summaryrefslogtreecommitdiffstats
path: root/framework/src/onos/web/gui/src
diff options
context:
space:
mode:
authorAshlee Young <ashlee@onosfw.com>2015-09-09 22:15:21 -0700
committerAshlee Young <ashlee@onosfw.com>2015-09-09 22:15:21 -0700
commit13d05bc8458758ee39cb829098241e89616717ee (patch)
tree22a4d1ce65f15952f07a3df5af4b462b4697cb3a /framework/src/onos/web/gui/src
parent6139282e1e93c2322076de4b91b1c85d0bc4a8b3 (diff)
ONOS checkin based on commit tag e796610b1f721d02f9b0e213cf6f7790c10ecd60
Change-Id: Ife8810491034fe7becdba75dda20de4267bd15cd
Diffstat (limited to 'framework/src/onos/web/gui/src')
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/ApplicationResource.java44
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/ApplicationViewMessageHandler.java125
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/ClusterViewMessageHandler.java101
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/DeviceViewMessageHandler.java209
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/FlowViewMessageHandler.java164
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/GroupViewMessageHandler.java131
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/HostViewMessageHandler.java130
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/IntentViewMessageHandler.java276
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/LinkViewMessageHandler.java127
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/LogoutResource.java46
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/MainIndexResource.java102
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/MainModuleResource.java77
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/MainNavResource.java124
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/MainViewResource.java60
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/PortViewMessageHandler.java96
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/SettingsViewMessageHandler.java95
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/SpriteService.java50
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TopoOverlayCache.java116
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TopologyResource.java94
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandler.java781
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java509
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TrafficMonitor.java675
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TrafficOverlay.java62
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TunnelViewMessageHandler.java80
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/UiExtensionManager.java181
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocket.java240
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocketServlet.java95
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/package-info.java20
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/topo/IntentSelection.java175
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/topo/ServicesBundle.java132
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/topo/TopoIntentFilter.java274
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/topo/TrafficLink.java223
-rw-r--r--framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/topo/TrafficLinkMap.java33
-rw-r--r--framework/src/onos/web/gui/src/main/resources/core/css.html1
-rw-r--r--framework/src/onos/web/gui/src/main/resources/core/js.html1
-rw-r--r--framework/src/onos/web/gui/src/main/resources/not-ready.html35
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/WEB-INF/web.xml185
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_bripc/practice-table.html58
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_bripc/practice-table.js273
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_bripc/show-icons-test.js107
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_bripc/show-icons.html91
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_bripc/svg-exercise.html89
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_bripc/svg-exercise.js170
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/checkmark-xmark-icon.html145
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/embedded-icon.html130
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/glyphs.html145
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch01-01-hello-world-app.html15
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-01-module-example.html16
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-02-creating-controller.html20
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-03-hello-controller.html21
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-04-controller-click-msg.html26
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-05-ng-repeat-example-1.html29
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-06-more-directives.html52
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-07-ng-repeat-object.html28
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-08-ng-helper-vars.html42
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-09-ng-repeat-track-id.html58
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-10-ng-repeat-across-elements.html38
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-01-simple-ng-model.html28
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-02-simple-ng-model2.html40
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-03-simple-form.html45
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-04-two-forms-databinding.html44
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-05-form-validation.html42
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-06-form-error-messages.html53
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-07-form-styling.html45
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-08-nested-forms.html63
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-09-checkbox-example.html47
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-10-radio-buttons.html63
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-11-select-example.html41
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch05-01-need-for-service-app.js34
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch05-01-need-for-service.html41
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch05-02-log-example.html22
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch05-03-simple-angular-service.html43
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch05-03-simple-angular-service.js115
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch08-01-filter-example.html48
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch08-02-filter-number-string.html83
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch08-03-filter-arrays.html86
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch08-04-custom-filters.html61
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch10-01-simple-routing.html36
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/js/ch03-controller.js17
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/js/ch09-01-time-ago.js27
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/oblique.html473
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/onos-logo.svg176
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/overlaywork/AppUiTopoOverlay.java74
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/overlaywork/README.txt4
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/overlaywork/topov.js157
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/_sdh/topojson/samerica.html87
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/README.txt7
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/common.css31
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/directives.js72
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/README.txt44
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/layer/flash.css49
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/layer/flash.js165
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/layer/layer.js25
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/layer/panel.css50
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/layer/panel.js214
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/layer/quickhelp.css64
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/layer/quickhelp.js387
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/layer/veil.css50
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/layer/veil.js99
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/mast/mast.css102
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/mast/mast.html6
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/mast/mast.js56
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/nav/nav.css90
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/nav/nav.js103
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/remote/remote.js25
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/remote/rest.js72
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/remote/urlfn.js63
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/remote/websocket.js329
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/remote/wsevent.js49
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/remote/wsock.js42
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/svg/geodata.js186
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/svg/glyph.css34
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/svg/glyph.js646
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/svg/icon.css92
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/svg/icon.js265
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/svg/map.js129
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/svg/svg.js25
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/svg/svgUtil.js311
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/svg/zoom.js132
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/util/fn.js292
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/util/keys.js215
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/util/prefs.js128
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/util/random.js51
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/util/theme.js121
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/util/util.js25
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/widget/button.css120
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/widget/button.js263
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/widget/table.css215
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/widget/table.js272
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/widget/tableBuilder.js165
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/widget/toolbar.css77
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/widget/toolbar.js268
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/widget/tooltip.css44
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/widget/tooltip.js146
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/fw/widget/widget.js25
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/onos.css60
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/app/app.css32
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/app/app.html80
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/app/app.js148
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/cluster/cluster.css27
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/cluster/cluster.html68
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/cluster/cluster.js36
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/device/device.css144
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/device/device.html82
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/device/device.js319
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/flow/flow.css86
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/flow/flow.html84
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/flow/flow.js62
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/group/group.css77
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/group/group.html90
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/group/group.js70
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/host/host.css27
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/host/host.html54
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/host/host.js36
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/intent/intent.css71
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/intent/intent.html72
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/intent/intent.js36
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/link/link.css27
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/link/link.html70
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/link/link.js44
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/port/port.css49
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/port/port.html90
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/port/port.js62
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/settings/settings.css27
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/settings/settings.html52
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/settings/settings.js36
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/topo/README.txt3
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/topo/topo.css729
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/topo/topo.html7
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/topo/topo.js529
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoD3.js576
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoEvent.js131
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoFilter.js149
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoForce.js1134
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoInst.js373
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoLink.js338
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoModel.js439
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoOblique.js257
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoOverlay.js418
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoPanel.js539
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoSelect.js286
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoSprite.js262
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoToolbar.js284
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoTraffic.js220
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoTrafficNew.js159
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/tunnel/tunnel.css27
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/tunnel/tunnel.html72
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/app/view/tunnel/tunnel.js44
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/data/img/apple-touch-icon.pngbin0 -> 12833 bytes
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/data/img/nav-menu.pngbin0 -> 1595 bytes
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/data/img/onos-logo-fliprotate.pngbin0 -> 59667 bytes
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/data/img/onos-logo.lg.pngbin0 -> 41088 bytes
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/data/img/onos-logo.pngbin0 -> 5741 bytes
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/data/map/README.txt61
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/data/map/continental_us.topojson25782
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/data/map/countries.topojson1
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/data/map/countries_formatted.topojson347863
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/data/sprites/clouds.json59
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/data/sprites/demo-clouds.json45
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/data/sprites/layout.json129
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/data/sprites/menlo.json76
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/data/sprites/packetOptical.json42
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/data/sprites/segmentRouting.json52
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/error.html79
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/index.html183
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/login.html69
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/nav.html4
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/not-ready.html40
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/onos.js162
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/README.txt31
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/layer/flash-spec.js72
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/layer/panel-spec.js189
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/layer/quickhelp-spec.js214
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/layer/veil-spec.js45
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/mast/mast-spec.js37
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/nav/nav-spec.js165
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/remote/rest-spec.js97
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/remote/urlfn-spec.js89
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/remote/websocket-spec.js268
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/remote/wsevent-spec.js78
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/geodata-spec.js159
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/glyph-spec.js425
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/icon-spec.js106
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/map-spec.js87
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/svgUtil-spec.js237
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/zoom-spec.js152
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/util/fn-spec.js446
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/util/keys-spec.js278
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/util/prefs-spec.js60
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/util/random-spec.js110
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/util/theme-spec.js162
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/widget/button-spec.js300
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/widget/table-spec.js340
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/widget/tableBuilder-spec.js95
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/widget/toolbar-spec.js180
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/fw/widget/tooltip-spec.js79
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/onos-spec.js35
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/view/device/device-spec.js38
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/view/device/fakeData.json88
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoEvent-spec.js45
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoFilter-spec.js70
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoForce-spec.js53
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoInst-spec.js45
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoModel-spec.js414
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoOblique-spec.js45
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoPanel-spec.js159
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoSelect-spec.js51
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoToolbar-spec.js52
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoTraffic-spec.js47
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/e2e/README.txt2
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tests/karma.conf.js90
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tp/AngularJS.LICENSE24
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tp/D3.LICENSE26
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tp/README.txt1
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tp/angular-cookies.js206
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tp/angular-cookies.min.js8
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tp/angular-mocks.js2380
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tp/angular-route.js996
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tp/angular-route.min.js15
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tp/angular.js25917
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tp/angular.min.js250
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tp/d3.js9243
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tp/d3.min.js5
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tp/jquery-2.1.1.js9176
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tp/jquery-2.1.1.min.js4
-rw-r--r--framework/src/onos/web/gui/src/main/webapp/tp/topojson.v1.min.js1
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex1.json19
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex2_memo.json24
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex3.json24
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addHost_ex1.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addHost_ex2.json27
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addInstance_ex1.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addLink_ex1.json13
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/removeDevice_fab.json20
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/removeHost_fab.json22
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/removeInstance_ex1.json7
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/removeLink_ex1.json12
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showDetails_ex1_host.json22
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showDetails_ex2_device.json33
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showSummary_ex1.json30
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex1.json48
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex2_animated.json88
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex3_none.json7
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/updateDevice_ex1.json15
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/updateDevice_ex2.json15
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/updateHost.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/updateInstance_ex1.json7
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/updateLink_ex1.json12
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/cancelSummary_ex1.json5
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestDetails_ex1.json9
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestDetails_ex2.json8
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestSummary_ex1.json5
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex1_devs.json12
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex2_hosts.json13
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex3_devs_hosts.json13
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex4_hover.json8
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/updateMeta_ex1.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_10_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_11_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_12_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_13_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_14_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_15_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_16_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_17_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_18_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_19_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_1_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_20_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_21_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_22_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_23_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_24_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_25_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_26_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_27_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_28_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_29_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_2_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_30_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_31_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_32_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_33_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_34_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_35_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_36_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_37_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_38_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_3_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_4_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_5_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_6_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_7_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_8_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_9_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/colors/scenario.json13
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_10_onos.json15
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_11_onos.json15
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_12_onos.json15
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_13_onos.json15
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_14_onos.json15
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_15_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_16_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_17_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_18_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_19_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_1_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_2_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_3_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_4_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_5_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_6_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_7_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_8_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_9_onos.json15
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/instances/scenario.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_1_ui.json8
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_2_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_3_ui.json8
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_4_onos.json20
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_5_onos.json20
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_6_onos.json20
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_7_ui.json6
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_8_onos.json7
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/scenario.json13
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_10_onos.json15
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_11_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_12_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_13_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_14_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_15_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_16_onos.json15
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_17_onos.json15
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_18_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_19_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_1_onos.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_20_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_21_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_22_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_23_onos.json22
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_24_onos.json22
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_25_onos.json7
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_2_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_3_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_4_onos.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_5_onos.json15
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_6_onos.json15
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_7_onos.json15
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_8_onos.json15
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/ev_9_onos.json15
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/links/scenario.json15
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_10_addInstance_F.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_11_addInstance_G.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_1_showSummary.json28
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_2_addInstance.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_3_addInstance_B.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_4_addInstance_C.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_5_updateInstance_B.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_6_removeInstance_B.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_7_addInstance_D.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_8_addInstance_B.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_9_addInstance_E.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/migrate/scenario.json12
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_1_addInstanceA.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_2_addInstanceB.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_3_addDevice_08.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_4_addDevice_03.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_5_addLink_03_08.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_6_addHost_03.json20
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_7_addHost_08.json19
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/scenario.json21
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_10_addLink_2-2b.json13
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_11_addLink_3-3b.json13
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_12_addLink_4-4b.json13
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_1_addDevice_sw1b.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_2_addDevice_sw2b.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_3_addDevice_sw3b.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_4_addDevice_sw4b.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_5_addDevice_sw1.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_6_addDevice_sw2.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_7_addDevice_sw3.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_8_addDevice_sw4.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_9_addLink_1-1b.json13
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/oblique/scenario.json9
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_10_updateHost_03.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_11_updateHost_08.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_12_updateLink.json15
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_13_updateLink.json15
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_14_removeLink.json15
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_15_removeHost_08.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_16_removeDevice_03.json22
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_17_removeDevice_08.json23
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_1_addInstanceA.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_2_addInstanceB.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_3_addDevice_08.json23
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_4_addDevice_03.json23
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_5_updateDevice_08_online.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_6_updateDevice_03_online.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_7_addLink_03_08.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_8_addHost_03.json21
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_9_addHost_08.json21
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/simple/scenario.json30
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_10_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_11_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_12_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_13_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_14_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_15_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_16_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_17_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_18_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_19_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_1_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_20_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_21_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_22_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_23_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_24_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_25_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_26_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_27_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_28_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_29_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_2_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_30_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_31_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_32_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_33_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_34_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_35_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_36_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_37_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_38_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_39_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_3_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_40_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_41_onos.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_4_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_5_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_6_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_7_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_8_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_9_onos.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/startup/scenario.json19
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_10_addLink_s8-r8.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_11_addLink_s3-r3.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_12_addLink_r8-r3.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_13_addHost_h3.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_14_addHost_h7.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_15_addHost_h8.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_16_addDevice_r4.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_17_addLink_r8-r4.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_18_showTraffic_primary.json34
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_19_showTraffic_secondary.json34
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_1_addInstance.json14
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_20_showTraffic_allMix.json39
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_21_showTraffic_none.json7
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_22_updateDevice_s7offline.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_23_updateDevice_s7online.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_24_removeDevice_s8.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_25_addDevice_s8.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_26_removeHost_h7.json17
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_2_addDevice_s8.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_3_addDevice_s3.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_4_addDevice_s7.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_5_addDevice_r8.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_6_addDevice_r3.json18
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_7_addLink_s3-s7.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_8_addLink_s8-s3.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_9_addLink_s8-s7.json16
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/ev/traffic/scenario.json12
-rw-r--r--framework/src/onos/web/gui/src/test/_karma/mockserver.js361
-rw-r--r--framework/src/onos/web/gui/src/test/java/org/onosproject/ui/impl/README.txt1
-rw-r--r--framework/src/onos/web/gui/src/test/webapp/_sdh/ng-examples/js/ch03-controllerSpec.js35
-rw-r--r--framework/src/onos/web/gui/src/test/webapp/_sdh/ng-examples/js/ch09-01-time-agoSpec.js40
515 files changed, 458324 insertions, 0 deletions
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/ApplicationResource.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/ApplicationResource.java
new file mode 100644
index 00000000..398bfee0
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/ApplicationResource.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ui.impl;
+
+import com.sun.jersey.multipart.FormDataParam;
+import org.onlab.rest.BaseResource;
+import org.onosproject.app.ApplicationAdminService;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Application upload resource.
+ */
+@Path("applications")
+public class ApplicationResource extends BaseResource {
+
+ @Path("upload")
+ @POST
+ @Consumes(MediaType.MULTIPART_FORM_DATA)
+ public Response upload(@FormDataParam("file") InputStream stream) throws IOException {
+ get(ApplicationAdminService.class).install(stream);
+ return Response.ok().build();
+ }
+
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/ApplicationViewMessageHandler.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/ApplicationViewMessageHandler.java
new file mode 100644
index 00000000..77a58972
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/ApplicationViewMessageHandler.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ui.impl;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.ImmutableSet;
+import org.onosproject.app.ApplicationAdminService;
+import org.onosproject.app.ApplicationService;
+import org.onosproject.app.ApplicationState;
+import org.onosproject.core.Application;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.ui.RequestHandler;
+import org.onosproject.ui.UiMessageHandler;
+import org.onosproject.ui.table.TableModel;
+import org.onosproject.ui.table.TableRequestHandler;
+
+import java.util.Collection;
+
+import static org.onosproject.app.ApplicationState.ACTIVE;
+
+/**
+ * Message handler for application view related messages.
+ */
+public class ApplicationViewMessageHandler extends UiMessageHandler {
+
+ private static final String APP_DATA_REQ = "appDataRequest";
+ private static final String APP_DATA_RESP = "appDataResponse";
+ private static final String APPS = "apps";
+
+ private static final String APP_MGMT_REQ = "appManagementRequest";
+
+ private static final String STATE = "state";
+ private static final String STATE_IID = "_iconid_state";
+ private static final String ID = "id";
+ private static final String VERSION = "version";
+ private static final String ORIGIN = "origin";
+ private static final String DESC = "desc";
+
+ private static final String ICON_ID_ACTIVE = "active";
+ private static final String ICON_ID_INACTIVE = "appInactive";
+
+ private static final String[] COL_IDS = {
+ STATE, STATE_IID, ID, VERSION, ORIGIN, DESC
+ };
+
+ @Override
+ protected Collection<RequestHandler> createRequestHandlers() {
+ return ImmutableSet.of(
+ new AppDataRequest(),
+ new AppMgmtRequest()
+ );
+ }
+
+ // handler for application table requests
+ private final class AppDataRequest extends TableRequestHandler {
+ private AppDataRequest() {
+ super(APP_DATA_REQ, APP_DATA_RESP, APPS);
+ }
+
+ @Override
+ protected String[] getColumnIds() {
+ return COL_IDS;
+ }
+
+ @Override
+ protected void populateTable(TableModel tm, ObjectNode payload) {
+ ApplicationService as = get(ApplicationService.class);
+ for (Application app : as.getApplications()) {
+ populateRow(tm.addRow(), app, as);
+ }
+ }
+
+ private void populateRow(TableModel.Row row, Application app,
+ ApplicationService as) {
+ ApplicationId id = app.id();
+ ApplicationState state = as.getState(id);
+ String iconId = state == ACTIVE ? ICON_ID_ACTIVE : ICON_ID_INACTIVE;
+
+ row.cell(STATE, state)
+ .cell(STATE_IID, iconId)
+ .cell(ID, id.name())
+ .cell(VERSION, app.version())
+ .cell(ORIGIN, app.origin())
+ .cell(DESC, app.description());
+ }
+ }
+
+ // handler for application management control button actions
+ private final class AppMgmtRequest extends RequestHandler {
+ private AppMgmtRequest() {
+ super(APP_MGMT_REQ);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ String action = string(payload, "action");
+ String name = string(payload, "name");
+ if (action != null && name != null) {
+ ApplicationAdminService service = get(ApplicationAdminService.class);
+ ApplicationId appId = service.getId(name);
+ if (action.equals("activate")) {
+ service.activate(appId);
+ } else if (action.equals("deactivate")) {
+ service.deactivate(appId);
+ } else if (action.equals("uninstall")) {
+ service.uninstall(appId);
+ }
+ chain(APP_DATA_REQ, sid, payload);
+ }
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/ClusterViewMessageHandler.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/ClusterViewMessageHandler.java
new file mode 100644
index 00000000..da0eae07
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/ClusterViewMessageHandler.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.ui.impl;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.ImmutableSet;
+import org.joda.time.DateTime;
+import org.onosproject.cluster.ClusterService;
+import org.onosproject.cluster.ControllerNode;
+import org.onosproject.cluster.NodeId;
+import org.onosproject.ui.RequestHandler;
+import org.onosproject.ui.UiMessageHandler;
+import org.onosproject.ui.table.TableModel;
+import org.onosproject.ui.table.TableRequestHandler;
+import org.onosproject.ui.table.cell.TimeFormatter;
+
+import java.util.Collection;
+
+
+/**
+ * Message handler for cluster view related messages.
+ */
+public class ClusterViewMessageHandler extends UiMessageHandler {
+
+ private static final String CLUSTER_DATA_REQ = "clusterDataRequest";
+ private static final String CLUSTER_DATA_RESP = "clusterDataResponse";
+ private static final String CLUSTERS = "clusters";
+
+ private static final String ID = "id";
+ private static final String IP = "ip";
+ private static final String TCP_PORT = "tcp";
+ private static final String STATE_IID = "_iconid_state";
+ private static final String UPDATED = "updated";
+
+ private static final String[] COL_IDS = {
+ ID, IP, TCP_PORT, STATE_IID, UPDATED
+ };
+
+ private static final String ICON_ID_ONLINE = "active";
+ private static final String ICON_ID_OFFLINE = "inactive";
+
+ @Override
+ protected Collection<RequestHandler> createRequestHandlers() {
+ return ImmutableSet.of(new ClusterDataRequest());
+ }
+
+ // handler for cluster table requests
+ private final class ClusterDataRequest extends TableRequestHandler {
+ private ClusterDataRequest() {
+ super(CLUSTER_DATA_REQ, CLUSTER_DATA_RESP, CLUSTERS);
+ }
+
+ @Override
+ protected String[] getColumnIds() {
+ return COL_IDS;
+ }
+
+ @Override
+ protected TableModel createTableModel() {
+ TableModel tm = super.createTableModel();
+ tm.setFormatter(UPDATED, new TimeFormatter());
+ return tm;
+ }
+
+ @Override
+ protected void populateTable(TableModel tm, ObjectNode payload) {
+ ClusterService cs = get(ClusterService.class);
+ for (ControllerNode node : cs.getNodes()) {
+ populateRow(tm.addRow(), node, cs);
+ }
+ }
+
+ private void populateRow(TableModel.Row row, ControllerNode node,
+ ClusterService cs) {
+ NodeId id = node.id();
+ DateTime lastUpdated = cs.getLastUpdated(id);
+ String iconId = (cs.getState(id) == ControllerNode.State.ACTIVE) ?
+ ICON_ID_ONLINE : ICON_ID_OFFLINE;
+
+ row.cell(ID, id)
+ .cell(IP, node.ip())
+ .cell(TCP_PORT, node.tcpPort())
+ .cell(STATE_IID, iconId)
+ .cell(UPDATED, lastUpdated);
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/DeviceViewMessageHandler.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/DeviceViewMessageHandler.java
new file mode 100644
index 00000000..fb83cdd7
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/DeviceViewMessageHandler.java
@@ -0,0 +1,209 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ui.impl;
+
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.ImmutableSet;
+import org.onosproject.mastership.MastershipService;
+import org.onosproject.net.AnnotationKeys;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Link;
+import org.onosproject.net.Port;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.link.LinkService;
+import org.onosproject.ui.RequestHandler;
+import org.onosproject.ui.UiMessageHandler;
+import org.onosproject.ui.table.TableModel;
+import org.onosproject.ui.table.TableRequestHandler;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import static org.apache.commons.lang.WordUtils.capitalizeFully;
+
+/**
+ * Message handler for device view related messages.
+ */
+public class DeviceViewMessageHandler extends UiMessageHandler {
+
+ private static final String DEV_DATA_REQ = "deviceDataRequest";
+ private static final String DEV_DATA_RESP = "deviceDataResponse";
+ private static final String DEVICES = "devices";
+
+ private static final String DEV_DETAILS_REQ = "deviceDetailsRequest";
+ private static final String DEV_DETAILS_RESP = "deviceDetailsResponse";
+ private static final String DETAILS = "details";
+
+ private static final String ID = "id";
+ private static final String TYPE = "type";
+ private static final String AVAILABLE = "available";
+ private static final String AVAILABLE_IID = "_iconid_available";
+ private static final String TYPE_IID = "_iconid_type";
+ private static final String DEV_ICON_PREFIX = "devIcon_";
+ private static final String NUM_PORTS = "num_ports";
+ private static final String LINK_DEST = "elinks_dest";
+ private static final String MFR = "mfr";
+ private static final String HW = "hw";
+ private static final String SW = "sw";
+ private static final String PROTOCOL = "protocol";
+ private static final String MASTER_ID = "masterid";
+ private static final String CHASSIS_ID = "chassisid";
+ private static final String SERIAL = "serial";
+ private static final String PORTS = "ports";
+ private static final String ENABLED = "enabled";
+ private static final String SPEED = "speed";
+ private static final String NAME = "name";
+
+
+ private static final String[] COL_IDS = {
+ AVAILABLE, AVAILABLE_IID, TYPE_IID, ID,
+ NUM_PORTS, MASTER_ID, MFR, HW, SW,
+ PROTOCOL, CHASSIS_ID, SERIAL
+ };
+
+ private static final String ICON_ID_ONLINE = "active";
+ private static final String ICON_ID_OFFLINE = "inactive";
+
+ @Override
+ protected Collection<RequestHandler> createRequestHandlers() {
+ return ImmutableSet.of(
+ new DataRequestHandler(),
+ new DetailRequestHandler()
+ );
+ }
+
+ private static String getTypeIconId(Device d) {
+ return DEV_ICON_PREFIX + d.type().toString();
+ }
+
+ // handler for device table requests
+ private final class DataRequestHandler extends TableRequestHandler {
+ private DataRequestHandler() {
+ super(DEV_DATA_REQ, DEV_DATA_RESP, DEVICES);
+ }
+
+ @Override
+ protected String[] getColumnIds() {
+ return COL_IDS;
+ }
+
+ @Override
+ protected void populateTable(TableModel tm, ObjectNode payload) {
+ DeviceService ds = get(DeviceService.class);
+ MastershipService ms = get(MastershipService.class);
+ for (Device dev : ds.getDevices()) {
+ populateRow(tm.addRow(), dev, ds, ms);
+ }
+ }
+
+ private void populateRow(TableModel.Row row, Device dev,
+ DeviceService ds, MastershipService ms) {
+ DeviceId id = dev.id();
+ boolean available = ds.isAvailable(id);
+ String iconId = available ? ICON_ID_ONLINE : ICON_ID_OFFLINE;
+
+ String protocol = dev.annotations().value(PROTOCOL);
+
+ row.cell(ID, id)
+ .cell(AVAILABLE, available)
+ .cell(AVAILABLE_IID, iconId)
+ .cell(TYPE_IID, getTypeIconId(dev))
+ .cell(MFR, dev.manufacturer())
+ .cell(HW, dev.hwVersion())
+ .cell(SW, dev.swVersion())
+ .cell(PROTOCOL, protocol != null ? protocol : "")
+ .cell(NUM_PORTS, ds.getPorts(id).size())
+ .cell(MASTER_ID, ms.getMasterFor(id));
+ }
+ }
+
+ // handler for selected device detail requests
+ private final class DetailRequestHandler extends RequestHandler {
+ private DetailRequestHandler() {
+ super(DEV_DETAILS_REQ);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ String id = string(payload, "id", "of:0000000000000000");
+
+ DeviceId deviceId = DeviceId.deviceId(id);
+ DeviceService service = get(DeviceService.class);
+ MastershipService ms = get(MastershipService.class);
+ Device device = service.getDevice(deviceId);
+ ObjectNode data = MAPPER.createObjectNode();
+
+ data.put(ID, deviceId.toString());
+ data.put(TYPE, capitalizeFully(device.type().toString()));
+ data.put(TYPE_IID, getTypeIconId(device));
+ data.put(MFR, device.manufacturer());
+ data.put(HW, device.hwVersion());
+ data.put(SW, device.swVersion());
+ data.put(SERIAL, device.serialNumber());
+ data.put(CHASSIS_ID, device.chassisId().toString());
+ data.put(MASTER_ID, ms.getMasterFor(deviceId).toString());
+ data.put(PROTOCOL, device.annotations().value(PROTOCOL));
+
+ ArrayNode ports = MAPPER.createArrayNode();
+
+ List<Port> portList = new ArrayList<>(service.getPorts(deviceId));
+ Collections.sort(portList, (p1, p2) -> {
+ long delta = p1.number().toLong() - p2.number().toLong();
+ return delta == 0 ? 0 : (delta < 0 ? -1 : +1);
+ });
+
+ for (Port p : portList) {
+ ports.add(portData(p, deviceId));
+ }
+ data.set(PORTS, ports);
+
+ ObjectNode rootNode = MAPPER.createObjectNode();
+ rootNode.set(DETAILS, data);
+ sendMessage(DEV_DETAILS_RESP, 0, rootNode);
+ }
+
+ private ObjectNode portData(Port p, DeviceId id) {
+ ObjectNode port = MAPPER.createObjectNode();
+ LinkService ls = get(LinkService.class);
+ String name = p.annotations().value(AnnotationKeys.PORT_NAME);
+
+ port.put(ID, capitalizeFully(p.number().toString()));
+ port.put(TYPE, capitalizeFully(p.type().toString()));
+ port.put(SPEED, p.portSpeed());
+ port.put(ENABLED, p.isEnabled());
+ port.put(NAME, name != null ? name : "");
+
+ Set<Link> links = ls.getEgressLinks(new ConnectPoint(id, p.number()));
+ if (!links.isEmpty()) {
+ StringBuilder egressLinks = new StringBuilder();
+ for (Link l : links) {
+ ConnectPoint dest = l.dst();
+ egressLinks.append(dest.elementId()).append("/")
+ .append(dest.port()).append(" ");
+ }
+ port.put(LINK_DEST, egressLinks.toString());
+ }
+
+ return port;
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/FlowViewMessageHandler.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/FlowViewMessageHandler.java
new file mode 100644
index 00000000..02179115
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/FlowViewMessageHandler.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.ui.impl;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.flow.FlowEntry;
+import org.onosproject.net.flow.FlowRuleService;
+import org.onosproject.net.flow.criteria.Criterion;
+import org.onosproject.net.flow.instructions.Instruction;
+import org.onosproject.ui.RequestHandler;
+import org.onosproject.ui.UiMessageHandler;
+import org.onosproject.ui.table.CellFormatter;
+import org.onosproject.ui.table.TableModel;
+import org.onosproject.ui.table.TableRequestHandler;
+import org.onosproject.ui.table.cell.EnumFormatter;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Message handler for flow view related messages.
+ */
+public class FlowViewMessageHandler extends UiMessageHandler {
+
+ private static final String FLOW_DATA_REQ = "flowDataRequest";
+ private static final String FLOW_DATA_RESP = "flowDataResponse";
+ private static final String FLOWS = "flows";
+
+ private static final String ID = "id";
+ private static final String APP_ID = "appId";
+ private static final String GROUP_ID = "groupId";
+ private static final String TABLE_ID = "tableId";
+ private static final String PRIORITY = "priority";
+ private static final String SELECTOR = "selector";
+ private static final String TREATMENT = "treatment";
+ private static final String TIMEOUT = "timeout";
+ private static final String PERMANENT = "permanent";
+ private static final String STATE = "state";
+ private static final String PACKETS = "packets";
+ private static final String BYTES = "bytes";
+
+ private static final String COMMA = ", ";
+
+ private static final String[] COL_IDS = {
+ ID, APP_ID, GROUP_ID, TABLE_ID, PRIORITY, SELECTOR,
+ TREATMENT, TIMEOUT, PERMANENT, STATE, PACKETS, BYTES
+ };
+
+ @Override
+ protected Collection<RequestHandler> createRequestHandlers() {
+ return ImmutableSet.of(new FlowDataRequest());
+ }
+
+ // handler for flow table requests
+ private final class FlowDataRequest extends TableRequestHandler {
+
+ private FlowDataRequest() {
+ super(FLOW_DATA_REQ, FLOW_DATA_RESP, FLOWS);
+ }
+
+ @Override
+ protected String[] getColumnIds() {
+ return COL_IDS;
+ }
+
+ @Override
+ protected TableModel createTableModel() {
+ TableModel tm = super.createTableModel();
+ tm.setFormatter(SELECTOR, new SelectorFormatter());
+ tm.setFormatter(TREATMENT, new TreatmentFormatter());
+ tm.setFormatter(STATE, EnumFormatter.INSTANCE);
+ return tm;
+ }
+
+ @Override
+ protected void populateTable(TableModel tm, ObjectNode payload) {
+ String uri = string(payload, "devId");
+ if (!Strings.isNullOrEmpty(uri)) {
+ DeviceId deviceId = DeviceId.deviceId(uri);
+ FlowRuleService frs = get(FlowRuleService.class);
+ for (FlowEntry flow : frs.getFlowEntries(deviceId)) {
+ populateRow(tm.addRow(), flow);
+ }
+ }
+ }
+
+ private void populateRow(TableModel.Row row, FlowEntry flow) {
+ row.cell(ID, flow.id().value())
+ .cell(APP_ID, flow.appId())
+ .cell(GROUP_ID, flow.groupId().id())
+ .cell(TABLE_ID, flow.tableId())
+ .cell(PRIORITY, flow.priority())
+ .cell(SELECTOR, flow)
+ .cell(TREATMENT, flow)
+ .cell(TIMEOUT, flow.timeout())
+ .cell(PERMANENT, flow.isPermanent())
+ .cell(STATE, flow.state())
+ .cell(PACKETS, flow.packets())
+ .cell(BYTES, flow.bytes());
+ }
+
+ private final class SelectorFormatter implements CellFormatter {
+ @Override
+ public String format(Object value) {
+ FlowEntry flow = (FlowEntry) value;
+ Set<Criterion> criteria = flow.selector().criteria();
+
+ if (criteria.isEmpty()) {
+ return "(No traffic selector criteria for this flow)";
+ }
+ StringBuilder sb = new StringBuilder("Criteria: ");
+ for (Criterion c : criteria) {
+ sb.append(c).append(COMMA);
+ }
+ removeTrailingComma(sb);
+
+ return sb.toString();
+ }
+ }
+
+ private final class TreatmentFormatter implements CellFormatter {
+ @Override
+ public String format(Object value) {
+ FlowEntry flow = (FlowEntry) value;
+ List<Instruction> instructions = flow.treatment().allInstructions();
+
+ if (instructions.isEmpty()) {
+ return "(No traffic treatment instructions for this flow)";
+ }
+ StringBuilder sb = new StringBuilder("Treatment Instructions: ");
+ for (Instruction i : instructions) {
+ sb.append(i).append(COMMA);
+ }
+ removeTrailingComma(sb);
+
+ return sb.toString();
+ }
+ }
+
+ private StringBuilder removeTrailingComma(StringBuilder sb) {
+ int pos = sb.lastIndexOf(COMMA);
+ sb.delete(pos, sb.length());
+ return sb;
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/GroupViewMessageHandler.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/GroupViewMessageHandler.java
new file mode 100644
index 00000000..c7d539b1
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/GroupViewMessageHandler.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.ui.impl;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.group.Group;
+import org.onosproject.net.group.GroupBucket;
+import org.onosproject.net.group.GroupService;
+import org.onosproject.ui.RequestHandler;
+import org.onosproject.ui.UiMessageHandler;
+import org.onosproject.ui.table.CellFormatter;
+import org.onosproject.ui.table.TableModel;
+import org.onosproject.ui.table.TableRequestHandler;
+import org.onosproject.ui.table.cell.EnumFormatter;
+
+import java.util.Collection;
+import java.util.List;
+
+
+/**
+ * Message handler for group view related messages.
+ */
+public class GroupViewMessageHandler extends UiMessageHandler {
+
+ private static final String GROUP_DATA_REQ = "groupDataRequest";
+ private static final String GROUP_DATA_RESP = "groupDataResponse";
+ private static final String GROUPS = "groups";
+
+ private static final String ID = "id";
+ private static final String APP_ID = "app_id";
+ private static final String STATE = "state";
+ private static final String TYPE = "type";
+ private static final String PACKETS = "packets";
+ private static final String BYTES = "bytes";
+ private static final String BUCKETS = "buckets";
+
+ private static final String[] COL_IDS = {
+ ID, APP_ID, STATE, TYPE, PACKETS, BYTES, BUCKETS
+ };
+
+ @Override
+ protected Collection<RequestHandler> createRequestHandlers() {
+ return ImmutableSet.of(new GroupDataRequest());
+ }
+
+ // handler for group table requests
+ private final class GroupDataRequest extends TableRequestHandler {
+
+ private GroupDataRequest() {
+ super(GROUP_DATA_REQ, GROUP_DATA_RESP, GROUPS);
+ }
+
+ @Override
+ protected String[] getColumnIds() {
+ return COL_IDS;
+ }
+
+ @Override
+ protected TableModel createTableModel() {
+ TableModel tm = super.createTableModel();
+ tm.setFormatter(TYPE, EnumFormatter.INSTANCE);
+ tm.setFormatter(BUCKETS, new BucketFormatter());
+ return tm;
+ }
+
+ @Override
+ protected void populateTable(TableModel tm, ObjectNode payload) {
+ String uri = string(payload, "devId");
+ if (!Strings.isNullOrEmpty(uri)) {
+ DeviceId deviceId = DeviceId.deviceId(uri);
+ GroupService gs = get(GroupService.class);
+ for (Group group : gs.getGroups(deviceId)) {
+ populateRow(tm.addRow(), group);
+ }
+ }
+ }
+
+ private void populateRow(TableModel.Row row, Group g) {
+ row.cell(ID, g.id().id())
+ .cell(APP_ID, g.appId().name())
+ .cell(STATE, g.state())
+ .cell(TYPE, g.type())
+ .cell(PACKETS, g.packets())
+ .cell(BYTES, g.bytes())
+ .cell(BUCKETS, g.buckets().buckets());
+ }
+
+ private final class BucketFormatter implements CellFormatter {
+ private static final String BREAK = "<br>";
+
+ @Override
+ public String format(Object value) {
+ StringBuilder sb = new StringBuilder();
+ List<GroupBucket> buckets = (List<GroupBucket>) value;
+
+ if (buckets.isEmpty()) {
+ return "(No buckets for this group)";
+ }
+
+ for (GroupBucket b : buckets) {
+ sb.append("Bytes: ")
+ .append(b.bytes())
+ .append(" Packets: ")
+ .append(b.packets())
+ .append(" Actions: ")
+ .append(b.treatment().allInstructions())
+ .append(BREAK);
+ }
+
+ return sb.toString();
+ }
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/HostViewMessageHandler.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/HostViewMessageHandler.java
new file mode 100644
index 00000000..12a2b664
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/HostViewMessageHandler.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ui.impl;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.ImmutableSet;
+import org.onlab.packet.IpAddress;
+import org.onosproject.net.AnnotationKeys;
+import org.onosproject.net.Host;
+import org.onosproject.net.host.HostService;
+import org.onosproject.ui.RequestHandler;
+import org.onosproject.ui.UiMessageHandler;
+import org.onosproject.ui.table.CellFormatter;
+import org.onosproject.ui.table.TableModel;
+import org.onosproject.ui.table.TableRequestHandler;
+import org.onosproject.ui.table.cell.HostLocationFormatter;
+
+import java.util.Collection;
+import java.util.Set;
+
+import static com.google.common.base.Strings.isNullOrEmpty;
+
+/**
+ * Message handler for host view related messages.
+ */
+public class HostViewMessageHandler extends UiMessageHandler {
+
+ private static final String HOST_DATA_REQ = "hostDataRequest";
+ private static final String HOST_DATA_RESP = "hostDataResponse";
+ private static final String HOSTS = "hosts";
+
+ private static final String TYPE_IID = "_iconid_type";
+ private static final String ID = "id";
+ private static final String MAC = "mac";
+ private static final String VLAN = "vlan";
+ private static final String IPS = "ips";
+ private static final String LOCATION = "location";
+
+ private static final String HOST_ICON_PREFIX = "hostIcon_";
+
+ private static final String[] COL_IDS = {
+ TYPE_IID, ID, MAC, VLAN, IPS, LOCATION
+ };
+
+ @Override
+ protected Collection<RequestHandler> createRequestHandlers() {
+ return ImmutableSet.of(new HostDataRequest());
+ }
+
+ // handler for host table requests
+ private final class HostDataRequest extends TableRequestHandler {
+ private HostDataRequest() {
+ super(HOST_DATA_REQ, HOST_DATA_RESP, HOSTS);
+ }
+
+ @Override
+ protected String[] getColumnIds() {
+ return COL_IDS;
+ }
+
+ @Override
+ protected TableModel createTableModel() {
+ TableModel tm = super.createTableModel();
+ tm.setFormatter(LOCATION, HostLocationFormatter.INSTANCE);
+ tm.setFormatter(IPS, new IpSetFormatter());
+ return tm;
+ }
+
+ @Override
+ protected void populateTable(TableModel tm, ObjectNode payload) {
+ HostService hs = get(HostService.class);
+ for (Host host : hs.getHosts()) {
+ populateRow(tm.addRow(), host);
+ }
+ }
+
+ private void populateRow(TableModel.Row row, Host host) {
+ row.cell(TYPE_IID, getTypeIconId(host))
+ .cell(ID, host.id())
+ .cell(MAC, host.mac())
+ .cell(VLAN, host.vlan())
+ .cell(IPS, host.ipAddresses())
+ .cell(LOCATION, host.location());
+ }
+
+ private String getTypeIconId(Host host) {
+ String hostType = host.annotations().value(AnnotationKeys.TYPE);
+ return HOST_ICON_PREFIX +
+ (isNullOrEmpty(hostType) ? "endstation" : hostType);
+ }
+
+ private final class IpSetFormatter implements CellFormatter {
+ private static final String COMMA = ", ";
+
+ @Override
+ public String format(Object value) {
+ Set<IpAddress> ips = (Set<IpAddress>) value;
+ if (ips.isEmpty()) {
+ return "(No IP Addresses for this host)";
+ }
+ StringBuilder sb = new StringBuilder();
+ for (IpAddress ip : ips) {
+ sb.append(ip.toString())
+ .append(COMMA);
+ }
+ removeTrailingComma(sb);
+ return sb.toString();
+ }
+
+ private StringBuilder removeTrailingComma(StringBuilder sb) {
+ int pos = sb.lastIndexOf(COMMA);
+ sb.delete(pos, sb.length());
+ return sb;
+ }
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/IntentViewMessageHandler.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/IntentViewMessageHandler.java
new file mode 100644
index 00000000..bacb76d2
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/IntentViewMessageHandler.java
@@ -0,0 +1,276 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ui.impl;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.ImmutableSet;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.NetworkResource;
+import org.onosproject.net.flow.criteria.Criterion;
+import org.onosproject.net.flow.instructions.Instruction;
+import org.onosproject.net.intent.ConnectivityIntent;
+import org.onosproject.net.intent.Constraint;
+import org.onosproject.net.intent.HostToHostIntent;
+import org.onosproject.net.intent.Intent;
+import org.onosproject.net.intent.IntentService;
+import org.onosproject.net.intent.LinkCollectionIntent;
+import org.onosproject.net.intent.MultiPointToSinglePointIntent;
+import org.onosproject.net.intent.PathIntent;
+import org.onosproject.net.intent.PointToPointIntent;
+import org.onosproject.net.intent.SinglePointToMultiPointIntent;
+import org.onosproject.ui.RequestHandler;
+import org.onosproject.ui.UiMessageHandler;
+import org.onosproject.ui.table.CellFormatter;
+import org.onosproject.ui.table.TableModel;
+import org.onosproject.ui.table.TableRequestHandler;
+import org.onosproject.ui.table.cell.AppIdFormatter;
+import org.onosproject.ui.table.cell.EnumFormatter;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Message handler for intent view related messages.
+ */
+public class IntentViewMessageHandler extends UiMessageHandler {
+
+ private static final String INTENT_DATA_REQ = "intentDataRequest";
+ private static final String INTENT_DATA_RESP = "intentDataResponse";
+ private static final String INTENTS = "intents";
+
+ private static final String APP_ID = "appId";
+ private static final String KEY = "key";
+ private static final String TYPE = "type";
+ private static final String PRIORITY = "priority";
+ private static final String STATE = "state";
+ private static final String RESOURCES = "resources";
+ private static final String DETAILS = "details";
+
+ private static final String[] COL_IDS = {
+ APP_ID, KEY, TYPE, PRIORITY, STATE, RESOURCES, DETAILS
+ };
+
+ @Override
+ protected Collection<RequestHandler> createRequestHandlers() {
+ return ImmutableSet.of(new IntentDataRequest());
+ }
+
+ // handler for intent table requests
+ private final class IntentDataRequest extends TableRequestHandler {
+ private IntentDataRequest() {
+ super(INTENT_DATA_REQ, INTENT_DATA_RESP, INTENTS);
+ }
+
+ @Override
+ protected String defaultColumnId() {
+ return APP_ID;
+ }
+
+ @Override
+ protected String[] getColumnIds() {
+ return COL_IDS;
+ }
+
+ @Override
+ protected TableModel createTableModel() {
+ TableModel tm = super.createTableModel();
+ tm.setFormatter(APP_ID, AppIdFormatter.INSTANCE);
+ tm.setFormatter(RESOURCES, new ResourcesFormatter());
+ tm.setFormatter(DETAILS, new DetailsFormatter());
+ tm.setFormatter(STATE, EnumFormatter.INSTANCE);
+ return tm;
+ }
+
+ @Override
+ protected void populateTable(TableModel tm, ObjectNode payload) {
+ IntentService is = get(IntentService.class);
+ for (Intent intent : is.getIntents()) {
+ populateRow(tm.addRow(), intent, is);
+ }
+ }
+
+ private void populateRow(TableModel.Row row, Intent intent, IntentService is) {
+ row.cell(APP_ID, intent.appId())
+ .cell(KEY, intent.key())
+ .cell(TYPE, intent.getClass().getSimpleName())
+ .cell(PRIORITY, intent.priority())
+ .cell(STATE, is.getIntentState(intent.key()))
+ .cell(RESOURCES, intent)
+ .cell(DETAILS, intent);
+ }
+
+ private final class ResourcesFormatter implements CellFormatter {
+ private static final String COMMA = ", ";
+
+ @Override
+ public String format(Object value) {
+ Intent intent = (Intent) value;
+ Collection<NetworkResource> resources = intent.resources();
+ if (resources.isEmpty()) {
+ return "(No resources for this intent)";
+ }
+ StringBuilder sb = new StringBuilder("Resources: ");
+ for (NetworkResource nr : resources) {
+ sb.append(nr).append(COMMA);
+ }
+ removeTrailingComma(sb);
+
+ return sb.toString();
+ }
+
+ private StringBuilder removeTrailingComma(StringBuilder sb) {
+ int pos = sb.lastIndexOf(COMMA);
+ sb.delete(pos, sb.length());
+ return sb;
+ }
+ }
+
+ private final class DetailsFormatter implements CellFormatter {
+ @Override
+ public String format(Object value) {
+ return formatDetails((Intent) value, new StringBuilder()).toString();
+ }
+
+ private StringBuilder formatDetails(Intent intent, StringBuilder sb) {
+ if (intent instanceof ConnectivityIntent) {
+ buildConnectivityDetails((ConnectivityIntent) intent, sb);
+ }
+
+ if (intent instanceof HostToHostIntent) {
+ buildHostToHostDetails((HostToHostIntent) intent, sb);
+
+ } else if (intent instanceof PointToPointIntent) {
+ buildPointToPointDetails((PointToPointIntent) intent, sb);
+
+ } else if (intent instanceof MultiPointToSinglePointIntent) {
+ buildMPToSPDetails((MultiPointToSinglePointIntent) intent, sb);
+
+ } else if (intent instanceof SinglePointToMultiPointIntent) {
+ buildSPToMPDetails((SinglePointToMultiPointIntent) intent, sb);
+
+ } else if (intent instanceof PathIntent) {
+ buildPathDetails((PathIntent) intent, sb);
+
+ } else if (intent instanceof LinkCollectionIntent) {
+ buildLinkConnectionDetails((LinkCollectionIntent) intent, sb);
+ }
+
+ if (sb.length() == 0) {
+ sb.append("(No details for this intent)");
+ } else {
+ sb.insert(0, "Details: ");
+ }
+ return sb;
+ }
+
+ private void appendMultiPointsDetails(Set<ConnectPoint> points,
+ StringBuilder sb) {
+ for (ConnectPoint point : points) {
+ sb.append(point.elementId())
+ .append('/')
+ .append(point.port())
+ .append(' ');
+ }
+ }
+
+ private void buildConnectivityDetails(ConnectivityIntent intent,
+ StringBuilder sb) {
+ Set<Criterion> criteria = intent.selector().criteria();
+ List<Instruction> instructions = intent.treatment().allInstructions();
+ List<Constraint> constraints = intent.constraints();
+
+ if (!criteria.isEmpty()) {
+ sb.append("Selector: ").append(criteria);
+ }
+ if (!instructions.isEmpty()) {
+ sb.append("Treatment: ").append(instructions);
+ }
+ if (constraints != null && !constraints.isEmpty()) {
+ sb.append("Constraints: ").append(constraints);
+ }
+ }
+
+ private void buildHostToHostDetails(HostToHostIntent intent,
+ StringBuilder sb) {
+ sb.append(" Host 1: ")
+ .append(intent.one())
+ .append(", Host 2: ")
+ .append(intent.two());
+ }
+
+ private void buildPointToPointDetails(PointToPointIntent intent,
+ StringBuilder sb) {
+ ConnectPoint ingress = intent.ingressPoint();
+ ConnectPoint egress = intent.egressPoint();
+ sb.append(" Ingress: ")
+ .append(ingress.elementId())
+ .append('/')
+ .append(ingress.port())
+
+ .append(", Egress: ")
+ .append(egress.elementId())
+ .append('/')
+ .append(egress.port())
+ .append(' ');
+ }
+
+ private void buildMPToSPDetails(MultiPointToSinglePointIntent intent,
+ StringBuilder sb) {
+ ConnectPoint egress = intent.egressPoint();
+
+ sb.append(" Ingress=");
+ appendMultiPointsDetails(intent.ingressPoints(), sb);
+
+ sb.append(", Egress=")
+ .append(egress.elementId())
+ .append('/')
+ .append(egress.port())
+ .append(' ');
+ }
+
+ private void buildSPToMPDetails(SinglePointToMultiPointIntent intent,
+ StringBuilder sb) {
+ ConnectPoint ingress = intent.ingressPoint();
+
+ sb.append(" Ingress=")
+ .append(ingress.elementId())
+ .append('/')
+ .append(ingress.port())
+ .append(", Egress=");
+
+ appendMultiPointsDetails(intent.egressPoints(), sb);
+ }
+
+ private void buildPathDetails(PathIntent intent, StringBuilder sb) {
+ sb.append(" path=")
+ .append(intent.path().links())
+ .append(", cost=")
+ .append(intent.path().cost());
+ }
+
+ private void buildLinkConnectionDetails(LinkCollectionIntent intent,
+ StringBuilder sb) {
+ sb.append(" links=")
+ .append(intent.links())
+ .append(", egress=");
+
+ appendMultiPointsDetails(intent.egressPoints(), sb);
+ }
+
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/LinkViewMessageHandler.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/LinkViewMessageHandler.java
new file mode 100644
index 00000000..7de6d624
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/LinkViewMessageHandler.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.ui.impl;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.ImmutableSet;
+import org.onosproject.net.Link;
+import org.onosproject.net.link.LinkService;
+import org.onosproject.ui.RequestHandler;
+import org.onosproject.ui.UiMessageHandler;
+import org.onosproject.ui.topo.BaseLink;
+import org.onosproject.ui.topo.BaseLinkMap;
+import org.onosproject.ui.table.TableModel;
+import org.onosproject.ui.table.TableRequestHandler;
+import org.onosproject.ui.table.cell.ConnectPointFormatter;
+import org.onosproject.ui.table.cell.EnumFormatter;
+
+import java.util.Collection;
+
+/**
+ * Message handler for link view related messages.
+ */
+public class LinkViewMessageHandler extends UiMessageHandler {
+
+ private static final String A_BOTH_B = "A &harr; B";
+ private static final String A_SINGLE_B = "A &rarr; B";
+ private static final String SLASH = " / ";
+
+ private static final String LINK_DATA_REQ = "linkDataRequest";
+ private static final String LINK_DATA_RESP = "linkDataResponse";
+ private static final String LINKS = "links";
+
+ private static final String ONE = "one";
+ private static final String TWO = "two";
+ private static final String TYPE = "type";
+ private static final String STATE = "_iconid_state";
+ private static final String DIRECTION = "direction";
+ private static final String DURABLE = "durable";
+
+ private static final String[] COL_IDS = {
+ ONE, TWO, TYPE, STATE, DIRECTION, DURABLE
+ };
+
+ private static final String ICON_ID_ONLINE = "active";
+ private static final String ICON_ID_OFFLINE = "inactive";
+
+ @Override
+ protected Collection<RequestHandler> createRequestHandlers() {
+ return ImmutableSet.of(new LinkDataRequest());
+ }
+
+ // handler for link table requests
+ private final class LinkDataRequest extends TableRequestHandler {
+ private LinkDataRequest() {
+ super(LINK_DATA_REQ, LINK_DATA_RESP, LINKS);
+ }
+
+ @Override
+ protected String[] getColumnIds() {
+ return COL_IDS;
+ }
+
+ @Override
+ protected String defaultColumnId() {
+ return ONE;
+ }
+
+ @Override
+ protected TableModel createTableModel() {
+ TableModel tm = super.createTableModel();
+ tm.setFormatter(ONE, ConnectPointFormatter.INSTANCE);
+ tm.setFormatter(TWO, ConnectPointFormatter.INSTANCE);
+ tm.setFormatter(TYPE, EnumFormatter.INSTANCE);
+ return tm;
+ }
+
+ @Override
+ protected void populateTable(TableModel tm, ObjectNode payload) {
+ LinkService ls = get(LinkService.class);
+ BaseLinkMap linkMap = new BaseLinkMap();
+ ls.getLinks().forEach(linkMap::add);
+ linkMap.biLinks().forEach(blink -> populateRow(tm.addRow(), blink));
+ }
+
+ private void populateRow(TableModel.Row row, BaseLink blink) {
+ row.cell(ONE, blink.one().src())
+ .cell(TWO, blink.one().dst())
+ .cell(TYPE, linkType(blink))
+ .cell(STATE, linkState(blink))
+ .cell(DIRECTION, linkDir(blink))
+ .cell(DURABLE, blink.one().isDurable());
+ }
+
+ private String linkType(BaseLink link) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(link.one().type());
+ if (link.two() != null && link.two().type() != link.one().type()) {
+ sb.append(SLASH).append(link.two().type());
+ }
+ return sb.toString();
+ }
+
+ private String linkState(BaseLink link) {
+ return (link.one().state() == Link.State.ACTIVE ||
+ link.two().state() == Link.State.ACTIVE) ?
+ ICON_ID_ONLINE : ICON_ID_OFFLINE;
+ }
+
+ private String linkDir(BaseLink link) {
+ return link.two() != null ? A_BOTH_B : A_SINGLE_B;
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/LogoutResource.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/LogoutResource.java
new file mode 100644
index 00000000..b21b5cdb
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/LogoutResource.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ui.impl;
+
+import org.onlab.rest.BaseResource;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+/**
+ * Application upload resource.
+ */
+@Path("logout")
+public class LogoutResource extends BaseResource {
+
+ @Context
+ private HttpServletRequest servletRequest;
+
+ @GET
+ public Response logout() throws IOException, URISyntaxException {
+ servletRequest.getSession().invalidate();
+ String url = servletRequest.getRequestURL().toString();
+ url = url.replaceFirst("/onos/ui/.*", "/onos/ui/login.html");
+ return Response.temporaryRedirect(new URI(url)).build();
+ }
+
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/MainIndexResource.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/MainIndexResource.java
new file mode 100644
index 00000000..a30c0470
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/MainIndexResource.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ui.impl;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableList.Builder;
+import org.onlab.osgi.ServiceNotFoundException;
+import org.onosproject.rest.AbstractInjectionResource;
+import org.onosproject.ui.UiExtensionService;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.SequenceInputStream;
+
+import static com.google.common.collect.ImmutableList.of;
+import static com.google.common.io.ByteStreams.toByteArray;
+
+/**
+ * Resource for serving the dynamically composed index.html.
+ */
+@Path("/")
+public class MainIndexResource extends AbstractInjectionResource {
+
+ private static final String INDEX = "index.html";
+ private static final String NOT_READY = "not-ready.html";
+
+ private static final String INJECT_CSS_START = "<!-- {INJECTED-STYLESHEETS-START} -->";
+ private static final String INJECT_CSS_END = "<!-- {INJECTED-STYLESHEETS-END} -->";
+
+ private static final String INJECT_JS_START = "<!-- {INJECTED-JAVASCRIPT-START} -->";
+ private static final String INJECT_JS_END = "<!-- {INJECTED-JAVASCRIPT-END} -->";
+
+ @GET
+ @Produces(MediaType.TEXT_HTML)
+ public Response getMainIndex() throws IOException {
+ ClassLoader classLoader = getClass().getClassLoader();
+ UiExtensionService service;
+ try {
+ service = get(UiExtensionService.class);
+ } catch (ServiceNotFoundException e) {
+ return Response.ok(classLoader.getResourceAsStream(NOT_READY)).build();
+ }
+
+ InputStream indexTemplate = classLoader.getResourceAsStream(INDEX);
+ String index = new String(toByteArray(indexTemplate));
+
+ int p1s = split(index, 0, INJECT_JS_START);
+ int p1e = split(index, p1s, INJECT_JS_END);
+ int p2s = split(index, p1e, INJECT_CSS_START);
+ int p2e = split(index, p2s, INJECT_CSS_END);
+ int p3s = split(index, p2e, null);
+
+ StreamEnumeration streams =
+ new StreamEnumeration(of(stream(index, 0, p1s),
+ includeJs(service),
+ stream(index, p1e, p2s),
+ includeCss(service),
+ stream(index, p2e, p3s)));
+
+ return Response.ok(new SequenceInputStream(streams)).build();
+ }
+
+ // Produces an input stream including CSS injections from all extensions.
+ private InputStream includeCss(UiExtensionService service) {
+ Builder<InputStream> builder = ImmutableList.builder();
+ service.getExtensions().forEach(ext -> add(builder, ext.css()));
+ return new SequenceInputStream(new StreamEnumeration(builder.build()));
+ }
+
+ // Produces an input stream including JS injections from all extensions.
+ private InputStream includeJs(UiExtensionService service) {
+ Builder<InputStream> builder = ImmutableList.builder();
+ service.getExtensions().forEach(ext -> add(builder, ext.js()));
+ return new SequenceInputStream(new StreamEnumeration(builder.build()));
+ }
+
+ // Safely adds the stream to the list builder only if stream is not null.
+ private void add(Builder<InputStream> builder, InputStream inputStream) {
+ if (inputStream != null) {
+ builder.add(inputStream);
+ }
+ }
+
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/MainModuleResource.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/MainModuleResource.java
new file mode 100644
index 00000000..42d1dff9
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/MainModuleResource.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ui.impl;
+
+import org.onosproject.rest.AbstractInjectionResource;
+import org.onosproject.ui.UiExtension;
+import org.onosproject.ui.UiExtensionService;
+import org.onosproject.ui.UiView;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Response;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.SequenceInputStream;
+
+import static com.google.common.collect.ImmutableList.of;
+import static com.google.common.io.ByteStreams.toByteArray;
+import static org.onosproject.ui.impl.MainViewResource.SCRIPT;
+
+/**
+ * Resource for serving the dynamically composed onos.js.
+ */
+@Path("/")
+public class MainModuleResource extends AbstractInjectionResource {
+
+ private static final String MAIN_JS = "onos.js";
+
+ private static final String INJECT_VIEW_IDS_START = "// {INJECTED-VIEW-IDS-START}";
+ private static final String INJECT_VIEW_IDS_END = "// {INJECTED-VIEW-IDS-END}";
+
+ @GET
+ @Produces(SCRIPT)
+ public Response getMainModule() throws IOException {
+ UiExtensionService service = get(UiExtensionService.class);
+ InputStream jsTemplate = getClass().getClassLoader().getResourceAsStream(MAIN_JS);
+ String js = new String(toByteArray(jsTemplate));
+
+ int p1s = split(js, 0, INJECT_VIEW_IDS_START);
+ int p1e = split(js, 0, INJECT_VIEW_IDS_END);
+ int p2s = split(js, p1e, null);
+
+ StreamEnumeration streams =
+ new StreamEnumeration(of(stream(js, 0, p1s),
+ includeViewIds(service),
+ stream(js, p1e, p2s)));
+
+ return Response.ok(new SequenceInputStream(streams)).build();
+ }
+
+ // Produces an input stream including view id injections from all extensions.
+ private InputStream includeViewIds(UiExtensionService service) {
+ StringBuilder sb = new StringBuilder("\n");
+ for (UiExtension extension : service.getExtensions()) {
+ for (UiView view : extension.views()) {
+ sb.append(" '").append(view.id()).append("',");
+ }
+ }
+ return new ByteArrayInputStream(sb.toString().getBytes());
+ }
+
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/MainNavResource.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/MainNavResource.java
new file mode 100644
index 00000000..7f0af3a5
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/MainNavResource.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ui.impl;
+
+import org.onosproject.rest.AbstractInjectionResource;
+import org.onosproject.ui.UiExtension;
+import org.onosproject.ui.UiExtensionService;
+import org.onosproject.ui.UiView;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.SequenceInputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.google.common.collect.ImmutableList.of;
+import static com.google.common.io.ByteStreams.toByteArray;
+
+/**
+ * Resource for serving the dynamically composed nav.html.
+ */
+@Path("/")
+public class MainNavResource extends AbstractInjectionResource {
+
+ private static final String NAV_HTML = "nav.html";
+
+ private static final String INJECT_VIEW_ITEMS_START =
+ "<!-- {INJECTED-VIEW-NAV-START} -->";
+ private static final String INJECT_VIEW_ITEMS_END =
+ "<!-- {INJECTED-VIEW-NAV-END} -->";
+
+ private static final String HDR_FORMAT =
+ "<div class=\"nav-hdr\">%s</div>\n";
+ private static final String NAV_FORMAT =
+ "<a ng-click=\"navCtrl.hideNav()\" href=\"#/%s\">%s %s</a>\n";
+
+ private static final String BLANK_GLYPH = "unknown";
+
+ @GET
+ @Produces(MediaType.TEXT_HTML)
+ public Response getNavigation() throws IOException {
+ UiExtensionService service = get(UiExtensionService.class);
+ InputStream navTemplate =
+ getClass().getClassLoader().getResourceAsStream(NAV_HTML);
+ String html = new String(toByteArray(navTemplate));
+
+ int p1s = split(html, 0, INJECT_VIEW_ITEMS_START);
+ int p1e = split(html, 0, INJECT_VIEW_ITEMS_END);
+ int p2s = split(html, p1e, null);
+
+ StreamEnumeration streams =
+ new StreamEnumeration(of(stream(html, 0, p1s),
+ includeNavItems(service),
+ stream(html, p1e, p2s)));
+
+ return Response.ok(new SequenceInputStream(streams)).build();
+ }
+
+ // Produces an input stream of nav item injections from all extensions.
+ private InputStream includeNavItems(UiExtensionService service) {
+ List<UiExtension> extensions = service.getExtensions();
+ StringBuilder sb = new StringBuilder("\n");
+
+ for (UiView.Category cat : UiView.Category.values()) {
+ if (cat == UiView.Category.HIDDEN) {
+ continue;
+ }
+
+ List<UiView> catViews = getViewsForCat(extensions, cat);
+ if (!catViews.isEmpty()) {
+ addCatHeader(sb, cat);
+ addCatItems(sb, catViews);
+ }
+ }
+
+ return new ByteArrayInputStream(sb.toString().getBytes());
+ }
+
+ private List<UiView> getViewsForCat(List<UiExtension> extensions,
+ UiView.Category cat) {
+ List<UiView> views = new ArrayList<>();
+ for (UiExtension extension : extensions) {
+ views.addAll(extension.views().stream().filter(
+ view -> cat.equals(view.category())
+ ).collect(Collectors.toList()));
+ }
+ return views;
+ }
+
+ private void addCatHeader(StringBuilder sb, UiView.Category cat) {
+ sb.append(String.format(HDR_FORMAT, cat.label()));
+ }
+
+ private void addCatItems(StringBuilder sb, List<UiView> catViews) {
+ for (UiView view : catViews) {
+ sb.append(String.format(NAV_FORMAT, view.id(), icon(view), view.label()));
+ }
+ }
+
+ private String icon(UiView view) {
+ String gid = view.iconId() == null ? BLANK_GLYPH : view.iconId();
+ return "<div icon icon-id=\"" + gid + "\"></div>";
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/MainViewResource.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/MainViewResource.java
new file mode 100644
index 00000000..130a7eab
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/MainViewResource.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ui.impl;
+
+import org.onosproject.rest.AbstractInjectionResource;
+import org.onosproject.ui.UiExtension;
+import org.onosproject.ui.UiExtensionService;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.Response;
+import java.io.IOException;
+
+import static javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM;
+import static javax.ws.rs.core.MediaType.TEXT_HTML;
+
+/**
+ * Resource for serving the dynamically composed onos.js.
+ */
+@Path("/")
+public class MainViewResource extends AbstractInjectionResource {
+
+ static final String CONTENT_TYPE = "Content-Type";
+ static final String STYLESHEET = "text/css";
+ static final String SCRIPT = "text/javascript";
+
+ @Path("{view}/{resource}")
+ @GET
+ public Response getViewResource(@PathParam("view") String viewId,
+ @PathParam("resource") String resource) throws IOException {
+ UiExtensionService service = get(UiExtensionService.class);
+ UiExtension extension = service.getViewExtension(viewId);
+ return extension != null ?
+ Response.ok(extension.resource(viewId, resource))
+ .header(CONTENT_TYPE, contentType(resource)).build() :
+ Response.status(Response.Status.NOT_FOUND).build();
+ }
+
+ static String contentType(String resource) {
+ return resource.endsWith(".html") ? TEXT_HTML :
+ resource.endsWith(".css") ? STYLESHEET :
+ resource.endsWith(".js") ? SCRIPT :
+ APPLICATION_OCTET_STREAM;
+ }
+
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/PortViewMessageHandler.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/PortViewMessageHandler.java
new file mode 100644
index 00000000..92ebcf75
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/PortViewMessageHandler.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.ui.impl;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.device.PortStatistics;
+import org.onosproject.ui.RequestHandler;
+import org.onosproject.ui.UiMessageHandler;
+import org.onosproject.ui.table.TableModel;
+import org.onosproject.ui.table.TableRequestHandler;
+
+import java.util.Collection;
+
+
+/**
+ * Message handler for port view related messages.
+ */
+public class PortViewMessageHandler extends UiMessageHandler {
+
+ private static final String PORT_DATA_REQ = "portDataRequest";
+ private static final String PORT_DATA_RESP = "portDataResponse";
+ private static final String PORTS = "ports";
+
+ private static final String ID = "id";
+ private static final String PKT_RX = "pkt_rx";
+ private static final String PKT_TX = "pkt_tx";
+ private static final String BYTES_RX = "bytes_rx";
+ private static final String BYTES_TX = "bytes_tx";
+ private static final String PKT_RX_DRP = "pkt_rx_drp";
+ private static final String PKT_TX_DRP = "pkt_tx_drp";
+ private static final String DURATION = "duration";
+
+ private static final String[] COL_IDS = {
+ ID, PKT_RX, PKT_TX, BYTES_RX, BYTES_TX,
+ PKT_RX_DRP, PKT_TX_DRP, DURATION
+ };
+
+ @Override
+ protected Collection<RequestHandler> createRequestHandlers() {
+ return ImmutableSet.of(new PortDataRequest());
+ }
+
+ // handler for port table requests
+ private final class PortDataRequest extends TableRequestHandler {
+
+ private PortDataRequest() {
+ super(PORT_DATA_REQ, PORT_DATA_RESP, PORTS);
+ }
+
+ @Override
+ protected String[] getColumnIds() {
+ return COL_IDS;
+ }
+
+ @Override
+ protected void populateTable(TableModel tm, ObjectNode payload) {
+ String uri = string(payload, "devId");
+ if (!Strings.isNullOrEmpty(uri)) {
+ DeviceId deviceId = DeviceId.deviceId(uri);
+ DeviceService ds = get(DeviceService.class);
+ for (PortStatistics stat : ds.getPortStatistics(deviceId)) {
+ populateRow(tm.addRow(), stat);
+ }
+ }
+ }
+
+ private void populateRow(TableModel.Row row, PortStatistics stat) {
+ row.cell(ID, stat.port())
+ .cell(PKT_RX, stat.packetsReceived())
+ .cell(PKT_TX, stat.packetsSent())
+ .cell(BYTES_RX, stat.bytesReceived())
+ .cell(BYTES_TX, stat.bytesSent())
+ .cell(PKT_RX_DRP, stat.packetsRxDropped())
+ .cell(PKT_TX_DRP, stat.packetsTxDropped())
+ .cell(DURATION, stat.durationSec());
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/SettingsViewMessageHandler.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/SettingsViewMessageHandler.java
new file mode 100644
index 00000000..ed413fab
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/SettingsViewMessageHandler.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ui.impl;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.ImmutableSet;
+import org.onosproject.cfg.ComponentConfigService;
+import org.onosproject.cfg.ConfigProperty;
+import org.onosproject.ui.RequestHandler;
+import org.onosproject.ui.UiMessageHandler;
+import org.onosproject.ui.table.TableModel;
+import org.onosproject.ui.table.TableRequestHandler;
+
+import java.util.Collection;
+
+/**
+ * Message handler for component configuration view related messages.
+ */
+public class SettingsViewMessageHandler extends UiMessageHandler {
+
+ private static final String DATA_REQUEST = "settingDataRequest";
+ private static final String DATA_RESPONSE = "settingDataResponse";
+ private static final String SETTINGS = "settings";
+
+ private static final String COMPONENT = "component";
+ private static final String ID = "id";
+ private static final String TYPE = "type";
+ private static final String VALUE = "value";
+ private static final String DEFAULT = "defValue";
+ private static final String DESC = "desc";
+
+ private static final String[] COL_IDS = {
+ COMPONENT, ID, TYPE, VALUE, DEFAULT, DESC
+ };
+
+ @Override
+ protected Collection<RequestHandler> createRequestHandlers() {
+ return ImmutableSet.of(new SettingsRequest());
+ }
+
+ // handler for host table requests
+ private final class SettingsRequest extends TableRequestHandler {
+ private SettingsRequest() {
+ super(DATA_REQUEST, DATA_RESPONSE, SETTINGS);
+ }
+
+ @Override
+ protected String[] getColumnIds() {
+ return COL_IDS;
+ }
+
+ @Override
+ protected String defaultColumnId() {
+ return COMPONENT;
+ }
+
+ @Override
+ protected TableModel createTableModel() {
+ TableModel tm = super.createTableModel();
+ return tm;
+ }
+
+ @Override
+ protected void populateTable(TableModel tm, ObjectNode payload) {
+ ComponentConfigService ccs = get(ComponentConfigService.class);
+ for (String component : ccs.getComponentNames()) {
+ for (ConfigProperty prop : ccs.getProperties(component)) {
+ populateRow(tm.addRow(), component, prop);
+ }
+ }
+ }
+
+ private void populateRow(TableModel.Row row, String component, ConfigProperty prop) {
+ row.cell(COMPONENT, component)
+ .cell(ID, prop.name())
+ .cell(TYPE, prop.type().toString().toLowerCase())
+ .cell(VALUE, prop.value())
+ .cell(DEFAULT, prop.defaultValue())
+ .cell(DESC, prop.description());
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/SpriteService.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/SpriteService.java
new file mode 100644
index 00000000..7312329c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/SpriteService.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ui.impl;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+import java.util.Set;
+
+/**
+ * Provisional service to keep track of the topology view sprite definitions.
+ */
+public interface SpriteService {
+
+ /**
+ * Returns set of registered sprite definition names.
+ *
+ * @return set of sprite definition names
+ */
+ Set<String> getNames();
+
+ /**
+ * Registers sprite data under the specified name.
+ *
+ * @param name sprite definition name
+ * @param spriteData sprite data
+ */
+ void put(String name, JsonNode spriteData);
+
+ /**
+ * Returns the sprite definition registered under the given name.
+ *
+ * @param name sprite definition name
+ * @return sprite data
+ */
+ JsonNode get(String name);
+
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TopoOverlayCache.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TopoOverlayCache.java
new file mode 100644
index 00000000..99557c2d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TopoOverlayCache.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.onosproject.ui.impl;
+
+import org.onosproject.ui.UiTopoOverlay;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static com.google.common.base.Strings.isNullOrEmpty;
+
+/**
+ * A cache of {@link org.onosproject.ui.UiTopoOverlay}'s that were registered
+ * at the time the UI connection was established.
+ */
+public class TopoOverlayCache {
+
+ private static final String EMPTY = "";
+ private static final UiTopoOverlay NONE = new NullOverlay();
+
+ private final Map<String, UiTopoOverlay> overlays = new HashMap<>();
+ private UiTopoOverlay current = NONE;
+
+ public TopoOverlayCache() {
+ overlays.put(null, NONE);
+ }
+
+ /**
+ * Adds a topology overlay to the cache.
+ *
+ * @param overlay a topology overlay
+ */
+ public void add(UiTopoOverlay overlay) {
+ overlays.put(overlay.id(), overlay);
+ }
+
+ /**
+ * Invoked when the cache is no longer needed.
+ */
+ public void destroy() {
+ overlays.clear();
+ }
+
+ /**
+ * Switching currently selected overlay.
+ *
+ * @param deact identity of overlay to deactivate
+ * @param act identity of overlay to activate
+ */
+ public void switchOverlay(String deact, String act) {
+ UiTopoOverlay toDeactivate = getOverlay(deact);
+ UiTopoOverlay toActivate = getOverlay(act);
+
+ toDeactivate.deactivate();
+ current = toActivate;
+ current.activate();
+ }
+
+ private UiTopoOverlay getOverlay(String id) {
+ return isNullOrEmpty(id) ? NONE : overlays.get(id);
+ }
+
+ /**
+ * Returns the current overlay instance.
+ * Note that this method always returns a reference; when there is no
+ * overlay selected the "NULL" overlay instance is returned.
+ *
+ * @return the current overlay
+ */
+ public UiTopoOverlay currentOverlay() {
+ return current;
+ }
+
+ /**
+ * Returns the number of overlays in the cache. Remember that this
+ * includes the "NULL" overlay, representing "no overlay selected".
+ *
+ * @return number of overlays
+ */
+ public int size() {
+ return overlays.size();
+ }
+
+ /**
+ * Returns true if the identifier of the currently active overlay
+ * matches the given parameter.
+ *
+ * @param overlayId overlay identifier
+ * @return true if this matches the ID of currently active overlay
+ */
+ public boolean isActive(String overlayId) {
+ return currentOverlay().id().equals(overlayId);
+ }
+
+ // overlay instance representing "no overlay selected"
+ private static class NullOverlay extends UiTopoOverlay {
+ public NullOverlay() {
+ super(EMPTY);
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TopologyResource.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TopologyResource.java
new file mode 100644
index 00000000..30960911
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TopologyResource.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2014-2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ui.impl;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onlab.rest.BaseResource;
+import org.slf4j.Logger;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Response;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Topology viewer resource.
+ */
+@Path("topology")
+public class TopologyResource extends BaseResource {
+
+ private static final Logger log = getLogger(TopologyResource.class);
+
+ private final ObjectMapper mapper = new ObjectMapper();
+
+ @Path("geoloc")
+ @GET
+ @Produces("application/json")
+ public Response getGeoLocations() {
+ ObjectNode rootNode = mapper.createObjectNode();
+ ArrayNode devices = mapper.createArrayNode();
+ ArrayNode hosts = mapper.createArrayNode();
+
+ Map<String, ObjectNode> metaUi = TopologyViewMessageHandler.getMetaUi();
+ for (String id : metaUi.keySet()) {
+ ObjectNode memento = metaUi.get(id);
+ if (id.length() > 17 && id.charAt(17) == '/') {
+ addGeoData(hosts, "id", id, memento);
+ } else {
+ addGeoData(devices, "uri", id, memento);
+ }
+ }
+
+ rootNode.set("devices", devices);
+ rootNode.set("hosts", hosts);
+ return Response.ok(rootNode.toString()).build();
+ }
+
+ private void addGeoData(ArrayNode array, String idField, String id,
+ ObjectNode memento) {
+ ObjectNode node = mapper.createObjectNode().put(idField, id);
+ ObjectNode annot = mapper.createObjectNode();
+ node.set("annotations", annot);
+ try {
+ annot.put("latitude", memento.get("lat").asDouble())
+ .put("longitude", memento.get("lng").asDouble());
+ array.add(node);
+ } catch (Exception e) {
+ log.debug("Skipping geo entry");
+ }
+ }
+
+ @Path("sprites")
+ @POST
+ @Consumes("application/json")
+ public Response setSprites(InputStream stream) throws IOException {
+ JsonNode root = mapper.readTree(stream);
+ String name = root.path("defn_name").asText("sprites");
+ get(SpriteService.class).put(name, root);
+ return Response.ok().build();
+ }
+
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandler.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandler.java
new file mode 100644
index 00000000..8acdc2cf
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandler.java
@@ -0,0 +1,781 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ui.impl;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.ImmutableSet;
+import org.onlab.osgi.ServiceDirectory;
+import org.onlab.util.AbstractAccumulator;
+import org.onlab.util.Accumulator;
+import org.onosproject.cluster.ClusterEvent;
+import org.onosproject.cluster.ClusterEventListener;
+import org.onosproject.cluster.ControllerNode;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.event.Event;
+import org.onosproject.mastership.MastershipAdminService;
+import org.onosproject.mastership.MastershipEvent;
+import org.onosproject.mastership.MastershipListener;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.Device;
+import org.onosproject.net.Host;
+import org.onosproject.net.HostId;
+import org.onosproject.net.HostLocation;
+import org.onosproject.net.Link;
+import org.onosproject.net.device.DeviceEvent;
+import org.onosproject.net.device.DeviceListener;
+import org.onosproject.net.flow.DefaultTrafficSelector;
+import org.onosproject.net.flow.DefaultTrafficTreatment;
+import org.onosproject.net.flow.FlowRuleEvent;
+import org.onosproject.net.flow.FlowRuleListener;
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.host.HostEvent;
+import org.onosproject.net.host.HostListener;
+import org.onosproject.net.intent.HostToHostIntent;
+import org.onosproject.net.intent.IntentEvent;
+import org.onosproject.net.intent.IntentListener;
+import org.onosproject.net.intent.MultiPointToSinglePointIntent;
+import org.onosproject.net.link.LinkEvent;
+import org.onosproject.net.link.LinkListener;
+import org.onosproject.ui.RequestHandler;
+import org.onosproject.ui.UiConnection;
+import org.onosproject.ui.impl.TrafficMonitor.Mode;
+import org.onosproject.ui.topo.Highlights;
+import org.onosproject.ui.topo.NodeSelection;
+import org.onosproject.ui.topo.PropertyPanel;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.ExecutorService;
+
+import static java.util.concurrent.Executors.newSingleThreadExecutor;
+import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.cluster.ClusterEvent.Type.INSTANCE_ADDED;
+import static org.onosproject.net.DeviceId.deviceId;
+import static org.onosproject.net.HostId.hostId;
+import static org.onosproject.net.device.DeviceEvent.Type.*;
+import static org.onosproject.net.host.HostEvent.Type.HOST_ADDED;
+import static org.onosproject.net.link.LinkEvent.Type.LINK_ADDED;
+import static org.onosproject.ui.JsonUtils.envelope;
+import static org.onosproject.ui.topo.TopoJson.highlightsMessage;
+import static org.onosproject.ui.topo.TopoJson.json;
+
+/**
+ * Web socket capable of interacting with the GUI topology view.
+ */
+public class TopologyViewMessageHandler extends TopologyViewMessageHandlerBase {
+
+ // incoming event types
+ private static final String REQ_DETAILS = "requestDetails";
+ private static final String UPDATE_META = "updateMeta";
+ private static final String ADD_HOST_INTENT = "addHostIntent";
+ private static final String ADD_MULTI_SRC_INTENT = "addMultiSourceIntent";
+ private static final String REQ_RELATED_INTENTS = "requestRelatedIntents";
+ private static final String REQ_NEXT_INTENT = "requestNextRelatedIntent";
+ private static final String REQ_PREV_INTENT = "requestPrevRelatedIntent";
+ private static final String REQ_SEL_INTENT_TRAFFIC = "requestSelectedIntentTraffic";
+ private static final String REQ_ALL_FLOW_TRAFFIC = "requestAllFlowTraffic";
+ private static final String REQ_ALL_PORT_TRAFFIC = "requestAllPortTraffic";
+ private static final String REQ_DEV_LINK_FLOWS = "requestDeviceLinkFlows";
+ private static final String CANCEL_TRAFFIC = "cancelTraffic";
+ private static final String REQ_SUMMARY = "requestSummary";
+ private static final String CANCEL_SUMMARY = "cancelSummary";
+ private static final String EQ_MASTERS = "equalizeMasters";
+ private static final String SPRITE_LIST_REQ = "spriteListRequest";
+ private static final String SPRITE_DATA_REQ = "spriteDataRequest";
+ private static final String TOPO_START = "topoStart";
+ private static final String TOPO_HEARTBEAT = "topoHeartbeat";
+ private static final String TOPO_SELECT_OVERLAY = "topoSelectOverlay";
+ private static final String TOPO_STOP = "topoStop";
+
+ // outgoing event types
+ private static final String SHOW_SUMMARY = "showSummary";
+ private static final String SHOW_DETAILS = "showDetails";
+ private static final String SPRITE_LIST_RESPONSE = "spriteListResponse";
+ private static final String SPRITE_DATA_RESPONSE = "spriteDataResponse";
+ private static final String UPDATE_INSTANCE = "updateInstance";
+
+ // fields
+ private static final String ID = "id";
+ private static final String DEVICE = "device";
+ private static final String HOST = "host";
+ private static final String CLASS = "class";
+ private static final String UNKNOWN = "unknown";
+ private static final String ONE = "one";
+ private static final String TWO = "two";
+ private static final String SRC = "src";
+ private static final String DST = "dst";
+ private static final String DATA = "data";
+ private static final String NAME = "name";
+ private static final String NAMES = "names";
+ private static final String ACTIVATE = "activate";
+ private static final String DEACTIVATE = "deactivate";
+
+
+ private static final String APP_ID = "org.onosproject.gui";
+
+ private static final long TRAFFIC_PERIOD = 5000;
+ private static final long SUMMARY_PERIOD = 30000;
+
+ private static final Comparator<? super ControllerNode> NODE_COMPARATOR =
+ (o1, o2) -> o1.id().toString().compareTo(o2.id().toString());
+
+
+ private final Timer timer = new Timer("onos-topology-view");
+
+ private static final int MAX_EVENTS = 1000;
+ private static final int MAX_BATCH_MS = 5000;
+ private static final int MAX_IDLE_MS = 1000;
+
+ private ApplicationId appId;
+
+ private final ClusterEventListener clusterListener = new InternalClusterListener();
+ private final MastershipListener mastershipListener = new InternalMastershipListener();
+ private final DeviceListener deviceListener = new InternalDeviceListener();
+ private final LinkListener linkListener = new InternalLinkListener();
+ private final HostListener hostListener = new InternalHostListener();
+ private final IntentListener intentListener = new InternalIntentListener();
+ private final FlowRuleListener flowListener = new InternalFlowListener();
+
+ private final Accumulator<Event> eventAccummulator = new InternalEventAccummulator();
+ private final ExecutorService msgSender =
+ newSingleThreadExecutor(groupedThreads("onos/gui", "msg-sender"));
+
+ private TopoOverlayCache overlayCache;
+ private TrafficMonitor traffic;
+
+ private TimerTask summaryTask = null;
+ private boolean summaryRunning = false;
+
+ private boolean listenersRemoved = false;
+
+
+ @Override
+ public void init(UiConnection connection, ServiceDirectory directory) {
+ super.init(connection, directory);
+ appId = directory.get(CoreService.class).registerApplication(APP_ID);
+ traffic = new TrafficMonitor(TRAFFIC_PERIOD, servicesBundle, this);
+ }
+
+ @Override
+ public void destroy() {
+ cancelAllRequests();
+ removeListeners();
+ super.destroy();
+ }
+
+ @Override
+ protected Collection<RequestHandler> createRequestHandlers() {
+ return ImmutableSet.of(
+ new TopoStart(),
+ new TopoHeartbeat(),
+ new TopoSelectOverlay(),
+ new TopoStop(),
+ new ReqSummary(),
+ new CancelSummary(),
+ new SpriteListReq(),
+ new SpriteDataReq(),
+ new RequestDetails(),
+ new UpdateMeta(),
+ new EqMasters(),
+
+ // TODO: migrate traffic related to separate app
+ new AddHostIntent(),
+ new AddMultiSourceIntent(),
+
+ new ReqAllFlowTraffic(),
+ new ReqAllPortTraffic(),
+ new ReqDevLinkFlows(),
+ new ReqRelatedIntents(),
+ new ReqNextIntent(),
+ new ReqPrevIntent(),
+ new ReqSelectedIntentTraffic(),
+
+ new CancelTraffic()
+ );
+ }
+
+ /**
+ * Injects the topology overlay cache.
+ *
+ * @param overlayCache injected cache
+ */
+ void setOverlayCache(TopoOverlayCache overlayCache) {
+ this.overlayCache = overlayCache;
+ }
+
+ // ==================================================================
+
+ private final class TopoStart extends RequestHandler {
+ private TopoStart() {
+ super(TOPO_START);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ addListeners();
+ sendAllInstances(null);
+ sendAllDevices();
+ sendAllLinks();
+ sendAllHosts();
+ }
+ }
+
+ private final class TopoHeartbeat extends RequestHandler {
+ private TopoHeartbeat() {
+ super(TOPO_HEARTBEAT);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ // place holder for now
+ }
+ }
+
+ private final class TopoSelectOverlay extends RequestHandler {
+ private TopoSelectOverlay() {
+ super(TOPO_SELECT_OVERLAY);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ String deact = string(payload, DEACTIVATE);
+ String act = string(payload, ACTIVATE);
+ overlayCache.switchOverlay(deact, act);
+ }
+ }
+
+ private final class TopoStop extends RequestHandler {
+ private TopoStop() {
+ super(TOPO_STOP);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ stopSummaryMonitoring();
+ traffic.stopMonitoring();
+ }
+ }
+
+ private final class ReqSummary extends RequestHandler {
+ private ReqSummary() {
+ super(REQ_SUMMARY);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ requestSummary(sid);
+ startSummaryMonitoring();
+ }
+ }
+
+ private final class CancelSummary extends RequestHandler {
+ private CancelSummary() {
+ super(CANCEL_SUMMARY);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ stopSummaryMonitoring();
+ }
+ }
+
+ private final class SpriteListReq extends RequestHandler {
+ private SpriteListReq() {
+ super(SPRITE_LIST_REQ);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ ObjectNode root = objectNode();
+ ArrayNode names = arrayNode();
+ get(SpriteService.class).getNames().forEach(names::add);
+ root.set(NAMES, names);
+ sendMessage(SPRITE_LIST_RESPONSE, sid, root);
+ }
+ }
+
+ private final class SpriteDataReq extends RequestHandler {
+ private SpriteDataReq() {
+ super(SPRITE_DATA_REQ);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ String name = string(payload, NAME);
+ ObjectNode root = objectNode();
+ root.set(DATA, get(SpriteService.class).get(name));
+ sendMessage(SPRITE_DATA_RESPONSE, sid, root);
+ }
+ }
+
+ private final class RequestDetails extends RequestHandler {
+ private RequestDetails() {
+ super(REQ_DETAILS);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ String type = string(payload, CLASS, UNKNOWN);
+ String id = string(payload, ID);
+ PropertyPanel pp = null;
+
+ if (type.equals(DEVICE)) {
+ pp = deviceDetails(deviceId(id), sid);
+ overlayCache.currentOverlay().modifyDeviceDetails(pp);
+ } else if (type.equals(HOST)) {
+ pp = hostDetails(hostId(id), sid);
+ overlayCache.currentOverlay().modifyHostDetails(pp);
+ }
+
+ sendMessage(envelope(SHOW_DETAILS, sid, json(pp)));
+ }
+ }
+
+ private final class UpdateMeta extends RequestHandler {
+ private UpdateMeta() {
+ super(UPDATE_META);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ updateMetaUi(payload);
+ }
+ }
+
+ private final class EqMasters extends RequestHandler {
+ private EqMasters() {
+ super(EQ_MASTERS);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ directory.get(MastershipAdminService.class).balanceRoles();
+ }
+ }
+
+
+ // ========= -----------------------------------------------------------------
+
+ // === TODO: move traffic related classes to traffic app
+
+ private final class AddHostIntent extends RequestHandler {
+ private AddHostIntent() {
+ super(ADD_HOST_INTENT);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ // TODO: add protection against device ids and non-existent hosts.
+ HostId one = hostId(string(payload, ONE));
+ HostId two = hostId(string(payload, TWO));
+
+ HostToHostIntent intent = HostToHostIntent.builder()
+ .appId(appId)
+ .one(one)
+ .two(two)
+ .build();
+
+ intentService.submit(intent);
+ if (overlayCache.isActive(TrafficOverlay.TRAFFIC_ID)) {
+ traffic.monitor(intent);
+ }
+ }
+ }
+
+ private final class AddMultiSourceIntent extends RequestHandler {
+ private AddMultiSourceIntent() {
+ super(ADD_MULTI_SRC_INTENT);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ // TODO: add protection against device ids and non-existent hosts.
+ Set<HostId> src = getHostIds((ArrayNode) payload.path(SRC));
+ HostId dst = hostId(string(payload, DST));
+ Host dstHost = hostService.getHost(dst);
+
+ Set<ConnectPoint> ingressPoints = getHostLocations(src);
+
+ // FIXME: clearly, this is not enough
+ TrafficSelector selector = DefaultTrafficSelector.builder()
+ .matchEthDst(dstHost.mac()).build();
+ TrafficTreatment treatment = DefaultTrafficTreatment.emptyTreatment();
+
+ MultiPointToSinglePointIntent intent =
+ MultiPointToSinglePointIntent.builder()
+ .appId(appId)
+ .selector(selector)
+ .treatment(treatment)
+ .ingressPoints(ingressPoints)
+ .egressPoint(dstHost.location())
+ .build();
+
+ intentService.submit(intent);
+ if (overlayCache.isActive(TrafficOverlay.TRAFFIC_ID)) {
+ traffic.monitor(intent);
+ }
+ }
+ }
+
+ // ========= -----------------------------------------------------------------
+
+ private final class ReqAllFlowTraffic extends RequestHandler {
+ private ReqAllFlowTraffic() {
+ super(REQ_ALL_FLOW_TRAFFIC);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ traffic.monitor(Mode.ALL_FLOW_TRAFFIC);
+ }
+ }
+
+ private final class ReqAllPortTraffic extends RequestHandler {
+ private ReqAllPortTraffic() {
+ super(REQ_ALL_PORT_TRAFFIC);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ traffic.monitor(Mode.ALL_PORT_TRAFFIC);
+ }
+ }
+
+ private final class ReqDevLinkFlows extends RequestHandler {
+ private ReqDevLinkFlows() {
+ super(REQ_DEV_LINK_FLOWS);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ NodeSelection nodeSelection =
+ new NodeSelection(payload, deviceService, hostService);
+ traffic.monitor(Mode.DEV_LINK_FLOWS, nodeSelection);
+ }
+ }
+
+ private final class ReqRelatedIntents extends RequestHandler {
+ private ReqRelatedIntents() {
+ super(REQ_RELATED_INTENTS);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ NodeSelection nodeSelection =
+ new NodeSelection(payload, deviceService, hostService);
+ traffic.monitor(Mode.RELATED_INTENTS, nodeSelection);
+ }
+ }
+
+ private final class ReqNextIntent extends RequestHandler {
+ private ReqNextIntent() {
+ super(REQ_NEXT_INTENT);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ traffic.selectNextIntent();
+ }
+ }
+
+ private final class ReqPrevIntent extends RequestHandler {
+ private ReqPrevIntent() {
+ super(REQ_PREV_INTENT);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ traffic.selectPreviousIntent();
+ }
+ }
+
+ private final class ReqSelectedIntentTraffic extends RequestHandler {
+ private ReqSelectedIntentTraffic() {
+ super(REQ_SEL_INTENT_TRAFFIC);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ traffic.monitor(Mode.SELECTED_INTENT);
+ }
+ }
+
+ private final class CancelTraffic extends RequestHandler {
+ private CancelTraffic() {
+ super(CANCEL_TRAFFIC);
+ }
+
+ @Override
+ public void process(long sid, ObjectNode payload) {
+ traffic.stopMonitoring();
+ }
+ }
+
+ //=======================================================================
+
+ // Converts highlights to JSON format and sends the message to the client
+ protected void sendHighlights(Highlights highlights) {
+ sendMessage(highlightsMessage(highlights));
+ }
+
+ // Subscribes for summary messages.
+ private synchronized void requestSummary(long sid) {
+ PropertyPanel pp = summmaryMessage(sid);
+ overlayCache.currentOverlay().modifySummary(pp);
+ sendMessage(envelope(SHOW_SUMMARY, sid, json(pp)));
+ }
+
+
+ private void cancelAllRequests() {
+ stopSummaryMonitoring();
+ traffic.stopMonitoring();
+ }
+
+ // Sends all controller nodes to the client as node-added messages.
+ private void sendAllInstances(String messageType) {
+ List<ControllerNode> nodes = new ArrayList<>(clusterService.getNodes());
+ Collections.sort(nodes, NODE_COMPARATOR);
+ for (ControllerNode node : nodes) {
+ sendMessage(instanceMessage(new ClusterEvent(INSTANCE_ADDED, node),
+ messageType));
+ }
+ }
+
+ // Sends all devices to the client as device-added messages.
+ private void sendAllDevices() {
+ // Send optical first, others later for layered rendering
+ for (Device device : deviceService.getDevices()) {
+ if (device.type() == Device.Type.ROADM) {
+ sendMessage(deviceMessage(new DeviceEvent(DEVICE_ADDED, device)));
+ }
+ }
+ for (Device device : deviceService.getDevices()) {
+ if (device.type() != Device.Type.ROADM) {
+ sendMessage(deviceMessage(new DeviceEvent(DEVICE_ADDED, device)));
+ }
+ }
+ }
+
+ // Sends all links to the client as link-added messages.
+ private void sendAllLinks() {
+ // Send optical first, others later for layered rendering
+ for (Link link : linkService.getLinks()) {
+ if (link.type() == Link.Type.OPTICAL) {
+ sendMessage(linkMessage(new LinkEvent(LINK_ADDED, link)));
+ }
+ }
+ for (Link link : linkService.getLinks()) {
+ if (link.type() != Link.Type.OPTICAL) {
+ sendMessage(linkMessage(new LinkEvent(LINK_ADDED, link)));
+ }
+ }
+ }
+
+ // Sends all hosts to the client as host-added messages.
+ private void sendAllHosts() {
+ for (Host host : hostService.getHosts()) {
+ sendMessage(hostMessage(new HostEvent(HOST_ADDED, host)));
+ }
+ }
+
+ private Set<ConnectPoint> getHostLocations(Set<HostId> hostIds) {
+ Set<ConnectPoint> points = new HashSet<>();
+ for (HostId hostId : hostIds) {
+ points.add(getHostLocation(hostId));
+ }
+ return points;
+ }
+
+ private HostLocation getHostLocation(HostId hostId) {
+ return hostService.getHost(hostId).location();
+ }
+
+ // Produces a list of host ids from the specified JSON array.
+ private Set<HostId> getHostIds(ArrayNode ids) {
+ Set<HostId> hostIds = new HashSet<>();
+ for (JsonNode id : ids) {
+ hostIds.add(hostId(id.asText()));
+ }
+ return hostIds;
+ }
+
+
+ private synchronized void startSummaryMonitoring() {
+ stopSummaryMonitoring();
+ summaryTask = new SummaryMonitor();
+ timer.schedule(summaryTask, SUMMARY_PERIOD, SUMMARY_PERIOD);
+ summaryRunning = true;
+ }
+
+ private synchronized void stopSummaryMonitoring() {
+ if (summaryTask != null) {
+ summaryTask.cancel();
+ summaryTask = null;
+ }
+ summaryRunning = false;
+ }
+
+
+ // Adds all internal listeners.
+ private synchronized void addListeners() {
+ listenersRemoved = false;
+ clusterService.addListener(clusterListener);
+ mastershipService.addListener(mastershipListener);
+ deviceService.addListener(deviceListener);
+ linkService.addListener(linkListener);
+ hostService.addListener(hostListener);
+ intentService.addListener(intentListener);
+ flowService.addListener(flowListener);
+ }
+
+ // Removes all internal listeners.
+ private synchronized void removeListeners() {
+ if (!listenersRemoved) {
+ listenersRemoved = true;
+ clusterService.removeListener(clusterListener);
+ mastershipService.removeListener(mastershipListener);
+ deviceService.removeListener(deviceListener);
+ linkService.removeListener(linkListener);
+ hostService.removeListener(hostListener);
+ intentService.removeListener(intentListener);
+ flowService.removeListener(flowListener);
+ }
+ }
+
+ // Cluster event listener.
+ private class InternalClusterListener implements ClusterEventListener {
+ @Override
+ public void event(ClusterEvent event) {
+ msgSender.execute(() -> sendMessage(instanceMessage(event, null)));
+ }
+ }
+
+ // Mastership change listener
+ private class InternalMastershipListener implements MastershipListener {
+ @Override
+ public void event(MastershipEvent event) {
+ msgSender.execute(() -> {
+ sendAllInstances(UPDATE_INSTANCE);
+ Device device = deviceService.getDevice(event.subject());
+ if (device != null) {
+ sendMessage(deviceMessage(new DeviceEvent(DEVICE_UPDATED, device)));
+ }
+ });
+ }
+ }
+
+ // Device event listener.
+ private class InternalDeviceListener implements DeviceListener {
+ @Override
+ public void event(DeviceEvent event) {
+ if (event.type() != PORT_STATS_UPDATED) {
+ msgSender.execute(() -> sendMessage(deviceMessage(event)));
+ eventAccummulator.add(event);
+ }
+ }
+ }
+
+ // Link event listener.
+ private class InternalLinkListener implements LinkListener {
+ @Override
+ public void event(LinkEvent event) {
+ msgSender.execute(() -> sendMessage(linkMessage(event)));
+ eventAccummulator.add(event);
+ }
+ }
+
+ // Host event listener.
+ private class InternalHostListener implements HostListener {
+ @Override
+ public void event(HostEvent event) {
+ msgSender.execute(() -> sendMessage(hostMessage(event)));
+ eventAccummulator.add(event);
+ }
+ }
+
+ // Intent event listener.
+ private class InternalIntentListener implements IntentListener {
+ @Override
+ public void event(IntentEvent event) {
+ msgSender.execute(traffic::pokeIntent);
+ eventAccummulator.add(event);
+ }
+ }
+
+ // Intent event listener.
+ private class InternalFlowListener implements FlowRuleListener {
+ @Override
+ public void event(FlowRuleEvent event) {
+ eventAccummulator.add(event);
+ }
+ }
+
+
+ // === SUMMARY MONITORING
+
+ // Periodic update of the summary information
+ private class SummaryMonitor extends TimerTask {
+ @Override
+ public void run() {
+ try {
+ if (summaryRunning) {
+ msgSender.execute(() -> requestSummary(0));
+ }
+ } catch (Exception e) {
+ log.warn("Unable to handle summary request due to {}", e.getMessage());
+ log.warn("Boom!", e);
+ }
+ }
+ }
+
+ // Accumulates events to drive methodic update of the summary pane.
+ private class InternalEventAccummulator extends AbstractAccumulator<Event> {
+ protected InternalEventAccummulator() {
+ super(new Timer("topo-summary"), MAX_EVENTS, MAX_BATCH_MS, MAX_IDLE_MS);
+ }
+
+ @Override
+ public void processItems(List<Event> items) {
+ // Start-of-Debugging -- Keep in until ONOS-2572 is fixed for reals
+ long now = System.currentTimeMillis();
+ String me = this.toString();
+ String miniMe = me.replaceAll("^.*@", "me@");
+ log.debug("Time: {}; this: {}, processing items ({} events)",
+ now, miniMe, items.size());
+ // End-of-Debugging
+
+ try {
+ if (summaryRunning) {
+ msgSender.execute(() -> requestSummary(0));
+ }
+ } catch (Exception e) {
+ log.warn("Unable to handle summary request due to {}", e.getMessage());
+ log.debug("Boom!", e);
+ }
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java
new file mode 100644
index 00000000..840e89f3
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TopologyViewMessageHandlerBase.java
@@ -0,0 +1,509 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ui.impl;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onlab.osgi.ServiceDirectory;
+import org.onlab.packet.IpAddress;
+import org.onosproject.cluster.ClusterEvent;
+import org.onosproject.cluster.ClusterService;
+import org.onosproject.cluster.ControllerNode;
+import org.onosproject.cluster.NodeId;
+import org.onosproject.core.CoreService;
+import org.onosproject.incubator.net.PortStatisticsService;
+import org.onosproject.incubator.net.tunnel.OpticalTunnelEndPoint;
+import org.onosproject.incubator.net.tunnel.Tunnel;
+import org.onosproject.incubator.net.tunnel.TunnelService;
+import org.onosproject.mastership.MastershipService;
+import org.onosproject.net.Annotated;
+import org.onosproject.net.AnnotationKeys;
+import org.onosproject.net.Annotations;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DefaultEdgeLink;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.EdgeLink;
+import org.onosproject.net.Host;
+import org.onosproject.net.HostId;
+import org.onosproject.net.HostLocation;
+import org.onosproject.net.Link;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.device.DeviceEvent;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.flow.FlowEntry;
+import org.onosproject.net.flow.FlowRuleService;
+import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.flow.instructions.Instruction;
+import org.onosproject.net.flow.instructions.Instructions.OutputInstruction;
+import org.onosproject.net.host.HostEvent;
+import org.onosproject.net.host.HostService;
+import org.onosproject.net.intent.IntentService;
+import org.onosproject.net.link.LinkEvent;
+import org.onosproject.net.link.LinkService;
+import org.onosproject.net.provider.ProviderId;
+import org.onosproject.net.statistic.StatisticService;
+import org.onosproject.net.topology.Topology;
+import org.onosproject.net.topology.TopologyService;
+import org.onosproject.ui.JsonUtils;
+import org.onosproject.ui.UiConnection;
+import org.onosproject.ui.UiMessageHandler;
+import org.onosproject.ui.impl.topo.ServicesBundle;
+import org.onosproject.ui.topo.PropertyPanel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Strings.isNullOrEmpty;
+import static org.onosproject.cluster.ClusterEvent.Type.INSTANCE_ADDED;
+import static org.onosproject.cluster.ClusterEvent.Type.INSTANCE_REMOVED;
+import static org.onosproject.cluster.ControllerNode.State.ACTIVE;
+import static org.onosproject.net.DefaultEdgeLink.createEdgeLink;
+import static org.onosproject.net.PortNumber.portNumber;
+import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_ADDED;
+import static org.onosproject.net.device.DeviceEvent.Type.DEVICE_REMOVED;
+import static org.onosproject.net.host.HostEvent.Type.HOST_ADDED;
+import static org.onosproject.net.host.HostEvent.Type.HOST_REMOVED;
+import static org.onosproject.net.link.LinkEvent.Type.LINK_ADDED;
+import static org.onosproject.net.link.LinkEvent.Type.LINK_REMOVED;
+import static org.onosproject.ui.topo.TopoConstants.CoreButtons;
+import static org.onosproject.ui.topo.TopoConstants.Properties;
+import static org.onosproject.ui.topo.TopoUtils.compactLinkString;
+
+/**
+ * Facility for creating messages bound for the topology viewer.
+ */
+public abstract class TopologyViewMessageHandlerBase extends UiMessageHandler {
+
+ protected static final Logger log =
+ LoggerFactory.getLogger(TopologyViewMessageHandlerBase.class);
+
+ private static final ProviderId PID =
+ new ProviderId("core", "org.onosproject.core", true);
+
+ protected static final String SHOW_HIGHLIGHTS = "showHighlights";
+
+ protected ServiceDirectory directory;
+ protected ClusterService clusterService;
+ protected DeviceService deviceService;
+ protected LinkService linkService;
+ protected HostService hostService;
+ protected MastershipService mastershipService;
+ protected IntentService intentService;
+ protected FlowRuleService flowService;
+ protected StatisticService flowStatsService;
+ protected PortStatisticsService portStatsService;
+ protected TopologyService topologyService;
+ protected TunnelService tunnelService;
+
+ protected ServicesBundle servicesBundle;
+
+ private String version;
+
+ // TODO: extract into an external & durable state; good enough for now and demo
+ private static Map<String, ObjectNode> metaUi = new ConcurrentHashMap<>();
+
+ /**
+ * Returns read-only view of the meta-ui information.
+ *
+ * @return map of id to meta-ui mementos
+ */
+ static Map<String, ObjectNode> getMetaUi() {
+ return Collections.unmodifiableMap(metaUi);
+ }
+
+ @Override
+ public void init(UiConnection connection, ServiceDirectory directory) {
+ super.init(connection, directory);
+ this.directory = checkNotNull(directory, "Directory cannot be null");
+ clusterService = directory.get(ClusterService.class);
+ deviceService = directory.get(DeviceService.class);
+ linkService = directory.get(LinkService.class);
+ hostService = directory.get(HostService.class);
+ mastershipService = directory.get(MastershipService.class);
+ intentService = directory.get(IntentService.class);
+ flowService = directory.get(FlowRuleService.class);
+ flowStatsService = directory.get(StatisticService.class);
+ portStatsService = directory.get(PortStatisticsService.class);
+ topologyService = directory.get(TopologyService.class);
+ tunnelService = directory.get(TunnelService.class);
+
+ servicesBundle = new ServicesBundle(intentService, deviceService,
+ hostService, linkService,
+ flowService,
+ flowStatsService, portStatsService);
+
+ String ver = directory.get(CoreService.class).version().toString();
+ version = ver.replace(".SNAPSHOT", "*").replaceFirst("~.*$", "");
+ }
+
+ // Returns the specified set of IP addresses as a string.
+ private String ip(Set<IpAddress> ipAddresses) {
+ Iterator<IpAddress> it = ipAddresses.iterator();
+ return it.hasNext() ? it.next().toString() : "unknown";
+ }
+
+ // Produces JSON structure from annotations.
+ private JsonNode props(Annotations annotations) {
+ ObjectNode props = objectNode();
+ if (annotations != null) {
+ for (String key : annotations.keys()) {
+ props.put(key, annotations.value(key));
+ }
+ }
+ return props;
+ }
+
+ // Produces an informational log message event bound to the client.
+ protected ObjectNode info(long id, String message) {
+ return message("info", id, message);
+ }
+
+ // Produces a warning log message event bound to the client.
+ protected ObjectNode warning(long id, String message) {
+ return message("warning", id, message);
+ }
+
+ // Produces an error log message event bound to the client.
+ protected ObjectNode error(long id, String message) {
+ return message("error", id, message);
+ }
+
+ // Produces a log message event bound to the client.
+ private ObjectNode message(String severity, long id, String message) {
+ ObjectNode payload = objectNode()
+ .put("severity", severity)
+ .put("message", message);
+
+ return JsonUtils.envelope("message", id, payload);
+ }
+
+ // Produces a cluster instance message to the client.
+ protected ObjectNode instanceMessage(ClusterEvent event, String messageType) {
+ ControllerNode node = event.subject();
+ int switchCount = mastershipService.getDevicesOf(node.id()).size();
+ ObjectNode payload = objectNode()
+ .put("id", node.id().toString())
+ .put("ip", node.ip().toString())
+ .put("online", clusterService.getState(node.id()) == ACTIVE)
+ .put("uiAttached", node.equals(clusterService.getLocalNode()))
+ .put("switches", switchCount);
+
+ ArrayNode labels = arrayNode();
+ labels.add(node.id().toString());
+ labels.add(node.ip().toString());
+
+ // Add labels, props and stuff the payload into envelope.
+ payload.set("labels", labels);
+ addMetaUi(node.id().toString(), payload);
+
+ String type = messageType != null ? messageType :
+ ((event.type() == INSTANCE_ADDED) ? "addInstance" :
+ ((event.type() == INSTANCE_REMOVED ? "removeInstance" :
+ "addInstance")));
+ return JsonUtils.envelope(type, 0, payload);
+ }
+
+ // Produces a device event message to the client.
+ protected ObjectNode deviceMessage(DeviceEvent event) {
+ Device device = event.subject();
+ ObjectNode payload = objectNode()
+ .put("id", device.id().toString())
+ .put("type", device.type().toString().toLowerCase())
+ .put("online", deviceService.isAvailable(device.id()))
+ .put("master", master(device.id()));
+
+ // Generate labels: id, chassis id, no-label, optional-name
+ String name = device.annotations().value(AnnotationKeys.NAME);
+ ArrayNode labels = arrayNode();
+ labels.add("");
+ labels.add(isNullOrEmpty(name) ? device.id().toString() : name);
+ labels.add(device.id().toString());
+
+ // Add labels, props and stuff the payload into envelope.
+ payload.set("labels", labels);
+ payload.set("props", props(device.annotations()));
+ addGeoLocation(device, payload);
+ addMetaUi(device.id().toString(), payload);
+
+ String type = (event.type() == DEVICE_ADDED) ? "addDevice" :
+ ((event.type() == DEVICE_REMOVED) ? "removeDevice" : "updateDevice");
+ return JsonUtils.envelope(type, 0, payload);
+ }
+
+ // Produces a link event message to the client.
+ protected ObjectNode linkMessage(LinkEvent event) {
+ Link link = event.subject();
+ ObjectNode payload = objectNode()
+ .put("id", compactLinkString(link))
+ .put("type", link.type().toString().toLowerCase())
+ .put("online", link.state() == Link.State.ACTIVE)
+ .put("linkWidth", 1.2)
+ .put("src", link.src().deviceId().toString())
+ .put("srcPort", link.src().port().toString())
+ .put("dst", link.dst().deviceId().toString())
+ .put("dstPort", link.dst().port().toString());
+ String type = (event.type() == LINK_ADDED) ? "addLink" :
+ ((event.type() == LINK_REMOVED) ? "removeLink" : "updateLink");
+ return JsonUtils.envelope(type, 0, payload);
+ }
+
+ // Produces a host event message to the client.
+ protected ObjectNode hostMessage(HostEvent event) {
+ Host host = event.subject();
+ String hostType = host.annotations().value(AnnotationKeys.TYPE);
+ ObjectNode payload = objectNode()
+ .put("id", host.id().toString())
+ .put("type", isNullOrEmpty(hostType) ? "endstation" : hostType)
+ .put("ingress", compactLinkString(edgeLink(host, true)))
+ .put("egress", compactLinkString(edgeLink(host, false)));
+ payload.set("cp", hostConnect(host.location()));
+ payload.set("labels", labels(ip(host.ipAddresses()),
+ host.mac().toString()));
+ payload.set("props", props(host.annotations()));
+ addGeoLocation(host, payload);
+ addMetaUi(host.id().toString(), payload);
+
+ String type = (event.type() == HOST_ADDED) ? "addHost" :
+ ((event.type() == HOST_REMOVED) ? "removeHost" : "updateHost");
+ return JsonUtils.envelope(type, 0, payload);
+ }
+
+ // Encodes the specified host location into a JSON object.
+ private ObjectNode hostConnect(HostLocation location) {
+ return objectNode()
+ .put("device", location.deviceId().toString())
+ .put("port", location.port().toLong());
+ }
+
+ // Encodes the specified list of labels a JSON array.
+ private ArrayNode labels(String... labels) {
+ ArrayNode json = arrayNode();
+ for (String label : labels) {
+ json.add(label);
+ }
+ return json;
+ }
+
+ // Returns the name of the master node for the specified device id.
+ private String master(DeviceId deviceId) {
+ NodeId master = mastershipService.getMasterFor(deviceId);
+ return master != null ? master.toString() : "";
+ }
+
+ // Generates an edge link from the specified host location.
+ private EdgeLink edgeLink(Host host, boolean ingress) {
+ return new DefaultEdgeLink(PID, new ConnectPoint(host.id(), portNumber(0)),
+ host.location(), ingress);
+ }
+
+ // Adds meta UI information for the specified object.
+ private void addMetaUi(String id, ObjectNode payload) {
+ ObjectNode meta = metaUi.get(id);
+ if (meta != null) {
+ payload.set("metaUi", meta);
+ }
+ }
+
+ // Adds a geo location JSON to the specified payload object.
+ private void addGeoLocation(Annotated annotated, ObjectNode payload) {
+ Annotations annotations = annotated.annotations();
+ if (annotations == null) {
+ return;
+ }
+
+ String slat = annotations.value(AnnotationKeys.LATITUDE);
+ String slng = annotations.value(AnnotationKeys.LONGITUDE);
+ try {
+ if (slat != null && slng != null && !slat.isEmpty() && !slng.isEmpty()) {
+ double lat = Double.parseDouble(slat);
+ double lng = Double.parseDouble(slng);
+ ObjectNode loc = objectNode()
+ .put("type", "latlng").put("lat", lat).put("lng", lng);
+ payload.set("location", loc);
+ }
+ } catch (NumberFormatException e) {
+ log.warn("Invalid geo data latitude={}; longiture={}", slat, slng);
+ }
+ }
+
+ // Updates meta UI information for the specified object.
+ protected void updateMetaUi(ObjectNode payload) {
+ metaUi.put(JsonUtils.string(payload, "id"),
+ JsonUtils.node(payload, "memento"));
+ }
+
+
+ // -----------------------------------------------------------------------
+ // Create models of the data to return, that overlays can adjust / augment
+
+ // Returns property panel model for summary response.
+ protected PropertyPanel summmaryMessage(long sid) {
+ Topology topology = topologyService.currentTopology();
+
+ return new PropertyPanel("ONOS Summary", "node")
+ .addProp(Properties.DEVICES, topology.deviceCount())
+ .addProp(Properties.LINKS, topology.linkCount())
+ .addProp(Properties.HOSTS, hostService.getHostCount())
+ .addProp(Properties.TOPOLOGY_SSCS, topology.clusterCount())
+ .addSeparator()
+ .addProp(Properties.INTENTS, intentService.getIntentCount())
+ .addProp(Properties.TUNNELS, tunnelService.tunnelCount())
+ .addProp(Properties.FLOWS, flowService.getFlowRuleCount())
+ .addProp(Properties.VERSION, version);
+ }
+
+ // Returns property panel model for device details response.
+ protected PropertyPanel deviceDetails(DeviceId deviceId, long sid) {
+ Device device = deviceService.getDevice(deviceId);
+ Annotations annot = device.annotations();
+ String name = annot.value(AnnotationKeys.NAME);
+ int portCount = deviceService.getPorts(deviceId).size();
+ int flowCount = getFlowCount(deviceId);
+ int tunnelCount = getTunnelCount(deviceId);
+
+ String title = isNullOrEmpty(name) ? deviceId.toString() : name;
+ String typeId = device.type().toString().toLowerCase();
+
+ PropertyPanel pp = new PropertyPanel(title, typeId)
+ .id(deviceId.toString())
+
+ .addProp(Properties.URI, deviceId.toString())
+ .addProp(Properties.VENDOR, device.manufacturer())
+ .addProp(Properties.HW_VERSION, device.hwVersion())
+ .addProp(Properties.SW_VERSION, device.swVersion())
+ .addProp(Properties.SERIAL_NUMBER, device.serialNumber())
+ .addProp(Properties.PROTOCOL, annot.value(AnnotationKeys.PROTOCOL))
+ .addSeparator()
+
+ .addProp(Properties.LATITUDE, annot.value(AnnotationKeys.LATITUDE))
+ .addProp(Properties.LONGITUDE, annot.value(AnnotationKeys.LONGITUDE))
+ .addSeparator()
+
+ .addProp(Properties.PORTS, portCount)
+ .addProp(Properties.FLOWS, flowCount)
+ .addProp(Properties.TUNNELS, tunnelCount)
+
+ .addButton(CoreButtons.SHOW_DEVICE_VIEW)
+ .addButton(CoreButtons.SHOW_FLOW_VIEW)
+ .addButton(CoreButtons.SHOW_PORT_VIEW)
+ .addButton(CoreButtons.SHOW_GROUP_VIEW);
+
+ return pp;
+ }
+
+ protected int getFlowCount(DeviceId deviceId) {
+ int count = 0;
+ for (FlowEntry flowEntry : flowService.getFlowEntries(deviceId)) {
+ count++;
+ }
+ return count;
+ }
+
+ protected int getTunnelCount(DeviceId deviceId) {
+ int count = 0;
+ Collection<Tunnel> tunnels = tunnelService.queryAllTunnels();
+ for (Tunnel tunnel : tunnels) {
+ OpticalTunnelEndPoint src = (OpticalTunnelEndPoint) tunnel.src();
+ OpticalTunnelEndPoint dst = (OpticalTunnelEndPoint) tunnel.dst();
+ DeviceId srcDevice = (DeviceId) src.elementId().get();
+ DeviceId dstDevice = (DeviceId) dst.elementId().get();
+ if (srcDevice.toString().equals(deviceId.toString()) ||
+ dstDevice.toString().equals(deviceId.toString())) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ // Counts all flow entries that egress on the links of the given device.
+ private Map<Link, Integer> getLinkFlowCounts(DeviceId deviceId) {
+ // get the flows for the device
+ List<FlowEntry> entries = new ArrayList<>();
+ for (FlowEntry flowEntry : flowService.getFlowEntries(deviceId)) {
+ entries.add(flowEntry);
+ }
+
+ // get egress links from device, and include edge links
+ Set<Link> links = new HashSet<>(linkService.getDeviceEgressLinks(deviceId));
+ Set<Host> hosts = hostService.getConnectedHosts(deviceId);
+ if (hosts != null) {
+ for (Host host : hosts) {
+ links.add(createEdgeLink(host, false));
+ }
+ }
+
+ // compile flow counts per link
+ Map<Link, Integer> counts = new HashMap<>();
+ for (Link link : links) {
+ counts.put(link, getEgressFlows(link, entries));
+ }
+ return counts;
+ }
+
+ // Counts all entries that egress on the link source port.
+ private int getEgressFlows(Link link, List<FlowEntry> entries) {
+ int count = 0;
+ PortNumber out = link.src().port();
+ for (FlowEntry entry : entries) {
+ TrafficTreatment treatment = entry.treatment();
+ for (Instruction instruction : treatment.allInstructions()) {
+ if (instruction.type() == Instruction.Type.OUTPUT &&
+ ((OutputInstruction) instruction).port().equals(out)) {
+ count++;
+ }
+ }
+ }
+ return count;
+ }
+
+ // Returns host details response.
+ protected PropertyPanel hostDetails(HostId hostId, long sid) {
+ Host host = hostService.getHost(hostId);
+ Annotations annot = host.annotations();
+ String type = annot.value(AnnotationKeys.TYPE);
+ String name = annot.value(AnnotationKeys.NAME);
+ String vlan = host.vlan().toString();
+
+ String title = isNullOrEmpty(name) ? hostId.toString() : name;
+ String typeId = isNullOrEmpty(type) ? "endstation" : type;
+
+ PropertyPanel pp = new PropertyPanel(title, typeId)
+ .id(hostId.toString())
+ .addProp(Properties.MAC, host.mac())
+ .addProp(Properties.IP, host.ipAddresses(), "[\\[\\]]")
+ .addProp(Properties.VLAN, vlan.equals("-1") ? "none" : vlan)
+ .addSeparator()
+ .addProp(Properties.LATITUDE, annot.value(AnnotationKeys.LATITUDE))
+ .addProp(Properties.LONGITUDE, annot.value(AnnotationKeys.LONGITUDE));
+
+ // Potentially add button descriptors here
+ return pp;
+ }
+
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TrafficMonitor.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TrafficMonitor.java
new file mode 100644
index 00000000..3d733f9e
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TrafficMonitor.java
@@ -0,0 +1,675 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.onosproject.ui.impl;
+
+import com.google.common.collect.ImmutableList;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.ElementId;
+import org.onosproject.net.Host;
+import org.onosproject.net.HostId;
+import org.onosproject.net.Link;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.flow.FlowEntry;
+import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.flow.instructions.Instruction;
+import org.onosproject.net.flow.instructions.Instructions.OutputInstruction;
+import org.onosproject.net.intent.FlowRuleIntent;
+import org.onosproject.net.intent.Intent;
+import org.onosproject.net.intent.LinkCollectionIntent;
+import org.onosproject.net.intent.OpticalConnectivityIntent;
+import org.onosproject.net.intent.OpticalPathIntent;
+import org.onosproject.net.intent.PathIntent;
+import org.onosproject.net.statistic.Load;
+import org.onosproject.ui.impl.topo.IntentSelection;
+import org.onosproject.ui.impl.topo.ServicesBundle;
+import org.onosproject.ui.impl.topo.TopoIntentFilter;
+import org.onosproject.ui.impl.topo.TrafficLink;
+import org.onosproject.ui.impl.topo.TrafficLink.StatsType;
+import org.onosproject.ui.impl.topo.TrafficLinkMap;
+import org.onosproject.ui.topo.DeviceHighlight;
+import org.onosproject.ui.topo.Highlights;
+import org.onosproject.ui.topo.Highlights.Amount;
+import org.onosproject.ui.topo.HostHighlight;
+import org.onosproject.ui.topo.LinkHighlight.Flavor;
+import org.onosproject.ui.topo.NodeHighlight;
+import org.onosproject.ui.topo.NodeSelection;
+import org.onosproject.ui.topo.TopoUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import static org.onosproject.net.DefaultEdgeLink.createEdgeLink;
+import static org.onosproject.ui.impl.TrafficMonitor.Mode.*;
+
+/**
+ * Encapsulates the behavior of monitoring specific traffic patterns.
+ */
+public class TrafficMonitor {
+
+ // 4 Kilo Bytes as threshold
+ private static final double BPS_THRESHOLD = 4 * TopoUtils.KILO;
+
+ private static final Logger log =
+ LoggerFactory.getLogger(TrafficMonitor.class);
+
+ /**
+ * Designates the different modes of operation.
+ */
+ public enum Mode {
+ IDLE,
+ ALL_FLOW_TRAFFIC,
+ ALL_PORT_TRAFFIC,
+ DEV_LINK_FLOWS,
+ RELATED_INTENTS,
+ SELECTED_INTENT
+ }
+
+ private final long trafficPeriod;
+ private final ServicesBundle servicesBundle;
+ private final TopologyViewMessageHandler msgHandler;
+ private final TopoIntentFilter intentFilter;
+
+ private final Timer timer = new Timer("topo-traffic");
+
+ private TimerTask trafficTask = null;
+ private Mode mode = IDLE;
+ private NodeSelection selectedNodes = null;
+ private IntentSelection selectedIntents = null;
+
+
+ /**
+ * Constructs a traffic monitor.
+ *
+ * @param trafficPeriod traffic task period in ms
+ * @param servicesBundle bundle of services
+ * @param msgHandler our message handler
+ */
+ public TrafficMonitor(long trafficPeriod, ServicesBundle servicesBundle,
+ TopologyViewMessageHandler msgHandler) {
+ this.trafficPeriod = trafficPeriod;
+ this.servicesBundle = servicesBundle;
+ this.msgHandler = msgHandler;
+
+ intentFilter = new TopoIntentFilter(servicesBundle);
+ }
+
+ // =======================================================================
+ // === API ===
+
+ /**
+ * Monitor for traffic data to be sent back to the web client, under
+ * the given mode. This causes a background traffic task to be
+ * scheduled to repeatedly compute and transmit the appropriate traffic
+ * data to the client.
+ * <p>
+ * The monitoring mode is expected to be one of:
+ * <ul>
+ * <li>ALL_FLOW_TRAFFIC</li>
+ * <li>ALL_PORT_TRAFFIC</li>
+ * <li>SELECTED_INTENT</li>
+ * </ul>
+ *
+ * @param mode monitoring mode
+ */
+ public synchronized void monitor(Mode mode) {
+ log.debug("monitor: {}", mode);
+ this.mode = mode;
+
+ switch (mode) {
+ case ALL_FLOW_TRAFFIC:
+ clearSelection();
+ scheduleTask();
+ sendAllFlowTraffic();
+ break;
+
+ case ALL_PORT_TRAFFIC:
+ clearSelection();
+ scheduleTask();
+ sendAllPortTraffic();
+ break;
+
+ case SELECTED_INTENT:
+ scheduleTask();
+ sendSelectedIntentTraffic();
+ break;
+
+ default:
+ log.debug("Unexpected call to monitor({})", mode);
+ clearAll();
+ break;
+ }
+ }
+
+ /**
+ * Monitor for traffic data to be sent back to the web client, under
+ * the given mode, using the given selection of devices and hosts.
+ * In the case of "device link flows", this causes a background traffic
+ * task to be scheduled to repeatedly compute and transmit the appropriate
+ * traffic data to the client. In the case of "related intents", no
+ * repeating task is scheduled.
+ * <p>
+ * The monitoring mode is expected to be one of:
+ * <ul>
+ * <li>DEV_LINK_FLOWS</li>
+ * <li>RELATED_INTENTS</li>
+ * </ul>
+ *
+ * @param mode monitoring mode
+ * @param nodeSelection how to select a node
+ */
+ public synchronized void monitor(Mode mode, NodeSelection nodeSelection) {
+ log.debug("monitor: {} -- {}", mode, nodeSelection);
+ this.mode = mode;
+ this.selectedNodes = nodeSelection;
+
+ switch (mode) {
+ case DEV_LINK_FLOWS:
+ // only care about devices (not hosts)
+ if (selectedNodes.devicesWithHover().isEmpty()) {
+ sendClearAll();
+ } else {
+ scheduleTask();
+ sendDeviceLinkFlows();
+ }
+ break;
+
+ case RELATED_INTENTS:
+ if (selectedNodes.none()) {
+ sendClearAll();
+ } else {
+ selectedIntents = new IntentSelection(selectedNodes, intentFilter);
+ if (selectedIntents.none()) {
+ sendClearAll();
+ } else {
+ sendSelectedIntents();
+ }
+ }
+ break;
+
+ default:
+ log.debug("Unexpected call to monitor({}, {})", mode, nodeSelection);
+ clearAll();
+ break;
+ }
+ }
+
+ // TODO: move this out to the "h2h/multi-intent app"
+ /**
+ * Monitor for traffic data to be sent back to the web client, for the
+ * given intent.
+ *
+ * @param intent the intent to monitor
+ */
+ public synchronized void monitor(Intent intent) {
+ log.debug("monitor intent: {}", intent.id());
+ selectedNodes = null;
+ selectedIntents = new IntentSelection(intent);
+ mode = SELECTED_INTENT;
+ scheduleTask();
+ sendSelectedIntentTraffic();
+ }
+
+ /**
+ * Selects the next intent in the select group (if there is one),
+ * and sends highlighting data back to the web client to display
+ * which path is selected.
+ */
+ public synchronized void selectNextIntent() {
+ if (selectedIntents != null) {
+ selectedIntents.next();
+ sendSelectedIntents();
+ if (mode == SELECTED_INTENT) {
+ mode = RELATED_INTENTS;
+ }
+ }
+ }
+
+ /**
+ * Selects the previous intent in the select group (if there is one),
+ * and sends highlighting data back to the web client to display
+ * which path is selected.
+ */
+ public synchronized void selectPreviousIntent() {
+ if (selectedIntents != null) {
+ selectedIntents.prev();
+ sendSelectedIntents();
+ if (mode == SELECTED_INTENT) {
+ mode = RELATED_INTENTS;
+ }
+ }
+ }
+
+ /**
+ * Resends selected intent traffic data. This is called, for example,
+ * when the system detects an intent update happened.
+ */
+ public synchronized void pokeIntent() {
+ if (mode == SELECTED_INTENT) {
+ sendSelectedIntentTraffic();
+ }
+ }
+
+ /**
+ * Stop all traffic monitoring.
+ */
+ public synchronized void stopMonitoring() {
+ log.debug("STOP monitoring");
+ if (mode != IDLE) {
+ sendClearAll();
+ }
+ }
+
+
+ // =======================================================================
+ // === Helper methods ===
+
+ private void sendClearAll() {
+ clearAll();
+ sendClearHighlights();
+ }
+
+ private void clearAll() {
+ this.mode = IDLE;
+ clearSelection();
+ cancelTask();
+ }
+
+ private void clearSelection() {
+ selectedNodes = null;
+ selectedIntents = null;
+ }
+
+ private synchronized void scheduleTask() {
+ if (trafficTask == null) {
+ log.debug("Starting up background traffic task...");
+ trafficTask = new TrafficUpdateTask();
+ timer.schedule(trafficTask, trafficPeriod, trafficPeriod);
+ } else {
+ log.debug("(traffic task already running)");
+ }
+ }
+
+ private synchronized void cancelTask() {
+ if (trafficTask != null) {
+ trafficTask.cancel();
+ trafficTask = null;
+ }
+ }
+
+ private void sendAllFlowTraffic() {
+ log.debug("sendAllFlowTraffic");
+ msgHandler.sendHighlights(trafficSummary(StatsType.FLOW_STATS));
+ }
+
+ private void sendAllPortTraffic() {
+ log.debug("sendAllPortTraffic");
+ msgHandler.sendHighlights(trafficSummary(StatsType.PORT_STATS));
+ }
+
+ private void sendDeviceLinkFlows() {
+ log.debug("sendDeviceLinkFlows: {}", selectedNodes);
+ msgHandler.sendHighlights(deviceLinkFlows());
+ }
+
+ private void sendSelectedIntents() {
+ log.debug("sendSelectedIntents: {}", selectedIntents);
+ msgHandler.sendHighlights(intentGroup());
+ }
+
+ private void sendSelectedIntentTraffic() {
+ log.debug("sendSelectedIntentTraffic: {}", selectedIntents);
+ msgHandler.sendHighlights(intentTraffic());
+ }
+
+ private void sendClearHighlights() {
+ log.debug("sendClearHighlights");
+ msgHandler.sendHighlights(new Highlights());
+ }
+
+ // =======================================================================
+ // === Generate messages in JSON object node format
+
+ private Highlights trafficSummary(StatsType type) {
+ Highlights highlights = new Highlights();
+
+ TrafficLinkMap linkMap = new TrafficLinkMap();
+ compileLinks(linkMap);
+ addEdgeLinks(linkMap);
+
+ for (TrafficLink tlink : linkMap.biLinks()) {
+ if (type == StatsType.FLOW_STATS) {
+ attachFlowLoad(tlink);
+ } else if (type == StatsType.PORT_STATS) {
+ attachPortLoad(tlink);
+ }
+
+ // we only want to report on links deemed to have traffic
+ if (tlink.hasTraffic()) {
+ highlights.add(tlink.highlight(type));
+ }
+ }
+ return highlights;
+ }
+
+ // create highlights for links, showing flows for selected devices.
+ private Highlights deviceLinkFlows() {
+ Highlights highlights = new Highlights();
+
+ if (selectedNodes != null && !selectedNodes.devicesWithHover().isEmpty()) {
+ // capture flow counts on bilinks
+ TrafficLinkMap linkMap = new TrafficLinkMap();
+
+ for (Device device : selectedNodes.devicesWithHover()) {
+ Map<Link, Integer> counts = getLinkFlowCounts(device.id());
+ for (Link link : counts.keySet()) {
+ TrafficLink tlink = linkMap.add(link);
+ tlink.addFlows(counts.get(link));
+ }
+ }
+
+ // now report on our collated links
+ for (TrafficLink tlink : linkMap.biLinks()) {
+ highlights.add(tlink.highlight(StatsType.FLOW_COUNT));
+ }
+
+ }
+ return highlights;
+ }
+
+ private Highlights intentGroup() {
+ Highlights highlights = new Highlights();
+
+ if (selectedIntents != null && !selectedIntents.none()) {
+ // If 'all' intents are selected, they will all have primary
+ // highlighting; otherwise, the specifically selected intent will
+ // have primary highlighting, and the remainder will have secondary
+ // highlighting.
+ Set<Intent> primary;
+ Set<Intent> secondary;
+ int count = selectedIntents.size();
+
+ Set<Intent> allBut = new HashSet<>(selectedIntents.intents());
+ Intent current;
+
+ if (selectedIntents.all()) {
+ primary = allBut;
+ secondary = Collections.emptySet();
+ log.debug("Highlight all intents ({})", count);
+ } else {
+ current = selectedIntents.current();
+ primary = new HashSet<>();
+ primary.add(current);
+ allBut.remove(current);
+ secondary = allBut;
+ log.debug("Highlight intent: {} ([{}] of {})",
+ current.id(), selectedIntents.index(), count);
+ }
+
+ highlightIntentLinks(highlights, primary, secondary);
+ }
+ return highlights;
+ }
+
+ private Highlights intentTraffic() {
+ Highlights highlights = new Highlights();
+
+ if (selectedIntents != null && selectedIntents.single()) {
+ Intent current = selectedIntents.current();
+ Set<Intent> primary = new HashSet<>();
+ primary.add(current);
+ log.debug("Highlight traffic for intent: {} ([{}] of {})",
+ current.id(), selectedIntents.index(), selectedIntents.size());
+
+ highlightIntentLinksWithTraffic(highlights, primary);
+ highlights.subdueAllElse(Amount.MINIMALLY);
+ }
+ return highlights;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ private void compileLinks(TrafficLinkMap linkMap) {
+ servicesBundle.linkService().getLinks().forEach(linkMap::add);
+ }
+
+ private void addEdgeLinks(TrafficLinkMap linkMap) {
+ servicesBundle.hostService().getHosts().forEach(host -> {
+ linkMap.add(createEdgeLink(host, true));
+ linkMap.add(createEdgeLink(host, false));
+ });
+ }
+
+ private Load getLinkFlowLoad(Link link) {
+ if (link != null && link.src().elementId() instanceof DeviceId) {
+ return servicesBundle.flowStatsService().load(link);
+ }
+ return null;
+ }
+
+ private void attachFlowLoad(TrafficLink link) {
+ link.addLoad(getLinkFlowLoad(link.one()));
+ link.addLoad(getLinkFlowLoad(link.two()));
+ }
+
+ private void attachPortLoad(TrafficLink link) {
+ // For bi-directional traffic links, use
+ // the max link rate of either direction
+ // (we choose 'one' since we know that is never null)
+ Link one = link.one();
+ Load egressSrc = servicesBundle.portStatsService().load(one.src());
+ Load egressDst = servicesBundle.portStatsService().load(one.dst());
+ link.addLoad(maxLoad(egressSrc, egressDst), BPS_THRESHOLD);
+// link.addLoad(maxLoad(egressSrc, egressDst), 10); // DEBUG ONLY!!
+ }
+
+ private Load maxLoad(Load a, Load b) {
+ if (a == null) {
+ return b;
+ }
+ if (b == null) {
+ return a;
+ }
+ return a.rate() > b.rate() ? a : b;
+ }
+
+ // Counts all flow entries that egress on the links of the given device.
+ private Map<Link, Integer> getLinkFlowCounts(DeviceId deviceId) {
+ // get the flows for the device
+ List<FlowEntry> entries = new ArrayList<>();
+ for (FlowEntry flowEntry : servicesBundle.flowService()
+ .getFlowEntries(deviceId)) {
+ entries.add(flowEntry);
+ }
+
+ // get egress links from device, and include edge links
+ Set<Link> links = new HashSet<>(servicesBundle.linkService()
+ .getDeviceEgressLinks(deviceId));
+ Set<Host> hosts = servicesBundle.hostService().getConnectedHosts(deviceId);
+ if (hosts != null) {
+ for (Host host : hosts) {
+ links.add(createEdgeLink(host, false));
+ }
+ }
+
+ // compile flow counts per link
+ Map<Link, Integer> counts = new HashMap<>();
+ for (Link link : links) {
+ counts.put(link, getEgressFlows(link, entries));
+ }
+ return counts;
+ }
+
+ // Counts all entries that egress on the link source port.
+ private int getEgressFlows(Link link, List<FlowEntry> entries) {
+ int count = 0;
+ PortNumber out = link.src().port();
+ for (FlowEntry entry : entries) {
+ TrafficTreatment treatment = entry.treatment();
+ for (Instruction instruction : treatment.allInstructions()) {
+ if (instruction.type() == Instruction.Type.OUTPUT &&
+ ((OutputInstruction) instruction).port().equals(out)) {
+ count++;
+ }
+ }
+ }
+ return count;
+ }
+
+ private void highlightIntentLinks(Highlights highlights,
+ Set<Intent> primary, Set<Intent> secondary) {
+ TrafficLinkMap linkMap = new TrafficLinkMap();
+ // NOTE: highlight secondary first, then primary, so that links shared
+ // by intents are colored correctly ("last man wins")
+ createTrafficLinks(highlights, linkMap, secondary, Flavor.SECONDARY_HIGHLIGHT, false);
+ createTrafficLinks(highlights, linkMap, primary, Flavor.PRIMARY_HIGHLIGHT, false);
+ colorLinks(highlights, linkMap);
+ }
+
+ private void highlightIntentLinksWithTraffic(Highlights highlights,
+ Set<Intent> primary) {
+ TrafficLinkMap linkMap = new TrafficLinkMap();
+ createTrafficLinks(highlights, linkMap, primary, Flavor.PRIMARY_HIGHLIGHT, true);
+ colorLinks(highlights, linkMap);
+ }
+
+ private void createTrafficLinks(Highlights highlights,
+ TrafficLinkMap linkMap, Set<Intent> intents,
+ Flavor flavor, boolean showTraffic) {
+ for (Intent intent : intents) {
+ List<Intent> installables = servicesBundle.intentService()
+ .getInstallableIntents(intent.key());
+ Iterable<Link> links = null;
+ if (installables != null) {
+ for (Intent installable : installables) {
+
+ if (installable instanceof PathIntent) {
+ links = ((PathIntent) installable).path().links();
+ } else if (installable instanceof FlowRuleIntent) {
+ links = linkResources(installable);
+ } else if (installable instanceof LinkCollectionIntent) {
+ links = ((LinkCollectionIntent) installable).links();
+ } else if (installable instanceof OpticalPathIntent) {
+ links = ((OpticalPathIntent) installable).path().links();
+ }
+
+ boolean isOptical = intent instanceof OpticalConnectivityIntent;
+ processLinks(linkMap, links, flavor, isOptical, showTraffic);
+ updateHighlights(highlights, links);
+ }
+ }
+ }
+ }
+
+ private void updateHighlights(Highlights highlights, Iterable<Link> links) {
+ for (Link link : links) {
+ ensureNodePresent(highlights, link.src().elementId());
+ ensureNodePresent(highlights, link.dst().elementId());
+ }
+ }
+
+ private void ensureNodePresent(Highlights highlights, ElementId eid) {
+ String id = eid.toString();
+ NodeHighlight nh = highlights.getNode(id);
+ if (nh == null) {
+ if (eid instanceof DeviceId) {
+ nh = new DeviceHighlight(id);
+ highlights.add((DeviceHighlight) nh);
+ } else if (eid instanceof HostId) {
+ nh = new HostHighlight(id);
+ highlights.add((HostHighlight) nh);
+ }
+ }
+ }
+
+ // Extracts links from the specified flow rule intent resources
+ private Collection<Link> linkResources(Intent installable) {
+ ImmutableList.Builder<Link> builder = ImmutableList.builder();
+ installable.resources().stream().filter(r -> r instanceof Link)
+ .forEach(r -> builder.add((Link) r));
+ return builder.build();
+ }
+
+ private void processLinks(TrafficLinkMap linkMap, Iterable<Link> links,
+ Flavor flavor, boolean isOptical,
+ boolean showTraffic) {
+ if (links != null) {
+ for (Link link : links) {
+ TrafficLink tlink = linkMap.add(link);
+ tlink.tagFlavor(flavor);
+ tlink.optical(isOptical);
+ if (showTraffic) {
+ tlink.addLoad(getLinkFlowLoad(link));
+ tlink.antMarch(true);
+ }
+ }
+ }
+ }
+
+ private void colorLinks(Highlights highlights, TrafficLinkMap linkMap) {
+ for (TrafficLink tlink : linkMap.biLinks()) {
+ highlights.add(tlink.highlight(StatsType.TAGGED));
+ }
+ }
+
+ // =======================================================================
+ // === Background Task
+
+ // Provides periodic update of traffic information to the client
+ private class TrafficUpdateTask extends TimerTask {
+ @Override
+ public void run() {
+ try {
+ switch (mode) {
+ case ALL_FLOW_TRAFFIC:
+ sendAllFlowTraffic();
+ break;
+ case ALL_PORT_TRAFFIC:
+ sendAllPortTraffic();
+ break;
+ case DEV_LINK_FLOWS:
+ sendDeviceLinkFlows();
+ break;
+ case SELECTED_INTENT:
+ sendSelectedIntentTraffic();
+ break;
+
+ default:
+ // RELATED_INTENTS and IDLE modes should never invoke
+ // the background task, but if they do, they have
+ // nothing to do
+ break;
+ }
+
+ } catch (Exception e) {
+ log.warn("Unable to process traffic task due to {}", e.getMessage());
+ log.warn("Boom!", e);
+ }
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TrafficOverlay.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TrafficOverlay.java
new file mode 100644
index 00000000..ea8ca3ea
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TrafficOverlay.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.onosproject.ui.impl;
+
+import org.onosproject.ui.UiTopoOverlay;
+import org.onosproject.ui.topo.ButtonId;
+import org.onosproject.ui.topo.PropertyPanel;
+
+/**
+ * Topology Overlay for network traffic.
+ */
+public class TrafficOverlay extends UiTopoOverlay {
+ /**
+ * Traffic Overlay identifier.
+ */
+ public static final String TRAFFIC_ID = "traffic";
+
+ private static final String SDF_ID = "showDeviceFlows";
+ private static final String SRT_ID = "showRelatedTraffic";
+
+ private static final ButtonId SHOW_DEVICE_FLOWS = new ButtonId(SDF_ID);
+ private static final ButtonId SHOW_RELATED_TRAFFIC = new ButtonId(SRT_ID);
+
+
+ public TrafficOverlay() {
+ super(TRAFFIC_ID);
+ }
+
+ // override activate and deactivate, to write log messages
+ @Override
+ public void activate() {
+ super.activate();
+ log.debug("TrafficOverlay Activated");
+ }
+
+ @Override
+ public void deactivate() {
+ super.deactivate();
+ log.debug("TrafficOverlay Deactivated");
+ }
+
+ @Override
+ public void modifyDeviceDetails(PropertyPanel pp) {
+ pp.addButton(SHOW_DEVICE_FLOWS)
+ .addButton(SHOW_RELATED_TRAFFIC);
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TunnelViewMessageHandler.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TunnelViewMessageHandler.java
new file mode 100644
index 00000000..13ce9398
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/TunnelViewMessageHandler.java
@@ -0,0 +1,80 @@
+package org.onosproject.ui.impl;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.ImmutableSet;
+import org.onosproject.incubator.net.tunnel.Tunnel;
+import org.onosproject.incubator.net.tunnel.TunnelEndPointFormatter;
+import org.onosproject.incubator.net.tunnel.TunnelService;
+import org.onosproject.ui.RequestHandler;
+import org.onosproject.ui.UiMessageHandler;
+import org.onosproject.ui.table.TableModel;
+import org.onosproject.ui.table.TableRequestHandler;
+import org.onosproject.ui.table.cell.EnumFormatter;
+
+import java.util.Collection;
+
+public class TunnelViewMessageHandler extends UiMessageHandler {
+ private static final String TUNNEL_DATA_REQ = "tunnelDataRequest";
+ private static final String TUNNEL_DATA_RESP = "tunnelDataResponse";
+ private static final String TUNNELS = "tunnels";
+ private static final String ID = "id";
+ private static final String NAME = "name";
+ private static final String ONE = "one";
+ private static final String TWO = "two";
+ private static final String TYPE = "type";
+ private static final String GROUP_ID = "group_id";
+
+ private static final String BANDWIDTH = "bandwidth";
+ private static final String PATH = "path";
+
+
+ private static final String[] COL_IDS = {
+ ID, NAME, ONE, TWO, TYPE, GROUP_ID,
+ BANDWIDTH, PATH
+ };
+
+ @Override
+ protected Collection<RequestHandler> createRequestHandlers() {
+ return ImmutableSet.of(new TunnelDataRequestHandler());
+ }
+
+ private final class TunnelDataRequestHandler extends TableRequestHandler {
+
+ public TunnelDataRequestHandler() {
+ super(TUNNEL_DATA_REQ, TUNNEL_DATA_RESP, TUNNELS);
+ }
+
+ @Override
+ protected String[] getColumnIds() {
+ return COL_IDS;
+ }
+
+ @Override
+ protected TableModel createTableModel() {
+ TableModel tm = super.createTableModel();
+ //TODO add more formater class so that we can get a more readable table
+ tm.setFormatter(ONE, TunnelEndPointFormatter.INSTANCE);
+ tm.setFormatter(TWO, TunnelEndPointFormatter.INSTANCE);
+ tm.setFormatter(TYPE, EnumFormatter.INSTANCE);
+ return tm;
+ }
+
+ @Override
+ protected void populateTable(TableModel tm, ObjectNode payload) {
+ TunnelService ts = get(TunnelService.class);
+ ts.queryAllTunnels().forEach(tunnel -> populateRow(tm.addRow(), tunnel));
+ }
+
+ }
+
+ private void populateRow(TableModel.Row row, Tunnel tunnel) {
+ row.cell(ID, tunnel.tunnelId().id())
+ .cell(NAME, tunnel.tunnelName().value())
+ .cell(ONE, tunnel.src())
+ .cell(TWO, tunnel.dst())
+ .cell(TYPE, tunnel.type())
+ .cell(GROUP_ID, tunnel.groupId().id())
+ .cell(BANDWIDTH, tunnel.annotations().value(BANDWIDTH))
+ .cell(PATH, tunnel.path());
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/UiExtensionManager.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/UiExtensionManager.java
new file mode 100644
index 00000000..2bd0bb61
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/UiExtensionManager.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ui.impl;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onosproject.mastership.MastershipService;
+import org.onosproject.ui.UiExtension;
+import org.onosproject.ui.UiExtensionService;
+import org.onosproject.ui.UiMessageHandlerFactory;
+import org.onosproject.ui.UiTopoOverlayFactory;
+import org.onosproject.ui.UiView;
+import org.onosproject.ui.UiViewHidden;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import static com.google.common.collect.ImmutableList.of;
+import static java.util.stream.Collectors.toSet;
+import static org.onosproject.ui.UiView.Category.NETWORK;
+import static org.onosproject.ui.UiView.Category.PLATFORM;
+
+/**
+ * Manages the user interface extensions.
+ */
+@Component(immediate = true)
+@Service
+public class UiExtensionManager implements UiExtensionService, SpriteService {
+
+ private static final ClassLoader CL =
+ UiExtensionManager.class.getClassLoader();
+ private static final String CORE = "core";
+
+ private final Logger log = LoggerFactory.getLogger(getClass());
+
+ // List of all extensions
+ private final List<UiExtension> extensions = Lists.newArrayList();
+
+ // Map of views to extensions
+ private final Map<String, UiExtension> views = Maps.newHashMap();
+
+ // Core views & core extension
+ private final UiExtension core = createCoreExtension();
+
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected MastershipService mastershipService;
+
+ // Creates core UI extension
+ private UiExtension createCoreExtension() {
+ List<UiView> coreViews = of(
+ new UiView(PLATFORM, "app", "Applications", "nav_apps"),
+ new UiView(PLATFORM, "settings", "Settings", "nav_settings"),
+ new UiView(PLATFORM, "cluster", "Cluster Nodes", "nav_cluster"),
+ new UiView(NETWORK, "topo", "Topology", "nav_topo"),
+ new UiView(NETWORK, "device", "Devices", "nav_devs"),
+ new UiViewHidden("flow"),
+ new UiViewHidden("port"),
+ new UiViewHidden("group"),
+ new UiView(NETWORK, "link", "Links", "nav_links"),
+ new UiView(NETWORK, "host", "Hosts", "nav_hosts"),
+ new UiView(NETWORK, "intent", "Intents", "nav_intents"),
+ //TODO add a new type of icon for tunnel
+ new UiView(NETWORK, "tunnel", "Tunnels", "nav_links")
+ );
+
+ UiMessageHandlerFactory messageHandlerFactory =
+ () -> ImmutableList.of(
+ new TopologyViewMessageHandler(),
+ new DeviceViewMessageHandler(),
+ new LinkViewMessageHandler(),
+ new HostViewMessageHandler(),
+ new FlowViewMessageHandler(),
+ new PortViewMessageHandler(),
+ new GroupViewMessageHandler(),
+ new IntentViewMessageHandler(),
+ new ApplicationViewMessageHandler(),
+ new SettingsViewMessageHandler(),
+ new ClusterViewMessageHandler(),
+ new TunnelViewMessageHandler()
+ );
+
+ UiTopoOverlayFactory topoOverlayFactory =
+ () -> ImmutableList.of(
+ new TrafficOverlay()
+ );
+
+ return new UiExtension.Builder(CL, coreViews)
+ .messageHandlerFactory(messageHandlerFactory)
+ .topoOverlayFactory(topoOverlayFactory)
+ .resourcePath(CORE)
+ .build();
+ }
+
+ @Activate
+ public void activate() {
+ register(core);
+ log.info("Started");
+ }
+
+ @Deactivate
+ public void deactivate() {
+ UiWebSocketServlet.closeAll();
+ unregister(core);
+ log.info("Stopped");
+ }
+
+ @Override
+ public synchronized void register(UiExtension extension) {
+ if (!extensions.contains(extension)) {
+ extensions.add(extension);
+ for (UiView view : extension.views()) {
+ views.put(view.id(), extension);
+ }
+ }
+ }
+
+ @Override
+ public synchronized void unregister(UiExtension extension) {
+ extensions.remove(extension);
+ extension.views().stream()
+ .map(UiView::id).collect(toSet()).forEach(views::remove);
+ }
+
+ @Override
+ public synchronized List<UiExtension> getExtensions() {
+ return ImmutableList.copyOf(extensions);
+ }
+
+ @Override
+ public synchronized UiExtension getViewExtension(String viewId) {
+ return views.get(viewId);
+ }
+
+ // =====================================================================
+ // Provisional tracking of sprite definitions
+
+ private final Map<String, JsonNode> sprites = Maps.newHashMap();
+
+ @Override
+ public Set<String> getNames() {
+ return ImmutableSet.copyOf(sprites.keySet());
+ }
+
+ @Override
+ public void put(String name, JsonNode spriteData) {
+ log.info("Registered sprite definition [{}]", name);
+ sprites.put(name, spriteData);
+ }
+
+ @Override
+ public JsonNode get(String name) {
+ return sprites.get(name);
+ }
+
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocket.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocket.java
new file mode 100644
index 00000000..1b6f7f99
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocket.java
@@ -0,0 +1,240 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ui.impl;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.eclipse.jetty.websocket.WebSocket;
+import org.onlab.osgi.ServiceDirectory;
+import org.onlab.osgi.ServiceNotFoundException;
+import org.onosproject.cluster.ClusterService;
+import org.onosproject.cluster.ControllerNode;
+import org.onosproject.ui.UiConnection;
+import org.onosproject.ui.UiExtensionService;
+import org.onosproject.ui.UiMessageHandlerFactory;
+import org.onosproject.ui.UiMessageHandler;
+import org.onosproject.ui.UiTopoOverlayFactory;
+import org.onosproject.ui.topo.TopoConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Web socket capable of interacting with the GUI.
+ */
+public class UiWebSocket
+ implements UiConnection, WebSocket.OnTextMessage, WebSocket.OnControl {
+
+ private static final Logger log = LoggerFactory.getLogger(UiWebSocket.class);
+
+ private static final long MAX_AGE_MS = 30_000;
+
+ private static final byte PING = 0x9;
+ private static final byte PONG = 0xA;
+ private static final byte[] PING_DATA = new byte[]{(byte) 0xde, (byte) 0xad};
+
+ private final ServiceDirectory directory;
+
+ private Connection connection;
+ private FrameConnection control;
+
+ private final ObjectMapper mapper = new ObjectMapper();
+
+ private long lastActive = System.currentTimeMillis();
+
+ private Map<String, UiMessageHandler> handlers;
+ private TopoOverlayCache overlayCache;
+
+ /**
+ * Creates a new web-socket for serving data to GUI.
+ *
+ * @param directory service directory
+ */
+ public UiWebSocket(ServiceDirectory directory) {
+ this.directory = directory;
+ }
+
+ /**
+ * Issues a close on the connection.
+ */
+ synchronized void close() {
+ destroyHandlersAndOverlays();
+ if (connection.isOpen()) {
+ connection.close();
+ }
+ }
+
+ /**
+ * Indicates if this connection is idle.
+ *
+ * @return true if idle or closed
+ */
+ synchronized boolean isIdle() {
+ long quietFor = System.currentTimeMillis() - lastActive;
+ boolean idle = quietFor > MAX_AGE_MS;
+ if (idle || (connection != null && !connection.isOpen())) {
+ log.debug("IDLE (or closed) websocket [{} ms]", quietFor);
+ return true;
+ } else if (connection != null) {
+ try {
+ control.sendControl(PING, PING_DATA, 0, PING_DATA.length);
+ } catch (IOException e) {
+ log.warn("Unable to send ping message due to: ", e);
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void onOpen(Connection connection) {
+ this.connection = connection;
+ this.control = (FrameConnection) connection;
+ try {
+ createHandlersAndOverlays();
+ sendInstanceData();
+ log.info("GUI client connected");
+
+ } catch (ServiceNotFoundException e) {
+ log.warn("Unable to open GUI connection; services have been shut-down", e);
+ this.connection.close();
+ this.connection = null;
+ this.control = null;
+ }
+ }
+
+ @Override
+ public synchronized void onClose(int closeCode, String message) {
+ destroyHandlersAndOverlays();
+ log.info("GUI client disconnected [close-code={}, message={}]",
+ closeCode, message);
+ }
+
+ @Override
+ public boolean onControl(byte controlCode, byte[] data, int offset, int length) {
+ lastActive = System.currentTimeMillis();
+ return true;
+ }
+
+ @Override
+ public void onMessage(String data) {
+ log.debug("onMessage: {}", data);
+ lastActive = System.currentTimeMillis();
+ try {
+ ObjectNode message = (ObjectNode) mapper.reader().readTree(data);
+ String type = message.path("event").asText("unknown");
+ UiMessageHandler handler = handlers.get(type);
+ if (handler != null) {
+ handler.process(message);
+ } else {
+ log.warn("No GUI message handler for type {}", type);
+ }
+ } catch (Exception e) {
+ log.warn("Unable to parse GUI message {} due to {}", data, e);
+ log.debug("Boom!!!", e);
+ }
+ }
+
+ @Override
+ public synchronized void sendMessage(ObjectNode message) {
+ try {
+ if (connection.isOpen()) {
+ connection.sendMessage(message.toString());
+ }
+ } catch (IOException e) {
+ log.warn("Unable to send message {} to GUI due to {}", message, e);
+ log.debug("Boom!!!", e);
+ }
+ }
+
+ @Override
+ public synchronized void sendMessage(String type, long sid, ObjectNode payload) {
+ ObjectNode message = mapper.createObjectNode();
+ message.put("event", type);
+ if (sid > 0) {
+ message.put("sid", sid);
+ }
+ message.set("payload", payload);
+ sendMessage(message);
+
+ }
+
+ // Creates new message handlers.
+ private synchronized void createHandlersAndOverlays() {
+ log.debug("creating handlers and overlays...");
+ handlers = new HashMap<>();
+ overlayCache = new TopoOverlayCache();
+
+ UiExtensionService service = directory.get(UiExtensionService.class);
+ service.getExtensions().forEach(ext -> {
+ UiMessageHandlerFactory factory = ext.messageHandlerFactory();
+ if (factory != null) {
+ factory.newHandlers().forEach(handler -> {
+ handler.init(this, directory);
+ handler.messageTypes().forEach(type -> handlers.put(type, handler));
+
+ // need to inject the overlay cache into topology message handler
+ if (handler instanceof TopologyViewMessageHandler) {
+ ((TopologyViewMessageHandler) handler).setOverlayCache(overlayCache);
+ }
+ });
+ }
+
+ UiTopoOverlayFactory overlayFactory = ext.topoOverlayFactory();
+ if (overlayFactory != null) {
+ overlayFactory.newOverlays().forEach(overlayCache::add);
+ }
+ });
+ log.debug("#handlers = {}, #overlays = {}", handlers.size(),
+ overlayCache.size());
+ }
+
+ // Destroys message handlers.
+ private synchronized void destroyHandlersAndOverlays() {
+ log.debug("destroying handlers and overlays...");
+ handlers.forEach((type, handler) -> handler.destroy());
+ handlers.clear();
+
+ if (overlayCache != null) {
+ overlayCache.destroy();
+ overlayCache = null;
+ }
+ }
+
+ // Sends cluster node/instance information to allow GUI to fail-over.
+ private void sendInstanceData() {
+ ClusterService service = directory.get(ClusterService.class);
+ ArrayNode instances = mapper.createArrayNode();
+
+ for (ControllerNode node : service.getNodes()) {
+ ObjectNode instance = mapper.createObjectNode()
+ .put("id", node.id().toString())
+ .put("ip", node.ip().toString())
+ .put(TopoConstants.Glyphs.UI_ATTACHED,
+ node.equals(service.getLocalNode()));
+ instances.add(instance);
+ }
+
+ ObjectNode payload = mapper.createObjectNode();
+ payload.set("clusterNodes", instances);
+ sendMessage("bootstrap", 0, payload);
+ }
+
+}
+
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocketServlet.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocketServlet.java
new file mode 100644
index 00000000..ffc558da
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/UiWebSocketServlet.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ui.impl;
+
+import org.eclipse.jetty.websocket.WebSocket;
+import org.eclipse.jetty.websocket.WebSocketServlet;
+import org.onlab.osgi.DefaultServiceDirectory;
+import org.onlab.osgi.ServiceDirectory;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * Web socket servlet capable of creating web sockets for the user interface.
+ */
+public class UiWebSocketServlet extends WebSocketServlet {
+
+ private static final long PING_DELAY_MS = 5000;
+
+ private static UiWebSocketServlet instance;
+
+ private ServiceDirectory directory = new DefaultServiceDirectory();
+
+ private final Set<UiWebSocket> sockets = new HashSet<>();
+ private final Timer timer = new Timer();
+ private final TimerTask pruner = new Pruner();
+ private boolean isStopped = false;
+
+ /**
+ * Closes all currently open UI web-sockets.
+ */
+ public static void closeAll() {
+ if (instance != null) {
+ instance.isStopped = true;
+ instance.sockets.forEach(UiWebSocket::close);
+ instance.sockets.clear();
+ instance.pruner.cancel();
+ instance.timer.cancel();
+ }
+ }
+
+ @Override
+ public void init() throws ServletException {
+ super.init();
+ instance = this;
+ timer.schedule(pruner, PING_DELAY_MS, PING_DELAY_MS);
+ }
+
+ @Override
+ public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) {
+ if (isStopped) {
+ return null;
+ }
+ UiWebSocket socket = new UiWebSocket(directory);
+ synchronized (sockets) {
+ sockets.add(socket);
+ }
+ return socket;
+ }
+
+ // Task for pruning web-sockets that are idle.
+ private class Pruner extends TimerTask {
+ @Override
+ public void run() {
+ synchronized (sockets) {
+ Iterator<UiWebSocket> it = sockets.iterator();
+ while (it.hasNext()) {
+ UiWebSocket socket = it.next();
+ if (socket.isIdle()) {
+ it.remove();
+ socket.close();
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/package-info.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/package-info.java
new file mode 100644
index 00000000..0f228039
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2014-2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Set of resources providing data for the ONOS GUI.
+ */
+package org.onosproject.ui.impl;
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/topo/IntentSelection.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/topo/IntentSelection.java
new file mode 100644
index 00000000..151e6131
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/topo/IntentSelection.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.onosproject.ui.impl.topo;
+
+import org.onosproject.net.intent.Intent;
+import org.onosproject.ui.topo.NodeSelection;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Encapsulates a selection of intents (paths) inferred from a selection
+ * of devices and/or hosts from the topology view.
+ */
+public class IntentSelection {
+
+ private static final int ALL = -1;
+
+ protected static final Logger log =
+ LoggerFactory.getLogger(IntentSelection.class);
+
+ private final NodeSelection nodes;
+
+ private final List<Intent> intents;
+ private int index = ALL;
+
+ /**
+ * Creates an intent selection group, based on selected nodes.
+ *
+ * @param nodes node selection
+ * @param filter intent filter
+ */
+ public IntentSelection(NodeSelection nodes, TopoIntentFilter filter) {
+ this.nodes = nodes;
+ intents = filter.findPathIntents(nodes.hostsWithHover(), nodes.devicesWithHover());
+ if (intents.size() == 1) {
+ index = 0; // pre-select a single intent
+ }
+ }
+
+ /**
+ * Creates an intent selection group, for a single intent.
+ *
+ * @param intent the intent
+ */
+ public IntentSelection(Intent intent) {
+ nodes = null;
+ intents = new ArrayList<>(1);
+ intents.add(intent);
+ index = 0;
+ }
+
+ /**
+ * Returns true if no intents are selected.
+ *
+ * @return true if nothing selected
+ */
+ public boolean none() {
+ return intents.isEmpty();
+ }
+
+ /**
+ * Returns true if all intents in this select group are currently selected.
+ * This is the initial state, so that all intents are shown on the
+ * topology view with primary highlighting.
+ *
+ * @return true if all selected
+ */
+ public boolean all() {
+ return index == ALL;
+ }
+
+ /**
+ * Returns true if there is a single intent in this select group, or if
+ * a specific intent has been marked (index != ALL).
+ *
+ * @return true if single intent marked
+ */
+ public boolean single() {
+ return !all();
+ }
+
+ /**
+ * Returns the number of intents in this selection group.
+ *
+ * @return number of intents
+ */
+ public int size() {
+ return intents.size();
+ }
+
+ /**
+ * Returns the index of the currently selected intent.
+ *
+ * @return the current index
+ */
+ public int index() {
+ return index;
+ }
+
+ /**
+ * The list of intents in this selection group.
+ *
+ * @return list of intents
+ */
+ public List<Intent> intents() {
+ return Collections.unmodifiableList(intents);
+ }
+
+ /**
+ * Marks and returns the next intent in this group. Note that the
+ * selection wraps around to the beginning again, if necessary.
+ *
+ * @return the next intent in the group
+ */
+ public Intent next() {
+ index += 1;
+ if (index >= intents.size()) {
+ index = 0;
+ }
+ return intents.get(index);
+ }
+
+ /**
+ * Marks and returns the previous intent in this group. Note that the
+ * selection wraps around to the end again, if necessary.
+ *
+ * @return the previous intent in the group
+ */
+ public Intent prev() {
+ index -= 1;
+ if (index < 0) {
+ index = intents.size() - 1;
+ }
+ return intents.get(index);
+ }
+
+ /**
+ * Returns the currently marked intent, or null if "all" intents
+ * are marked.
+ *
+ * @return the currently marked intent
+ */
+ public Intent current() {
+ return all() ? null : intents.get(index);
+ }
+
+ @Override
+ public String toString() {
+ return "IntentSelection{" +
+ "nodes=" + nodes +
+ ", #intents=" + intents.size() +
+ ", index=" + index +
+ '}';
+ }
+
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/topo/ServicesBundle.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/topo/ServicesBundle.java
new file mode 100644
index 00000000..bcc4ad8b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/topo/ServicesBundle.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.onosproject.ui.impl.topo;
+
+import org.onosproject.incubator.net.PortStatisticsService;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.flow.FlowRuleService;
+import org.onosproject.net.host.HostService;
+import org.onosproject.net.intent.IntentService;
+import org.onosproject.net.link.LinkService;
+import org.onosproject.net.statistic.StatisticService;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * A bundle of services that the topology view requires to get its job done.
+ */
+public class ServicesBundle {
+
+ private final IntentService intentService;
+ private final DeviceService deviceService;
+ private final HostService hostService;
+ private final LinkService linkService;
+ private final FlowRuleService flowService;
+ private final StatisticService flowStatsService;
+ private final PortStatisticsService portStatsService;
+
+ /**
+ * Creates the services bundle.
+ *
+ * @param intentService intent service reference
+ * @param deviceService device service reference
+ * @param hostService host service reference
+ * @param linkService link service reference
+ * @param flowService flow service reference
+ * @param flowStatsService flow statistics service reference
+ * @param portStatsService port statistics service reference
+ */
+ public ServicesBundle(IntentService intentService,
+ DeviceService deviceService,
+ HostService hostService,
+ LinkService linkService,
+ FlowRuleService flowService,
+ StatisticService flowStatsService,
+ PortStatisticsService portStatsService) {
+ this.intentService = checkNotNull(intentService);
+ this.deviceService = checkNotNull(deviceService);
+ this.hostService = checkNotNull(hostService);
+ this.linkService = checkNotNull(linkService);
+ this.flowService = checkNotNull(flowService);
+ this.flowStatsService = checkNotNull(flowStatsService);
+ this.portStatsService = checkNotNull(portStatsService);
+ }
+
+ /**
+ * Returns a reference to the intent service.
+ *
+ * @return intent service reference
+ */
+ public IntentService intentService() {
+ return intentService;
+ }
+
+ /**
+ * Returns a reference to the device service.
+ *
+ * @return device service reference
+ */
+ public DeviceService deviceService() {
+ return deviceService;
+ }
+
+ /**
+ * Returns a reference to the host service.
+ *
+ * @return host service reference
+ */
+ public HostService hostService() {
+ return hostService;
+ }
+
+ /**
+ * Returns a reference to the link service.
+ *
+ * @return link service reference
+ */
+ public LinkService linkService() {
+ return linkService;
+ }
+
+ /**
+ * Returns a reference to the flow rule service.
+ *
+ * @return flow service reference
+ */
+ public FlowRuleService flowService() {
+ return flowService;
+ }
+
+ /**
+ * Returns a reference to the flow statistics service.
+ *
+ * @return flow statistics service reference
+ */
+ public StatisticService flowStatsService() {
+ return flowStatsService;
+ }
+
+ /**
+ * Returns a reference to the port statistics service.
+ *
+ * @return port statistics service reference
+ */
+ public PortStatisticsService portStatsService() {
+ return portStatsService;
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/topo/TopoIntentFilter.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/topo/TopoIntentFilter.java
new file mode 100644
index 00000000..8372dede
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/topo/TopoIntentFilter.java
@@ -0,0 +1,274 @@
+/*
+ * Copyright 2014-2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.ui.impl.topo;
+
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Host;
+import org.onosproject.net.HostId;
+import org.onosproject.net.Link;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.flow.FlowRule;
+import org.onosproject.net.host.HostService;
+import org.onosproject.net.intent.FlowRuleIntent;
+import org.onosproject.net.intent.HostToHostIntent;
+import org.onosproject.net.intent.Intent;
+import org.onosproject.net.intent.IntentService;
+import org.onosproject.net.intent.LinkCollectionIntent;
+import org.onosproject.net.intent.MultiPointToSinglePointIntent;
+import org.onosproject.net.intent.OpticalConnectivityIntent;
+import org.onosproject.net.intent.PathIntent;
+import org.onosproject.net.intent.PointToPointIntent;
+import org.onosproject.net.link.LinkService;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+import static org.onosproject.net.intent.IntentState.INSTALLED;
+
+/**
+ * Auxiliary facility to query the intent service based on the specified
+ * set of end-station hosts, edge points or infrastructure devices.
+ */
+public class TopoIntentFilter {
+
+ private final IntentService intentService;
+ private final DeviceService deviceService;
+ private final HostService hostService;
+ private final LinkService linkService;
+
+ /**
+ * Creates an intent filter.
+ *
+ * @param services service references bundle
+ */
+ public TopoIntentFilter(ServicesBundle services) {
+ this.intentService = services.intentService();
+ this.deviceService = services.deviceService();
+ this.hostService = services.hostService();
+ this.linkService = services.linkService();
+ }
+
+ /**
+ * Finds all path (host-to-host or point-to-point) intents that pertain
+ * to the given hosts and devices.
+ *
+ * @param hosts set of hosts to query by
+ * @param devices set of devices to query by
+ * @return set of intents that 'match' all hosts and devices given
+ */
+ public List<Intent> findPathIntents(Set<Host> hosts, Set<Device> devices) {
+ // start with all intents
+ Iterable<Intent> sourceIntents = intentService.getIntents();
+
+ // Derive from this the set of edge connect points.
+ Set<ConnectPoint> edgePoints = getEdgePoints(hosts);
+
+ // Iterate over all intents and produce a set that contains only those
+ // intents that target all selected hosts or derived edge connect points.
+ return getIntents(hosts, devices, edgePoints, sourceIntents);
+ }
+
+
+ // Produces a set of edge points from the specified set of hosts.
+ private Set<ConnectPoint> getEdgePoints(Set<Host> hosts) {
+ Set<ConnectPoint> edgePoints = new HashSet<>();
+ for (Host host : hosts) {
+ edgePoints.add(host.location());
+ }
+ return edgePoints;
+ }
+
+ // Produces a list of intents that target all selected hosts, devices or connect points.
+ private List<Intent> getIntents(Set<Host> hosts, Set<Device> devices,
+ Set<ConnectPoint> edgePoints,
+ Iterable<Intent> sourceIntents) {
+ List<Intent> intents = new ArrayList<>();
+ if (hosts.isEmpty() && devices.isEmpty()) {
+ return intents;
+ }
+
+ Set<OpticalConnectivityIntent> opticalIntents = new HashSet<>();
+
+ // Search through all intents and see if they are relevant to our search.
+ for (Intent intent : sourceIntents) {
+ if (intentService.getIntentState(intent.key()) == INSTALLED) {
+ boolean isRelevant = false;
+ if (intent instanceof HostToHostIntent) {
+ isRelevant = isIntentRelevantToHosts((HostToHostIntent) intent, hosts) &&
+ isIntentRelevantToDevices(intent, devices);
+ } else if (intent instanceof PointToPointIntent) {
+ isRelevant = isIntentRelevant((PointToPointIntent) intent, edgePoints) &&
+ isIntentRelevantToDevices(intent, devices);
+ } else if (intent instanceof MultiPointToSinglePointIntent) {
+ isRelevant = isIntentRelevant((MultiPointToSinglePointIntent) intent, edgePoints) &&
+ isIntentRelevantToDevices(intent, devices);
+ } else if (intent instanceof OpticalConnectivityIntent) {
+ opticalIntents.add((OpticalConnectivityIntent) intent);
+ }
+ // TODO: add other intents, e.g. SinglePointToMultiPointIntent
+
+ if (isRelevant) {
+ intents.add(intent);
+ }
+ }
+ }
+
+ // As a second pass, try to link up any optical intents with the
+ // packet-level ones.
+ for (OpticalConnectivityIntent intent : opticalIntents) {
+ if (isIntentRelevant(intent, intents) &&
+ isIntentRelevantToDevices(intent, devices)) {
+ intents.add(intent);
+ }
+ }
+ return intents;
+ }
+
+ // Indicates whether the specified intent involves all of the given hosts.
+ private boolean isIntentRelevantToHosts(HostToHostIntent intent, Iterable<Host> hosts) {
+ for (Host host : hosts) {
+ HostId id = host.id();
+ // Bail if intent does not involve this host.
+ if (!id.equals(intent.one()) && !id.equals(intent.two())) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ // Indicates whether the specified intent involves all of the given devices.
+ private boolean isIntentRelevantToDevices(Intent intent, Iterable<Device> devices) {
+ List<Intent> installables = intentService.getInstallableIntents(intent.key());
+ for (Device device : devices) {
+ if (!isIntentRelevantToDevice(installables, device)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ // Indicates whether the specified intent involves the given device.
+ private boolean isIntentRelevantToDevice(List<Intent> installables, Device device) {
+ if (installables != null) {
+ for (Intent installable : installables) {
+ if (installable instanceof PathIntent) {
+ PathIntent pathIntent = (PathIntent) installable;
+ if (pathContainsDevice(pathIntent.path().links(), device.id())) {
+ return true;
+ }
+ } else if (installable instanceof FlowRuleIntent) {
+ FlowRuleIntent flowRuleIntent = (FlowRuleIntent) installable;
+ if (rulesContainDevice(flowRuleIntent.flowRules(), device.id())) {
+ return true;
+ }
+ } else if (installable instanceof LinkCollectionIntent) {
+ LinkCollectionIntent linksIntent = (LinkCollectionIntent) installable;
+ if (pathContainsDevice(linksIntent.links(), device.id())) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ // Indicates whether the specified links involve the given device.
+ private boolean pathContainsDevice(Iterable<Link> links, DeviceId id) {
+ for (Link link : links) {
+ if (link.src().elementId().equals(id) || link.dst().elementId().equals(id)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // Indicates whether the specified flow rules involvesthe given device.
+ private boolean rulesContainDevice(Collection<FlowRule> flowRules, DeviceId id) {
+ for (FlowRule rule : flowRules) {
+ if (rule.deviceId().equals(id)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean isIntentRelevant(PointToPointIntent intent,
+ Iterable<ConnectPoint> edgePoints) {
+ for (ConnectPoint point : edgePoints) {
+ // Bail if intent does not involve this edge point.
+ if (!point.equals(intent.egressPoint()) &&
+ !point.equals(intent.ingressPoint())) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ // Indicates whether the specified intent involves all of the given edge points.
+ private boolean isIntentRelevant(MultiPointToSinglePointIntent intent,
+ Iterable<ConnectPoint> edgePoints) {
+ for (ConnectPoint point : edgePoints) {
+ // Bail if intent does not involve this edge point.
+ if (!point.equals(intent.egressPoint()) &&
+ !intent.ingressPoints().contains(point)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ // Indicates whether the specified intent involves all of the given edge points.
+ private boolean isIntentRelevant(OpticalConnectivityIntent opticalIntent,
+ Iterable<Intent> intents) {
+ Link ccSrc = getFirstLink(opticalIntent.getSrc(), false);
+ Link ccDst = getFirstLink(opticalIntent.getDst(), true);
+ if (ccSrc == null || ccDst == null) {
+ return false;
+ }
+
+ for (Intent intent : intents) {
+ List<Intent> installables = intentService.getInstallableIntents(intent.key());
+ for (Intent installable : installables) {
+ if (installable instanceof PathIntent) {
+ List<Link> links = ((PathIntent) installable).path().links();
+ if (links.size() == 3) {
+ Link tunnel = links.get(1);
+ if (Objects.equals(tunnel.src(), ccSrc.src()) &&
+ Objects.equals(tunnel.dst(), ccDst.dst())) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ private Link getFirstLink(ConnectPoint point, boolean ingress) {
+ for (Link link : linkService.getLinks(point)) {
+ if (point.equals(ingress ? link.src() : link.dst())) {
+ return link;
+ }
+ }
+ return null;
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/topo/TrafficLink.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/topo/TrafficLink.java
new file mode 100644
index 00000000..a0e16620
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/topo/TrafficLink.java
@@ -0,0 +1,223 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.onosproject.ui.impl.topo;
+
+import org.onosproject.net.Link;
+import org.onosproject.net.LinkKey;
+import org.onosproject.net.statistic.Load;
+import org.onosproject.ui.topo.BiLink;
+import org.onosproject.ui.topo.LinkHighlight;
+import org.onosproject.ui.topo.LinkHighlight.Flavor;
+import org.onosproject.ui.topo.TopoUtils;
+
+import static org.onosproject.ui.topo.LinkHighlight.Flavor.NO_HIGHLIGHT;
+import static org.onosproject.ui.topo.LinkHighlight.Flavor.PRIMARY_HIGHLIGHT;
+import static org.onosproject.ui.topo.LinkHighlight.Flavor.SECONDARY_HIGHLIGHT;
+
+/**
+ * Representation of a link and its inverse, and associated traffic data.
+ * This class understands how to generate the appropriate
+ * {@link LinkHighlight}s for showing traffic data on the topology view.
+ */
+public class TrafficLink extends BiLink {
+
+ private static final String EMPTY = "";
+ private static final String QUE = "?";
+
+ private long bytes = 0;
+ private long rate = 0;
+ private long flows = 0;
+ private Flavor taggedFlavor = NO_HIGHLIGHT;
+ private boolean hasTraffic = false;
+ private boolean isOptical = false;
+ private boolean antMarch = false;
+
+ /**
+ * Constructs a traffic link for the given key and initial link.
+ *
+ * @param key canonical key for this traffic link
+ * @param link first link
+ */
+ public TrafficLink(LinkKey key, Link link) {
+ super(key, link);
+ }
+
+ /**
+ * Sets the optical flag to the given value.
+ *
+ * @param b true if an optical link
+ * @return self, for chaining
+ */
+ public TrafficLink optical(boolean b) {
+ isOptical = b;
+ return this;
+ }
+
+ /**
+ * Sets the ant march flag to the given value.
+ *
+ * @param b true if marching ants required
+ * @return self, for chaining
+ */
+ public TrafficLink antMarch(boolean b) {
+ antMarch = b;
+ return this;
+ }
+
+ /**
+ * Tags this traffic link with the flavor to be used in visual rendering.
+ *
+ * @param flavor the flavor to tag
+ * @return self, for chaining
+ */
+ public TrafficLink tagFlavor(Flavor flavor) {
+ this.taggedFlavor = flavor;
+ return this;
+ }
+
+ /**
+ * Adds load statistics, marks the traffic link as having traffic.
+ *
+ * @param load load to add
+ */
+ public void addLoad(Load load) {
+ addLoad(load, 0);
+ }
+
+ /**
+ * Adds load statistics, marks the traffic link as having traffic, if the
+ * load {@link Load#rate rate} is greater than the given threshold
+ * (expressed in bytes per second).
+ *
+ * @param load load to add
+ * @param threshold threshold to register traffic
+ */
+ public void addLoad(Load load, double threshold) {
+ if (load != null) {
+ this.hasTraffic = hasTraffic || load.rate() > threshold;
+ this.bytes += load.latest();
+ this.rate += load.rate();
+ }
+ }
+
+ /**
+ * Adds the given count of flows to this traffic link.
+ *
+ * @param count count of flows
+ */
+ public void addFlows(int count) {
+ this.flows += count;
+ }
+
+ @Override
+ public LinkHighlight highlight(Enum<?> type) {
+ StatsType statsType = (StatsType) type;
+ switch (statsType) {
+ case FLOW_COUNT:
+ return highlightForFlowCount(statsType);
+
+ case FLOW_STATS:
+ case PORT_STATS:
+ return highlightForStats(statsType);
+
+ case TAGGED:
+ return highlightForTagging(statsType);
+
+ default:
+ throw new IllegalStateException("unexpected case: " + statsType);
+ }
+ }
+
+ private LinkHighlight highlightForStats(StatsType type) {
+ return new LinkHighlight(linkId(), SECONDARY_HIGHLIGHT)
+ .setLabel(generateLabel(type));
+ }
+
+ private LinkHighlight highlightForFlowCount(StatsType type) {
+ Flavor flavor = flows > 0 ? PRIMARY_HIGHLIGHT : SECONDARY_HIGHLIGHT;
+ return new LinkHighlight(linkId(), flavor)
+ .setLabel(generateLabel(type));
+ }
+
+ private LinkHighlight highlightForTagging(StatsType type) {
+ LinkHighlight hlite = new LinkHighlight(linkId(), taggedFlavor)
+ .setLabel(generateLabel(type));
+ if (isOptical) {
+ hlite.addMod(LinkHighlight.MOD_OPTICAL);
+ }
+ if (antMarch) {
+ hlite.addMod(LinkHighlight.MOD_ANIMATED);
+ }
+ return hlite;
+ }
+
+ // Generates a string representation of the load, to be used as a label
+ private String generateLabel(StatsType type) {
+ switch (type) {
+ case FLOW_COUNT:
+ return TopoUtils.formatFlows(flows);
+
+ case FLOW_STATS:
+ return TopoUtils.formatBytes(bytes);
+
+ case PORT_STATS:
+ return TopoUtils.formatBitRate(rate);
+
+ case TAGGED:
+ return hasTraffic ? TopoUtils.formatBytes(bytes) : EMPTY;
+
+ default:
+ return QUE;
+ }
+ }
+
+ /**
+ * Returns true if this link has been deemed to have enough traffic
+ * to register on the topology view in the web UI.
+ *
+ * @return true if this link has displayable traffic
+ */
+ public boolean hasTraffic() {
+ return hasTraffic;
+ }
+
+ /**
+ * Designates type of traffic statistics to report on a highlighted link.
+ */
+ public enum StatsType {
+ /**
+ * Number of flows.
+ */
+ FLOW_COUNT,
+
+ /**
+ * Number of bytes.
+ */
+ FLOW_STATS,
+
+ /**
+ * Number of bits per second.
+ */
+ PORT_STATS,
+
+ /**
+ * Custom tagged information.
+ */
+ TAGGED
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/topo/TrafficLinkMap.java b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/topo/TrafficLinkMap.java
new file mode 100644
index 00000000..081964f8
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/java/org/onosproject/ui/impl/topo/TrafficLinkMap.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.onosproject.ui.impl.topo;
+
+import org.onosproject.net.Link;
+import org.onosproject.net.LinkKey;
+import org.onosproject.ui.topo.BiLinkMap;
+
+/**
+ * Collection of {@link TrafficLink}s.
+ */
+public class TrafficLinkMap extends BiLinkMap<TrafficLink> {
+
+ @Override
+ public TrafficLink create(LinkKey key, Link link) {
+ return new TrafficLink(key, link);
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/resources/core/css.html b/framework/src/onos/web/gui/src/main/resources/core/css.html
new file mode 100644
index 00000000..97bee6ba
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/resources/core/css.html
@@ -0,0 +1 @@
+<!-- Builtin view stylesheets are in the main index.html -->
diff --git a/framework/src/onos/web/gui/src/main/resources/core/js.html b/framework/src/onos/web/gui/src/main/resources/core/js.html
new file mode 100644
index 00000000..8e2269bd
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/resources/core/js.html
@@ -0,0 +1 @@
+<!-- Builtin view javascript is in the main index.html --> \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/resources/not-ready.html b/framework/src/onos/web/gui/src/main/resources/not-ready.html
new file mode 100644
index 00000000..7843ca44
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/resources/not-ready.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<!--
+ ~ Copyright 2015 Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<html>
+<head>
+ <meta charset="utf-8">
+ <link rel="shortcut icon" href="data/img/onos-logo.png">
+
+ <link rel="apple-touch-icon" href="data/img/apple-touch-icon.png">
+ <meta name="apple-mobile-web-app-capable" content="yes">
+ <meta name="apple-mobile-web-app-status-bar-style" content="black">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <meta http-equiv="refresh" content="5;URL=/onos/ui">
+
+ <title>ONOS</title>
+
+</head>
+<body>
+<h1>ONOS GUI not ready yet... stand by...</h1>
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/WEB-INF/web.xml b/framework/src/onos/web/gui/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 00000000..dda59f54
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2014 Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+ id="ONOS" version="2.5">
+ <display-name>ONOS GUI</display-name>
+
+ <welcome-file-list>
+ <welcome-file>index.html</welcome-file>
+ </welcome-file-list>
+
+ <!--
+ -->
+ <security-constraint>
+ <web-resource-collection>
+ <web-resource-name>Secured</web-resource-name>
+ <url-pattern>/index.html</url-pattern>
+ </web-resource-collection>
+ <auth-constraint>
+ <role-name>admin</role-name>
+ </auth-constraint>
+ <!--
+ <user-data-constraint>
+ <transport-guarantee>CONFIDENTIAL</transport-guarantee>
+ </user-data-constraint>
+ -->
+ </security-constraint>
+
+ <security-role>
+ <role-name>admin</role-name>
+ </security-role>
+
+ <login-config>
+ <auth-method>FORM</auth-method>
+ <realm-name>karaf</realm-name>
+ <form-login-config>
+ <form-login-page>/login.html</form-login-page>
+ <form-error-page>/error.html</form-error-page>
+ </form-login-config>
+ </login-config>
+
+ <servlet>
+ <servlet-name>Index Page</servlet-name>
+ <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer
+ </servlet-class>
+ <init-param>
+ <param-name>com.sun.jersey.config.property.resourceConfigClass
+ </param-name>
+ <param-value>com.sun.jersey.api.core.ClassNamesResourceConfig
+ </param-value>
+ </init-param>
+ <init-param>
+ <param-name>com.sun.jersey.config.property.classnames</param-name>
+ <param-value>org.onosproject.ui.impl.MainIndexResource</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>Index Page</servlet-name>
+ <url-pattern>/index.html</url-pattern>
+ </servlet-mapping>
+
+ <servlet>
+ <servlet-name>Main Module</servlet-name>
+ <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer
+ </servlet-class>
+ <init-param>
+ <param-name>com.sun.jersey.config.property.resourceConfigClass
+ </param-name>
+ <param-value>com.sun.jersey.api.core.ClassNamesResourceConfig
+ </param-value>
+ </init-param>
+ <init-param>
+ <param-name>com.sun.jersey.config.property.classnames</param-name>
+ <param-value>org.onosproject.ui.impl.MainModuleResource
+ </param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>Main Module</servlet-name>
+ <url-pattern>/onos.js</url-pattern>
+ </servlet-mapping>
+
+ <servlet>
+ <servlet-name>Nav Module</servlet-name>
+ <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer
+ </servlet-class>
+ <init-param>
+ <param-name>com.sun.jersey.config.property.resourceConfigClass
+ </param-name>
+ <param-value>com.sun.jersey.api.core.ClassNamesResourceConfig
+ </param-value>
+ </init-param>
+ <init-param>
+ <param-name>com.sun.jersey.config.property.classnames</param-name>
+ <param-value>org.onosproject.ui.impl.MainNavResource</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>Nav Module</servlet-name>
+ <url-pattern>/nav.html</url-pattern>
+ </servlet-mapping>
+
+ <servlet>
+ <servlet-name>View Module</servlet-name>
+ <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer
+ </servlet-class>
+ <init-param>
+ <param-name>com.sun.jersey.config.property.resourceConfigClass
+ </param-name>
+ <param-value>com.sun.jersey.api.core.ClassNamesResourceConfig
+ </param-value>
+ </init-param>
+ <init-param>
+ <param-name>com.sun.jersey.config.property.classnames</param-name>
+ <param-value>org.onosproject.ui.impl.MainViewResource</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>View Module</servlet-name>
+ <url-pattern>/app/view/*</url-pattern>
+ </servlet-mapping>
+
+ <servlet>
+ <servlet-name>JAX-RS Service</servlet-name>
+ <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer
+ </servlet-class>
+ <init-param>
+ <param-name>com.sun.jersey.config.property.resourceConfigClass
+ </param-name>
+ <param-value>com.sun.jersey.api.core.ClassNamesResourceConfig
+ </param-value>
+ </init-param>
+ <init-param>
+ <param-name>com.sun.jersey.config.property.classnames</param-name>
+ <param-value>
+ org.onosproject.ui.impl.LogoutResource,
+ org.onosproject.ui.impl.TopologyResource,
+ org.onosproject.ui.impl.ApplicationResource
+ </param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>JAX-RS Service</servlet-name>
+ <url-pattern>/rs/*</url-pattern>
+ </servlet-mapping>
+
+ <servlet>
+ <servlet-name>Web Socket Service</servlet-name>
+ <servlet-class>org.onosproject.ui.impl.UiWebSocketServlet
+ </servlet-class>
+ <load-on-startup>2</load-on-startup>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>Web Socket Service</servlet-name>
+ <url-pattern>/websock/*</url-pattern>
+ </servlet-mapping>
+
+</web-app>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_bripc/practice-table.html b/framework/src/onos/web/gui/src/main/webapp/_bripc/practice-table.html
new file mode 100644
index 00000000..1912cc7e
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_bripc/practice-table.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<!--
+ ~ Copyright 2015 Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<!--
+ ONOS -- Displaying icons with Angular test page
+ -->
+
+<html>
+<head lang="en">
+ <meta charset="UTF-8">
+ <title>Practice Table Formatting</title>
+
+ <script type="text/javascript" src="../tp/angular.js"></script>
+ <script type="text/javascript" src="../tp/angular-route.js"></script>
+
+ <script type="text/javascript" src="../tp/d3.js"></script>
+
+ <script type="text/javascript" src="practice-table.js"></script>
+ <script type="text/javascript" src="../app/fw/widget/widget.js"></script>
+ <script type="text/javascript" src="../app/fw/widget/table.js"></script>
+
+ <style>
+ html,
+ body {
+ background-color: #ddf;
+ font-family: Arial, Helvetica, sans-serif;
+ font-size: 9pt;
+ }
+
+ h2 {
+ color: darkred;
+ }
+
+ </style>
+
+</head>
+<!-- outline for using a controller in Angular -->
+<body ng-app="practiceTable">
+ <h2>Scrolling Table Practice</h2>
+ <div id="tableDiv" ng-controller="showTableCtrl as ctrl">
+ </div>
+
+</body>
+</html> \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/_bripc/practice-table.js b/framework/src/onos/web/gui/src/main/webapp/_bripc/practice-table.js
new file mode 100644
index 00000000..f244c866
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_bripc/practice-table.js
@@ -0,0 +1,273 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Showing Icons Test Module
+ */
+
+(function () {
+ 'use strict';
+
+ var config = {
+ colIds: ['_iconid_available', 'id', 'mfr', 'hw', 'sw', 'serial',
+ 'annotations'],
+ colText: ['Availability', 'URI', 'Vendor', 'Hardware Version',
+ 'Software Version', 'Serial Number', 'Protocol']
+ },
+ deviceData = {
+ "devices": [{
+ "id": "of:0000000000000001",
+ "available": true,
+ "_iconid_available": "active",
+ "role": "MASTER",
+ "mfr": "Nicira, Inc.",
+ "hw": "Open vSwitch",
+ "sw": "2.0.1",
+ "serial": "None",
+ "annotations": {
+ "protocol": "OF_10"
+ }
+ },
+ {
+ "id": "of:0000000000000004",
+ "available": false,
+ "_iconid_available": "inactive",
+ "role": "MASTER",
+ "mfr": "Nicira, Inc.",
+ "hw": "Open vSwitch",
+ "sw": "2.0.1",
+ "serial": "None",
+ "annotations": {
+ "protocol": "OF_10"
+ }
+ },
+ {
+ "id": "of:0000000000000092",
+ "available": false,
+ "_iconid_available": "inactive",
+ "role": "MASTER",
+ "mfr": "Nicira, Inc.",
+ "hw": "Open vSwitch",
+ "sw": "2.0.1",
+ "serial": "None",
+ "annotations": {
+ "protocol": "OF_10"
+ }
+ },
+ {
+ "id": "of:0000000000000092",
+ "available": false,
+ "_iconid_available": "inactive",
+ "role": "MASTER",
+ "mfr": "Nicira, Inc.",
+ "hw": "Open vSwitch",
+ "sw": "2.0.1",
+ "serial": "None",
+ "annotations": {
+ "protocol": "OF_10"
+ }
+ },
+ {
+ "id": "of:0000000000000092",
+ "available": false,
+ "_iconid_available": "inactive",
+ "role": "MASTER",
+ "mfr": "Nicira, Inc.",
+ "hw": "Open vSwitch",
+ "sw": "2.0.1",
+ "serial": "None",
+ "annotations": {
+ "protocol": "OF_10"
+ }
+ },
+ {
+ "id": "of:0000000000000092",
+ "available": false,
+ "_iconid_available": "inactive",
+ "role": "MASTER",
+ "mfr": "Nicira, Inc.",
+ "hw": "Open vSwitch",
+ "sw": "2.0.1",
+ "serial": "None",
+ "annotations": {
+ "protocol": "OF_10"
+ }
+ },
+ {
+ "id": "of:0000000000000092",
+ "available": false,
+ "_iconid_available": "inactive",
+ "role": "MASTER",
+ "mfr": "Nicira, Inc.",
+ "hw": "Open vSwitch",
+ "sw": "2.0.1",
+ "serial": "None",
+ "annotations": {
+ "protocol": "OF_10"
+ }
+ },
+ {
+ "id": "of:0000000000000092",
+ "available": false,
+ "_iconid_available": "inactive",
+ "role": "MASTER",
+ "mfr": "Nicira, Inc.",
+ "hw": "Open vSwitch",
+ "sw": "2.0.1",
+ "serial": "None",
+ "annotations": {
+ "protocol": "OF_10"
+ }
+ },
+ {
+ "id": "of:0000000000000092",
+ "available": false,
+ "_iconid_available": "inactive",
+ "role": "MASTER",
+ "mfr": "Nicira, Inc.",
+ "hw": "Open vSwitch",
+ "sw": "2.0.1",
+ "serial": "None",
+ "annotations": {
+ "protocol": "OF_10"
+ }
+ },
+ {
+ "id": "of:0000000000000092",
+ "available": false,
+ "_iconid_available": "inactive",
+ "role": "MASTER",
+ "mfr": "Nicira, Inc.",
+ "hw": "Open vSwitch",
+ "sw": "2.0.1",
+ "serial": "None",
+ "annotations": {
+ "protocol": "OF_10"
+ }
+ },
+ {
+ "id": "of:0000000000000092",
+ "available": false,
+ "_iconid_available": "inactive",
+ "role": "MASTER",
+ "mfr": "Nicira, Inc.",
+ "hw": "Open vSwitch",
+ "sw": "2.0.1",
+ "serial": "None",
+ "annotations": {
+ "protocol": "OF_10"
+ }
+ },
+ {
+ "id": "of:0000000000000092",
+ "available": false,
+ "_iconid_available": "inactive",
+ "role": "MASTER",
+ "mfr": "Nicira, Inc.",
+ "hw": "Open vSwitch",
+ "sw": "2.0.1",
+ "serial": "None",
+ "annotations": {
+ "protocol": "OF_10"
+ }
+ },
+ {
+ "id": "of:0000000000000092",
+ "available": false,
+ "_iconid_available": "inactive",
+ "role": "MASTER",
+ "mfr": "Nicira, Inc.",
+ "hw": "Open vSwitch",
+ "sw": "2.0.1",
+ "serial": "None",
+ "annotations": {
+ "protocol": "OF_10"
+ }
+ }]
+ };
+
+ function setColWidth(t) {
+ var tHeaders, tdElement, colWidth;
+
+ tHeaders = t.selectAll('th');
+
+ // select each td in the first row and set the header's width to the
+ // corresponding td's width, if td is larger than header's width
+ tHeaders.each(function(thElement, index){
+ thElement = d3.select(this);
+
+ tdElement = t.select('td:nth-of-type(' + (index + 1) + ')');
+ colWidth = tdElement.style('width');
+
+ thElement.style('width', colWidth);
+ tdElement.style('width', colWidth);
+ });
+ }
+
+ function setCSS(thead, tbody, height) {
+ thead.style('display', 'block');
+ tbody.style({'display': 'block',
+ 'height': height || '100px',
+ 'overflow': 'auto'
+ });
+ }
+
+ function fixTable(t, th, tb, height) {
+ setColWidth(t);
+ setCSS(th, tb, height);
+ }
+
+ angular.module('practiceTable', ['onosWidget'])
+
+ .controller('showTableCtrl', ['$log', '$scope', '$rootScope',
+ '$timeout', 'TableService',
+ function ($log, $scope, $rootScope, $timeout, ts) {
+ var self = this;
+ var table = ts.renderTable(d3.select('#tableDiv'), config, deviceData);
+ }])
+
+ .directive('fixedHeader', ['$log', '$timeout', '$compile',
+ function ($log, $timeout, $compile) {
+ return {
+ restrict: 'A',
+ scope: {
+ tHeight: '@'
+ },
+
+ link: function (scope, element, attrs) {
+ var table = d3.select(element[0]),
+ thead = table.select('thead'),
+ tbody = table.select('tbody');
+
+ // wait until the table is visible
+ scope.$watch(
+ function () { return (!(table.offsetParent === null)); },
+ function(newValue, oldValue) {
+ if (newValue === true) {
+
+ // ensure thead and tbody have no display
+ thead.style('display', null);
+ tbody.style('display', null);
+
+ $timeout(function () {
+ fixTable(table, thead, tbody, scope.tHeight);
+ });
+ }
+ });
+ }
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/_bripc/show-icons-test.js b/framework/src/onos/web/gui/src/main/webapp/_bripc/show-icons-test.js
new file mode 100644
index 00000000..915e0168
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_bripc/show-icons-test.js
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Showing Icons Test Module
+ */
+
+(function () {
+ 'use strict';
+
+ // assuming the glyph is a square
+ // div is a D3 selection of the <DIV> element into which icon should load
+ // size is the size of the glyph
+ // id is the symbol id
+ // rer is the rectangle the glyph will be in's rounded corners
+ // svgClass is the class name for your glyph
+ function createGlyph(div, size, id, rer, svgClass) {
+ var dim = size || 20,
+ texty = 30,
+ gid = id || 'unknown',
+ rx = rer || 4,
+ svgCls = svgClass || 'embeddedGlyph',
+ svg, g;
+
+ svg = div.append('svg').attr({
+ 'class': svgCls,
+ width: dim,
+ height: dim + texty,
+ viewBox: '0 0 ' + dim + ' ' + dim
+ });
+
+ g = svg.append('g').attr({
+ 'class': 'glyph'
+ });
+
+ g.append('rect').attr({
+ width: dim,
+ height: dim,
+ rx: rx
+ });
+
+ g.append('use').attr({
+ width: dim,
+ height: dim,
+ 'class': 'glyph',
+ 'xlink:href': '#' + gid
+ });
+
+ g.append('text')
+ .attr({
+ 'text-anchor': 'left',
+ y: '1em',
+ x: 0,
+ transform: 'translate(0, ' + dim + ')scale(0.8)'
+ })
+ .style('fill', '#800')
+ .text(id);
+ }
+
+ angular.module('showIconsTest', ['onosSvg'])
+
+ .controller('OvShowIconsTest', ['$log', 'GlyphService', 'IconService',
+ function ($log, gs, icns) {
+ var self = this;
+
+ gs.init();
+
+ var div = d3.select('#showIcons');
+
+ // show device online and offline icons
+ icns.loadEmbeddedIcon(div, 'active', 50);
+ div.append('span').style('padding-left', '15px');
+ icns.loadEmbeddedIcon(div, 'inactive', 50);
+
+ var defs = d3.select('defs');
+
+ // show all glyphs in glyph library
+ gs.loadDefs(defs, null, true);
+ var list = gs.ids(),
+ gDiv = d3.select('#showGlyphs'),
+ ctr = 0;
+ list.forEach(function (id) {
+ createGlyph(gDiv, 50, id);
+ ctr += 1;
+ if (ctr%6 > 0) {
+ gDiv.append('span').style('padding-left', '15px');
+ } else {
+ gDiv.append('br');
+ }
+ });
+
+ $log.log('OvShowIconsTest has been created');
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/_bripc/show-icons.html b/framework/src/onos/web/gui/src/main/webapp/_bripc/show-icons.html
new file mode 100644
index 00000000..e6bf1dab
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_bripc/show-icons.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html>
+<!--
+ ~ Copyright 2015 Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<!--
+ ONOS -- Displaying icons with Angular test page
+ -->
+
+<html>
+<head lang="en">
+ <meta charset="UTF-8">
+ <title>Show Icons Angular</title>
+
+ <script type="text/javascript" src="../tp/angular.js"></script>
+ <script type="text/javascript" src="../tp/angular-route.js"></script>
+
+ <script type="text/javascript" src="../tp/d3.js"></script>
+
+ <script type="text/javascript" src="../app/fw/util/util.js"></script>
+ <script type="text/javascript" src="../app/fw/util/fn.js"></script>
+ <script type="text/javascript" src="../app/fw/util/theme.js"></script>
+ <script type="text/javascript" src="../app/fw/util/keys.js"></script>
+
+ <script type="text/javascript" src="../app/fw/svg/svg.js"></script>
+ <script type="text/javascript" src="../app/fw/svg/svgUtil.js"></script>
+ <script type="text/javascript" src="../app/fw/svg/glyph.js"></script>
+ <script type="text/javascript" src="../app/fw/svg/icon.js"></script>
+ <script type="text/javascript" src="../app/fw/svg/geodata.js"></script>
+ <script type="text/javascript" src="../app/fw/svg/map.js"></script>
+ <script type="text/javascript" src="../app/fw/svg/zoom.js"></script>
+
+ <script type="text/javascript" src="show-icons-test.js"></script>
+
+ <link rel="stylesheet" href="../app/common.css">
+ <link rel="stylesheet" href="../app/fw/svg/icon.css">
+
+ <style>
+ html,
+ body {
+ background-color: #ddf;
+ font-family: Arial, Helvetica, sans-serif;
+ font-size: 9pt;
+ }
+
+ h2 {
+ color: darkred;
+ }
+
+ svg .glyph {
+ stroke: none;
+ fill: #123456;
+ fill-rule: evenodd;
+ }
+
+ svg.embeddedGlyph .glyph rect {
+ fill: #fff
+ }
+
+ </style>
+
+</head>
+<!-- outline for using a controller in Angular -->
+<body class="light" ng-app="showIconsTest" ng-controller="OvShowIconsTest as ctrl">
+ <h2>Displaying Icons and Glyphs with Angular</h2>
+ <div id="showIcons">
+ <p>Show all icons in icon library:<br></p>
+ </div>
+ <hr>
+ <div id="showGlyphs">
+ <p>Show all glyphs in glyph library:</p>
+ <p>(Displays checkMark and xMark too, because icons are built on top
+ of glyphs.)</p>
+ </div>
+
+
+
+</body>
+</html> \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/_bripc/svg-exercise.html b/framework/src/onos/web/gui/src/main/webapp/_bripc/svg-exercise.html
new file mode 100644
index 00000000..f9c11b8d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_bripc/svg-exercise.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html>
+<!--
+ ~ Copyright 2015 Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<!--
+ ONOS -- SVG mouse over d3 exercise html
+ -->
+
+<html>
+<head lang="en">
+ <meta charset="UTF-8">
+ <title>Upgrade Performance</title>
+
+ <script type="text/javascript" src="../tp/angular.js"></script>
+ <script type="text/javascript" src="../tp/d3.js"></script>
+ <script type="text/javascript" src="svg-exercise.js"></script>
+ <script type="text/javascript" src="../app/fw/util/util.js"></script>
+ <script type="text/javascript" src="../app/fw/util/fn.js"></script>
+
+
+ <style>
+ html,
+ body, div {
+ background-color: #eee;
+ font-family: Arial, Helvetica, sans-serif;
+ font-size: 9pt;
+ margin: 0;
+ overflow: hidden;
+ }
+ .button {
+ fill: #369;
+ filter: url(#buttonBevel);
+ }
+ svg text {
+ fill: white;
+ letter-spacing: .005em;
+ }
+ </style>
+</head>
+
+<body ng-app="svgExercise">
+
+<div id="svgExDiv" ng-controller="svgExCtrl as ctrl">
+ <improve-performance></improve-performance>
+</div>
+
+<svg xmlns="http://www.w3.org/2000/svg"
+ viewBox="-10 -10 110 110"
+ visibility="hidden">
+ <filter id="buttonBevel"
+ filterUnits="objectBoundingBox"
+ x="-10%" y="-10%" width="110%" height="110%">
+ <feGaussianBlur in="SourceAlpha"
+ stdDeviation="4"
+ result="blur"/>
+ <feSpecularLighting in="blur"
+ surfaceScale="7"
+ specularConstant="0.6"
+ specularExponent="5"
+ result="spec"
+ lighting-color="#4E7199">
+ <fePointLight x="-5000" y="-10000" z="20000"/>
+ </feSpecularLighting>
+ <feComposite in="spec"
+ in2="SourceAlpha"
+ operator="in"
+ result="spec2"/>
+ <feComposite in="SourceGraphic"
+ in2="spec2"
+ operator="arithmetic"
+ k1="0" k2="1" k3="1" k4="0" />
+ </filter>
+</svg>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_bripc/svg-exercise.js b/framework/src/onos/web/gui/src/main/webapp/_bripc/svg-exercise.js
new file mode 100644
index 00000000..96ed131f
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_bripc/svg-exercise.js
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- SVG mouse over d3 exercise module
+ */
+
+(function () {
+ 'use strict';
+
+ // injected references
+ var $log, fs;
+
+ // constants
+ var btnWidth = 175,
+ btnHeight = 50,
+ hoverZone = 70,
+ sectorDivisions = 3,
+ margin = 10;
+
+ // svg elements
+ var svg, g;
+
+ // other variables
+ var winWidth, winHeight,
+ sectorWidth, sectorHeight,
+ currSector = 4, // always starts in the middle
+ mouse;
+
+ // ====================================================
+
+ function centeredOnWindow(axis, dim) {
+ return (axis / 2) - (dim / 2);
+ }
+
+ function onMouseMove() {
+ mouse = d3.mouse(this);
+ moveButton();
+ }
+
+ function removeMouseListener() {
+ g.on('mousemove', null);
+ }
+
+ function addMouseListener() {
+ g.on('mousemove', onMouseMove);
+ }
+
+ function selectSector() {
+ var sector, row, col,
+ currCol = currSector % sectorDivisions;
+
+ do {
+ sector = Math.floor((Math.random() * 9));
+ col = sector % sectorDivisions;
+ } while (col === currCol);
+ currSector = sector;
+ row = Math.floor(sector / sectorDivisions);
+
+ return {
+ xmin: (sectorWidth * col) + margin,
+ xmax: ((sectorWidth * col) + sectorWidth) - margin,
+ ymin: (sectorHeight * row) + margin,
+ ymax: ((sectorHeight * row) + sectorHeight) - margin
+ };
+ }
+
+ function selectXY(sectorCoords) {
+ var x, y, x1, y1;
+
+ do {
+ x = (Math.random() * sectorCoords.xmax) + sectorCoords.xmin;
+ y = (Math.random() * sectorCoords.ymax) + sectorCoords.ymin;
+ x1 = x + btnWidth;
+ y1 = y + btnHeight;
+ } while (x1 > sectorCoords.xmax || y1 > sectorCoords.ymax);
+
+ return {
+ x: x,
+ y: y
+ };
+ }
+
+ function gTranslate(x, y) {
+ return 'translate(' + x + ',' + y + ')';
+ }
+
+ function moveButton() {
+ var sec = selectSector(),
+ pos = selectXY(sec);
+ g.transition()
+ .duration(300)
+ .ease('cubic-out')
+ .each('start', removeMouseListener)
+ .attr('transform', gTranslate(pos.x, pos.y))
+ .each('end', addMouseListener);
+ }
+
+ angular.module('svgExercise', ['onosUtil'])
+
+ .controller('svgExCtrl', ['$log', function (_$log_) {
+ $log = _$log_;
+ }])
+
+ .directive('improvePerformance', ['FnService', function (_fs_) {
+ fs = _fs_;
+ return {
+ restrict: 'E',
+ link: function (scope, elem) {
+ winWidth = fs.windowSize().width;
+ winHeight = fs.windowSize().height;
+ sectorWidth = winWidth / sectorDivisions;
+ sectorHeight = winHeight / sectorDivisions;
+
+ svg = d3.select(elem[0])
+ .append('svg')
+ .attr({
+ width: winWidth + 'px',
+ height: winHeight + 'px'
+ });
+
+ g = svg.append('g');
+
+ g.append('rect')
+ .attr({
+ width: btnWidth + 'px',
+ height: btnHeight + 'px',
+ rx: '10px',
+ 'class': 'button'
+ });
+
+ g.append('text')
+ .style('text-anchor', 'middle')
+ .text('Click for better performance.')
+ .attr({
+ x: btnWidth / 2,
+ y: (btnHeight / 2) + 5
+ });
+
+ g.append('rect')
+ .attr({
+ fill: 'none',
+ 'pointer-events': 'all',
+ width: btnWidth + hoverZone + 'px',
+ height: btnHeight + hoverZone + 'px',
+ x: -(hoverZone / 2),
+ y: -(hoverZone / 2)
+ });
+ g.attr('transform',
+ gTranslate(centeredOnWindow(winWidth, btnWidth),
+ centeredOnWindow(winHeight, btnHeight)));
+
+ addMouseListener();
+ }
+ };
+ }]);
+}()); \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/checkmark-xmark-icon.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/checkmark-xmark-icon.html
new file mode 100644
index 00000000..4c726fe7
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/checkmark-xmark-icon.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html>
+<!--
+ ~ Copyright 2015 Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<!--
+ ONOS -- Embedded checkmarks and xmarks in table page
+ -->
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Embedded Check and X Marks</title>
+
+ <script src="../tp/d3.js"></script>
+
+ <link rel="stylesheet" href="../app/common.css">
+
+ <style>
+ html,
+ body {
+ background-color: #fff;
+ font-family: Arial, Helvetica, sans-serif;
+ font-size: 9pt;
+ }
+
+ svg .icon .glyph {
+ stroke: none;
+ fill: white;
+ fill-rule: evenodd;
+ }
+
+ svg .icon.active {
+ fill: green;
+ }
+
+ svg .icon.inactive {
+ fill: darkred;
+ }
+
+ svg .icon rect {
+ stroke: white;
+ stroke-width: 3px;
+ }
+
+ </style>
+</head>
+<body class="light">
+<!-- minimal framework to access glyphs library module -->
+<script>
+ var libs = {};
+ var ONOS = { ui: { addLib: function (id, things) { libs[id] = things; }}};
+
+
+</script>
+
+<!-- Test HTML -->
+
+<div>
+ <table class="summary-list">
+ <tr> <th></th> <th>Two</th> <th>Three</th> </tr>
+ <tr>
+ <td>
+ <div icon icon-id="active">
+
+ <!-- icon directive needs to inject the following structure -->
+ <!-- ------------------------------------------------ -->
+ <svg width="20" height="20" viewBox="0 0 50 50">
+ <g class="icon active">
+ <rect width="50" height="50" rx="10"></rect>
+ <use class="glyph" xlink:href="#checkmark" width="50" height="50"></use>
+ </g>
+ </svg>
+ <!-- ------------------------------------------------ -->
+
+ </div>
+ </td>
+ <td>Some text</td>
+ <td>Some text</td>
+ </tr>
+ <tr>
+ <td>
+ <div icon icon-id="inactive">
+
+ <!-- icon directive needs to inject the following structure -->
+ <!-- ------------------------------------------------ -->
+ <svg width="20" height="20" viewBox="0 0 50 50">
+ <g class="icon inactive">
+ <rect width="50" height="50" rx="10"></rect>
+ <use class="glyph" xlink:href="#xmark" width="50" height="50"></use>
+ </g>
+ </svg>
+ <!-- ------------------------------------------------ -->
+
+
+ </div>
+ </td>
+ <td>Some text</td>
+ <td>Some Other text</td>
+ </tr>
+ </table>
+</div>
+
+<!-- common definitions for other SVG elements to use -->
+<svg width="0" height="0">
+ <defs>
+ <symbol id="checkmark" viewBox="0 0 10 10">
+ <path d="M2.644,4.531c0,0,0.719-0.422,1.172,0.281l1.047,1.797c0,0,
+ 2.675-5.449,2.781-5.719c0,0,0.547-0.859,1.359-0.094
+ c0,0,0.484,0.484,0,1.297S6.775,7.305,5.557,9.211c0,0-0.413,0.461-1.194,
+ 0.086S2.222,5.375,2.222,5.375S2.159,4.734,2.644,4.531z">
+ </path>
+ </symbol>
+
+ <symbol id="xmark" viewBox="0 0 10 10">
+ <path d="M8.967,7.196C8.172,6.852,7.37,6.058,6.672,5.189c0.385-0.463,
+ 0.665-0.834,0.764-1.008C7.825,3.5,9.382,1.553,8.068,1.067
+ C6.754,0.58,6.585,1.723,6.585,1.723C6.41,2.129,5.955,2.722,5.386,3.371C4.865,
+ 2.544,4.541,1.918,4.541,1.918
+ S3.812,0.24,2.863,0.654C1.915,1.067,2.304,2.283,2.304,2.283c0.349,1.122,
+ 0.834,2.082,1.368,2.898
+ C2.456,6.396,1.331,7.415,1.331,7.415S0.82,7.829,0.844,8.072C0.869,8.315,
+ 0.917,9.556,2.4,9.067
+ C3.084,8.843,4.122,7.933,5.083,6.95c1.306,1.348,2.498,1.949,2.498,1.949s0.535,
+ 0.51,1.386-0.244
+ C9.819,7.902,8.967,7.196,8.967,7.196z">
+ </path>
+ </symbol>
+
+ </defs>
+</svg>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/embedded-icon.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/embedded-icon.html
new file mode 100644
index 00000000..8d4d62a8
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/embedded-icon.html
@@ -0,0 +1,130 @@
+<!DOCTYPE html>
+<!--
+ ~ Copyright 2015 Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<!--
+ ONOS -- Embedded icon test page
+ -->
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Embedded Icons</title>
+
+ <script src="../tp/d3.js"></script>
+
+ <link rel="stylesheet" href="../app/common.css">
+
+ <style>
+ html,
+ body {
+ background-color: #fff;
+ font-family: Arial, Helvetica, sans-serif;
+ font-size: 9pt;
+ }
+
+ svg .icon .glyph {
+ stroke: none;
+ fill: white;
+ fill-rule: evenodd;
+ }
+
+ svg .icon.active {
+ fill: green;
+ }
+
+ svg .icon.inactive {
+ fill: darkred;
+ }
+
+ svg .icon rect {
+ stroke: black;
+ stroke-width: 1px;
+ }
+
+ </style>
+</head>
+<body class="light">
+<!-- minimal framework to access glyphs library module -->
+<script>
+ var libs = {};
+ var ONOS = { ui: { addLib: function (id, things) { libs[id] = things; }}};
+
+
+</script>
+
+<!-- Test HTML -->
+
+<div>
+ <table class="summary-list">
+ <tr> <th></th> <th>Two</th> <th>Three</th> </tr>
+ <tr>
+ <td>
+ <div icon icon-id="active">
+
+ <!-- icon directive needs to inject the following structure -->
+ <!-- ------------------------------------------------ -->
+ <svg width="20" height="20" viewBox="0 0 50 50">
+ <g class="icon active">
+ <rect width="50" height="50" rx="4"></rect>
+ <use class="glyph" xlink:href="#ui" width="50" height="50"></use>
+ </g>
+ </svg>
+ <!-- ------------------------------------------------ -->
+
+ </div>
+ </td>
+ <td>Some text</td>
+ <td>Some text</td>
+ </tr>
+ <tr>
+ <td>
+ <div icon icon-id="inactive">
+
+ <!-- icon directive needs to inject the following structure -->
+ <!-- ------------------------------------------------ -->
+ <svg width="20" height="20" viewBox="0 0 50 50">
+ <g class="icon inactive">
+ <rect width="50" height="50" rx="4"></rect>
+ <use class="glyph" xlink:href="#ui" width="50" height="50"></use>
+ </g>
+ </svg>
+ <!-- ------------------------------------------------ -->
+
+
+ </div>
+ </td>
+ <td>Some text</td>
+ <td>Some Other text</td>
+ </tr>
+ </table>
+</div>
+
+<!-- common definitions for other SVG elements to use -->
+<svg width="0" height="0">
+ <defs>
+ <symbol id="ui" viewBox="0 0 10 10">
+ <path d="M2,2.5a.5,.5,0,0,1,.5-.5h5
+ a.5,.5,0,0,1,.5,.5v3a.5,.5,0,0,1-.5,.5h-5a.5,
+ .5,0,0,1-.5-.5zM2.5,2.8a.3,.3,0,0,1,.3-.3
+ h4.4a.3,.3,0,0,1,.3,.3v2.4a.3,.3,0,0,1-.3,
+ .3h-4.4a.3,.3,0,0,1-.3-.3zM2,6.55h6l1,1.45h-8z">
+ </path>
+ </symbol>
+ </defs>
+</svg>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/glyphs.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/glyphs.html
new file mode 100644
index 00000000..589ef07b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/glyphs.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html>
+<!--
+ ~ Copyright 2014 Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<!--
+ ONOS -- Glyphs library test page (old version)
+ -->
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Glyphs</title>
+
+ <script src="../tp/d3.js"></script>
+
+ <style>
+ html,
+ body {
+ background-color: #ddf;
+ font-family: Arial, Helvetica, sans-serif;
+ font-size: 9pt;
+ }
+
+ svg {
+ background-color: #fff;
+ }
+
+ svg .glyph {
+ stroke: none;
+ fill: black;
+ fill-rule: evenodd;
+ }
+
+ svg .icon text {
+ text-anchor: middle;
+ font-size: 5pt;
+ fill: green;
+ stroke: none;
+ }
+
+ </style>
+</head>
+<body>
+ <!-- minimal framework to access glyphs library module -->
+ <script>
+ var libs = {};
+ var ONOS = { ui: { addLib: function (id, things) { libs[id] = things; }}};
+ </script>
+
+ <!-- import the glyphs library -->
+ <script src="../glyphs.js"></script>
+
+ <svg></svg>
+
+ <!-- code to display the glyphs in the library -->
+ <script>
+ (function () {
+ var w = 1000,
+ h = 800,
+ vb = '0 0 ' + w + ' ' + h;
+
+ var svg = d3.select('svg')
+ .attr({ width: w, height: h, viewBox: vb });
+
+ // create definitions element...
+ var defs = svg.append('defs');
+
+ // create scaling group
+ var grp = svg.append('g')
+ .attr('transform', 'translate(20,20)scale(2)');
+
+ var mag = svg.append('g')
+ .attr('transform', 'translate(20,20)scale(12)');
+
+ function translate(loc) {
+ return 'translate(' + loc[0] + ',' + loc[1] +')';
+ }
+
+ function icon(what, id, loc, color, bg, size) {
+ var i = '#' + id,
+ c = color || 'black',
+ b = bg || '#eef',
+ z = size || 40,
+ g;
+
+ g = what.append('g')
+ .attr({ 'class': 'icon', transform: translate(loc) });
+
+ g.append('rect')
+ .attr({ width: z, height: z, rx: 4 })
+ .style('fill', b)
+ .style('stroke', 'black')
+ .style('stroke-width', 0.5);
+
+ g.append('use')
+ .attr({ 'class': 'glyph', width: z, height: z, 'xlink:href': i })
+ .style('fill', c);
+
+ if (id !== 'bird') {
+ g.append('text')
+ .text(id)
+ .attr({ x: z / 2, y: z + 8 })
+ }
+ }
+
+
+ // import glyphs...
+ libs.glyphs.loadDefs(defs);
+
+ // bird, top right corner
+ icon(svg, 'bird', [830,10], '#800', '#ecc', 160);
+
+ // show icons...
+ icon(grp, 'unknown', [ 0, 0]);
+ icon(grp, 'node', [ 50, 0]);
+ icon(grp, 'switch', [100, 0]);
+ icon(grp, 'roadm', [150, 0]);
+ icon(grp, 'endstation', [200, 0]);
+ icon(grp, 'router', [250, 0]);
+ icon(grp, 'bgpSpeaker', [300, 0]);
+ icon(grp, 'uiAttached', [350, 0]);
+
+ icon(grp, 'chain', [ 0, 60]);
+ icon(grp, 'crown', [ 50, 60]);
+
+// icon(mag, 'crown', [20, 15], 'rgba(240,120,120,1)', 'transparent');
+
+ // more goodies to come soon.....
+ })();
+ </script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch01-01-hello-world-app.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch01-01-hello-world-app.html
new file mode 100644
index 00000000..82cfec6c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch01-01-hello-world-app.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<body ng-app>
+ <input type="text"
+ ng-model="name"
+ placeholder="Enter your name">
+
+ <h1>Hello <span ng-bind="name"></span></h1>
+ <!-- Note alternate syntax for same thig... -->
+ <h1>Hello {{ name }}</h1>
+
+ <script src="../../tp/angular.js"></script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-01-module-example.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-01-module-example.html
new file mode 100644
index 00000000..97432e35
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-01-module-example.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Hello AngularJS</title>
+
+ <script src="../../tp/angular.js"></script>
+</head>
+<body>
+ Hello {{1 + 1}}nd time AngularJS
+
+ <script type="text/javascript">
+ angular.module('notesApp', []);
+ </script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-02-creating-controller.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-02-creating-controller.html
new file mode 100644
index 00000000..566c6dd5
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-02-creating-controller.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Hello AngularJS</title>
+
+ <script src="../../tp/angular.js"></script>
+</head>
+<body ng-controller="MainCtrl">
+ Hello {{1 + 1}}nd time AngularJS
+
+ <script type="text/javascript">
+ angular.module('notesApp', [])
+ .controller('MainCtrl', [function () {
+ // controller specific code here
+ console.log('MainCtrl has been created');
+ }]);
+ </script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-03-hello-controller.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-03-hello-controller.html
new file mode 100644
index 00000000..c206bf8e
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-03-hello-controller.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+</head>
+<body ng-controller="MainCtrl as ctrl">
+ {{ctrl.helloMsg}} AngularJS.
+ <br/>
+ {{ctrl.goodbyeMsg}} AngularJS
+
+ <script type="text/javascript">
+ angular.module('notesApp', [])
+ .controller('MainCtrl', [function () {
+ this.helloMsg = 'Hello ';
+ var goodbyeMsg = 'Goodbye ';
+ }]);
+ </script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-04-controller-click-msg.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-04-controller-click-msg.html
new file mode 100644
index 00000000..4a4a22ee
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-04-controller-click-msg.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+</head>
+<body ng-controller="MainCtrl as ctrl">
+ {{ctrl.message}} AngularJS.
+
+ <button ng-click="ctrl.changeMessage()">
+ Change Message
+ </button>
+
+ <script type="text/javascript">
+ angular.module('notesApp', [])
+ .controller('MainCtrl', [function () {
+ var self = this;
+ self.message = 'Hello';
+ self.changeMessage = function () {
+ self.message = 'Goodbye'
+ };
+ }]);
+ </script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-05-ng-repeat-example-1.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-05-ng-repeat-example-1.html
new file mode 100644
index 00000000..a262c1b6
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-05-ng-repeat-example-1.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+</head>
+<body ng-controller="MainCtrl as ctrl">
+
+ <div ng-repeat="note in ctrl.notes">
+ <span class="label"> {{note.label}} </span>
+ <!--<span class="status" ng-bind="note.done"></span>-->
+ <span class="status"> {{note.done}} </span>
+ </div>
+
+ <script type="text/javascript">
+ angular.module('notesApp', [])
+ .controller('MainCtrl', [function () {
+ var self = this;
+ self.notes = [
+ {id: 1, label: 'First note', done: false},
+ {id: 2, label: 'Second note', done: false},
+ {id: 3, label: 'Done note', done: true},
+ {id: 4, label: 'Last note', done: false}
+ ]
+ }]);
+ </script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-06-more-directives.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-06-more-directives.html
new file mode 100644
index 00000000..254dd08c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-06-more-directives.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <style>
+ .done {
+ background-color: limegreen;
+ }
+ .pending {
+ background-color: yellow;
+ }
+ .assignee {
+ color: red;
+ font-weight: bold;
+ }
+ </style>
+ <script src="../../tp/angular.js"></script>
+</head>
+<body ng-controller="MainCtrl as ctrl">
+
+ <div ng-repeat="note in ctrl.notes"
+ ng-class="ctrl.getNoteClass(note.done)">
+ <span class="label"> {{note.label}} </span>
+ <span class="assignee"
+ ng-show="note.assignee"
+ ng-bind="note.assignee">
+ </span>
+ </div>
+
+ <script type="text/javascript">
+ angular.module('notesApp', []).controller('MainCtrl', [
+ function () {
+ var self = this;
+ self.notes = [
+ {id: 1, label: 'First note', done: false, assignee: 'Simon'},
+ {id: 2, label: 'Second note', done: false},
+ {id: 3, label: 'Done note', done: true},
+ {id: 4, label: 'Last note', done: false, assignee: 'Fred'}
+ ];
+
+ self.getNoteClass = function (status) {
+ return {
+ done: status,
+ pending: !status
+ };
+ };
+ }
+ ]);
+ </script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-07-ng-repeat-object.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-07-ng-repeat-object.html
new file mode 100644
index 00000000..43de929d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-07-ng-repeat-object.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+</head>
+<body ng-controller="MainCtrl as ctrl">
+
+ <div ng-repeat="(author, note) in ctrl.notes">
+ <span class="label"> {{note.label}} </span>
+ <span class="author" ng-bind="author"></span>
+ </div>
+
+ <script type="text/javascript">
+ angular.module('notesApp', []).controller('MainCtrl', [
+ function () {
+ var self = this;
+ self.notes = {
+ simon: { id: 1, label: 'First note', done: false},
+ Thomas: { id: 3, label: 'Finished third note', done: true},
+ alice: { id: 2, label: 'Second note', done: false}
+ };
+ }
+ ]);
+ </script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-08-ng-helper-vars.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-08-ng-helper-vars.html
new file mode 100644
index 00000000..cf872d92
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-08-ng-helper-vars.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+ <style>
+ span {
+ background-color: #cce;
+ }
+ </style>
+</head>
+<body ng-controller="MainCtrl as ctrl">
+
+ <div ng-repeat="note in ctrl.notes">
+ <div>First element: {{$first}}</div>
+ <div>Middle element: {{$middle}}</div>
+ <div>Last element: {{$last}}</div>
+ <div>Index of element: {{$index}}</div>
+ <div>At even position: {{$even}}</div>
+ <div>At odd position: {{$odd}}</div>
+
+ <span class="label"> {{note.label}} </span>
+ <span class="status"> {{note.done}} </span>
+ <br/><br/>
+ </div>
+
+ <script type="text/javascript">
+ angular.module('notesApp', []).controller('MainCtrl', [
+ function () {
+ var self = this;
+ self.notes = [
+ {id: 1, label: 'First note', done: false},
+ {id: 2, label: 'Second note', done: false},
+ {id: 3, label: 'Done note', done: true},
+ {id: 4, label: 'Last note', done: false}
+ ];
+ }
+ ]);
+ </script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-09-ng-repeat-track-id.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-09-ng-repeat-track-id.html
new file mode 100644
index 00000000..23ad7dc0
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-09-ng-repeat-track-id.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+ <style>
+ span {
+ background-color: #cce;
+ }
+ </style>
+</head>
+<body ng-controller="MainCtrl as ctrl">
+
+ <button ng-click="ctrl.changeNotes()">Change Notes</button>
+ <br/>
+
+ DOM Elements change at every click
+ <div ng-repeat="note in ctrl.notes1">
+ {{note.$$hashKey}}
+ <span class="label"> {{note.label}} </span>
+ <span class="author"> {{note.done}} </span>
+ </div>
+ <br/>
+
+ DOM Elements are reused at every click
+ <div ng-repeat="note in ctrl.notes2 track by note.id">
+ {{note.$$hashKey}}
+ <span class="label"> {{note.label}} </span>
+ <span class="author"> {{note.done}} </span>
+ </div>
+
+ <script type="text/javascript">
+ angular.module('notesApp', []).controller('MainCtrl', [
+ function () {
+ var self = this;
+ var notes = [
+ {id: 1, label: 'First note', done: false, someRandom: 31431},
+ {id: 2, label: 'Second note', done: false},
+ {id: 3, label: 'Finished third note', done: true}
+ ];
+ self.notes1 = angular.copy(notes);
+ self.notes2 = angular.copy(notes);
+
+ self.changeNotes = function () {
+ notes = [
+ {id: 1, label: 'Changed note', done: false, someRandom: 4242},
+ {id: 2, label: 'Second note', done: false},
+ {id: 3, label: 'Finished third note', done: true}
+ ];
+ self.notes1 = angular.copy(notes);
+ self.notes2 = angular.copy(notes);
+ }
+ }
+ ]);
+ </script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-10-ng-repeat-across-elements.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-10-ng-repeat-across-elements.html
new file mode 100644
index 00000000..06a4fa72
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch02-10-ng-repeat-across-elements.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+ <style>
+ span {
+ background-color: #cce;
+ }
+ </style>
+</head>
+<body ng-controller="MainCtrl as ctrl">
+
+ <table>
+ <tr ng-repeat-start="note in ctrl.notes">
+ <td>{{note.label}}</td>
+ </tr>
+ <tr ng-repeat-end>
+ <td>Done: {{note.done}}</td>
+ </tr>
+ </table>
+
+
+ <script type="text/javascript">
+ angular.module('notesApp', []).controller('MainCtrl', [
+ function () {
+ var self = this;
+ self.notes = [
+ {id: 1, label: 'First note', done: false},
+ {id: 2, label: 'Second note', done: false},
+ {id: 3, label: 'Finished third note', done: true}
+ ];
+ }
+ ]);
+ </script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-01-simple-ng-model.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-01-simple-ng-model.html
new file mode 100644
index 00000000..5c8a4b13
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-01-simple-ng-model.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+ <style>
+ span {
+ background-color: #cce;
+ }
+ </style>
+</head>
+<body ng-controller="MainCtrl as ctrl">
+
+<input type="text" ng-model="ctrl.username"/>
+You typed {{ctrl.username}}
+
+
+<script type="text/javascript">
+ angular.module('notesApp', []).controller('MainCtrl', [
+ function () {
+ var self = this;
+ self.username = 'nothing';
+ }
+ ]);
+</script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-02-simple-ng-model2.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-02-simple-ng-model2.html
new file mode 100644
index 00000000..d02909f7
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-02-simple-ng-model2.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+ <style>
+ span {
+ background-color: #cce;
+ }
+ </style>
+</head>
+<body ng-controller="MainCtrl as ctrl">
+
+<input type="text" ng-model="ctrl.username"/>
+<input type="password" ng-model="ctrl.password"/>
+<button ng-click="ctrl.change()">Change values</button>
+<button ng-click="ctrl.submit()">Submit</button>
+
+
+
+
+<script type="text/javascript">
+ angular.module('notesApp', []).controller('MainCtrl', [
+ function () {
+ var self = this;
+ self.change = function () {
+ self.username = 'changed';
+ self.password = 'password';
+ };
+
+ self.submit = function () {
+ console.log('user clicked submit with ',
+ self.username, self.password);
+ };
+ }
+ ]);
+</script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-03-simple-form.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-03-simple-form.html
new file mode 100644
index 00000000..54a7ea4b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-03-simple-form.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+ <style>
+ span {
+ background-color: #cce;
+ }
+ </style>
+</head>
+<body ng-controller="MainCtrl as ctrl">
+
+<!--
+ - Note, using a form has the advantage of reacting to RETURN triggering
+ - the submit, as well as pressing the submit button.
+ -->
+<form ng-submit="ctrl.submit()">
+ <input type="text" placeholder="username" ng-model="ctrl.user.username"/>
+ <input type="password" placeholder="password" ng-model="ctrl.user.password"/>
+ <input type="submit" value="Submit"/>
+ <p></p>
+ <textarea cols="60" rows="5" ng-model="ctrl.user.notes" placeholder="Notes">
+ </textarea>
+ <p>
+ NOTES:
+ <div>
+ {{ctrl.user.notes}}
+ </div>
+ </p>
+</form>
+
+<script type="text/javascript">
+ angular.module('notesApp', [])
+ .controller('MainCtrl', [function () {
+ var self = this;
+
+ self.submit = function () {
+ console.log('User clicked submit with ', self.user);
+ };
+ }]);
+</script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-04-two-forms-databinding.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-04-two-forms-databinding.html
new file mode 100644
index 00000000..9cb4961c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-04-two-forms-databinding.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+ <style>
+ span {
+ background-color: #cce;
+ }
+ </style>
+</head>
+<body ng-controller="MainCtrl as ctrl">
+
+<form ng-submit="ctrl.submit1()">
+ <input type="text" placeholder="username" ng-model="ctrl.username"/>
+ <input type="password" placeholder="password" ng-model="ctrl.password"/>
+ <input type="submit" value="Submit"/>
+</form>
+
+<!-- Better way of structuring the form data -->
+<form ng-submit="ctrl.submit2()">
+ <input type="text" placeholder="username" ng-model="ctrl.user.username"/>
+ <input type="password" placeholder="password" ng-model="ctrl.user.password"/>
+ <input type="submit" value="Submit"/>
+</form>
+
+<script type="text/javascript">
+ angular.module('notesApp', [])
+ .controller('MainCtrl', [function () {
+ var self = this;
+
+ self.submit1 = function () {
+ // create user object to send to server
+ var user = {username: self.username, password: self.password};
+ console.log('First submit: ', user);
+ };
+ self.submit2 = function () {
+ console.log('Second submit: ', self.user);
+ };
+ }]);
+</script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-05-form-validation.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-05-form-validation.html
new file mode 100644
index 00000000..3501adb1
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-05-form-validation.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+ <style>
+ span {
+ background-color: #cce;
+ }
+ </style>
+</head>
+<body ng-controller="MainCtrl as ctrl">
+
+<form ng-submit="ctrl.submit()" name="myForm">
+ <input type="text"
+ placeholder="username"
+ ng-model="ctrl.user.username"
+ required
+ ng-minlength="4"/>
+
+ <input type="password"
+ placeholder="password"
+ ng-model="ctrl.user.password"
+ required/>
+
+ <input type="submit"
+ value="Submit"
+ ng-disabled="myForm.$invalid"/>
+</form>
+
+<script type="text/javascript">
+ angular.module('notesApp', [])
+ .controller('MainCtrl', [function () {
+ var self = this;
+ self.submit = function () {
+ console.log('Submit: ', self.user);
+ };
+ }]);
+</script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-06-form-error-messages.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-06-form-error-messages.html
new file mode 100644
index 00000000..46c38c94
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-06-form-error-messages.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+</head>
+<body ng-controller="MainCtrl as ctrl">
+
+<form ng-submit="ctrl.submit()" name="myForm">
+ <input type="text"
+ name="uname"
+ placeholder="username"
+ ng-model="ctrl.user.username"
+ required
+ ng-minlength="4"/>
+ <span ng-show="myForm.uname.$error.required">
+ This is a required field
+ </span>
+ <span ng-show="myForm.uname.$error.minlength">
+ Minimum length required is 4
+ </span>
+ <span ng-show="myForm.uname.$invalid">
+ This field is invalid
+ </span>
+ <br/>
+
+ <input type="password"
+ name="pwd"
+ placeholder="password"
+ ng-model="ctrl.user.password"
+ required/>
+ <span ng-show="myForm.pwd.$error.required">
+ This is a required field
+ </span>
+ <br/>
+
+ <input type="submit"
+ value="Submit"
+ ng-disabled="myForm.$invalid"/>
+</form>
+
+<script type="text/javascript">
+ angular.module('notesApp', [])
+ .controller('MainCtrl', [function () {
+ var self = this;
+ self.submit = function () {
+ console.log('Submit: ', self.user);
+ };
+ }]);
+</script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-07-form-styling.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-07-form-styling.html
new file mode 100644
index 00000000..1b6ab867
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-07-form-styling.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+ <style>
+ .username.ng-valid {
+ background-color: greenyellow;
+ }
+ .username.ng-dirty.ng-invalid-required {
+ background-color: hotpink;
+ }
+ .username.ng-dirty.ng-invalid-minlength {
+ background-color: lightpink;
+ }
+ </style>
+</head>
+<body ng-controller="MainCtrl as ctrl">
+
+<form ng-submit="ctrl.submit()" name="myForm">
+ <input type="text"
+ class="username"
+ name="uname"
+ placeholder="username"
+ ng-model="ctrl.user.username"
+ required
+ ng-minlength="4"/>
+
+ <input type="submit"
+ value="Submit"
+ ng-disabled="myForm.$invalid"/>
+</form>
+
+<script type="text/javascript">
+ angular.module('notesApp', [])
+ .controller('MainCtrl', [function () {
+ var self = this;
+ self.submit = function () {
+ console.log('Submit: ', self.user);
+ };
+ }]);
+</script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-08-nested-forms.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-08-nested-forms.html
new file mode 100644
index 00000000..c3149195
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-08-nested-forms.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html ng-app>
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+</head>
+<!-- no controller in this example -->
+<body>
+
+<form novalidate name="myForm">
+ <input type="text"
+ class="username"
+ name="uname"
+ ng-model="ctrl.user.username"
+ required=""
+ placeholder="Username"
+ ng-minlength="4"/>
+
+ <input type="password"
+ class="password"
+ name="pad"
+ ng-model="ctrl.user.password"
+ required=""
+ placeholder="Password"
+ required=""/>
+
+ <p/>
+
+ <ng-form name="profile">
+ <input type="text"
+ name="firstName"
+ ng-model="ctrl.user.profile.firstName"
+ placeholder="First Name"
+ required/>
+ <input type="text"
+ name="middleName"
+ ng-model="ctrl.user.profile.middleName"
+ placeholder="Middle Name"/>
+ <input type="text"
+ name="lastName"
+ ng-model="ctrl.user.profile.lastName"
+ placeholder="Last Name"
+ required/>
+
+ <input type="date"
+ name="dob"
+ placeholder="Date of birth"
+ ng-model="ctrl.user.profile.dob"/>
+ </ng-form>
+
+ <span ng-show="myForm.profile.$invalid">
+ Please fill out the profile information
+ </span>
+
+ <p/>
+
+ <input type="submit"
+ value="Submit"
+ ng-disabled="myForm.$invalid"/>
+</form>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-09-checkbox-example.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-09-checkbox-example.html
new file mode 100644
index 00000000..fe35af10
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-09-checkbox-example.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+</head>
+<body ng-controller="MainCtrl as ctrl">
+
+ <div>
+ <h2>What are your favorite sports?</h2>
+ <div ng-repeat="sport in ctrl.sports">
+ <label ng-bind="sport.label"></label>
+ <div>
+ With binding:
+ <input type="checkbox"
+ ng-model="sport.selected"
+ ng-true-value="'YES'"
+ ng-false-value="'NO'"/>
+ </div>
+ <div>
+ using ng-checked:
+ <input type="checkbox"
+ ng-checked="sport.selected === 'YES'"/>
+ </div>
+ <div>
+ Current state: {{sport.selected}}
+ </div>
+ <br/>
+ </div>
+
+ </div>
+
+ <script type="text/javascript">
+ angular.module('notesApp', [])
+ .controller('MainCtrl', [function () {
+ var self = this;
+ self.sports = [
+ {label: 'Basketball', selected: 'YES'},
+ {label: 'Cricket', selected: 'NO'},
+ {label: 'Soccer', selected: 'NO'},
+ {label: 'Swimming', selected: 'YES'}
+ ];
+ }]);
+ </script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-10-radio-buttons.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-10-radio-buttons.html
new file mode 100644
index 00000000..2a2cb83d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-10-radio-buttons.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+</head>
+<body ng-controller="MainCtrl as ctrl">
+
+ <div>
+ <h2>Radio Buttons</h2>
+ <div ng-init="user.gender = 'female'">
+ <input type="radio"
+ name="gender"
+ ng-model="user.gender"
+ value="male"/>Male
+ <input type="radio"
+ name="gender"
+ ng-model="user.gender"
+ value="female"/>Female
+ </div>
+ </div>
+
+ <div>
+ <h2>Radio Buttons two</h2>
+ <div ng-init="user.gender2 = 'male'; otherGender = 'Other'">
+ <input type="radio"
+ name="gender2"
+ ng-model="user.gender2"
+ value="male"/>Male
+ <input type="radio"
+ name="gender2"
+ ng-model="user.gender2"
+ value="female"/>Female
+ <input type="radio"
+ name="gender2"
+ ng-model="user.gender2"
+ ng-value="otherGender"/>{{otherGender}}
+ </div>
+ </div>
+
+ <div>
+ <h2>Radio Buttons three</h2>
+ <div ng-repeat="ch in ctrl.choices">
+ <input type="radio"
+ name="choice"
+ ng-model="user.choice"
+ ng-value="ch"/>{{ch}}
+
+ </div>
+ </div>
+
+
+ <script type="text/javascript">
+ angular.module('notesApp', [])
+ .controller('MainCtrl', [function () {
+ var self = this;
+
+ self.choices = ['foo', 'bar', 'baz', 'zoo', 'goo'];
+ }]);
+ </script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-11-select-example.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-11-select-example.html
new file mode 100644
index 00000000..a8cda33c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch04-11-select-example.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+</head>
+<body ng-controller="MainCtrl as ctrl">
+
+ <div>
+ <select ng-model="ctrl.selectedCountryId"
+ ng-options="c.id as c.label for c in ctrl.countries">
+ </select>
+ Selected Country ID: {{ctrl.selectedCountryId}}
+ </div>
+
+ <div>
+ <select ng-model="ctrl.selectedCountry"
+ ng-options="c.label for c in ctrl.countries track by c.id">
+ </select>
+ Selected Country: {{ctrl.selectedCountry}}
+ </div>
+
+ <script type="text/javascript">
+ angular.module('notesApp', [])
+ .controller('MainCtrl', [function () {
+ var self = this;
+
+ self.countries = [
+ {label: 'UK', id: 1},
+ {label: 'USA', id: 2},
+ {label: 'France', id: 3},
+ {label: 'Italy', id: 4}
+ ];
+ var first = self.countries[0];
+ self.selectedCountryId = first.id;
+ self.selectedCountry = first;
+ }]);
+ </script>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch05-01-need-for-service-app.js b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch05-01-need-for-service-app.js
new file mode 100644
index 00000000..4e25b0b1
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch05-01-need-for-service-app.js
@@ -0,0 +1,34 @@
+// ch05-01-need-for-service-app.js
+
+angular.module('notesApp', [])
+ .controller('MainCtrl', [function () {
+ var self = this;
+ self.tab = 'first';
+ self.open = function (tab) {
+ self.tab = tab;
+ }
+ }])
+ .controller('SubCtrl', [function () {
+ var self = this;
+ self.list = [
+ {id: 0, label: 'Item 0'},
+ {id: 1, label: 'Item 1'}
+ ];
+
+ self.add = function () {
+ var n = self.list.length;
+ self.list.push({
+ id: n,
+ label: 'Item ' + n
+ });
+ }
+ }]);
+
+/*
+ NOTE: When we use controllers, they are instances that get created and
+ destroyed as we navigate across the application. Any state they
+ hold is temporary at best, and cannot be communicated to other
+ controllers.
+
+ That's why we'd use "services" instead.
+ */
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch05-01-need-for-service.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch05-01-need-for-service.html
new file mode 100644
index 00000000..21d17e4c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch05-01-need-for-service.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+ <script src="ch05-01-need-for-service-app.js"></script>
+</head>
+<body ng-controller="MainCtrl as mainCtrl">
+
+ <h1> Hello Controllers! </h1>
+ <button ng-click="mainCtrl.open('first')">Open First</button>
+ <button ng-click="mainCtrl.open('second')">Open Second</button>
+
+ <div ng-switch on="mainCtrl.tab">
+
+ <div ng-switch-when="first">
+ <div ng-controller="SubCtrl as ctrl">
+ <h3>First Tab</h3>
+ <button ng-click="ctrl.add()">Add more items</button>
+ <ul>
+ <li ng-repeat="item in ctrl.list">
+ <span ng-bind="item.label"></span>
+ </li>
+ </ul>
+ </div>
+ </div>
+
+ <div ng-switch-when="second">
+ <div ng-controller="SubCtrl as ctrl">
+ <h3>Second Tab</h3>
+ <button ng-click="ctrl.add()">Add more items</button>
+ <ul>
+ <li ng-repeat="item in ctrl.list">
+ <span ng-bind="item.label"></span>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch05-02-log-example.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch05-02-log-example.html
new file mode 100644
index 00000000..d516440d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch05-02-log-example.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+</head>
+<body ng-controller="MainCtrl as mainCtrl">
+
+ <h1> Hello Services! </h1>
+ <button ng-click="mainCtrl.logStuff()">Log something</button>
+
+ <script type="text/javascript">
+ angular.module('notesApp', [])
+ .controller('MainCtrl', ['$log', function ($log) {
+ var self = this;
+ self.logStuff = function () {
+ $log.log('The button was pressed');
+ };
+ }]);
+ </script>
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch05-03-simple-angular-service.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch05-03-simple-angular-service.html
new file mode 100644
index 00000000..74f2a8e8
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch05-03-simple-angular-service.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html ng-app="notesApp">
+<head>
+ <title>Notes App</title>
+ <script src="../../tp/angular.js"></script>
+ <script src="ch05-03-simple-angular-service.js"></script>
+</head>
+<body ng-controller="MainCtrl as mainCtrl">
+
+ <h1> Hello Controllers! </h1>
+
+ <button ng-click="mainCtrl.open('first')"> Open First </button>
+ <button ng-click="mainCtrl.open('second')"> Open Second </button>
+
+ <div ng-switch on="mainCtrl.tab">
+
+ <div ng-switch-when="first">
+ <div ng-controller="SubCtrl as ctrl">
+ <h3>First Tab</h3>
+ <button ng-click="ctrl.add()">Add item</button>
+ <ul>
+ <li ng-repeat="item in ctrl.list()">
+ <span ng-bind="item.label"></span>
+ </li>
+ </ul>
+ </div>
+ </div>
+
+ <div ng-switch-when="second">
+ <div ng-controller="SubCtrl as ctrl">
+ <h3>Second Tab</h3>
+ <button ng-click="ctrl.add()">Add item</button>
+ <ul>
+ <li ng-repeat="item in ctrl.list()">
+ <span ng-bind="item.label"></span>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch05-03-simple-angular-service.js b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch05-03-simple-angular-service.js
new file mode 100644
index 00000000..25786bed
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch05-03-simple-angular-service.js
@@ -0,0 +1,115 @@
+// ch05-03-simple-angular-service.js
+
+// this example shows three different ways of defining our own "service"...
+
+// use 'factory()' for functions/plain objects API
+// use 'service()' for JS class object API
+// use 'provider()' for configurable service API
+
+
+// this is a service definition
+function ItemServiceTwo() {
+ var items = [
+ {id: 0, label: 'Item 0'},
+ {id: 1, label: 'Item 1'}
+ ];
+ this.list = function () {
+ return items;
+ };
+ this.add = function (item) {
+ items.push(item);
+ };
+}
+
+// this is a provider definition
+function ItemServiceThree(optItems) {
+ var items = optItems || [];
+
+ this.list = function () {
+ return items;
+ };
+ this.add = function (item) {
+ items.push(item);
+ }
+}
+
+angular.module('notesApp', [])
+
+ // [provider] define item service as configurable provider
+ .provider('ItemServiceThree', function () {
+ var haveDefaultItems = true;
+
+ this.disableDefaultItems = function () {
+ haveDefaultItems = false;
+ };
+
+ // this function gets our dependencies..
+ this.$get = [function () {
+ var optItems = [];
+ if (haveDefaultItems) {
+ optItems = [
+ {id: 0, label: 'Item 0'},
+ {id: 1, label: 'Item 1'}
+ ];
+ }
+ return new ItemServiceThree(optItems);
+ }];
+ })
+
+ // [provider] define configuration for provider
+ .config(['ItemServiceThreeProvider', function (ItemServiceThreeProvider) {
+ // to see how the provider can change configuration
+ // change the value of shouldHaveDefaults to true and
+ // try running the example
+ var shouldHaveDefaults = false;
+
+ // get configuration from server.
+ // set shouldHaveDefaults somehow
+ // assume it magically changes for now
+ if (!shouldHaveDefaults) {
+ ItemServiceThreeProvider.disableDefaultItems();
+ }
+ }])
+
+ // [service] define item service as a JS class
+ .service('ItemServiceTwo', [ItemServiceTwo])
+
+ // [factory] define item service factory
+ .factory('ItemService', [function () {
+ var items = [
+ {id: 0, label: 'Item 0'},
+ {id: 1, label: 'Item 1'}
+ ];
+ return {
+ list: function () {
+ return items;
+ },
+ add: function (item) {
+ items.push(item);
+ }
+ };
+ }])
+
+ // ======================================================================
+ // define controllers...
+ .controller('MainCtrl', [function () {
+ var self = this;
+ self.tab = 'first';
+ self.open = function (tab) {
+ self.tab = tab;
+ };
+ }])
+
+ .controller('SubCtrl', ['ItemService', function (ItemService) {
+ var self = this;
+ self.list = function () {
+ return ItemService.list();
+ };
+ self.add = function () {
+ var n = self.list().length;
+ ItemService.add({
+ id: n,
+ label: 'Item ' + n
+ });
+ };
+ }]);
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch08-01-filter-example.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch08-01-filter-example.html
new file mode 100644
index 00000000..105209ca
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch08-01-filter-example.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Filters in Action</title>
+ <script src="../../tp/angular.js"></script>
+</head>
+<body ng-app="filtersApp">
+
+ <div ng-controller="FilterCtrl as ctrl">
+ <div>
+ Amount as a number: {{ctrl.amount | number}}
+ </div>
+ <div>
+ Total cost as a currency: {{ctrl.totalCost | currency}}
+ </div>
+ <div>
+ Total cost in GBP: {{ctrl.totalCost | currency:'GBP '}}
+ </div>
+ <div>
+ Shout: {{ctrl.name | uppercase}}
+ </div>
+ <div>
+ Whisper: {{ctrl.name | lowercase}}
+ </div>
+ <div>
+ Start time: {{ctrl.startTime | date:'medium'}}
+ </div>
+ <div>
+ as JSON: {{ctrl.struct | json}}
+ </div>
+ </div>
+
+ <script type="text/javascript">
+ angular.module('filtersApp', [])
+ .controller('FilterCtrl', [function () {
+ var self = this;
+ self.amount = 1024;
+ self.totalCost = 4906;
+ self.name = 'Onos Rocks!';
+ self.startTime = new Date().getTime();
+ self.struct = {
+ foo: 'bar',
+ baz: 3.1415
+ };
+ }]);
+ </script>
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch08-02-filter-number-string.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch08-02-filter-number-string.html
new file mode 100644
index 00000000..46e9c4d7
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch08-02-filter-number-string.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Filters in Action</title>
+ <script src="../../tp/angular.js"></script>
+</head>
+<body ng-app="filtersApp">
+
+ <ul ng-controller="FilterCtrl as ctrl">
+ <li>
+ Amount - {{ctrl.amount}}
+ </li>
+ <li>
+ Amount - Default Currency: {{ctrl.amount | currency}}
+ </li>
+ <li>
+ <!-- Using English pound sign -->
+ Amount - GBP Currency: {{ctrl.amount | currency:'&#163'}}
+ </li>
+ <li>
+ Amount - Number: {{ctrl.amount | number }}
+ </li>
+ <li>
+ Amount - Number (4 decimals): {{ctrl.amount | number:4}}
+ </li>
+ <li>
+ Amount - Yummy &#x3c0 = {{ctrl.pi | number:4 }}
+ </li>
+
+ <li>
+ Name - no filters: {{ctrl.name}}
+ </li>
+ <li>
+ Name - lowercase: {{ctrl.name | lowercase}}
+ </li>
+ <li>
+ Name - uppercase: {{ctrl.name | uppercase}}
+ </li>
+ <li>
+ Name - prefix: {{ctrl.name | limitTo:4}}
+ </li>
+
+ <li>
+ JSON filter: {{ctrl.struct | json}}
+ </li>
+
+ <li>
+ Timestamp: {{ctrl.startTime}}
+ </li>
+ <li>
+ Default Date filter: {{ctrl.startTime | date}}
+ </li>
+ <li>
+ Medium Date filter: {{ctrl.startTime | date:'medium'}}
+ </li>
+ <li>
+ Long Date filter: {{ctrl.startTime | date:'longDate'}}
+ </li>
+ <li>
+ Custom Date filter: {{ctrl.startTime | date:'M/dd, yyyy'}}
+ </li>
+ <li>
+ Custom Time filter: {{ctrl.startTime | date:'h:m a'}}
+ </li>
+ </ul>
+
+ <script type="text/javascript">
+ angular.module('filtersApp', [])
+ .controller('FilterCtrl', [function () {
+ var self = this;
+ self.amount = 1024;
+ self.totalCost = 4906;
+ self.name = 'Onos Rocks!';
+ self.startTime = new Date().getTime();
+ self.struct = {
+ foo: 'bar',
+ baz: 3.1415
+ };
+ self.pi = Math.PI;
+ }]);
+ </script>
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch08-03-filter-arrays.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch08-03-filter-arrays.html
new file mode 100644
index 00000000..a9ce3cae
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch08-03-filter-arrays.html
@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Filters in Action</title>
+ <script src="../../tp/angular.js"></script>
+</head>
+<body ng-app="filtersApp">
+
+ <div ng-controller="FilterCtrl as ctrl">
+
+ <table>
+ <tr>
+ <td>
+ <button ng-click="ctrl.currentFilter = 'string'">
+ Filter with string
+ </button>
+ </td>
+ <td>
+ Filter Text
+ <input type="text"
+ ng-model="ctrl.filterOptions['string']"/>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <button ng-click="ctrl.currentFilter = 'object'">
+ Filter with object
+ </button>
+ </td>
+ <td>
+ Show Done or Not Done
+ <input type="checkbox"
+ ng-model="ctrl.filterOptions['object'].done"/>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <button ng-click="ctrl.currentFilter = 'function'">
+ Filter with function
+ </button>
+ </td>
+ </tr>
+ </table>
+ <ul>
+ <li ng-repeat="note in ctrl.notes |
+ filter:ctrl.filterOptions[ctrl.currentFilter] |
+ orderBy:ctrl.sortOrder |
+ limitTo:5">
+ {{note.label}} - {{note.type}} - {{note.done}}
+ </li>
+ </ul>
+ </div>
+
+
+ <script type="text/javascript">
+ angular.module('filtersApp', [])
+ .controller('FilterCtrl', [function () {
+ var self = this;
+
+ self.notes = [
+ {label: 'FC Todo', type: 'chore', done: false},
+ {label: 'FT Todo', type: 'task', done: false},
+ {label: 'FF Todo', type: 'fun', done: true},
+ {label: 'SC Todo', type: 'chore', done: false},
+ {label: 'ST Todo', type: 'task', done: true},
+ {label: 'SF Todo', type: 'fun', done: true},
+ {label: 'TC Todo', type: 'chore', done: false},
+ {label: 'TT Todo', type: 'task', done: false},
+ {label: 'TF Todo', type: 'fun', done: false}
+ ];
+
+ self.sortOrder = ['+type', '-label'];
+
+ self.filterOptions = {
+ 'string': '',
+ 'object': {done: false, label: 'F'},
+ 'function': function (note) {
+ return note.type === 'task' && note.done === false;
+ }
+ };
+
+ self.currentFilter = 'string';
+ }]);
+ </script>
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch08-04-custom-filters.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch08-04-custom-filters.html
new file mode 100644
index 00000000..f39991d9
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch08-04-custom-filters.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Custom Filters in Action</title>
+ <script src="../../tp/angular.js"></script>
+</head>
+<body ng-app="filtersApp">
+
+ <div ng-controller="FilterCtrl as ctrl">
+ <div>
+ Start time (Timestamp): {{ctrl.startTime}}
+ </div>
+ <div>
+ Start time (Time): {{ctrl.startTime | date:'h:m a'}}
+ </div>
+ <div>
+ Start time (Our filter): {{ctrl.startTime | timeAgo}}
+ </div>
+ <div>
+ Start time (Our filter 2): {{ctrl.startTime | timeAgo:true}}
+ </div>
+ <div>
+ Some time ago (Computed): {{ctrl.someTimeAgo | date:'h:m a'}}
+ </div>
+ <div>
+ Some time ago (Our filter): {{ctrl.someTimeAgo | timeAgo}}
+ </div>
+ </div>
+
+ <script type="text/javascript">
+ angular.module('filtersApp', [])
+ .controller('FilterCtrl', [function () {
+ var self = this;
+ self.startTime = new Date().getTime();
+ self.someTimeAgo = self.startTime - (1000*3600*4);
+ }])
+ .filter('timeAgo', [function () {
+ var _m = 1000 * 60,
+ _h = _m * 60,
+ _d = _h * 24,
+ _mon = _d * 30;
+
+ return function (ts, ignoreSecs) {
+ var now = new Date().getTime(),
+ diff = now - ts;
+ if (diff < _m && !ignoreSecs) {
+ return 'seconds ago';
+ } else if (diff < _h) {
+ return 'minutes ago';
+ } else if (diff < _d) {
+ return 'hours ago';
+ } else if (diff < _mon) {
+ return 'days ago';
+ } else {
+ return 'months ago';
+ }
+ }
+ }]);
+ </script>
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch10-01-simple-routing.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch10-01-simple-routing.html
new file mode 100644
index 00000000..29614127
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/ch10-01-simple-routing.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Simple Routing</title>
+ <script src="../../tp/angular.js"></script>
+ <script src="../../tp/angular-route.js"></script>
+</head>
+<body ng-app="routingApp">
+
+ <h2>Angular Routing</h2>
+
+ <ul>
+ <li><a href="#/">Default Route</a></li>
+ <li><a href="#/second">Second Route</a></li>
+ <li><a href="#/asdfertdfghsdfg">Non-existent Route</a></li>
+ </ul>
+
+ <div ng-view></div>
+
+ <script type="text/javascript">
+ angular.module('routingApp', ['ngRoute'])
+ .config(['$routeProvider', function ($routeProvider) {
+ $routeProvider
+ .when('/', {
+ template: '<h5>This is the default route</h5>'
+ })
+ .when('/second', {
+ template: '<h5>This is the second route</h5>'
+ })
+ .otherwise({
+ redirectTo: '/'
+ });
+ }]);
+ </script>
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/js/ch03-controller.js b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/js/ch03-controller.js
new file mode 100644
index 00000000..92d3b0c0
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/js/ch03-controller.js
@@ -0,0 +1,17 @@
+// Simple controller
+
+angular.module('notesApp', [])
+ .controller('ListCtrl', [function () {
+ var self = this;
+ self.items = [
+ {id: 1, label: 'First', done: true},
+ {id: 2, label: 'Second', done: false}
+ ];
+
+ self.getDoneClass = function (item) {
+ return {
+ finished: item.done,
+ unfinished: !item.done
+ };
+ };
+ }]);
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/js/ch09-01-time-ago.js b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/js/ch09-01-time-ago.js
new file mode 100644
index 00000000..1a8b7f1c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/ng-examples/js/ch09-01-time-ago.js
@@ -0,0 +1,27 @@
+// ch09-01-time-ago.js
+
+angular.module('filterApp', [])
+ .filter('timeAgo', [function () {
+ var _m = 1000 * 60,
+ _h = _m * 60,
+ _d = _h * 24,
+ _mon = _d * 30;
+
+ return function (ts, ignoreSecs) {
+ var showSecs = !ignoreSecs,
+ now = new Date().getTime(),
+ diff = now - ts;
+
+ if (diff < _m && showSecs) {
+ return 'seconds ago';
+ } else if (diff < _h) {
+ return 'minutes ago';
+ } else if (diff < _d) {
+ return 'hours ago';
+ } else if (diff < _mon) {
+ return 'days ago';
+ } else {
+ return 'months ago';
+ }
+ }
+ }]);
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/oblique.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/oblique.html
new file mode 100644
index 00000000..e54d18f5
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/oblique.html
@@ -0,0 +1,473 @@
+<!DOCTYPE html>
+<!--
+ ~ Copyright 2014 Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<!--
+ Testing transformations for transitioning between overhead and
+ perspective projections of two layers.
+ -->
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Layer Transformations</title>
+
+ <script src="../tp/d3.js"></script>
+ <script src="../tp/jquery-2.1.1.min.js"></script>
+
+ <style>
+ html,
+ body {
+ background-color: #ccc;
+ font-family: Arial, Helvetica, sans-serif;
+ font-size: 9pt;
+ }
+
+ svg {
+ position: absolute;
+ background-color: #fff;
+ top: 30px;
+ left: 60px;
+ }
+
+ svg text {
+ font-size: 3pt;
+ }
+
+ </style>
+</head>
+<body>
+ <svg width="1000px" height="600px" viewBox="0 0 160 120"></svg>
+
+ <script>
+ (function (){
+
+ // Configuration...
+ var w = 160,
+ h = 120,
+ time = 1500;
+
+ var pktData = [
+ [20,60,'a'],
+ [60,20,'b'],
+ [100,20,'c'],
+ [140,60,'d'],
+ [100,100,'e'],
+ [60,100,'f'],
+ [20,20,'w'],
+ [140,20,'x'],
+ [20,100,'y'],
+ [140,100,'z']
+ ],
+ optData = [
+ [40,40,'p'],
+ [120,40,'q'],
+ [120,80,'r'],
+ [40,80,'s'],
+ [20,20,'j'],
+ [140,20,'k'],
+ [20,100,'l'],
+ [140,100,'m']
+ ],
+ linkData = [
+ ['a','p'],
+ ['p','b'],
+ ['b','c'],
+ ['c','q'],
+ ['q','d'],
+ ['d','r'],
+ ['r','e'],
+ ['e','f'],
+ ['f','s'],
+ ['s','a'],
+ ['s','q'],
+ ['p','r'],
+ ['b','f'],
+ ['c','e'],
+ ['w','j'],
+ ['x','k'],
+ ['z','m'],
+ ['y','l']
+ ];
+
+ // Transform parameters
+ var tf = {
+ tt: -.7, // x skew y factor
+ xsk: -35, // x skew angle
+ ysc: 0.5, // y scale
+ ytr: 50, // y translate
+ pad: 5
+ },
+ rectFill = {
+ pkt: 'rgba(130,130,170,0.3)',
+ opt: 'rgba(170,130,170,0.3)'
+ };
+
+ // Internal state...
+ var nodes = [],
+ links = [],
+ overhead = true,
+ xffn;
+
+ // D3/DOM magic...
+ var svg = d3.select('svg'),
+ nodeG,
+ linkG,
+ node,
+ link,
+ force,
+ pktLayer,
+ optLayer;
+
+
+ // General functions ...
+ function isF(f) {
+ return $.isFunction(f) ? f : null;
+ }
+
+ function translate(x,y) {
+ return 'translate(' + x + ',' + y + ')';
+ }
+
+ function scale(x,y) {
+ return 'scale(' + x + ',' + y + ')';
+ }
+ function skewX(x) {
+ return 'skewX(' + x + ')';
+ }
+
+
+ // Key Bindings...
+ var keyHandler = {
+ T: transform
+ };
+
+ function whatKey(code) {
+ switch (code) {
+ case 13: return 'enter';
+ case 16: return 'shift';
+ case 17: return 'ctrl';
+ case 18: return 'alt';
+ case 27: return 'esc';
+ case 32: return 'space';
+ case 37: return 'leftArrow';
+ case 38: return 'upArrow';
+ case 39: return 'rightArrow';
+ case 40: return 'downArrow';
+ case 91: return 'cmdLeft';
+ case 93: return 'cmdRight';
+ case 187: return 'equals';
+ case 189: return 'dash';
+ case 191: return 'slash';
+ default:
+ if ((code >= 48 && code <= 57) ||
+ (code >= 65 && code <= 90)) {
+ return String.fromCharCode(code);
+ } else if (code >= 112 && code <= 123) {
+ return 'F' + (code - 111);
+ }
+ return '.';
+ }
+ }
+
+ function keyIn() {
+ var event = d3.event,
+ keyCode = event.keyCode,
+ key = whatKey(keyCode),
+ fn = isF(keyHandler[key]);
+ if (fn) {
+ fn(key, keyCode, event);
+ }
+ }
+
+ // Key events....
+ function transform() {
+ overhead = !overhead;
+ if (overhead) {
+ toOverhead();
+ } else {
+ toOblique();
+ }
+ }
+
+ function toOverhead() {
+ xffn = null;
+ hidePlane(pktLayer);
+ hidePlane(optLayer);
+ transitionNodes();
+ }
+
+ function padBox(box, p) {
+ box.x -= p;
+ box.y -= p;
+ box.width += p*2;
+ box.height += p*2;
+ }
+
+ function toOblique() {
+ var box = nodeG.node().getBBox();
+ padBox(box, tf.pad);
+
+ xffn = function (xy, dir) {
+ var x = xy.x + xy.y*tf.tt,
+ y = xy.y*tf.ysc + tf.ysc*tf.ytr*dir;
+ return { x: x, y: y};
+ };
+
+ showPlane(pktLayer, box, -1);
+ showPlane(optLayer, box, 1);
+ transitionNodes();
+ }
+
+ function transitionNodes() {
+ // note: turn off force layout while transitioning.. if it is on
+// force.stop();
+
+ if (xffn) {
+ nodes.forEach(function (d) {
+ var dir = d.type === 'pkt' ? -1 : 1,
+ oldxy = {x: d.x, y: d.y},
+ coords = xffn(oldxy, dir);
+ d.oldxy = oldxy;
+ d.x = coords.x;
+ d.y = coords.y;
+ });
+ } else {
+ nodes.forEach(function (d) {
+ d.x = d.oldxy.x;
+ d.y = d.oldxy.y;
+ delete d.oldxy;
+ });
+ }
+
+ nodeG.selectAll('.node')
+ .transition()
+ .duration(time)
+ .attr({
+ transform: function (d) {
+ return translate(d.x, d.y);
+ }
+ });
+
+ linkG.selectAll('.link')
+ .transition()
+ .duration(time)
+ .attr({
+ x1: function (d) { return d.source.x; },
+ y1: function (d) { return d.source.y; },
+ x2: function (d) { return d.target.x; },
+ y2: function (d) { return d.target.y; }
+ });
+ }
+
+ function showPlane(layer, box, dir) {
+ layer.select('rect')
+ .attr(box)
+ .attr('opacity', 0)
+ .transition()
+ .duration(time)
+ .attr('opacity', 1)
+ .attr('transform', obliqueXform(dir));
+ }
+
+ function hidePlane(layer) {
+ var rect = layer.select('rect');
+ rect.transition()
+ .duration(time)
+ .attr('opacity', 0)
+ .attr('transform', overheadXform());
+
+ }
+
+ function obliqueXform(dir) {
+ return scale(1, tf.ysc) + translate(0, dir * tf.ytr) + skewX(tf.xsk);
+ }
+
+
+ function overheadXform() {
+ return skewX(0) + translate(0,0) + scale(1,1);
+ }
+
+ // Nodes and Links...
+ function prepareNodes() {
+ var hw = w/2,
+ hh = h/2;
+
+ function addNode(t, d) {
+ nodes.push({
+ type: t,
+ x: d[0] - hw,
+ y: d[1] - hh,
+ id: d[2],
+ fixed: true
+ });
+ }
+
+ optData.forEach(function (d) {
+ addNode('opt', d);
+ });
+ pktData.forEach(function (d) {
+ addNode('pkt', d);
+ });
+ }
+
+ function findNode(id) {
+ for (var i=0,n=nodes.length; i<n; i++) {
+ if (nodes[i].id === id) {
+ return nodes[i];
+ }
+ }
+ return null;
+ }
+
+ function prepareLinks() {
+ linkData.forEach(function (d) {
+ var src = d[0],
+ dst = d[1];
+ links.push({
+ id: src + '-' + dst,
+ source: findNode(src),
+ target: findNode(dst)
+ });
+ });
+
+ }
+
+ function updateNodes() {
+ node = nodeG.selectAll('.node')
+ .data(nodes, function (d) { return d.id; });
+
+ var entering = node.enter()
+ .append('g').attr({
+ id: function (d) { return d.id; },
+ 'class': function (d) { return 'node ' + d.type; }
+ });
+
+ entering.each(function (d) {
+ var el = d3.select(this);
+ d.el = el;
+
+ el.append('rect').attr({
+ width: 5,
+ height: 5,
+ fill: function (d) {
+ return d.type === 'pkt' ? '#669' : '#969';
+ },
+ rx: 1,
+ transform: 'translate(-2.5,-2.5)'
+ });
+ el.append('text')
+ .text(d.id)
+ .attr({
+ dy: '0.9em',
+ 'text-anchor': 'middle',
+ transform: 'translate(0,-2.5)',
+ fill: 'white'
+ });
+ });
+ }
+
+ function updateLinks() {
+ link = linkG.selectAll('.link')
+ .data(links, function (d) { return d.id; });
+
+ var entering = link.enter()
+ .append('line').attr({
+ id: function (d) { return d.id; },
+ class: 'link',
+ stroke: '#888',
+ 'stroke-width': 0.4,
+ opacity: 0.7
+ });
+
+ entering.each(function (d) {
+ d.el = d3.select(this);
+
+ });
+ }
+
+ function update() {
+ updateNodes();
+ updateLinks();
+ }
+
+ var ntick = 0;
+ function tick() {
+ console.log('tick ' + (++ntick));
+ node.attr({
+ transform: function (d) { return translate(d.x, d.y); }
+ });
+
+ link.attr({
+ x1: function (d) { return d.source.x; },
+ y1: function (d) { return d.source.y; },
+ x2: function (d) { return d.target.x; },
+ y2: function (d) { return d.target.y; }
+ });
+ }
+
+ function setOrigin(/*varargs*/) {
+ var i, n, g;
+ for (i= 0,n=arguments.length; i< n; i++) {
+ g = arguments[i];
+ g.attr('transform', translate(w/2, h/2));
+ }
+ }
+
+ function initLayers() {
+ optLayer.attr('class', 'layer').append('rect')
+ .attr('fill', rectFill.opt);
+ pktLayer.attr('class', 'layer').append('rect')
+ .attr('fill', rectFill.pkt);
+ }
+
+ function init() {
+ svg.append('text')
+ .text('Press the "T" key....')
+ .attr({ dy: '1.2em', fill: '#999'})
+ .style('font-size', '2.4pt')
+ .style('font-style', 'italic');
+
+ optLayer = svg.append('g').attr('id', 'optLayer');
+ pktLayer = svg.append('g').attr('id', 'pktLayer');
+ linkG = svg.append('g').attr('id', 'links');
+ nodeG = svg.append('g').attr('id', 'nodes');
+
+ setOrigin(optLayer, pktLayer, linkG, nodeG);
+
+ node = nodeG.selectAll('.node');
+ link = linkG.selectAll('.link');
+
+ initLayers();
+ prepareNodes();
+ prepareLinks();
+
+ force = d3.layout.force()
+ .size([w,h])
+ .nodes(nodes)
+ .links(links)
+ .gravity(0.4)
+ .friction(0.7)
+ .on('tick', tick);
+ update();
+ tick();
+ d3.select('body').on('keydown', keyIn);
+ }
+
+ init();
+ })();
+ </script>
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/onos-logo.svg b/framework/src/onos/web/gui/src/main/webapp/_sdh/onos-logo.svg
new file mode 100644
index 00000000..db4b81a7
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/onos-logo.svg
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 792 612" enable-background="new 0 0 792 612" xml:space="preserve">
+<g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="293.4264" y1="313.4543" x2="293.7567" y2="294.5293">
+ <stop offset="0" style="stop-color:#007EC5"/>
+ <stop offset="1" style="stop-color:#00C0ED"/>
+ </linearGradient>
+ <path fill="url(#SVGID_1_)" d="M308,377.4c1.7,0,3.2-0.3,4.3-1c1.1-0.6,2-1.4,2.6-2.3c0.6-0.9,1.1-1.9,1.3-3c0.2-1.1,0.3-2.1,0.3-3
+ c0-0.9-0.1-1.9-0.3-3c-0.2-1.1-0.7-2.1-1.3-3c-0.6-0.9-1.5-1.7-2.6-2.3c-1.1-0.6-2.6-1-4.3-1h-31c-1.8,0-3.2,0.3-4.3,1
+ c-1.1,0.6-2,1.4-2.6,2.3c-0.6,0.9-1.1,1.9-1.3,3c-0.2,1.1-0.3,2.1-0.3,3c0,0.9,0.1,1.9,0.3,3c0.2,1.1,0.7,2.1,1.3,3
+ c0.6,0.9,1.5,1.7,2.6,2.3c1.1,0.6,2.5,1,4.3,1H308L308,377.4z M323.7,368c0,1.9-0.3,3.9-1,5.9c-0.6,2-1.6,3.8-2.8,5.4
+ c-1.2,1.6-2.7,2.9-4.5,4c-1.7,1-3.7,1.5-5.9,1.5h-35c-2.1-0.1-4-0.7-5.6-1.7c-1.6-1.1-3-2.4-4.2-4c-1.2-1.6-2-3.4-2.6-5.3
+ c-0.6-1.9-0.9-3.9-0.9-5.8c0-1.9,0.3-3.9,1-5.9c0.6-2,1.6-3.8,2.8-5.4c1.2-1.6,2.7-2.9,4.5-4c1.7-1,3.7-1.5,5.9-1.5h35
+ c2.1,0.1,4,0.7,5.6,1.7c1.6,1,3,2.4,4.2,4c1.2,1.6,2,3.4,2.6,5.3C323.4,364.2,323.7,366.1,323.7,368z"/>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="364.0253" y1="215.4108" x2="366.8113" y2="55.7995">
+ <stop offset="0" style="stop-color:#007EC5"/>
+ <stop offset="1" style="stop-color:#00C0ED"/>
+ </linearGradient>
+ <path fill="url(#SVGID_2_)" d="M383.7,368c0-0.9-0.1-1.9-0.3-3c-0.2-1.1-0.7-2.1-1.3-3c-0.6-0.9-1.5-1.7-2.6-2.3s-2.6-1-4.3-1
+ h-27.7c-1.8,0-3.2,0.3-4.3,1c-1.1,0.6-2,1.4-2.6,2.3c-0.6,0.9-1.1,1.9-1.3,3c-0.2,1.1-0.3,2.1-0.3,3v13.1c0,1-0.4,1.9-1.1,2.6
+ c-0.7,0.7-1.6,1.1-2.6,1.1c-1,0-1.9-0.4-2.6-1.1c-0.7-0.7-1.1-1.6-1.1-2.6V368c0-1.9,0.3-3.9,1-5.9c0.6-2,1.6-3.8,2.8-5.4
+ c1.2-1.6,2.7-2.9,4.5-4c1.7-1,3.7-1.5,5.9-1.5h32.2c2.1,0.1,4,0.7,5.6,1.7c1.6,1,3,2.4,4.2,4c1.2,1.6,2,3.4,2.6,5.3
+ c0.6,1.9,0.9,3.9,0.9,5.8v13.1c0,1-0.4,1.9-1.1,2.6c-0.7,0.7-1.6,1.1-2.6,1.1c-1,0-1.9-0.4-2.6-1.1c-0.7-0.7-1.1-1.6-1.1-2.6V368z"
+ />
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="429.6967" y1="386.7026" x2="430.0228" y2="368.0231">
+ <stop offset="0" style="stop-color:#007EC5"/>
+ <stop offset="1" style="stop-color:#00C0ED"/>
+ </linearGradient>
+ <path fill="url(#SVGID_3_)" d="M445.5,377.4c1.7,0,3.2-0.3,4.3-1c1.1-0.6,2-1.4,2.6-2.3c0.6-0.9,1.1-1.9,1.3-3
+ c0.2-1.1,0.3-2.1,0.3-3c0-0.9-0.1-1.9-0.3-3c-0.2-1.1-0.7-2.1-1.3-3c-0.6-0.9-1.5-1.7-2.6-2.3c-1.1-0.6-2.6-1-4.3-1h-31
+ c-1.8,0-3.2,0.3-4.3,1c-1.1,0.6-2,1.4-2.6,2.3c-0.6,0.9-1.1,1.9-1.3,3c-0.2,1.1-0.3,2.1-0.3,3c0,0.9,0.1,1.9,0.3,3
+ c0.2,1.1,0.7,2.1,1.3,3c0.6,0.9,1.5,1.7,2.6,2.3c1.1,0.6,2.5,1,4.3,1H445.5L445.5,377.4z M461.3,368c0,1.9-0.3,3.9-1,5.9
+ c-0.6,2-1.6,3.8-2.8,5.4c-1.2,1.6-2.7,2.9-4.5,4c-1.7,1-3.7,1.5-5.9,1.5h-35c-2.1-0.1-4-0.7-5.6-1.7c-1.6-1.1-3-2.4-4.2-4
+ c-1.2-1.6-2-3.4-2.6-5.3c-0.6-1.9-0.9-3.9-0.9-5.8c0-1.9,0.3-3.9,1-5.9c0.6-2,1.6-3.8,2.8-5.4c1.2-1.6,2.7-2.9,4.5-4
+ c1.7-1,3.7-1.5,5.9-1.5h35c2.1,0.1,4,0.7,5.6,1.7c1.6,1,3,2.4,4.2,4c1.2,1.6,2,3.4,2.6,5.3C461,364.2,461.3,366.1,461.3,368z"/>
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="499.3867" y1="424.4887" x2="499.7166" y2="405.5856">
+ <stop offset="0" style="stop-color:#007EC5"/>
+ <stop offset="1" style="stop-color:#00C0ED"/>
+ </linearGradient>
+ <path fill="url(#SVGID_4_)" d="M479.2,371.7c-1.4,0-2.8-0.3-4-0.8c-1.2-0.5-2.3-1.3-3.2-2.2c-0.9-0.9-1.7-2-2.2-3.2
+ c-0.5-1.2-0.8-2.6-0.8-4c0-1.4,0.3-2.8,0.8-4c0.5-1.2,1.3-2.3,2.2-3.2c0.9-0.9,2-1.7,3.2-2.2c1.2-0.5,2.6-0.8,4-0.8h46.6
+ c1,0,1.9,0.4,2.6,1.1c0.7,0.7,1.1,1.6,1.1,2.6c0,1-0.4,1.9-1.1,2.6c-0.7,0.7-1.6,1.1-2.6,1.1H479c-0.8,0-1.4,0.3-2,0.8
+ c-0.6,0.5-0.9,1.2-0.9,2c0,0.8,0.3,1.4,0.9,2c0.6,0.6,1.3,0.8,2,0.8h42.5c1.4,0,2.8,0.3,4,0.8c1.3,0.5,2.3,1.3,3.3,2.2
+ c0.9,0.9,1.7,2,2.2,3.3c0.5,1.3,0.8,2.6,0.8,4c0,1.4-0.3,2.8-0.8,4c-0.5,1.2-1.3,2.3-2.2,3.2c-0.9,0.9-2,1.6-3.3,2.2
+ c-1.3,0.5-2.6,0.8-4,0.8H475c-1,0-1.9-0.4-2.6-1.1c-0.7-0.7-1.1-1.6-1.1-2.6c0-1,0.4-1.9,1.1-2.6c0.7-0.7,1.6-1.1,2.6-1.1h46.8
+ c0.8,0,1.4-0.3,2-0.8c0.6-0.5,0.8-1.2,0.8-2c0-0.8-0.3-1.5-0.8-2.1c-0.6-0.6-1.2-0.8-2-0.8H479.2z"/>
+</g>
+<g>
+ <g>
+ <path fill="#007EC5" d="M263,404.8c-1.2-1.2-1.8-2.7-1.8-4.6c0-1.9,0.6-3.4,1.8-4.6c1.2-1.2,2.7-1.8,4.5-1.8
+ c1.8,0,3.3,0.6,4.5,1.8c1.2,1.2,1.8,2.7,1.8,4.6c0,1.9-0.6,3.4-1.8,4.6c-1.2,1.2-2.7,1.8-4.5,1.8C265.6,406.6,264.1,406,263,404.8
+ L263,404.8z M263.7,396.4c-0.9,1-1.4,2.3-1.4,3.8c0,1.5,0.5,2.8,1.4,3.8c0.9,1,2.2,1.5,3.7,1.5c1.6,0,2.8-0.5,3.7-1.5
+ c0.9-1,1.4-2.3,1.4-3.8c0-1.5-0.5-2.8-1.4-3.8c-0.9-1-2.2-1.5-3.7-1.5C265.9,394.9,264.7,395.4,263.7,396.4z"/>
+ <path fill="#007EC5" d="M276.5,410.2v-11.8h1v1.4h0c0.3-0.5,0.7-0.9,1.3-1.2c0.6-0.3,1.2-0.4,1.8-0.4c1.2,0,2.2,0.4,3,1.2
+ c0.8,0.8,1.2,1.8,1.2,3c0,1.2-0.4,2.2-1.2,3c-0.8,0.8-1.8,1.2-3,1.2c-0.6,0-1.3-0.1-1.8-0.4c-0.6-0.3-1-0.7-1.3-1.2h0v5.3H276.5
+ L276.5,410.2z M278.4,400c-0.6,0.6-1,1.4-1,2.3c0,0.9,0.3,1.6,1,2.3c0.6,0.6,1.4,0.9,2.3,0.9c0.9,0,1.7-0.3,2.3-0.9
+ c0.6-0.6,0.9-1.4,0.9-2.3c0-0.9-0.3-1.7-0.9-2.3c-0.6-0.6-1.3-0.9-2.3-0.9C279.8,399.1,279,399.4,278.4,400z"/>
+ <path fill="#007EC5" d="M294.1,404.1l0.8,0.6c-0.8,1.1-1.9,1.7-3.4,1.7c-1.2,0-2.2-0.4-2.9-1.2c-0.7-0.8-1.1-1.8-1.1-3
+ c0-1.2,0.4-2.2,1.1-3c0.7-0.8,1.7-1.2,2.8-1.2c1.2,0,2.1,0.4,2.7,1.1c0.7,0.7,1,1.6,1,2.6v0.7h-6.6c0,0.2,0,0.4,0.1,0.6
+ c0.1,0.2,0.1,0.5,0.3,0.8c0.1,0.3,0.3,0.5,0.5,0.8c0.2,0.2,0.5,0.4,0.9,0.6c0.4,0.2,0.8,0.2,1.2,0.2c0.5,0,1-0.1,1.5-0.4
+ C293.5,404.9,293.8,404.6,294.1,404.1L294.1,404.1z M288.5,401.6h5.6c0-0.7-0.3-1.3-0.8-1.8c-0.5-0.5-1.2-0.8-1.9-0.8
+ c-0.5,0-1,0.1-1.4,0.3c-0.4,0.2-0.7,0.5-0.9,0.8c-0.2,0.3-0.3,0.6-0.4,0.8C288.5,401.3,288.5,401.5,288.5,401.6z"/>
+ <path fill="#007EC5" d="M298.1,406.3v-5.7c0-0.2,0-0.6,0-1.2c0-0.6,0-0.9,0-1.1h1c0,0.8,0,1.3,0.1,1.4h0.1
+ c0.2-0.5,0.6-0.8,1.1-1.1c0.5-0.3,1-0.5,1.7-0.5c2,0,3,1.1,3,3.4v4.7h-1v-4.7c0-1.7-0.7-2.5-2-2.5c-0.8,0-1.5,0.3-2,0.8
+ c-0.5,0.6-0.8,1.4-0.8,2.4v3.9H298.1z"/>
+ </g>
+ <g>
+ <polygon fill="#007EC5" points="313.1,406.3 313.1,394.2 314.5,394.2 321.9,404.8 321.9,404.8 321.9,394.2 323.1,394.2
+ 323.1,406.3 321.6,406.3 314.2,395.7 314.2,395.7 314.2,406.3 "/>
+ <path fill="#007EC5" d="M333,404.1l0.8,0.6c-0.8,1.1-1.9,1.7-3.4,1.7c-1.2,0-2.2-0.4-2.9-1.2c-0.7-0.8-1.1-1.8-1.1-3
+ c0-1.2,0.4-2.2,1.1-3c0.7-0.8,1.7-1.2,2.8-1.2c1.2,0,2.1,0.4,2.7,1.1c0.7,0.7,1,1.6,1,2.6v0.7h-6.6c0,0.2,0,0.4,0.1,0.6
+ c0.1,0.2,0.1,0.5,0.3,0.8c0.1,0.3,0.3,0.5,0.5,0.8c0.2,0.2,0.5,0.4,0.9,0.6c0.4,0.2,0.8,0.2,1.2,0.2c0.5,0,1-0.1,1.5-0.4
+ C332.4,404.9,332.8,404.6,333,404.1L333,404.1z M327.4,401.6h5.6c0-0.7-0.3-1.3-0.8-1.8c-0.5-0.5-1.2-0.8-1.9-0.8
+ c-0.5,0-1,0.1-1.4,0.3c-0.4,0.2-0.7,0.5-0.9,0.8c-0.2,0.3-0.3,0.6-0.4,0.8C327.4,401.3,327.4,401.5,327.4,401.6z"/>
+ <path fill="#007EC5" d="M340.9,398.4v0.9h-2.3v5.1c0,0.4,0.1,0.6,0.3,0.8c0.2,0.2,0.5,0.3,0.8,0.3c0.4,0,0.7-0.1,1.2-0.3l0.1,0.9
+ c-0.5,0.2-0.9,0.3-1.3,0.3c-0.7,0-1.2-0.2-1.5-0.6c-0.3-0.4-0.5-0.9-0.5-1.5v-5.1h-1.7v-0.9h1.7v-2.3h1v2.3H340.9z"/>
+ <polygon fill="#007EC5" points="344.8,406.3 342.3,398.4 343.5,398.4 345.4,405 345.4,405 347.6,398.4 348.6,398.4 350.9,405
+ 351,405 352.8,398.4 353.9,398.4 351.5,406.3 350.5,406.3 348.1,399.8 348.1,399.8 345.9,406.3 "/>
+ <path fill="#007EC5" d="M356.9,405.3c-0.8-0.8-1.2-1.8-1.2-3c0-1.2,0.4-2.2,1.2-3c0.8-0.8,1.8-1.2,3-1.2c1.2,0,2.2,0.4,3,1.2
+ c0.8,0.8,1.2,1.8,1.2,3c0,1.2-0.4,2.2-1.2,3c-0.8,0.8-1.8,1.2-3,1.2C358.7,406.5,357.7,406.1,356.9,405.3L356.9,405.3z M357.7,400
+ c-0.6,0.6-0.9,1.4-0.9,2.3c0,0.9,0.3,1.7,0.9,2.3c0.6,0.6,1.3,0.9,2.3,0.9c0.9,0,1.7-0.3,2.3-0.9c0.6-0.6,0.9-1.4,0.9-2.3
+ c0-0.9-0.3-1.7-0.9-2.3c-0.6-0.6-1.3-0.9-2.3-0.9C359,399.1,358.2,399.4,357.7,400z"/>
+ <path fill="#007EC5" d="M367.1,406.3v-5.7c0-0.2,0-0.6,0-1.2c0-0.6,0-0.9,0-1.1h1c0,0.8,0,1.3,0.1,1.4c0.6-1.1,1.4-1.6,2.5-1.6
+ c0.2,0,0.4,0,0.6,0.1l-0.1,1c-0.1,0-0.3-0.1-0.4-0.1c-0.9,0-1.5,0.3-1.9,0.8c-0.4,0.5-0.6,1.2-0.6,2v4.3H367.1z"/>
+ <polygon fill="#007EC5" points="373.5,406.3 373.5,393.3 374.5,393.3 374.5,402 378.4,398.4 379.9,398.4 375.9,402 380.4,406.3
+ 378.9,406.3 374.5,402.1 374.5,406.3 "/>
+ </g>
+ <g>
+ <path fill="#007EC5" d="M388.2,404.8c-1.2-1.2-1.8-2.7-1.8-4.6c0-1.9,0.6-3.4,1.8-4.6c1.2-1.2,2.7-1.8,4.5-1.8
+ c1.8,0,3.3,0.6,4.5,1.8c1.2,1.2,1.8,2.7,1.8,4.6c0,1.9-0.6,3.4-1.8,4.6c-1.2,1.2-2.7,1.8-4.5,1.8
+ C390.8,406.6,389.3,406,388.2,404.8L388.2,404.8z M388.9,396.4c-0.9,1-1.4,2.3-1.4,3.8c0,1.5,0.5,2.8,1.4,3.8
+ c0.9,1,2.2,1.5,3.7,1.5c1.6,0,2.8-0.5,3.7-1.5c0.9-1,1.4-2.3,1.4-3.8c0-1.5-0.5-2.8-1.4-3.8c-0.9-1-2.2-1.5-3.7-1.5
+ C391.1,394.9,389.9,395.4,388.9,396.4z"/>
+ <path fill="#007EC5" d="M401.7,410.2v-11.8h1v1.4h0c0.3-0.5,0.7-0.9,1.3-1.2c0.6-0.3,1.2-0.4,1.8-0.4c1.2,0,2.2,0.4,3,1.2
+ c0.8,0.8,1.2,1.8,1.2,3c0,1.2-0.4,2.2-1.2,3c-0.8,0.8-1.8,1.2-3,1.2c-0.6,0-1.3-0.1-1.8-0.4c-0.6-0.3-1-0.7-1.3-1.2h0v5.3H401.7
+ L401.7,410.2z M403.6,400c-0.6,0.6-1,1.4-1,2.3c0,0.9,0.3,1.6,1,2.3c0.6,0.6,1.4,0.9,2.3,0.9c0.9,0,1.7-0.3,2.3-0.9
+ c0.6-0.6,0.9-1.4,0.9-2.3c0-0.9-0.3-1.7-0.9-2.3c-0.6-0.6-1.3-0.9-2.3-0.9C405,399.1,404.2,399.4,403.6,400z"/>
+ <path fill="#007EC5" d="M419.3,404.1l0.8,0.6c-0.8,1.1-1.9,1.7-3.4,1.7c-1.2,0-2.2-0.4-2.9-1.2c-0.7-0.8-1.1-1.8-1.1-3
+ c0-1.2,0.4-2.2,1.1-3s1.7-1.2,2.8-1.2c1.2,0,2.1,0.4,2.7,1.1c0.7,0.7,1,1.6,1,2.6v0.7h-6.6c0,0.2,0,0.4,0.1,0.6
+ c0.1,0.2,0.1,0.5,0.3,0.8c0.1,0.3,0.3,0.5,0.5,0.8c0.2,0.2,0.5,0.4,0.9,0.6c0.4,0.2,0.8,0.2,1.2,0.2c0.5,0,1-0.1,1.5-0.4
+ C418.7,404.9,419,404.6,419.3,404.1L419.3,404.1z M413.7,401.6h5.6c0-0.7-0.3-1.3-0.8-1.8c-0.5-0.5-1.2-0.8-1.9-0.8
+ c-0.5,0-1,0.1-1.4,0.3c-0.4,0.2-0.7,0.5-0.9,0.8c-0.2,0.3-0.3,0.6-0.4,0.8C413.7,401.3,413.7,401.5,413.7,401.6z"/>
+ <path fill="#007EC5" d="M423.3,406.3v-5.7c0-0.2,0-0.6,0-1.2c0-0.6,0-0.9,0-1.1h1c0,0.8,0,1.3,0.1,1.4c0.6-1.1,1.4-1.6,2.5-1.6
+ c0.2,0,0.4,0,0.6,0.1l-0.1,1c-0.1,0-0.3-0.1-0.4-0.1c-0.9,0-1.5,0.3-1.9,0.8c-0.4,0.5-0.6,1.2-0.6,2v4.3H423.3z"/>
+ <path fill="#007EC5" d="M435.9,401v1.9c0,1.4,0.1,2.5,0.2,3.3h-1c-0.1-0.4-0.1-0.8-0.1-1.3h0c-0.6,1-1.5,1.5-2.8,1.5
+ c-0.8,0-1.4-0.2-2-0.6c-0.5-0.4-0.8-1-0.8-1.8c0-1.8,1.5-2.7,4.4-2.7h1.2V401c0-0.6-0.2-1.1-0.6-1.4c-0.4-0.3-0.9-0.5-1.6-0.5
+ c-0.9,0-1.7,0.3-2.4,0.9l-0.6-0.7c0.4-0.3,0.8-0.6,1.4-0.8c0.6-0.2,1.1-0.3,1.6-0.3c1,0,1.8,0.2,2.3,0.7
+ C435.6,399.3,435.9,400,435.9,401L435.9,401z M434.9,402.3h-1.1c-1,0-1.8,0.1-2.4,0.4c-0.7,0.3-1,0.7-1,1.4c0,0.5,0.2,0.8,0.5,1.1
+ c0.4,0.3,0.8,0.4,1.2,0.4c1,0,1.7-0.3,2.1-0.8c0.4-0.5,0.6-1.2,0.6-1.9V402.3z"/>
+ <path fill="#007EC5" d="M443.2,398.4v0.9h-2.3v5.1c0,0.4,0.1,0.6,0.3,0.8c0.2,0.2,0.5,0.3,0.8,0.3c0.4,0,0.7-0.1,1.2-0.3l0.1,0.9
+ c-0.5,0.2-0.9,0.3-1.3,0.3c-0.7,0-1.2-0.2-1.5-0.6c-0.3-0.4-0.5-0.9-0.5-1.5v-5.1h-1.7v-0.9h1.7v-2.3h1v2.3H443.2z"/>
+ <path fill="#007EC5" d="M445.9,406.3v-7.9h1v7.9H445.9L445.9,406.3z M445.9,395.8c-0.1-0.1-0.2-0.3-0.2-0.5c0-0.2,0.1-0.4,0.2-0.5
+ c0.1-0.1,0.3-0.2,0.5-0.2c0.2,0,0.4,0.1,0.5,0.2c0.1,0.1,0.2,0.3,0.2,0.5c0,0.2-0.1,0.4-0.2,0.5c-0.1,0.1-0.3,0.2-0.5,0.2
+ C446.2,396,446,395.9,445.9,395.8z"/>
+ <path fill="#007EC5" d="M450.6,406.3v-5.7c0-0.2,0-0.6,0-1.2c0-0.6,0-0.9,0-1.1h1c0,0.8,0,1.3,0.1,1.4h0.1
+ c0.2-0.5,0.6-0.8,1.1-1.1c0.5-0.3,1-0.5,1.7-0.5c2,0,3,1.1,3,3.4v4.7h-1v-4.7c0-1.7-0.7-2.5-2-2.5c-0.8,0-1.5,0.3-2,0.8
+ c-0.5,0.6-0.8,1.4-0.8,2.4v3.9H450.6z"/>
+ <path fill="#007EC5" d="M468.7,398.4v7.4c0,0.8-0.1,1.4-0.3,2c-0.2,0.6-0.4,1-0.7,1.3c-0.3,0.3-0.6,0.6-1,0.8
+ c-0.4,0.2-0.8,0.3-1.1,0.4c-0.3,0.1-0.7,0.1-1.1,0.1c-0.8,0-1.6-0.1-2.3-0.4c-0.7-0.3-1.3-0.7-1.7-1.2l0.8-0.8
+ c0.7,1,1.7,1.5,3.1,1.5c2.1,0,3.2-1.2,3.2-3.6v-1.1h0c-0.6,1-1.6,1.5-3,1.5c-1.2,0-2.2-0.4-3-1.2c-0.8-0.8-1.2-1.7-1.2-2.9
+ c0-1.1,0.4-2.1,1.2-2.9c0.8-0.8,1.8-1.2,3-1.2c1.3,0,2.3,0.5,3,1.5h0v-1.3H468.7L468.7,398.4z M466.8,404.4
+ c0.6-0.6,0.9-1.3,0.9-2.2c0-0.9-0.3-1.6-0.9-2.2c-0.6-0.6-1.3-0.9-2.2-0.9c-0.9,0-1.6,0.3-2.2,0.9c-0.6,0.6-0.9,1.3-0.9,2.2
+ c0,0.9,0.3,1.6,0.9,2.2c0.6,0.6,1.3,0.9,2.2,0.9C465.5,405.3,466.2,405,466.8,404.4z"/>
+ </g>
+ <g>
+ <path fill="#007EC5" d="M476,404.7l1.1-0.7c0.6,1,1.5,1.5,2.8,1.5c0.8,0,1.4-0.2,1.9-0.6c0.5-0.4,0.8-1,0.8-1.7
+ c0-0.5-0.2-1-0.5-1.3c-0.3-0.3-0.7-0.6-1.2-0.7c-0.5-0.1-1-0.3-1.5-0.5c-0.5-0.2-1-0.4-1.5-0.6c-0.5-0.2-0.8-0.6-1.2-1
+ c-0.3-0.5-0.5-1.1-0.5-1.8c0-1,0.4-1.8,1.1-2.4c0.8-0.6,1.7-0.9,2.8-0.9c1.4,0,2.5,0.5,3.3,1.5l-1,0.7c-0.6-0.8-1.4-1.2-2.4-1.2
+ c-0.8,0-1.4,0.2-1.9,0.6c-0.5,0.4-0.8,1-0.8,1.7c0,0.5,0.1,0.9,0.3,1.2c0.2,0.3,0.5,0.6,0.9,0.8c0.4,0.2,0.8,0.3,1.2,0.5
+ c0.4,0.1,0.9,0.3,1.3,0.4c0.4,0.2,0.9,0.3,1.2,0.6c0.4,0.2,0.7,0.6,0.9,1c0.2,0.4,0.3,0.9,0.3,1.6c0,1-0.4,1.9-1.1,2.5
+ c-0.7,0.6-1.6,0.9-2.7,0.9C478.1,406.6,476.8,406,476,404.7z"/>
+ <path fill="#007EC5" d="M492.9,398.4l-4.1,10.3c-0.4,1.1-1.2,1.7-2.2,1.7c-0.3,0-0.6-0.1-1-0.2l0.1-1c0.4,0.1,0.7,0.2,0.9,0.2
+ c0.3,0,0.6-0.1,0.8-0.4c0.2-0.2,0.4-0.6,0.5-1l0.7-1.8l-3.2-7.9h1.1l2.6,6.7l2.5-6.7H492.9z"/>
+ <path fill="#007EC5" d="M494.4,404.9l0.9-0.6c0.2,0.4,0.5,0.7,0.9,1c0.4,0.2,0.9,0.3,1.4,0.3c0.5,0,0.9-0.1,1.3-0.4
+ c0.4-0.3,0.5-0.6,0.5-1.1c0-0.4-0.2-0.7-0.5-0.9c-0.3-0.2-0.7-0.4-1.2-0.5c-0.5-0.1-0.9-0.2-1.4-0.3c-0.5-0.1-0.9-0.3-1.2-0.7
+ c-0.3-0.3-0.5-0.8-0.5-1.3c0-0.7,0.3-1.3,0.8-1.7c0.5-0.4,1.2-0.6,1.9-0.6c1.4,0,2.3,0.5,2.8,1.5l-0.9,0.5c-0.4-0.7-1-1.1-1.9-1.1
+ c-0.4,0-0.8,0.1-1.1,0.3c-0.4,0.2-0.5,0.5-0.5,0.9c0,0.4,0.2,0.7,0.5,0.9c0.3,0.2,0.7,0.3,1.2,0.4c0.5,0.1,0.9,0.2,1.4,0.3
+ c0.5,0.1,0.9,0.3,1.2,0.7c0.3,0.3,0.5,0.8,0.5,1.4c0,0.8-0.3,1.4-0.8,1.8c-0.6,0.4-1.2,0.6-2,0.6
+ C496.1,406.5,495,405.9,494.4,404.9z"/>
+ <path fill="#007EC5" d="M507.2,398.4v0.9h-2.3v5.1c0,0.4,0.1,0.6,0.3,0.8c0.2,0.2,0.5,0.3,0.8,0.3c0.4,0,0.7-0.1,1.2-0.3l0.1,0.9
+ c-0.5,0.2-0.9,0.3-1.3,0.3c-0.7,0-1.2-0.2-1.5-0.6c-0.3-0.4-0.5-0.9-0.5-1.5v-5.1h-1.7v-0.9h1.7v-2.3h1v2.3H507.2z"/>
+ <path fill="#007EC5" d="M515.9,404.1l0.8,0.6c-0.8,1.1-1.9,1.7-3.4,1.7c-1.2,0-2.2-0.4-2.9-1.2c-0.7-0.8-1.1-1.8-1.1-3
+ c0-1.2,0.4-2.2,1.1-3s1.7-1.2,2.8-1.2c1.2,0,2.1,0.4,2.7,1.1c0.7,0.7,1,1.6,1,2.6v0.7h-6.6c0,0.2,0,0.4,0.1,0.6
+ c0.1,0.2,0.1,0.5,0.3,0.8c0.1,0.3,0.3,0.5,0.5,0.8c0.2,0.2,0.5,0.4,0.9,0.6c0.4,0.2,0.8,0.2,1.2,0.2c0.5,0,1-0.1,1.5-0.4
+ C515.3,404.9,515.7,404.6,515.9,404.1L515.9,404.1z M510.3,401.6h5.6c0-0.7-0.3-1.3-0.8-1.8c-0.5-0.5-1.2-0.8-1.9-0.8
+ c-0.5,0-1,0.1-1.4,0.3c-0.4,0.2-0.7,0.5-0.9,0.8c-0.2,0.3-0.3,0.6-0.4,0.8C510.3,401.3,510.3,401.5,510.3,401.6z"/>
+ <path fill="#007EC5" d="M520,406.3v-5.7c0-0.2,0-0.6,0-1.2c0-0.6,0-0.9,0-1.1h1c0,0.8,0,1.3,0.1,1.4h0.1c0.2-0.5,0.6-0.8,1.1-1.1
+ c0.5-0.3,1-0.5,1.7-0.5c0.5,0,1,0.1,1.5,0.4c0.4,0.3,0.7,0.7,0.9,1.3c0.2-0.6,0.6-1,1.1-1.3c0.5-0.3,1-0.4,1.6-0.4
+ c2,0,3,1.1,3,3.4v4.7h-1v-4.7c0-1.7-0.7-2.5-2-2.5c-0.4,0-0.8,0.1-1.2,0.3c-0.3,0.2-0.6,0.4-0.8,0.7c-0.2,0.3-0.3,0.6-0.4,0.9
+ c-0.1,0.3-0.1,0.6-0.1,0.9v4.4h-1v-4.8c0-0.8-0.1-1.3-0.4-1.8c-0.3-0.4-0.7-0.6-1.2-0.6c-0.8,0-1.5,0.3-2,0.8
+ c-0.5,0.6-0.8,1.4-0.8,2.4v3.9H520z"/>
+ </g>
+</g>
+<g>
+
+ <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="280.7511" y1="468.8727" x2="530.5958" y2="160.3402" gradientTransform="matrix(-0.9595 0.2818 0.2818 0.9595 742.5177 -113.6192)">
+ <stop offset="0" style="stop-color:#C6262F"/>
+ <stop offset="1.288056e-03" style="stop-color:#C6262F"/>
+ <stop offset="0.3136" style="stop-color:#D64B43"/>
+ <stop offset="0.5951" style="stop-color:#E26255"/>
+ <stop offset="0.8334" style="stop-color:#EA6F61"/>
+ <stop offset="1" style="stop-color:#ED7466"/>
+ </linearGradient>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="url(#SVGID_5_)" d="M427.7,300.4c-6.9,0.6-13.1,5-19.2,7.1
+ c-18.1,6.2-33.9,9.1-56.5,4.7c24.6,17.2,36.6,13,63.7,0.1c-0.5,0.6-0.7,1.3-1.3,1.9c1.4-0.4,2.4-1.7,3.4-2.2
+ c-0.4,0.7-0.9,1.5-1.4,1.9c2.2-0.6,3.7-2.3,5.9-3.9c-2.4,2.1-4.2,5-6,8c-1.5,2.5-3.1,4.8-5.1,6.9c-1,1-1.9,1.9-2.9,2.9
+ c-1.4,1.3-2.9,2.5-5.1,2.9c1.7,0.1,3.6-0.3,6.5-1.9c-1.6,2.4-7.1,6.2-9.9,7.2c10.5-2.6,19.2-15.9,25.7-18
+ c18.3-5.9,13.8-3.4,27-14.2c1.6-1.3,3-1,5.1-0.8c1.1,0.1,2.1,0.3,3.2,0.5c0.8,0.2,1.4,0.4,2.2,0.8l1.8,0.9c-1.9-4.5-2.3-4.1-5.9-6
+ c-2.3-1.3-3.3-3.8-6.2-4.9c-7.1-2.6-11.9,11.7-11.7-5c0.1-8,4.2-14.4,6.4-22c1.1-3.8,2.3-7.6,2.4-11.5c0.1-2.3,0-4.7-0.4-7
+ c-2-11.2-8.4-21.5-19.7-24.8c-1-0.3-1.1-0.3-0.9,0c9.6,17.1,7.2,38.3,3.1,54.2C429.9,285.5,426.7,293.2,427.7,300.4z"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#E6E7E8" d="M344.4,311.8c7.1,4.9,15,9.5,23.8,10.7
+ c-8.3-0.4-16.6-3.8-27.3-11.3C342,311.4,343.2,311.6,344.4,311.8z"/>
+</g>
+</svg>
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/overlaywork/AppUiTopoOverlay.java b/framework/src/onos/web/gui/src/main/webapp/_sdh/overlaywork/AppUiTopoOverlay.java
new file mode 100644
index 00000000..c6d00cc0
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/overlaywork/AppUiTopoOverlay.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.meowster.over;
+
+import org.onosproject.ui.UiTopoOverlay;
+import org.onosproject.ui.topo.ButtonId;
+import org.onosproject.ui.topo.PropertyPanel;
+import org.onosproject.ui.topo.TopoConstants.CoreButtons;
+import org.onosproject.ui.topo.TopoConstants.Glyphs;
+
+import static org.onosproject.ui.topo.TopoConstants.Properties.*;
+
+/**
+ * Our topology overlay.
+ */
+public class AppUiTopoOverlay extends UiTopoOverlay {
+
+ // NOTE: this must match the ID defined in topov.js
+ private static final String OVERLAY_ID = "meowster-overlay";
+
+ private static final String MY_TITLE = "I changed the title";
+ private static final String MY_VERSION = "Beta-1.0.0042";
+
+ private static final ButtonId FOO_BUTTON = new ButtonId("foo");
+ private static final ButtonId BAR_BUTTON = new ButtonId("bar");
+
+ public AppUiTopoOverlay() {
+ super(OVERLAY_ID);
+ }
+
+
+ @Override
+ public void modifySummary(PropertyPanel pp) {
+ pp.title("My App Rocks!")
+ .typeId(Glyphs.CROWN)
+ .removeProps(
+ TOPOLOGY_SSCS,
+ INTENTS,
+ TUNNELS,
+ FLOWS,
+ VERSION
+ )
+ .addProp(VERSION, MY_VERSION);
+
+ }
+
+ @Override
+ public void modifyDeviceDetails(PropertyPanel pp) {
+ pp.title(MY_TITLE);
+ pp.removeProps(LATITUDE, LONGITUDE);
+
+ pp.addButton(FOO_BUTTON)
+ .addButton(BAR_BUTTON);
+
+ pp.removeButtons(CoreButtons.SHOW_PORT_VIEW)
+ .removeButtons(CoreButtons.SHOW_GROUP_VIEW);
+ }
+
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/overlaywork/README.txt b/framework/src/onos/web/gui/src/main/webapp/_sdh/overlaywork/README.txt
new file mode 100644
index 00000000..d7dcbecd
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/overlaywork/README.txt
@@ -0,0 +1,4 @@
+NOTE:
+
+This directory is putting under revision control some key files from
+an example stand-alone app, as I develop the topology overlay functionality.
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/overlaywork/topov.js b/framework/src/onos/web/gui/src/main/webapp/_sdh/overlaywork/topov.js
new file mode 100644
index 00000000..068c30c5
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/overlaywork/topov.js
@@ -0,0 +1,157 @@
+// sample topology overlay - client side
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, tov;
+
+ // internal state
+ var someStateValue = true;
+
+ // our overlay definition
+ var overlay = {
+ // NOTE: this must match the ID defined in AppUiTopoOverlay
+ overlayId: 'meowster-overlay',
+ glyphId: '*star4',
+ tooltip: 'Sample Meowster Topo Overlay',
+
+ // These glyphs get installed using the overlayId as a prefix.
+ // e.g. 'star4' is installed as 'meowster-overlay-star4'
+ // They can be referenced (from this overlay) as '*star4'
+ // That is, the '*' prefix stands in for 'meowster-overlay-'
+ glyphs: {
+ star4: {
+ vb: '0 0 8 8',
+ d: 'M1,4l2,-1l1,-2l1,2l2,1l-2,1l-1,2l-1,-2z'
+ },
+ banner: {
+ vb: '0 0 6 6',
+ d: 'M1,1v4l2,-2l2,2v-4z'
+ }
+ },
+
+ activate: function () {
+ $log.debug("sample topology overlay ACTIVATED");
+ },
+ deactivate: function () {
+ $log.debug("sample topology overlay DEACTIVATED");
+ },
+
+
+
+
+
+ // detail panel button definitions
+ buttons: {
+ foo: {
+ gid: 'chain',
+ tt: 'A FOO action',
+ cb: function (data) {
+ $log.debug('FOO action invoked with data:', data);
+ }
+ },
+ bar: {
+ gid: '*banner',
+ tt: 'A BAR action',
+ cb: function (data) {
+ $log.debug('BAR action invoked with data:', data);
+ }
+ }
+ },
+
+ // Key bindings for traffic overlay buttons
+ // NOTE: fully qual. button ID is derived from overlay-id and key-name
+ keyBindings: {
+ V: {
+ cb: buttonCallback,
+ tt: 'Uses the V key',
+ gid: '*banner'
+ },
+ F: {
+ cb: buttonCallback,
+ tt: 'Uses the F key',
+ gid: 'chain'
+ },
+ G: {
+ cb: buttonCallback,
+ tt: 'Uses the G key',
+ gid: 'crown'
+ },
+
+ T: {
+ cb: buttonCallback,
+ tt: 'Uses the T key',
+ gid: 'switch'
+ },
+
+ R: {
+ cb: buttonCallback,
+ tt: 'Uses the R key',
+ gid: 'endstation'
+ },
+
+ 0: {
+ cb: buttonCallback,
+ tt: 'Uses the ZERO key',
+ gid: 'xMark'
+ },
+
+ _keyOrder: [
+ '0', 'V', 'F', 'G', 'T', 'R'
+ ]
+
+ // NOTE: T and R should be rejected (not installed)
+ // T is reserved for 'toggle Theme'
+ // R is reserved for 'Reset pan and zoom'
+ },
+
+ hooks: {
+ // hook for handling escape key
+ // Must return true to consume ESC, false otherwise.
+ escape: cancelState,
+
+ // hooks for when the selection changes...
+ empty: function () {
+ selectionCallback('empty');
+ },
+ single: function (data) {
+ selectionCallback('single', data);
+ },
+ multi: function (selectOrder) {
+ selectionCallback('multi', selectOrder);
+ tov.addDetailButton('foo');
+ tov.addDetailButton('bar');
+ }
+ }
+
+ };
+
+ // invoked when the escape key is pressed
+ function cancelState() {
+ if (someStateValue) {
+ someStateValue = false;
+ // we consumed the ESC event
+ return true;
+ }
+ return false;
+ }
+
+ function buttonCallback(x) {
+ $log.debug('Toolbar-button callback', x);
+ }
+
+ function selectionCallback(x, d) {
+ $log.debug('Selection callback', x, d);
+ }
+
+ // invoke code to register with the overlay service
+ angular.module('ovSample')
+ .run(['$log', 'TopoOverlayService',
+
+ function (_$log_, _tov_) {
+ $log = _$log_;
+ tov = _tov_;
+ tov.register(overlay);
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/_sdh/topojson/samerica.html b/framework/src/onos/web/gui/src/main/webapp/_sdh/topojson/samerica.html
new file mode 100644
index 00000000..15bb331e
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/_sdh/topojson/samerica.html
@@ -0,0 +1,87 @@
+<!--
+ -- Sample code to show extracting country data from a countries TopoJSON
+ -- file and projecting it into an SVG layer.
+ --
+ -- See: http://bl.ocks.org/pnavarrc/62047b5638d624cfa9cb
+ -->
+<html>
+<head>
+ <title>S America</title>
+
+ <script charset="utf-8" src="../../tp/d3.min.js"></script>
+ <script charset="utf-8" src="../../tp/topojson.v1.min.js"></script>
+
+ <style>
+ svg {
+ border: 1px solid #888;
+ }
+ .country {
+ fill: #bcd1ff;
+ stroke: #7c79e6;
+ stroke-width: 1;
+ }
+ </style>
+</head>
+
+<body>
+ <div id="map"></div>
+
+ <script>
+ var datapath = '../../data/map/countries.topojson',
+ height = 500,
+ width = 500;
+
+ // create geographic projection
+ var projection = d3.geo.mercator()
+ .translate([width/2, height/2]);
+
+ // configure path generator
+ var pathGenerator = d3.geo.path()
+ .projection(projection);
+
+ var div = d3.select('#map'),
+ svg = div.append('svg'),
+ grp = svg.append('g');
+
+ svg.attr('width', width).attr('height', height);
+
+ d3.json(datapath, function (error, data) {
+ if (error) {
+ console.error(error);
+ throw error;
+ }
+
+ var features = topojson.feature(data, data.objects.countries).features;
+
+ // S.America
+ var southAmerica = features.filter(function (country) {
+ return country.properties.continent === 'South America';
+ });
+
+ var southAmericaFeature = {
+ type: 'FeatureCollection',
+ features: southAmerica
+ };
+
+ // compute bounds and centroid
+ var bounds = d3.geo.bounds(southAmericaFeature),
+ center = d3.geo.centroid(southAmericaFeature);
+
+ // compute angular distance between bound corners
+ var distance = d3.geo.distance(bounds[0], bounds[1]),
+ scale = height / distance / Math.sqrt(2);
+
+ // update projection
+ projection.scale(scale).center(center);
+
+ // draw
+ var countries = grp.selectAll('path.country')
+ .data([southAmericaFeature]);
+ countries.enter().append('path').classed('country', true);
+ countries.attr('d', pathGenerator);
+ countries.exit().remove();
+ });
+ </script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/README.txt b/framework/src/onos/web/gui/src/main/webapp/app/README.txt
new file mode 100644
index 00000000..d5f94d87
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/README.txt
@@ -0,0 +1,7 @@
+# Main Application
+
+index.html is the main launch point for the application.
+
+fw/ contains framework related code
+
+view/ contains view related code \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/common.css b/framework/src/onos/web/gui/src/main/webapp/app/common.css
new file mode 100644
index 00000000..3a181afc
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/common.css
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- common -- CSS file
+ */
+
+#view h2 {
+ margin: 0;
+ /* separated out so that other padding doesn't get clobbered */
+ padding-top: 20px;
+ padding-bottom: 20px;
+}
+
+.clickable {
+ cursor: pointer;
+}
+
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/directives.js b/framework/src/onos/web/gui/src/main/webapp/app/directives.js
new file mode 100644
index 00000000..0b4f4957
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/directives.js
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- General Purpose Angular directives defined here.
+ */
+
+(function () {
+ 'use strict';
+
+ angular.module('onosApp')
+
+ // Create a resize directive, that we can apply to elements
+ // so that they can respond to window resize events.
+ .directive('resize', ['$window', 'FnService', function ($window, fs) {
+ return {
+ scope: {
+ offsetHeight: '@',
+ offsetWidth: '@',
+ notifier: '&'
+ },
+ link: function (scope, element) {
+ var elem = d3.select(element[0]);
+ scope.$watchCollection(function () {
+ return {
+ h: $window.innerHeight,
+ w: $window.innerWidth
+ };
+ }, function () {
+ var offH = scope.offsetHeight || 0,
+ offW = scope.offsetWidth || 0,
+ wsz = fs.windowSize(offH, offW);
+
+ elem.style({
+ height: wsz.height + 'px',
+ width: wsz.width + 'px'
+ });
+
+ if (fs.isF(scope.notifier)) {
+ scope.notifier();
+ }
+ });
+
+ angular.element($window).bind('resize', function () {
+ scope.$apply();
+ });
+ }
+ };
+ }])
+
+ .directive('ngRepeatComplete', [function () {
+ return function (scope) {
+ if (scope.$last) {
+ scope.$emit('ngRepeatComplete');
+ scope.$broadcast('ngRepeatComplete');
+ }
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/README.txt b/framework/src/onos/web/gui/src/main/webapp/app/fw/README.txt
new file mode 100644
index 00000000..626547b2
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/README.txt
@@ -0,0 +1,44 @@
+# Framework related code
+
+- layer
+ - Flash Service (transient messages)
+ - Panel Service (floating panels)
+ - Quick Help Service (key bindings, mouse gestures)
+ - Veil Service (loss of server connection)
+
+- mast
+ - Masthead Service
+
+- nav
+ - Navigation Service (navigation menu)
+
+- remote
+ - REST Service
+ - URL functin Service
+ - Web Socket Service
+ - Web Socket Event Service
+ - Web Socket encapsulation
+
+ - (Login Service) << planned
+
+- svg
+ - GeoData Service (TopoJSON map functions)
+ - Glyph Service
+ - Icon Service
+ - Map Service
+ - SVG Utilities Service
+ - Zoom Service
+
+- util
+ - General Functions
+ - Key Handler
+ - User Preference Service
+ - Randomization Service
+ - Theme Service
+
+- widget
+ - Button Service
+ - Table Service (table styling directives)
+ - Table Builder Service
+ - Toolbar Service
+ - Tooltip Service
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/flash.css b/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/flash.css
new file mode 100644
index 00000000..02064625
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/flash.css
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Flash Service -- CSS file
+ */
+
+#flash {
+ z-index: 1400;
+}
+
+#flash svg {
+ position: absolute;
+ bottom: 0;
+ opacity: 0.8;
+}
+
+.light #flash svg g.flashItem rect {
+ fill: #ccc;
+}
+.dark #flash svg g.flashItem rect {
+ fill: #555;
+}
+
+#flash svg g.flashItem text {
+ stroke: none;
+ text-anchor: middle;
+ alignment-baseline: middle;
+ font-size: 16pt;
+}
+.light #flash svg g.flashItem text {
+ fill: #333;
+}
+.dark #flash svg g.flashItem text {
+ fill: #999;
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/flash.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/flash.js
new file mode 100644
index 00000000..0d95b774
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/flash.js
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Layer -- Flash Service
+
+ Provides a mechanism to flash short informational messages to the screen
+ to alert the user of something, e.g. "Hosts visible" or "Hosts hidden".
+ */
+(function () {
+ 'use strict';
+
+ // injected references
+ var $log, $timeout;
+
+ // configuration
+ var defaultSettings = {
+ fade: 200,
+ showFor: 1200
+ },
+ w = '100%',
+ h = 200,
+ xpad = 20,
+ ypad = 10,
+ rx = 10,
+ vbox = '-200 -' + (h/2) + ' 400 ' + h;
+
+ // internal state
+ var settings,
+ timer = null,
+ data = [],
+ enabled;
+
+ // DOM elements
+ var flashDiv, svg;
+
+
+ function computeBox(el) {
+ var text = el.select('text'),
+ box = text.node().getBBox();
+
+ // center
+ box.x = -box.width / 2;
+ box.y = -box.height / 2;
+
+ // add some padding
+ box.x -= xpad;
+ box.width += xpad * 2;
+ box.y -= ypad;
+ box.height += ypad * 2;
+
+ return box;
+ }
+
+ function updateFlash() {
+ if (!svg) {
+ svg = flashDiv.append('svg').attr({
+ width: w,
+ height: h,
+ viewBox: vbox
+ });
+ }
+
+ var items = svg.selectAll('.flashItem')
+ .data(data);
+
+ // this is when there is an existing item
+ items.each(function (msg) {
+ var el = d3.select(this),
+ box;
+
+ el.select('text').text(msg);
+ box = computeBox(el);
+ el.select('rect').attr(box);
+ });
+
+
+ // this is when there is no existing item
+ var entering = items.enter()
+ .append('g')
+ .attr({
+ class: 'flashItem',
+ opacity: 0
+ })
+ .transition()
+ .duration(settings.fade)
+ .attr('opacity', 1);
+
+ entering.each(function (msg) {
+ var el = d3.select(this),
+ box;
+
+ el.append('rect').attr('rx', rx);
+ el.append('text').text(msg);
+ box = computeBox(el);
+ el.select('rect').attr(box);
+ });
+
+ items.exit()
+ .transition()
+ .duration(settings.fade)
+ .attr('opacity', 0)
+ .remove();
+
+ if (svg && data.length === 0) {
+ svg.transition()
+ .delay(settings.fade + 10)
+ .remove();
+ svg = null;
+ }
+ }
+
+ function flash(msg) {
+ if (!enabled) return;
+
+ if (timer) {
+ $timeout.cancel(timer);
+ }
+
+ timer = $timeout(function () {
+ data = [];
+ updateFlash();
+ }, settings.showFor);
+
+ data = [msg];
+ updateFlash();
+ }
+
+ function enable(b) {
+ enabled = !!b;
+ }
+
+ angular.module('onosLayer')
+ .factory('FlashService', ['$log', '$timeout',
+ function (_$log_, _$timeout_) {
+ $log = _$log_;
+ $timeout = _$timeout_;
+
+ function initFlash(opts) {
+ settings = angular.extend({}, defaultSettings, opts);
+ flashDiv = d3.select('#flash');
+ enabled = true;
+ }
+
+ return {
+ initFlash: initFlash,
+ flash: flash,
+ enable: enable
+ };
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/layer.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/layer.js
new file mode 100644
index 00000000..a47f53e0
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/layer.js
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Layers Module
+ */
+(function () {
+ 'use strict';
+
+ angular.module('onosLayer', ['onosUtil']);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/panel.css b/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/panel.css
new file mode 100644
index 00000000..46dbdb52
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/panel.css
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Panel Service -- CSS file
+ */
+
+.floatpanel {
+ position: absolute;
+ z-index: 100;
+ display: block;
+ top: 64px;
+ width: 200px;
+ right: -220px;
+ opacity: 0;
+
+ padding: 10px;
+ font-size: 10pt;
+
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+}
+
+html[data-platform='iPad'] .floatpanel {
+ top: 80px;
+}
+
+.light .floatpanel {
+ background-color: rgba(255,255,255,0.8);
+ color: black;
+ box-shadow: 0 2px 12px #777;
+}
+.dark .floatpanel {
+ background-color: rgba(50,50,50,0.8);
+ color: #ccc;
+ box-shadow: 0 2px 12px #000;
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/panel.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/panel.js
new file mode 100644
index 00000000..aef71eee
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/panel.js
@@ -0,0 +1,214 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Layer -- Panel Service
+ */
+(function () {
+ 'use strict';
+
+ var $log, fs;
+
+ var defaultSettings = {
+ edge: 'right',
+ width: 200,
+ margin: 20,
+ hideMargin: 20,
+ xtnTime: 750,
+ fade: true
+ };
+
+ var panels,
+ panelLayer;
+
+
+ function init() {
+ panelLayer = d3.select('#floatpanels');
+ panelLayer.html('');
+ panels = {};
+ }
+
+ // helpers for panel
+ function noop() {}
+
+ function margin(p) {
+ return p.settings.margin;
+ }
+ function hideMargin(p) {
+ return p.settings.hideMargin;
+ }
+ function noPx(p, what) {
+ return Number(p.el.style(what).replace(/px$/, ''));
+ }
+ function widthVal(p) {
+ return noPx(p, 'width');
+ }
+ function heightVal(p) {
+ return noPx(p, 'height');
+ }
+ function pxShow(p) {
+ return margin(p) + 'px';
+ }
+ function pxHide(p) {
+ return (-hideMargin(p) - widthVal(p) - (noPx(p, 'padding') * 2)) + 'px';
+ }
+
+ function makePanel(id, settings) {
+ var p = {
+ id: id,
+ settings: settings,
+ on: false,
+ el: null
+ },
+ api = {
+ show: showPanel,
+ hide: hidePanel,
+ toggle: togglePanel,
+ empty: emptyPanel,
+ append: appendPanel,
+ width: panelWidth,
+ height: panelHeight,
+ isVisible: panelIsVisible,
+ classed: classed,
+ el: panelEl
+ };
+
+ p.el = panelLayer.append('div')
+ .attr('id', id)
+ .attr('class', 'floatpanel')
+ .style('opacity', 0);
+
+ // has to be called after el is set
+ p.el.style(p.settings.edge, pxHide(p));
+ panelWidth(p.settings.width);
+ if (p.settings.height) {
+ panelHeight(p.settings.height);
+ }
+
+ panels[id] = p;
+
+ function showPanel(cb) {
+ var endCb = fs.isF(cb) || noop;
+ p.on = true;
+ p.el.transition().duration(p.settings.xtnTime)
+ .each('end', endCb)
+ .style(p.settings.edge, pxShow(p))
+ .style('opacity', 1);
+ }
+
+ function hidePanel(cb) {
+ var endCb = fs.isF(cb) || noop,
+ endOpacity = p.settings.fade ? 0 : 1;
+ p.on = false;
+ p.el.transition().duration(p.settings.xtnTime)
+ .each('end', endCb)
+ .style(p.settings.edge, pxHide(p))
+ .style('opacity', endOpacity);
+ }
+
+ function togglePanel(cb) {
+ if (p.on) {
+ hidePanel(cb);
+ } else {
+ showPanel(cb);
+ }
+ return p.on;
+ }
+
+ function emptyPanel() {
+ return p.el.html('');
+ }
+
+ function appendPanel(what) {
+ return p.el.append(what);
+ }
+
+ function panelWidth(w) {
+ if (w === undefined) {
+ return widthVal(p);
+ }
+ p.el.style('width', w + 'px');
+ }
+
+ function panelHeight(h) {
+ if (h === undefined) {
+ return heightVal(p);
+ }
+ p.el.style('height', h + 'px');
+ }
+
+ function panelIsVisible() {
+ return p.on;
+ }
+
+ function classed(cls, bool) {
+ return p.el.classed(cls, bool);
+ }
+
+ function panelEl() {
+ return p.el;
+ }
+
+ return api;
+ }
+
+ function removePanel(id) {
+ panelLayer.select('#' + id).remove();
+ delete panels[id];
+ }
+
+ angular.module('onosLayer')
+ .factory('PanelService', ['$log', 'FnService', function (_$log_, _fs_) {
+ $log = _$log_;
+ fs = _fs_;
+
+ function createPanel(id, opts) {
+ var settings = angular.extend({}, defaultSettings, opts);
+ if (!id) {
+ $log.warn('createPanel: no ID given');
+ return null;
+ }
+ if (panels[id]) {
+ $log.warn('Panel with ID "' + id + '" already exists');
+ return null;
+ }
+ if (fs.debugOn('widget')) {
+ $log.debug('creating panel:', id, settings);
+ }
+ return makePanel(id, settings);
+ }
+
+ function destroyPanel(id) {
+ if (panels[id]) {
+ if (fs.debugOn('widget')) {
+ $log.debug('destroying panel:', id);
+ }
+ removePanel(id);
+ } else {
+ if (fs.debugOn('widget')) {
+ $log.debug('no panel to destroy:', id);
+ }
+ }
+ }
+
+ return {
+ init: init,
+ createPanel: createPanel,
+ destroyPanel: destroyPanel
+ };
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/quickhelp.css b/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/quickhelp.css
new file mode 100644
index 00000000..bb806d8a
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/quickhelp.css
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Quick Help Service -- CSS file
+ */
+
+#quickhelp {
+ z-index: 1300;
+}
+
+#quickhelp svg {
+ position: absolute;
+ top: 180px;
+ opacity: 1;
+}
+
+#quickhelp svg g.help rect {
+ fill: black;
+ opacity: 0.7;
+}
+
+#quickhelp svg text.title {
+ font-size: 10pt;
+ font-style: italic;
+ text-anchor: middle;
+ fill: #999;
+}
+
+#quickhelp svg g.keyItem {
+ fill: white;
+}
+
+#quickhelp svg g line.qhrowsep {
+ stroke: #888;
+ stroke-dasharray: 2 2;
+}
+
+#quickhelp svg text {
+ font-size: 7pt;
+ alignment-baseline: middle;
+}
+
+#quickhelp svg text.key {
+ fill: #add;
+}
+
+#quickhelp svg text.desc {
+ fill: #ddd;
+}
+
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/quickhelp.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/quickhelp.js
new file mode 100644
index 00000000..a25cf68d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/quickhelp.js
@@ -0,0 +1,387 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Layer -- Quick Help Service
+
+ Provides a mechanism to display key bindings and mouse gesture notes.
+ */
+(function () {
+ 'use strict';
+
+ // injected references
+ var $log, fs, sus;
+
+ // configuration
+ var defaultSettings = {
+ fade: 500
+ },
+ w = '100%',
+ h = '80%',
+ vbox = '-200 0 400 400',
+ pad = 10,
+ offy = 45,
+ sepYDelta = 20,
+ colXDelta = 16,
+ yTextSpc = 12,
+ offDesc = 8;
+
+ // internal state
+ var settings,
+ data = [],
+ yCount;
+
+ // DOM elements
+ var qhdiv, svg, pane, rect, items;
+
+ // key-logical-name to key-display lookup..
+ var keyDisp = {
+ equals: '=',
+ slash: '/',
+ backSlash: '\\',
+ backQuote: '`',
+ leftArrow: 'L-arrow',
+ upArrow: 'U-arrow',
+ rightArrow: 'R-arrow',
+ downArrow: 'D-arrow'
+ };
+
+ // list of needed bindings to use in aggregateData
+ var neededBindings = [
+ 'globalKeys', 'globalFormat', 'viewKeys', 'viewGestures'
+ ];
+
+ // ===========================================
+ // === Function Definitions ===
+
+ function mkKeyDisp(id) {
+ var v = keyDisp[id] || id;
+ return fs.cap(v);
+ }
+
+ function addSeparator(el, i) {
+ var y = sepYDelta/2 - 5;
+ el.append('line')
+ .attr({ 'class': 'qhrowsep', x1: 0, y1: y, x2: 0, y2: y });
+ }
+
+ function addContent(el, data, ri) {
+ var xCount = 0,
+ clsPfx = 'qh-r' + ri + '-c';
+
+ function addColumn(el, c, i) {
+ var cls = clsPfx + i,
+ oy = 0,
+ aggKey = el.append('g').attr('visibility', 'hidden'),
+ gcol = el.append('g').attr({
+ 'class': cls,
+ transform: sus.translate(xCount, 0)
+ });
+
+ c.forEach(function (j) {
+ var k = j[0],
+ v = j[1];
+
+ if (k !== '-') {
+ aggKey.append('text').text(k);
+
+ gcol.append('text').text(k)
+ .attr({
+ 'class': 'key',
+ y: oy
+ });
+ gcol.append('text').text(v)
+ .attr({
+ 'class': 'desc',
+ y: oy
+ });
+ }
+
+ oy += yTextSpc;
+ });
+
+ // adjust position of descriptions, based on widest key
+ var kbox = aggKey.node().getBBox(),
+ ox = kbox.width + offDesc;
+ gcol.selectAll('.desc').attr('x', ox);
+ aggKey.remove();
+
+ // now update x-offset for next column
+ var bbox = gcol.node().getBBox();
+ xCount += bbox.width + colXDelta;
+ }
+
+ data.forEach(function (d, i) {
+ addColumn(el, d, i);
+ });
+
+ // finally, return the height of the row..
+ return el.node().getBBox().height;
+ }
+
+ function updateKeyItems() {
+ var rows = items.selectAll('.qhRow').data(data);
+
+ yCount = offy;
+
+ var entering = rows.enter()
+ .append('g')
+ .attr({
+ 'class': 'qhrow'
+ });
+
+ entering.each(function (r, i) {
+ var el = d3.select(this),
+ sep = r.type === 'sep',
+ dy;
+
+ el.attr('transform', sus.translate(0, yCount));
+
+ if (sep) {
+ addSeparator(el, i);
+ yCount += sepYDelta;
+ } else {
+ dy = addContent(el, r.data, i);
+ yCount += dy;
+ }
+ });
+
+ // size the backing rectangle
+ var ibox = items.node().getBBox(),
+ paneW = ibox.width + pad * 2,
+ paneH = ibox.height + offy;
+
+ items.selectAll('.qhrowsep').attr('x2', ibox.width);
+ items.attr('transform', sus.translate(-paneW/2, -pad));
+ rect.attr({
+ width: paneW,
+ height: paneH,
+ transform: sus.translate(-paneW/2-pad, 0)
+ });
+
+ }
+
+ function checkFmt(fmt) {
+ // should be a single array of keys,
+ // or array of arrays of keys (one per column).
+ // return null if there is a problem.
+ var a = fs.isA(fmt),
+ n = a && a.length,
+ ns = 0,
+ na = 0;
+
+ if (n) {
+ // it is an array which has some content
+ a.forEach(function (d) {
+ fs.isA(d) && na++;
+ fs.isS(d) && ns++;
+ });
+ if (na === n || ns === n) {
+ // all arrays or all strings...
+ return a;
+ }
+ }
+ return null;
+ }
+
+ function buildBlock(map, fmt) {
+ var b = [];
+ fmt.forEach(function (k) {
+ var v = map.get(k),
+ a = fs.isA(v),
+ d = (a && a[1]);
+
+ // '-' marks a separator; d is the description
+ if (k === '-' || d) {
+ b.push([mkKeyDisp(k), d]);
+ }
+ });
+ return b;
+ }
+
+ function emptyRow() {
+ return { type: 'row', data: [] };
+ }
+
+ function mkArrRow(fmt) {
+ var d = emptyRow();
+ d.data.push(fmt);
+ return d;
+ }
+
+ function mkColumnarRow(map, fmt) {
+ var d = emptyRow();
+ fmt.forEach(function (a) {
+ d.data.push(buildBlock(map, a));
+ });
+ return d;
+ }
+
+ function mkMapRow(map, fmt) {
+ var d = emptyRow();
+ d.data.push(buildBlock(map, fmt));
+ return d;
+ }
+
+ function addRow(row) {
+ var d = row || { type: 'sep' };
+ data.push(d);
+ }
+
+ function aggregateData(bindings) {
+ var hf = '_helpFormat',
+ gmap = d3.map(bindings.globalKeys),
+ gfmt = bindings.globalFormat,
+ vmap = d3.map(bindings.viewKeys),
+ vgest = bindings.viewGestures,
+ vfmt, vkeys;
+
+ // filter out help format entry
+ vfmt = checkFmt(vmap.get(hf));
+ vmap.remove(hf);
+
+ // if bad (or no) format, fallback to sorted keys
+ if (!vfmt) {
+ vkeys = vmap.keys();
+ vfmt = vkeys.sort();
+ }
+
+ data = [];
+
+ addRow(mkMapRow(gmap, gfmt));
+ addRow();
+ addRow(fs.isA(vfmt[0]) ? mkColumnarRow(vmap, vfmt) : mkMapRow(vmap, vfmt));
+ addRow();
+ addRow(mkArrRow(vgest));
+ }
+
+
+ function popBind(bindings) {
+ pane = svg.append('g')
+ .attr({
+ class: 'help',
+ opacity: 0
+ });
+
+ rect = pane.append('rect')
+ .attr('rx', 8);
+
+ pane.append('text')
+ .text('Quick Help')
+ .attr({
+ class: 'title',
+ dy: '1.2em',
+ transform: sus.translate(-pad,0)
+ });
+
+ items = pane.append('g');
+ aggregateData(bindings);
+ updateKeyItems();
+
+ _fade(1);
+ }
+
+ function fadeBindings() {
+ _fade(0);
+ }
+
+ function _fade(o) {
+ svg.selectAll('g.help')
+ .transition()
+ .duration(settings.fade)
+ .attr('opacity', o);
+ }
+
+ function addSvg() {
+ svg = qhdiv.append('svg')
+ .attr({
+ width: w,
+ height: h,
+ viewBox: vbox
+ });
+ }
+
+ function removeSvg() {
+ svg.transition()
+ .delay(settings.fade + 20)
+ .remove();
+ }
+
+ function goodBindings(bindings) {
+ var warnPrefix = 'Quickhelp Service: showQuickHelp(), ';
+ if (!bindings || !fs.isO(bindings) || fs.isEmptyObject(bindings)) {
+ $log.warn(warnPrefix + 'invalid bindings object');
+ return false;
+ }
+ if (!(neededBindings.every(function (key) { return key in bindings; }))) {
+ $log.warn(
+ warnPrefix +
+ 'needed bindings for help panel not provided:',
+ neededBindings
+ );
+ return false
+ }
+ return true;
+ }
+
+ // ===========================================
+ // === Module Definition ===
+
+ angular.module('onosLayer')
+ .factory('QuickHelpService',
+ ['$log', 'FnService', 'SvgUtilService',
+
+ function (_$log_, _fs_, _sus_) {
+ $log = _$log_;
+ fs = _fs_;
+ sus = _sus_;
+
+ function initQuickHelp(opts) {
+ settings = angular.extend({}, defaultSettings, fs.isO(opts));
+ qhdiv = d3.select('#quickhelp');
+ }
+
+ function showQuickHelp(bindings) {
+ svg = qhdiv.select('svg');
+ if (!goodBindings(bindings)) {
+ return null;
+ }
+ if (svg.empty()) {
+ addSvg();
+ popBind(bindings);
+ } else {
+ hideQuickHelp();
+ }
+ }
+
+ function hideQuickHelp() {
+ svg = qhdiv.select('svg');
+ if (!svg.empty()) {
+ fadeBindings();
+ removeSvg();
+ return true;
+ }
+ return false;
+ }
+
+ return {
+ initQuickHelp: initQuickHelp,
+ showQuickHelp: showQuickHelp,
+ hideQuickHelp: hideQuickHelp
+ };
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/veil.css b/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/veil.css
new file mode 100644
index 00000000..afef94ac
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/veil.css
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Veil Service -- CSS file
+ */
+
+#veil {
+ z-index: 5000;
+ display: none;
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+
+.light #veil {
+ background-color: rgba(0,0,0,0.75);
+}
+.dark #veil {
+ background-color: rgba(64,64,64,0.75);
+}
+
+#veil .msg {
+ position: absolute;
+ padding: 60px;
+}
+
+#veil .msg p {
+ display: block;
+ font-size: 14pt;
+ font-style: italic;
+ color: #ddd;
+}
+
+#veil svg .glyph {
+ fill: #222;
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/veil.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/veil.js
new file mode 100644
index 00000000..fc0530af
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/layer/veil.js
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Layer -- Veil Service
+
+ Provides a mechanism to display an overlaying div with information.
+ Used mainly for web socket connection interruption.
+ */
+(function () {
+ 'use strict';
+
+ // injected references
+ var $log, $route, fs, ks, gs;
+
+ var veil;
+
+ function init() {
+ var wSize = fs.windowSize(),
+ ww = wSize.width,
+ wh = wSize.height,
+ shrink = wh * 0.3,
+ birdDim = wh - shrink,
+ birdCenter = (ww - birdDim) / 2,
+ svg;
+
+ veil = d3.select('#veil');
+
+ svg = veil.select('svg').attr({
+ width: ww,
+ height: wh
+ }).style('opacity', 0.2);
+
+ gs.addGlyph(svg, 'bird', birdDim, false, [birdCenter, shrink/2]);
+ }
+
+ // msg should be an array of strings
+ function show(msg) {
+ var msgs = fs.isA(msg) || [msg],
+ pdiv = veil.select('.msg');
+ pdiv.selectAll('p').remove();
+
+ msgs.forEach(function (line) {
+ pdiv.append('p').text(line);
+ });
+
+ veil.style('display', 'block');
+ ks.enableKeys(false);
+ }
+
+ function hide() {
+ veil.style('display', 'none');
+ ks.enableKeys(true);
+ }
+
+ // function that only invokes the veil if the caller is the current view
+ // TODO: review - is this deprecated ?
+ function lostServer(ctrlName, msg) {
+ if ($route.current.$$route.controller === ctrlName) {
+ $log.debug('VEIL-service: ', ctrlName);
+ show(msg)
+ } else {
+ $log.debug('VEIL-service: IGNORING ', ctrlName);
+ }
+ }
+
+ angular.module('onosLayer')
+ .factory('VeilService',
+ ['$log', '$route', 'FnService', 'KeyService', 'GlyphService',
+
+ function (_$log_, _$route_, _fs_, _ks_, _gs_) {
+ $log = _$log_;
+ $route = _$route_;
+ fs = _fs_;
+ ks = _ks_;
+ gs = _gs_;
+
+ return {
+ init: init,
+ show: show,
+ hide: hide,
+ lostServer: lostServer
+ };
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/mast/mast.css b/framework/src/onos/web/gui/src/main/webapp/app/fw/mast/mast.css
new file mode 100644
index 00000000..2e86e86d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/mast/mast.css
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Masthead -- CSS file
+ */
+
+#mast {
+ height: 36px;
+ padding: 4px;
+ vertical-align: baseline;
+}
+
+html[data-platform='iPad'] #mast {
+ padding-top: 16px;
+}
+
+.light #mast {
+ background-color: #bbb;
+ box-shadow: 0 2px 8px #777;
+}
+.dark #mast {
+ background-color: #444;
+ box-shadow: 0 2px 8px #222;
+}
+
+#mast .nav-menu-button {
+ width: 30px;
+ height: 30px;
+ margin-left: 8px;
+ margin-bottom: 4px;
+ cursor: pointer;
+}
+.light #mast .nav-menu-button:hover {
+ background-color: #ddd;
+}
+.dark #mast .nav-menu-button:hover {
+ background-color: #777;
+}
+
+#mast img.logo {
+ height: 38px;
+ padding-left: 8px;
+ padding-right: 8px;
+}
+
+#mast img.logo:hover {
+ /* need something better */
+ /*background-color: #888;*/
+}
+
+#mast .title {
+ font-size: 14pt;
+ font-style: italic;
+ vertical-align: 12px;
+}
+
+.light #mast .title {
+ color: #369;
+}
+.dark #mast .title {
+ color: #eee;
+}
+
+#mast-right {
+ display: inline-block;
+ padding-top: 8px;
+ padding-right: 16px;
+ float: right;
+ /*border: 1px solid red;*/
+}
+
+#mast-right a {
+ font-size: 12pt;
+ font-style: normal;
+ font-weight: bold;
+ text-decoration: none;
+}
+
+.light #mast-right a {
+ color: #369;
+}
+.dark #mast-right a {
+ color: #eee;
+}
+
+#mast-right a:hover {
+ color: #CE5650;
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/mast/mast.html b/framework/src/onos/web/gui/src/main/webapp/app/fw/mast/mast.html
new file mode 100644
index 00000000..5bb488a8
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/mast/mast.html
@@ -0,0 +1,6 @@
+<!-- Masthead partial HTML -->
+<img class="nav-menu-button" src="data/img/nav-menu.png"
+ ng-click="mastCtrl.toggleNav()"></div>
+<img class="logo" src="data/img/onos-logo.png">
+<span class="title">Open Network Operating System</span>
+<div id="mast-right"><a href="rs/logout">logout</a></div>
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/mast/mast.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/mast/mast.js
new file mode 100644
index 00000000..1cde58c7
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/mast/mast.js
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Masthead Module
+ */
+(function () {
+ 'use strict';
+
+ // injected services
+ var $log;
+
+ // configuration
+ var mastHeight = 36,
+ padMobile = 16;
+
+ angular.module('onosMast', ['onosNav'])
+ .controller('MastCtrl', ['$log', 'NavService', function (_$log_, ns) {
+ var self = this;
+
+ $log = _$log_;
+
+ // initialize mast controller here...
+ self.radio = null;
+
+ // delegate to NavService
+ self.toggleNav = function () {
+ ns.toggleNav();
+ };
+
+ $log.log('MastCtrl has been created');
+ }])
+
+ // also define a service to allow lookup of mast height.
+ .factory('MastService', ['FnService', function (fs) {
+ return {
+ mastHeight: function () {
+ return fs.isMobile() ? mastHeight + padMobile : mastHeight;
+ }
+ }
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/nav/nav.css b/framework/src/onos/web/gui/src/main/webapp/app/fw/nav/nav.css
new file mode 100644
index 00000000..4d2c4e91
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/nav/nav.css
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Navigation -- CSS file
+ */
+
+#nav {
+ position: absolute;
+ top: 45px;
+ left: 1px;
+ padding: 0;
+ z-index: 3000;
+ visibility: hidden;
+}
+
+html[data-platform='iPad'] #nav {
+ top: 57px;
+}
+
+.light #nav {
+ background-color: #bbb;
+ box-shadow: 0 2px 8px #777;
+}
+.dark #nav {
+ background-color: #444;
+ box-shadow: 0 2px 8px #111;
+}
+
+#nav .nav-hdr {
+ font-style: italic;
+ padding: 6px 8px 6px 8px;
+}
+
+.light #nav .nav-hdr {
+ color: #ddd;
+ border-bottom: solid 1px #999;
+ background-color: #aaa;
+}
+.dark #nav .nav-hdr {
+ color: #888;
+ border-bottom: solid 1px #444;
+ background-color: #555;
+}
+
+#nav a {
+ text-decoration: none;
+ font-size: 14pt;
+ display: block;
+ padding: 8px 16px 6px 12px;
+}
+
+.light #nav a {
+ color: #369;
+ border-bottom: solid #ccc 1px;
+}
+.dark #nav a {
+ color: #eee;
+ border-bottom: solid #333 1px;
+}
+
+.light #nav a:hover {
+ background-color: #ddd;
+}
+.dark #nav a:hover {
+ background-color: #777;
+}
+
+#nav a div {
+ display: inline-block;
+ vertical-align: middle;
+ padding-right: 4px;
+}
+
+#nav a div svg.embeddedIcon g.icon .glyph {
+ fill: #c66;
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/nav/nav.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/nav/nav.js
new file mode 100644
index 00000000..36ef599e
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/nav/nav.js
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Navigation Module
+ */
+(function () {
+ 'use strict';
+
+ // injected dependencies
+ var $log, $location, $window, fs;
+
+ // internal state
+ var navShown = false;
+
+ function updatePane() {
+ var vis = navShown ? 'visible' : 'hidden';
+ d3.select('#nav').style('visibility', vis);
+ }
+
+
+ function showNav() {
+ navShown = true;
+ updatePane();
+ }
+ function hideNav() {
+ navShown = false;
+ updatePane();
+ }
+ function toggleNav() {
+ navShown = !navShown;
+ updatePane();
+ }
+ function hideIfShown() {
+ if (navShown) {
+ hideNav();
+ return true;
+ }
+ return false;
+ }
+
+ function navTo(path, params) {
+ var url;
+ if (!path) {
+ $log.warn('Not a valid navigation path');
+ return null;
+ }
+ $location.url('/' + path);
+
+ if (fs.isO(params)) {
+ $location.search(params);
+ } else if (params !== undefined) {
+ $log.warn('Query params not an object', params);
+ }
+
+ url = $location.absUrl();
+ $log.log('Navigating to ', url);
+ $window.location.href = url;
+ }
+
+ angular.module('onosNav', [])
+ .controller('NavCtrl', ['$log',
+
+ function (_$log_) {
+ var self = this;
+ $log = _$log_;
+
+ self.hideNav = hideNav;
+ $log.log('NavCtrl has been created');
+ }
+ ])
+ .factory('NavService',
+ ['$log', '$location', '$window', 'FnService',
+
+ function (_$log_, _$location_, _$window_, _fs_) {
+ $log = _$log_;
+ $location = _$location_;
+ $window = _$window_;
+ fs = _fs_;
+
+ return {
+ showNav: showNav,
+ hideNav: hideNav,
+ toggleNav: toggleNav,
+ hideIfShown: hideIfShown,
+ navTo: navTo
+ };
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/remote/remote.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/remote/remote.js
new file mode 100644
index 00000000..453d08f9
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/remote/remote.js
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Remote Communications Module
+ */
+(function () {
+ 'use strict';
+
+ angular.module('onosRemote', ['onosUtil']);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/remote/rest.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/remote/rest.js
new file mode 100644
index 00000000..04b9fe02
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/remote/rest.js
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Remote Communications Module -- REST Service
+ */
+(function () {
+ 'use strict';
+
+ var $log;
+
+ angular.module('onosRemote')
+ .factory('RestService',
+ ['$log', '$http', 'FnService', 'UrlFnService',
+
+ function (_$log_, $http, fs, ufs) {
+ $log = _$log_;
+
+ function get(url, callback, errorCb) {
+ var fullUrl = ufs.rsUrl(url);
+
+ $http.get(fullUrl).then(function (response) {
+ // success
+ callback(response.data);
+ }, function (response) {
+ // error
+ var emsg = 'Failed to retrieve JSON data: ' + fullUrl;
+ $log.warn(emsg, response.status, response.data);
+ if (errorCb) {
+ errorCb(emsg);
+ }
+ });
+ }
+
+ // TODO: test this
+ function post(url, data, callbacks) {
+ var fullUrl = ufs.rsUrl(url);
+ $http.post(fullUrl, data).then(function (response) {
+ // success
+ if (callbacks && fs.isF(callbacks.success)) {
+ callbacks.success(response.data);
+ }
+ }, function (response) {
+ // error
+ var msg = 'Problem with $http post request: ' + fullUrl;
+ $log.warn(msg, response.status, response.data);
+
+ if (callbacks && fs.isF(callbacks.error)) {
+ callbacks.error(msg);
+ }
+ });
+ }
+
+ return {
+ get: get,
+ post: post
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/remote/urlfn.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/remote/urlfn.js
new file mode 100644
index 00000000..6ec01b41
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/remote/urlfn.js
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Remote -- General Purpose Functions
+ */
+(function () {
+ 'use strict';
+
+ var uiContext = '/onos/ui/',
+ rsSuffix = uiContext + 'rs/',
+ wsSuffix = uiContext + 'websock/';
+
+ angular.module('onosRemote')
+ .factory('UrlFnService', ['$location', function ($loc) {
+
+ function matchSecure(protocol) {
+ var p = $loc.protocol(),
+ secure = (p === 'https' || p === 'wss');
+ return secure ? protocol + 's' : protocol;
+ }
+
+ function urlBase(protocol, port, host) {
+ return matchSecure(protocol) + '://' +
+ (host || $loc.host()) + ':' + (port || $loc.port());
+ }
+
+ function httpPrefix(suffix) {
+ return urlBase('http') + suffix;
+ }
+
+ function wsPrefix(suffix, wsport, host) {
+ return urlBase('ws', wsport, host) + suffix;
+ }
+
+ function rsUrl(path) {
+ return httpPrefix(rsSuffix) + path;
+ }
+
+ function wsUrl(path, wsport, host) {
+ return wsPrefix(wsSuffix, wsport, host) + path;
+ }
+
+ return {
+ rsUrl: rsUrl,
+ wsUrl: wsUrl
+ };
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/remote/websocket.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/remote/websocket.js
new file mode 100644
index 00000000..1c03d6fd
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/remote/websocket.js
@@ -0,0 +1,329 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Remote -- Web Socket Service
+ */
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, $loc, fs, ufs, wsock, vs;
+
+ // internal state
+ var webSockOpts, // web socket options
+ ws = null, // web socket reference
+ wsUp = false, // web socket is good to go
+ sid = 0, // event sequence identifier
+ handlers = {}, // event handler bindings
+ pendingEvents = [], // events TX'd while socket not up
+ host, // web socket host
+ url, // web socket URL
+ clusterNodes = [], // ONOS instances data for failover
+ clusterIndex = -1, // the instance to which we are connected
+ connectRetries = 0, // limit our attempts at reconnecting
+ openListeners = {}, // registered listeners for websocket open()
+ nextListenerId = 1; // internal ID for open listeners
+
+ // =======================
+ // === Bootstrap Handler
+
+ var builtinHandlers = {
+ bootstrap: function (data) {
+ clusterNodes = data.clusterNodes;
+ clusterNodes.forEach(function (d, i) {
+ if (d.uiAttached) {
+ clusterIndex = i;
+ $log.info('Connected to cluster node ' + d.ip);
+ // TODO: add connect info to masthead somewhere
+ }
+ });
+ }
+ };
+
+ // ==========================
+ // === Web socket callbacks
+
+ function handleOpen() {
+ $log.info('Web socket open - ', url);
+ vs.hide();
+
+ if (fs.debugOn('txrx')) {
+ $log.debug('Sending ' + pendingEvents.length + ' pending event(s)...');
+ }
+ pendingEvents.forEach(function (ev) {
+ _send(ev);
+ });
+ pendingEvents = [];
+
+ connectRetries = 0;
+ wsUp = true;
+ informListeners(host, url);
+ }
+
+ // Handles the specified (incoming) message using handler bindings.
+ function handleMessage(msgEvent) {
+ var ev, h;
+
+ try {
+ ev = JSON.parse(msgEvent.data);
+ } catch (e) {
+ $log.error('Message.data is not valid JSON', msgEvent.data, e);
+ return null;
+ }
+ if (fs.debugOn('txrx')) {
+ $log.debug(' << *Rx* ', ev.event, ev.payload);
+ }
+
+ if (h = handlers[ev.event]) {
+ try {
+ h(ev.payload);
+ } catch (e) {
+ $log.error('Problem handling event:', ev, e);
+ return null;
+ }
+ } else {
+ $log.warn('Unhandled event:', ev);
+ }
+
+ }
+
+ function handleClose() {
+ var gsucc;
+
+ $log.info('Web socket closed');
+ wsUp = false;
+
+ if (gsucc = findGuiSuccessor()) {
+ createWebSocket(webSockOpts, gsucc);
+ } else {
+ // If no controllers left to contact, show the Veil...
+ vs.show([
+ 'Oops!',
+ 'Web-socket connection to server closed...',
+ 'Try refreshing the page.'
+ ]);
+ }
+ }
+
+
+ // ==============================
+ // === Private Helper Functions
+
+ function findGuiSuccessor() {
+ var ncn = clusterNodes.length,
+ ip, node;
+
+ while (connectRetries < ncn && !ip) {
+ connectRetries++;
+ clusterIndex = (clusterIndex + 1) % ncn;
+ node = clusterNodes[clusterIndex];
+ ip = node && node.ip;
+ }
+
+ return ip;
+ }
+
+ function informListeners(host, url) {
+ angular.forEach(openListeners, function (lsnr) {
+ lsnr.cb(host, url);
+ });
+ }
+
+ function _send(ev) {
+ if (fs.debugOn('txrx')) {
+ $log.debug(' *Tx* >> ', ev.event, ev.payload);
+ }
+ ws.send(JSON.stringify(ev));
+ }
+
+ function noHandlersWarn(handlers, caller) {
+ if (!handlers || fs.isEmptyObject(handlers)) {
+ $log.warn('WSS.' + caller + '(): no event handlers');
+ return true;
+ }
+ return false;
+ }
+
+ // ===================
+ // === API Functions
+
+ // Required for unit tests to set to known state
+ function resetSid() {
+ sid = 0;
+ }
+ function resetState() {
+ webSockOpts = undefined;
+ ws = null;
+ wsUp = false;
+ host = undefined;
+ url = undefined;
+ pendingEvents = [];
+ handlers = {};
+ sid = 0;
+ clusterNodes = [];
+ clusterIndex = -1;
+ connectRetries = 0;
+ openListeners = {};
+ nextListenerId = 1;
+ }
+
+ // Currently supported opts:
+ // wsport: web socket port (other than default 8181)
+ // host: if defined, is the host address to use
+ function createWebSocket(opts, _host_) {
+ var wsport = (opts && opts.wsport) || null;
+
+ webSockOpts = opts; // preserved for future calls
+
+ host = _host_ || $loc.host();
+ url = ufs.wsUrl('core', wsport, _host_);
+
+ $log.debug('Attempting to open websocket to: ' + url);
+ ws = wsock.newWebSocket(url);
+ if (ws) {
+ ws.onopen = handleOpen;
+ ws.onmessage = handleMessage;
+ ws.onclose = handleClose;
+ }
+ // Note: Wsock logs an error if the new WebSocket call fails
+ return url;
+ }
+
+ // Binds the message handlers to their message type (event type) as
+ // specified in the given map. Note that keys are the event IDs; values
+ // are either:
+ // * the event handler function, or
+ // * an API object which has an event handler for the key
+ //
+ function bindHandlers(handlerMap) {
+ var m,
+ dups = [];
+
+ if (noHandlersWarn(handlerMap, 'bindHandlers')) {
+ return null;
+ }
+ m = d3.map(handlerMap);
+
+ m.forEach(function (eventId, api) {
+ var fn = fs.isF(api) || fs.isF(api[eventId]);
+ if (!fn) {
+ $log.warn(eventId + ' handler not a function');
+ return;
+ }
+
+ if (handlers[eventId]) {
+ dups.push(eventId);
+ } else {
+ handlers[eventId] = fn;
+ }
+ });
+ if (dups.length) {
+ $log.warn('duplicate bindings ignored:', dups);
+ }
+ }
+
+ // Unbinds the specified message handlers.
+ // Expected that the same map will be used, but we only care about keys
+ function unbindHandlers(handlerMap) {
+ var m;
+
+ if (noHandlersWarn(handlerMap, 'unbindHandlers')) {
+ return null;
+ }
+ m = d3.map(handlerMap);
+
+ m.forEach(function (eventId) {
+ delete handlers[eventId];
+ });
+ }
+
+ function addOpenListener(callback) {
+ var id = nextListenerId++,
+ cb = fs.isF(callback),
+ o = { id: id, cb: cb };
+
+ if (cb) {
+ openListeners[id] = o;
+ } else {
+ $log.error('WSS.addOpenListener(): callback not a function');
+ o.error = 'No callback defined';
+ }
+ return o;
+ }
+
+ function removeOpenListener(lsnr) {
+ var id = fs.isO(lsnr) && lsnr.id,
+ o;
+ if (!id) {
+ $log.warn('WSS.removeOpenListener(): invalid listener', lsnr);
+ return null;
+ }
+ o = openListeners[id];
+
+ if (o) {
+ delete openListeners[id];
+ }
+ }
+
+ // Formulates an event message and sends it via the web-socket.
+ // If the websocket is not up yet, we store it in a pending list.
+ function sendEvent(evType, payload) {
+ var ev = {
+ event: evType,
+ sid: ++sid,
+ payload: payload || {}
+ };
+
+ if (wsUp) {
+ _send(ev);
+ } else {
+ pendingEvents.push(ev);
+ }
+ }
+
+
+ // ============================
+ // ===== Definition of module
+ angular.module('onosRemote')
+ .factory('WebSocketService',
+ ['$log', '$location', 'FnService', 'UrlFnService', 'WSock',
+ 'VeilService',
+
+ function (_$log_, _$loc_, _fs_, _ufs_, _wsock_, _vs_) {
+ $log = _$log_;
+ $loc = _$loc_;
+ fs = _fs_;
+ ufs = _ufs_;
+ wsock = _wsock_;
+ vs = _vs_;
+
+ bindHandlers(builtinHandlers);
+
+ return {
+ resetSid: resetSid,
+ resetState: resetState,
+ createWebSocket: createWebSocket,
+ bindHandlers: bindHandlers,
+ unbindHandlers: unbindHandlers,
+ addOpenListener: addOpenListener,
+ removeOpenListener: removeOpenListener,
+ sendEvent: sendEvent
+ };
+ }
+ ]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/remote/wsevent.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/remote/wsevent.js
new file mode 100644
index 00000000..02d71b52
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/remote/wsevent.js
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ DEPRECATED: to be deleted
+ ONOS GUI -- Remote -- Web Socket Event Service
+ */
+(function () {
+ 'use strict';
+
+ var sid = 0;
+
+ angular.module('onosRemote')
+ .factory('WsEventService', [function () {
+
+ function sendEvent(ws, evType, payload) {
+ var p = payload || {};
+
+ ws.send({
+ event: evType,
+ sid: ++sid,
+ payload: p
+ });
+ }
+
+ function resetSid() {
+ sid = 0;
+ }
+
+ return {
+ sendEvent: sendEvent,
+ resetSid: resetSid
+ };
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/remote/wsock.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/remote/wsock.js
new file mode 100644
index 00000000..0c58a798
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/remote/wsock.js
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Remote -- Web Socket Wrapper Service
+
+ This service provided specifically so that it can be mocked in unit tests.
+ */
+(function () {
+ 'use strict';
+
+ angular.module('onosRemote')
+ .factory('WSock', ['$log', function ($log) {
+
+ function newWebSocket(url) {
+ var ws = null;
+ try {
+ ws = new WebSocket(url);
+ } catch (e) {
+ $log.error('Unable to create web socket:', e);
+ }
+ return ws;
+ }
+
+ return {
+ newWebSocket: newWebSocket
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/geodata.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/geodata.js
new file mode 100644
index 00000000..6c54bb45
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/geodata.js
@@ -0,0 +1,186 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- SVG -- GeoData Service
+ */
+
+/*
+ The GeoData Service facilitates the fetching and caching of TopoJSON data
+ from the server, as well as providing a way of creating a path generator
+ for that data, to be used to render the map in an SVG layer.
+
+ A TopoData object can be fetched by ID. IDs that start with an asterisk
+ identify maps bundled with the GUI. IDs that do not start with an
+ asterisk are assumed to be URLs to externally provided data.
+
+ var topodata = GeoDataService.fetchTopoData('*continental-us');
+
+ The path generator can then be created for that data-set:
+
+ var gen = GeoDataService.createPathGenerator(topodata, opts);
+
+ opts is an optional argument that allows the override of default settings:
+ {
+ objectTag: 'states',
+ projection: d3.geo.mercator(),
+ logicalSize: 1000,
+ mapFillScale: .95
+ };
+
+ The returned object (gen) comprises transformed data (TopoJSON -> GeoJSON),
+ the D3 path generator function, and the settings used ...
+
+ {
+ geodata: { ... },
+ pathgen: function (...) { ... },
+ settings: { ... }
+ }
+ */
+
+(function () {
+ 'use strict';
+
+ // injected references
+ var $log, $http, fs;
+
+ // internal state
+ var cache = d3.map(),
+ bundledUrlPrefix = 'data/map/';
+
+ function getUrl(id) {
+ if (id[0] === '*') {
+ return bundledUrlPrefix + id.slice(1) + '.topojson';
+ }
+ return id + '.topojson';
+ }
+
+
+ // start afresh...
+ function clearCache() {
+ cache = d3.map();
+ }
+
+ // returns a promise decorated with:
+ // .meta -- id, url, and whether the data was cached
+ // .topodata -- TopoJSON data (on response from server)
+
+ function fetchTopoData(id) {
+ if (!fs.isS(id)) {
+ return null;
+ }
+ var url = getUrl(id),
+ promise = cache.get(id);
+
+ if (!promise) {
+ // need to fetch the data, build the object,
+ // cache it, and return it.
+ promise = $http.get(url);
+
+ promise.meta = {
+ id: id,
+ url: url,
+ wasCached: false
+ };
+
+ promise.then(function (response) {
+ // success
+ promise.topodata = response.data;
+ }, function (response) {
+ // error
+ $log.warn('Failed to retrieve map TopoJSON data: ' + url,
+ response.status, response.data);
+ });
+
+ cache.set(id, promise);
+
+ } else {
+ promise.meta.wasCached = true;
+ }
+
+ return promise;
+ }
+
+ var defaultGenSettings = {
+ objectTag: 'states',
+ projection: d3.geo.mercator(),
+ logicalSize: 1000,
+ mapFillScale: .95
+ };
+
+ // converts given TopoJSON-format data into corresponding GeoJSON
+ // data, and creates a path generator for that data.
+ function createPathGenerator(topoData, opts) {
+ var settings = angular.extend({}, defaultGenSettings, opts),
+ topoObject = topoData.objects[settings.objectTag],
+ geoData = topojson.feature(topoData, topoObject),
+ proj = settings.projection,
+ dim = settings.logicalSize,
+ mfs = settings.mapFillScale,
+ path = d3.geo.path().projection(proj);
+
+ rescaleProjection(proj, mfs, dim, path, geoData);
+
+ // return the results
+ return {
+ geodata: geoData,
+ pathgen: path,
+ settings: settings
+ };
+ }
+
+ function rescaleProjection(proj, mfs, dim, path, geoData) {
+ // adjust projection scale and translation to fill the view
+ // with the map
+
+ // start with unit scale, no translation..
+ proj.scale(1).translate([0, 0]);
+
+ // figure out dimensions of map data..
+ var b = path.bounds(geoData),
+ x1 = b[0][0],
+ y1 = b[0][1],
+ x2 = b[1][0],
+ y2 = b[1][1],
+ dx = x2 - x1,
+ dy = y2 - y1,
+ x = (x1 + x2) / 2,
+ y = (y1 + y2) / 2;
+
+ // size map to 95% of minimum dimension to fill space..
+ var s = mfs / Math.min(dx / dim, dy / dim),
+ t = [dim / 2 - s * x, dim / 2 - s * y];
+
+ // set new scale, translation on the projection..
+ proj.scale(s).translate(t);
+ }
+
+ angular.module('onosSvg')
+ .factory('GeoDataService', ['$log', '$http', 'FnService',
+ function (_$log_, _$http_, _fs_) {
+ $log = _$log_;
+ $http = _$http_;
+ fs = _fs_;
+
+
+ return {
+ clearCache: clearCache,
+ fetchTopoData: fetchTopoData,
+ createPathGenerator: createPathGenerator,
+ rescaleProjection: rescaleProjection
+ };
+ }]);
+}()); \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/glyph.css b/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/glyph.css
new file mode 100644
index 00000000..82910654
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/glyph.css
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Glyph Service -- CSS file
+ */
+
+svg .glyph {
+ stroke: none;
+ fill-rule: evenodd;
+}
+
+.light svg .glyph,
+.dark svg .glyph.overlay {
+ fill: black;
+}
+
+.dark svg .glyph,
+.light svg .glyph.overlay {
+ fill: white;
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/glyph.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/glyph.js
new file mode 100644
index 00000000..838a2ac0
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/glyph.js
@@ -0,0 +1,646 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- SVG -- Glyph Service
+ */
+(function () {
+ 'use strict';
+
+ // injected references
+ var $log, fs, sus;
+
+ // internal state
+ var glyphs = d3.map();
+
+ // ----------------------------------------------------------------------
+ // Base set of Glyphs...
+
+ var birdData = {
+ _bird: "352 224 113 112",
+ bird: "M427.7,300.4 c-6.9,0.6-13.1,5-19.2,7.1c-18.1,6.2-33.9," +
+ "9.1-56.5,4.7c24.6,17.2,36.6,13,63.7,0.1c-0.5,0.6-0.7,1.3-1.3," +
+ "1.9c1.4-0.4,2.4-1.7,3.4-2.2c-0.4,0.7-0.9,1.5-1.4,1.9c2.2-0.6," +
+ "3.7-2.3,5.9-3.9c-2.4,2.1-4.2,5-6,8c-1.5,2.5-3.1,4.8-5.1,6.9c-1," +
+ "1-1.9,1.9-2.9,2.9c-1.4,1.3-2.9,2.5-5.1,2.9c1.7,0.1,3.6-0.3,6.5" +
+ "-1.9c-1.6,2.4-7.1,6.2-9.9,7.2c10.5-2.6,19.2-15.9,25.7-18c18.3" +
+ "-5.9,13.8-3.4,27-14.2c1.6-1.3,3-1,5.1-0.8c1.1,0.1,2.1,0.3,3.2," +
+ "0.5c0.8,0.2,1.4,0.4,2.2,0.8l1.8,0.9c-1.9-4.5-2.3-4.1-5.9-6c-2.3" +
+ "-1.3-3.3-3.8-6.2-4.9c-7.1-2.6-11.9,11.7-11.7-5c0.1-8,4.2-14.4," +
+ "6.4-22c1.1-3.8,2.3-7.6,2.4-11.5c0.1-2.3,0-4.7-0.4-7c-2-11.2-8.4" +
+ "-21.5-19.7-24.8c-1-0.3-1.1-0.3-0.9,0c9.6,17.1,7.2,38.3,3.1,54.2" +
+ "C429.9,285.5,426.7,293.2,427.7,300.4z"
+ },
+
+ // TODO: ONOS-2566 glyphs for device types:
+ // otn, roadm_otn, firewall, balancer, ips, ids,
+ // controller, virtual, fiber_switch, other
+
+ glyphDataSet = {
+ _viewbox: "0 0 110 110",
+
+ unknown: "M35,40a5,5,0,0,1,5-5h30a5,5,0,0,1,5,5v30a5,5,0,0,1-5,5" +
+ "h-30a5,5,0,0,1-5-5z",
+
+ node: "M15,100a5,5,0,0,1-5-5v-65a5,5,0,0,1,5-5h80a5,5,0,0,1,5,5" +
+ "v65a5,5,0,0,1-5,5zM14,22.5l11-11a10,3,0,0,1,10-2h40a10,3,0,0,1," +
+ "10,2l11,11zM16,35a5,5,0,0,1,10,0a5,5,0,0,1-10,0z",
+
+ switch: "M10,20a10,10,0,0,1,10-10h70a10,10,0,0,1,10,10v70a10,10," +
+ "0,0,1-10,10h-70a10,10,0,0,1-10-10zM60,26l12,0,0-8,18,13-18,13,0" +
+ "-8-12,0zM60,60l12,0,0-8,18,13-18,13,0-8-12,0zM50,40l-12,0,0-8" +
+ "-18,13,18,13,0-8,12,0zM50,74l-12,0,0-8-18,13,18,13,0-8,12,0z",
+
+ roadm: "M10,35l25-25h40l25,25v40l-25,25h-40l-25-25zM58,26l12,0,0" +
+ "-8,18,13-18,13,0-8-12,0zM58,60l12,0,0-8,18,13-18,13,0-8-12,0z" +
+ "M52,40l-12,0,0-8-18,13,18,13,0-8,12,0zM52,74l-12,0,0-8-18,13," +
+ "18,13,0-8,12,0z",
+
+ endstation: "M10,15a5,5,0,0,1,5-5h65a5,5,0,0,1,5,5v80a5,5,0,0,1" +
+ "-5,5h-65a5,5,0,0,1-5-5zM87.5,14l11,11a3,10,0,0,1,2,10v40a3,10," +
+ "0,0,1,-2,10l-11,11zM17,19a2,2,0,0,1,2-2h56a2,2,0,0,1,2,2v26a2," +
+ "2,0,0,1-2,2h-56a2,2,0,0,1-2-2zM20,20h54v10h-54zM20,33h54v10h" +
+ "-54zM42,70a5,5,0,0,1,10,0a5,5,0,0,1-10,0z",
+
+ router: "M10,55A45,45,0,0,1,100,55A45,45,0,0,1,10,55M20,50l12,0," +
+ "0-8,18,13-18,13,0-8-12,0zM90,50l-12,0,0-8-18,13,18,13,0-8,12,0z" +
+ "M50,47l0-12-8,0,13-18,13,18-8,0,0,12zM50,63l0,12-8,0,13,18,13" +
+ "-18-8,0,0-12z",
+
+ bgpSpeaker: "M10,40a45,35,0,0,1,90,0Q100,77,55,100Q10,77,10,40z" +
+ "M50,29l12,0,0-8,18,13-18,13,0-8-12,0zM60,57l-12,0,0-8-18,13," +
+ "18,13,0-8,12,0z",
+
+ chain: "M60.4,77.6c-4.9,5.2-9.6,11.3-15.3,16.3c-8.6,7.5-20.4,6.8" +
+ "-28-0.8c-7.7-7.7-8.4-19.6-0.8-28.4c6.5-7.4,13.5-14.4,20.9-20.9" +
+ "c7.5-6.7,19.2-6.7,26.5-0.8c3.5,2.8,4.4,6.1,2.2,8.7c-2.7,3.1" +
+ "-5.5,2.5-8.5,0.3c-4.7-3.4-9.7-3.2-14,0.9C37.1,58.7,31,64.8," +
+ "25.2,71c-4.2,4.4-4.2,10.6-0.6,14.3c3.7,3.7,9.7,3.7,14.3-0.4" +
+ "c2.9-2.5,5.3-5.5,8.3-8c1-0.9,3-1.1,4.4-0.9C54.8,76.3,57.9,77.1," +
+ "60.4,77.6zM49.2,32.2c5-5.2,9.7-10.9,15.2-15.7c12.8-11,31.2" +
+ "-4.9,34.3,11.2C100,34.2,98.3,40.2,94,45c-6.7,7.4-13.7,14.6" +
+ "-21.2,21.2C65.1,73,53.2,72.7,46,66.5c-3.2-2.8-3.9-5.8-1.6-8.4" +
+ "c2.6-2.9,5.3-2.4,8.2-0.3c5.2,3.7,10,3.3,14.7-1.1c5.8-5.6,11.6" +
+ "-11.3,17.2-17.2c4.6-4.8,4.9-11.1,0.9-15c-3.9-3.9-10.1-3.4-15," +
+ "1.2c-3.1,2.9-5.7,7.4-9.3,8.5C57.6,35.3,53,33,49.2,32.2z",
+
+ crown: "M99.5,21.6c0,3-2.3,5.4-5.1,5.4c-0.3,0-0.7,0-1-0.1c-1.8," +
+ "4-4.8,10-7.2,17.3c-3.4,10.6-0.9,26.2,2.7,27.3C90.4,72,91.3," +
+ "75,88,75H22.7c-3.3,0-2.4-3-0.9-3.5c3.6-1.1,6.1-16.7,2.7-27.3" +
+ "c-2.4-7.4-5.4-13.5-7.2-17.5c-0.5,0.2-1,0.3-1.6,0.3c-2.8,0" +
+ "-5.1-2.4-5.1-5.4c0-3,2.3-5.4,5.1-5.4c2.8,0,5.1,2.4,5.1,5.4c0," +
+ "1-0.2,1.9-0.7,2.7c0.7,0.8,1.4,1.6,2.4,2.6c8.8,8.9,11.9,12.7," +
+ "18.1,11.7c6.5-1,11-8.2,13.3-14.1c-2-0.8-3.3-2.7-3.3-5.1c0-3," +
+ "2.3-5.4,5.1-5.4c2.8,0,5.1,2.4,5.1,5.4c0,2.5-1.6,4.5-3.7,5.2" +
+ "c2.3,5.9,6.8,13,13.2,14c6.2,1,9.3-2.7,18.1-11.7c0.7-0.7,1.4" +
+ "-1.5,2-2.1c-0.6-0.9-1-2-1-3.1c0-3,2.3-5.4,5.1-5.4C97.2,16.2," +
+ "99.5,18.6,99.5,21.6zM92,87.9c0,2.2-1.7,4.1-3.8,4.1H22.4c" +
+ "-2.1,0-4.4-1.9-4.4-4.1v-3.3c0-2.2,2.3-4.5,4.4-4.5h65.8c2.1," +
+ "0,3.8,2.3,3.8,4.5V87.9z",
+
+ lock: "M79.4,48.6h-2.7c0.2-5.7-0.2-20.4-7.9-28.8c-3.6-3.9-8.3" +
+ "-5.9-13.7-5.9c-5.4,0-10.2,2-13.8,5.9c-7.8,8.4-8.3,23.2-8.1,28.8" +
+ "h-2.7c-4.4,0-8,2.6-8,5.9v35.7c0,3.3,3.6,5.9,8,5.9h48.9c4.4,0," +
+ "8-2.6,8-5.9V54.5C87.5,51.3,83.9,48.6,79.4,48.6z M48.1,26.1c1.9" +
+ "-2,4.1-2.9,7-2.9c2.9,0,5.1,0.9,6.9,2.9c5,5.4,5.6,17.1,5.4,22.6" +
+ "h-25C42.3,43.1,43.1,31.5,48.1,26.1z",
+
+ topo: 'M97.2,76.3H86.6l-7.7-21.9H82c1,0,1.9-0.8,1.9-1.9V35.7c' +
+ '0-1-0.8-1.9-1.9-1.9H65.2c-1,0-1.9,0.8-1.9,1.9v2.6L33.4,26.1v-11' +
+ 'c0-1-0.8-1.9-1.9-1.9H14.7c-1,0-1.9,0.8-1.9,1.9v16.8c0,1,0.8,' +
+ '1.9,1.9,1.9h16.8c1,0,1.9-0.8,1.9-1.9v-2.6l29.9,12.2v9L30.5,76.9' +
+ 'c-0.3-0.3-0.8-0.5-1.3-0.5H12.4c-1,0-1.9,0.8-1.9,1.9V95c0,1,0.8,' +
+ '1.9,1.9,1.9h16.8c1,0,1.9-0.8,1.9-1.9v-6.9h47.4V95c0,1,0.8,1.9,' +
+ '1.9,1.9h16.8c1,0,1.9-0.8,1.9-1.9V78.2C99.1,77.2,98.2,76.3,97.2,' +
+ '76.3z M31.1,85.1v-4.9l32.8-26.4c0.3,0.3,0.8,0.5,1.3,0.5h10.5l' +
+ '7.7,21.9h-3c-1,0-1.9,0.8-1.9,1.9v6.9H31.1z',
+
+ refresh: 'M102.6,40.8L88.4,70.5L69.8,43.4L80,42.6c-0.7-2.3-1.7-' +
+ '5.1-3.4-7.8C71.8,27,64,23.1,53.5,23.1c-19.5,0-24.8,11.2-24.8,' +
+ '11.3l-10.1-4.3c0.3-0.7,7.9-18,35-18c24.8,0,35,17.3,37.7,29.6L' +
+ '102.6,40.8z M81.5,74.5c-0.2,0.5-5.5,11.4-24.9,11.4c-10.5,0-18.3' +
+ '-3.9-23.1-11.7c-1.7-2.8-2.8-5.6-3.4-7.8l10.2-0.8L21.7,38.5L7.5,' +
+ '68.2l11.4-0.9c2.7,12.3,12.9,29.6,37.7,29.6c26.9,0,34.6-17.2,34.9' +
+ '-18L81.5,74.5z',
+
+ garbage: 'M94.6,20.2c0,2.7-2.1,4.8-4.8,4.8H19.2c-2.7,0-4.8-2.1-' +
+ '4.8-4.8s2.1-4.8,4.8-4.8h27.6c-0.8-0.7-1.4-1.7-1.4-2.9c0-2.1,1.7-' +
+ '3.9,3.9-3.9h10.4c2.1,0,3.9,1.7,3.9,3.9c0,1.2-0.5,2.2-1.4,2.9h' +
+ '27.6C92.5,15.4,94.6,17.6,94.6,20.2z M91,33.4v64.8c0,2-1.7,3.6-' +
+ '3.8,3.6h-65c-2.1,0-3.8-1.6-3.8-3.6V33.4c0-2,1.7-3.6,3.8-3.6h65C' +
+ '89.3,29.8,91,31.4,91,33.4z M31.5,37.7c0-2.1-1.2-3.8-2.7-3.8h-0.7' +
+ 'c-1.5,0-2.7,1.7-2.7,3.8v55.9c0,2.1,1.2,3.8,2.7,3.8h0.7c1.5,0,2.7' +
+ '-1.7,2.7-3.8V37.7z M58.5,37.7c0-2.1-1.8-3.8-4-3.8h-1c-2.2,0-4,' +
+ '1.7-4,3.8v55.9c0,2.1,1.8,3.8,4,3.8h1c2.2,0,4-1.7,4-3.8V37.7z M' +
+ '83.5,37.7c0-2.1-1.2-3.8-2.7-3.8h-0.7c-1.5,0-2.7,1.7-2.7,3.8v55.9' +
+ 'c0,2.1,1.2,3.8,2.7,3.8h0.7c1.5,0,2.7-1.7,2.7-3.8V37.7z',
+
+ loading: 'M103.1,53.1c0,0,0,0.2,0,0.5c0,0.2,0,0.4,0,0.7c0,0.3,0,0' +
+ '.6,0,0.9c-0.1,1.3-0.2,3-0.5,4.8c-0.5,3.4-1.6,6.8-1.6,6.8l-9.2-2.' +
+ '7c0,0,0.8-2.7,1.1-5.5c0.2-1.4,0.3-2.8,0.3-3.8c0-0.3,0-0.5,0-0.7c' +
+ '0-0.2,0-0.4,0-0.6c0-0.3,0-0.5,0-0.5L103.1,53.1z M87.3,74.3c0,0-0' +
+ '.1,0.2-0.3,0.5c-0.2,0.3-0.4,0.6-0.7,1.1c-0.6,0.9-1.4,2-2.3,3.1c-' +
+ '1.8,2.2-3.9,4.1-3.9,4.1l5.7,6.5c0,0,0.7-0.5,1.6-1.4c1-0.9,2.2-2.' +
+ '1,3.3-3.4c1.1-1.3,2.2-2.6,3-3.7c0.4-0.5,0.7-1,0.9-1.3c0.2-0.3,0.' +
+ '3-0.4,0.3-0.4L87.3,74.3z M70.8,89.2c0,0-0.2,0.1-0.5,0.2c-0.3,0.2' +
+ '-0.6,0.3-1.2,0.5c-1,0.4-2.3,0.9-3.7,1.4c-2.7,0.9-5.5,1.3-5.5,1.3' +
+ 'l1.1,7.6c0,0,0.8-0.1,2.1-0.3c1.3-0.2,2.9-0.6,4.6-1c1.6-0.5,3.3-1' +
+ ',4.5-1.5c0.6-0.2,1.2-0.5,1.5-0.6c0.3-0.1,0.5-0.2,0.5-0.2L70.8,89' +
+ '.2z M48.6,92.9c0,0-0.2,0-0.5-0.1c-0.4,0-0.7-0.1-1.3-0.2c-1.1-0.2' +
+ '-2.5-0.5-3.9-0.8c-2.8-0.7-5.4-1.9-5.4-1.9L34.6,96c0,0,3,1.5,6.3,' +
+ '2.5c1.6,0.5,3.3,0.9,4.5,1.2c0.6,0.1,1.2,0.2,1.5,0.3c0.3,0.1,0.5,' +
+ '0.1,0.5,0.1L48.6,92.9z M27.6,83.8c0,0-0.1-0.1-0.4-0.3c-0.3-0.2-0' +
+ '.6-0.5-1-0.9c-0.8-0.7-1.8-1.8-2.8-2.8c-2-2.2-3.6-4.6-3.6-4.6l-5,' +
+ '3.2c0,0,0.4,0.7,1.1,1.7c0.7,1,1.7,2.4,2.8,3.7c1.1,1.3,2.2,2.5,3.' +
+ '1,3.4c0.4,0.4,0.9,0.8,1.1,1.1c0.3,0.2,0.4,0.4,0.4,0.4L27.6,83.8z' +
+ 'M14.8,64.7c0,0-0.1-0.2-0.2-0.5c-0.1-0.3-0.2-0.7-0.4-1.3c-0.3-1.1' +
+ '-0.6-2.5-0.8-4c-0.5-2.9-0.5-5.9-0.5-5.9l-5,0c0,0,0,0.8,0,2.1c0,1' +
+ '.2,0.1,2.9,0.3,4.5c0.2,1.6,0.5,3.3,0.8,4.5c0.1,0.6,0.3,1.2,0.4,1' +
+ '.5c0.1,0.3,0.1,0.5,0.1,0.5L14.8,64.7z M14.3,41.4c0,0,0.1-0.2,0.1' +
+ '-0.5c0.1-0.3,0.2-0.7,0.4-1.3c0.3-1.1,0.8-2.5,1.4-3.8c1.2-2.7,2.8' +
+ '-5.3,2.8-5.3l-3.4-2.2c0,0-1.8,2.7-3.2,5.7c-0.7,1.5-1.3,3-1.7,4.2' +
+ 'c-0.2,0.6-0.4,1.1-0.5,1.4C10,39.9,10,40.1,10,40.1L14.3,41.4z M26' +
+ '.7,21.3c0,0,0.1-0.1,0.4-0.4c0.3-0.2,0.6-0.5,1-0.9c0.9-0.7,2.1-1.' +
+ '6,3.3-2.5c1.2-0.8,2.5-1.6,3.5-2.1c1-0.5,1.7-0.9,1.7-0.9l-1.3-2.9' +
+ 'c0,0-0.7,0.3-1.8,0.9c-1.1,0.5-2.5,1.3-3.9,2.2c-1.4,0.9-2.7,1.8-3' +
+ '.7,2.5c-0.5,0.4-0.9,0.7-1.2,0.9c-0.3,0.2-0.4,0.3-0.4,0.3L26.7,21' +
+ '.3z M48.2,11c0,0,0.2,0,0.5-0.1c0.3,0,0.8-0.1,1.4-0.2c1.1-0.1,2.6' +
+ '-0.3,4.2-0.3c3-0.1,6.1,0.3,6.1,0.3l0.3-2.3c0,0-0.8-0.1-2-0.3C57.' +
+ '4,8.1,55.8,8,54.2,8c-1.6,0-3.2,0-4.4,0.1c-0.6,0-1.1,0.1-1.5,0.1c' +
+ '-0.3,0-0.5,0.1-0.5,0.1L48.2,11z M72,14c0,0,0.7,0.3,1.7,0.8c1,0.5' +
+ ',2.4,1.2,3.7,2c2.6,1.6,5,3.6,5,3.6l0.9-1c0,0-2.4-2.1-5-3.9c-1.3-' +
+ '0.9-2.7-1.7-3.8-2.3c-1.1-0.6-1.8-0.9-1.8-0.9L72,14zM90.7,29.6c0,' +
+ '0,0.4,0.6,1,1.6c0.6,1,1.4,2.3,2,3.7c0.7,1.4,1.3,2.8,1.7,3.9c0.4,' +
+ '1.1,0.6,1.8,0.6,1.8l0.4-0.1c0,0-0.2-0.8-0.6-1.9c-0.4-1.1-0.9-2.6' +
+ '-1.5-4c-0.6-1.4-1.3-2.9-1.9-3.9c-0.6-1-1-1.7-1-1.7L90.7,29.6z',
+
+ // --- Navigation glyphs ------------------------------------
+
+ flowTable: 'M15.9,19.1h-8v-13h8V19.1z M90.5,6.1H75.6v13h14.9V6.1z' +
+ ' M71.9,6.1H56.9v13h14.9V6.1z M53.2,6.1H38.3v13h14.9V6.1z M34.5,' +
+ '6.1H19.6v13h14.9V6.1z M102.2,6.1h-8v13h8V6.1z M102.2,23.6H7.9v' +
+ '78.5h94.4V23.6z M86,63.2c0,3.3-2.7,6-6,6c-2.8,0-5.1-1.9-5.8-' +
+ '4.5H63.3v5.1c0,0.9-0.7,1.5-1.5,1.5h-5.2v10.6c2.6,0.7,4.5,3,4.5,' +
+ '5.8c0,3.3-2.7,6-6,6c-3.3,0-6-2.7-6-6c0-2.8,1.9-5.1,4.4-5.8V71.3' +
+ 'H48c-0.9,0-1.5-0.7-1.5-1.5v-5.1H36c-0.7,2.6-3,4.4-5.8,4.4c-3.3,' +
+ '0-6-2.7-6-6s2.7-6,6-6c2.8,0,5.2,1.9,5.8,4.5h10.5V56c0-0.9,0.7-' +
+ '1.5,1.5-1.5h5.5V43.8c-2.6-0.7-4.5-3-4.5-5.8c0-3.3,2.7-6,6-6s6,' +
+ '2.7,6,6c0,2.8-1.9,5.1-4.5,5.8v10.6h5.2c0.9,0,1.5,0.7,1.5,1.5v' +
+ '5.6h10.8c0.7-2.6,3-4.5,5.8-4.5C83.3,57.1,86,59.8,86,63.2z M55.1,' +
+ '42.3c2.3,0,4.3-1.9,4.3-4.3c0-2.3-1.9-4.3-4.3-4.3s-4.3,1.9-4.3,' +
+ '4.3C50.8,40.4,52.7,42.3,55.1,42.3z M34.4,63.1c0-2.3-1.9-4.3-4.3' +
+ '-4.3s-4.3,1.9-4.3,4.3s1.9,4.3,4.3,4.3S34.4,65.5,34.4,63.1z ' +
+ 'M55.1,83.5c-2.3,0-4.3,1.9-4.3,4.3s1.9,4.3,4.3,4.3s4.3-1.9,4.3-' +
+ '4.3S57.5,83.5,55.1,83.5zM84.2,63.2c0-2.3-1.9-4.3-4.3-4.3s-4.3,' +
+ '1.9-4.3,4.3s1.9,4.3,4.3,4.3S84.2,65.5,84.2,63.2z',
+
+ portTable: 'M15.9,19.1h-8v-13h8V19.1z M90.5,6.1H75.6v13h14.9V6.1' +
+ 'z M71.9,6.1H56.9v13h14.9V6.1z M53.2,6.1H38.3v13h14.9V6.1z M34.5,' +
+ '6.1H19.6v13h14.9V6.1z M102.2,6.1h-8v13h8V6.1z M102.6,23.6v78.5H' +
+ '8.2V23.6H102.6z M85.5,37.7c0-0.7-0.4-1.3-0.9-1.3H26.2c-0.5,0-' +
+ '0.9,0.6-0.9,1.3v34.6c0,0.7,0.4,1.3,0.9,1.3h11v9.6c0,1.1,0.5,2,' +
+ '1.2,2h9.1c0,0.2,0,0.3,0,0.5v3c0,1.1,0.5,2,1.2,2h13.5c0.6,0,1.2-' +
+ '0.9,1.2-2v-3c0-0.2,0-0.3,0-0.5h9.1c0.6,0,1.2-0.9,1.2-2v-9.6h11' +
+ 'c0.5,0,0.9-0.6,0.9-1.3V37.7z M30.2,40h-1v8h1V40zM75.2,40h-2.1v8' +
+ 'h2.1V40z M67.7,40h-2.1v8h2.1V40z M60.2,40h-2.1v8h2.1V40z M52.7,' +
+ '40h-2.1v8h2.1V40z M45.2,40h-2.1v8h2.1V40zM37.7,40h-2.1v8h2.1V40' +
+ 'z M81.6,40h-1v8h1V40z',
+
+ groupTable: 'M16,19.1H8v-13h8V19.1z M90.6,6.1H75.7v13h14.9V6.1z ' +
+ 'M71.9,6.1H57v13h14.9V6.1z M53.3,6.1H38.4v13h14.9V6.1z M34.6,6.1' +
+ 'H19.7v13h14.9V6.1z M102.3,6.1h-8v13h8V6.1z M45.7,52.7c0.2-5.6,' +
+ '2.6-10.7,6.2-14.4c-2.6-1.5-5.7-2.5-8.9-2.5c-9.8,0-17.7,7.9-17.7,' +
+ '17.7c0,6.3,3.3,11.9,8.3,15C34.8,61.5,39.4,55.6,45.7,52.7z M51.9,' +
+ '68.8c-3.1-3.1-5.2-7.2-6-11.7c-4.7,2.8-7.9,7.6-8.6,13.2c1.8,0.6,' +
+ '3.6,0.9,5.6,0.9C46.2,71.2,49.3,70.3,51.9,68.8z M55.2,71.5c-3.5,' +
+ '2.4-7.7,3.7-12.2,3.7c-1.9,0-3.8-0.3-5.6-0.7C38.5,83.2,45.9,90,' +
+ '54.9,90c9,0,16.4-6.7,17.5-15.4c-1.6,0.4-3.4,0.6-5.1,0.6C62.8,' +
+ '75.2,58.6,73.8,55.2,71.5z M54.9,50.6c1.9,0,3.8,0.3,5.6,0.7c-0.5' +
+ '-4.1-2.5-7.9-5.4-10.6c-2.9,2.7-4.8,6.4-5.3,10.5C51.5,50.8,53.2,' +
+ '50.6,54.9,50.6z M49.7,55.4c0.5,4.3,2.4,8.1,5.4,10.9c2.9-2.8,4.9' +
+ '-6.6,5.4-10.8c-1.8-0.6-3.6-0.9-5.6-0.9C53.1,54.6,51.4,54.9,49.7,' +
+ '55.4z M102.3,23.6v78.5H8V23.6H102.3z M89,53.5c0-12-9.7-21.7-' +
+ '21.7-21.7c-4.5,0-8.7,1.4-12.2,3.7c-3.5-2.4-7.7-3.7-12.2-3.7c-12,' +
+ '0-21.7,9.7-21.7,21.7c0,8.5,4.9,15.9,12,19.4C33.6,84.6,43.2,94,' +
+ '54.9,94c11.7,0,21.2-9.3,21.7-20.9C84,69.7,89,62.2,89,53.5z M' +
+ '64.3,57.3c-0.8,4.4-2.9,8.4-5.9,11.5c2.6,1.5,5.7,2.5,8.9,2.5c1.8,' +
+ '0,3.6-0.3,5.2-0.8C72,64.9,68.8,60.1,64.3,57.3z M67.3,35.8c-3.3,0' +
+ '-6.3,0.9-8.9,2.5c3.7,3.8,6.1,8.9,6.2,14.6c6.1,3.1,10.6,8.9,11.7,' +
+ '15.8C81.5,65.6,85,60,85,53.5C85,43.8,77.1,35.8,67.3,35.8z',
+
+ // --- Topology toolbar specific glyphs ----------------------
+
+ summary: "M95.8,9.2H14.2c-2.8,0-5,2.2-5,5v81.5c0,2.8,2.2,5,5," +
+ "5h81.5c2.8,0,5-2.2,5-5V14.2C100.8,11.5,98.5,9.2,95.8,9.2z " +
+ "M16.7,22.2c0-1.1,0.9-2,2-2h20.1c1.1,0,2,0.9,2,2v20.1c0,1.1-0.9," +
+ "2-2,2H18.7c-1.1,0-2-0.9-2-2V22.2z M93,87c0,1.1-0.9,2-2,2H18.9" +
+ "c-1.1,0-2-0.9-2-2v-7c0-1.1,0.9-2,2-2H91c1.1,0,2,0.9,2,2V87z " +
+ "M93,65c0,1.1-0.9,2-2,2H18.9c-1.1,0-2-0.9-2-2v-7c0-1.1,0.9-2," +
+ "2-2H91c1.1,0,2,0.9,2,2V65z",
+
+ details: "M95.8,9.2H14.2c-2.8,0-5,2.2-5,5v81.5c0,2.8,2.2,5,5," +
+ "5h81.5c2.8,0,5-2.2,5-5V14.2C100.8,11.5,98.5,9.2,95.8,9.2z M16.9," +
+ "22.2c0-1.1,0.9-2,2-2H91c1.1,0,2,0.9,2,2v7c0,1.1-0.9,2-2,2H18.9c" +
+ "-1.1,0-2-0.9-2-2V22.2z M93,87.8c0,1.1-0.9,2-2,2H18.9c-1.1," +
+ "0-2-0.9-2-2v-7c0-1.1,0.9-2,2-2H91c1.1,0,2,0.9,2,2V87.8z M93,68.2" +
+ "c0,1.1-0.9,2-2,2H18.9c-1.1,0-2-0.9-2-2v-7c0-1.1,0.9-2,2-2H91" +
+ "c1.1,0,2,0.9,2,2V68.2z M93,48.8c0,1.1-0.9,2-2,2H19c-1.1,0-2-" +
+ "0.9-2-2v-7c0-1.1,0.9-2,2-2H91c1.1,0,2,0.9,2,2V48.8z",
+
+ ports: "M98,9.2H79.6c-1.1,0-2.1,0.9-2.1,2.1v17.6l-5.4,5.4c-1.7" +
+ "-1.1-3.8-1.8-6-1.8c-6,0-10.9,4.9-10.9,10.9c0,2.2,0.7,4.3,1.8,6" +
+ "l-7.5,7.5c-1.8-1.2-3.9-1.9-6.2-1.9c-6,0-10.9,4.9-10.9,10.9c0," +
+ "2.3,0.7,4.4,1.9,6.2l-6.2,6.2H11.3c-1.1,0-2.1,0.9-2.1,2.1v18.4" +
+ "c0,1.1,0.9,2.1,2.1,2.1h18.4c1.1,0,2.1-0.9,2.1-2.1v-16l7-6.9" +
+ "c1.4,0.7,3,1.1,4.7,1.1c6,0,10.9-4.9,10.9-10.9c0-1.7-0.4-3.3-" +
+ "1.1-4.7l8-8c1.5,0.7,3.1,1.1,4.8,1.1c6,0,10.9-4.9,10.9-10.9c0" +
+ "-1.7-0.4-3.4-1.1-4.8l6.9-6.9H98c1.1,0,2.1-0.9,2.1-2.1V11.3" +
+ "C100.1,10.2,99.2,9.2,98,9.2z M43.4,72c-3.3,0-6-2.7-6-6s2.7-6," +
+ "6-6s6,2.7,6,6S46.7,72,43.4,72z M66.1,49.5c-3.3,0-6-2.7-6-6" +
+ "c0-3.3,2.7-6,6-6s6,2.7,6,6C72.2,46.8,69.5,49.5,66.1,49.5z",
+
+ map: "M95.8,9.2H14.2c-2.8,0-5,2.2-5,5v66c0.3-1.4,0.7-2.8," +
+ "1.1-4.1l1.6,0.5c-0.9,2.4-1.6,4.8-2.2,7.3l-0.5-0.1v12c0,2.8,2.2," +
+ "5,5,5h81.5c2.8,0,5-2.2,5-5V14.2C100.8,11.5,98.5,9.2,95.8,9.2z " +
+ "M16.5,67.5c-0.4,0.5-0.7,1-1,1.5c-0.3,0.5-0.6,1-0.9,1.6l-1.9-0.9" +
+ "c0.3-0.6,0.6-1.2,0.9-1.8c0.3-0.6,0.6-1.2,1-1.7c0.7-1.1,1.5-2.2," +
+ "2.5-3.2l1.8,1.8C18,65.6,17.2,66.5,16.5,67.5z M29.7,64.1" +
+ "c-0.4-0.4-0.8-0.8-1.2-1.1c-0.1-0.1-0.2-0.1-0.2-0.1c0,0-0.1," +
+ "0-0.1-0.1l-0.1,0l0,0l-0.1,0c-0.3-0.1-0.5-0.2-0.8-0.2c-0.5-0.1" +
+ "-1.1-0.2-1.6-0.3c-0.6,0-1.1,0-1.6,0l-0.4-2.8c0.7-0.1,1.5-0.2,2.2" +
+ "-0.1c0.7,0,1.4,0.1,2.2,0.3c0.4,0.1,0.7,0.2,1,0.3l0.1,0l0,0l0.1," +
+ "0l0.1,0c0.1,0,0.1,0,0.3,0.1c0.3,0.1,0.5,0.2,0.7,0.4c0.7,0.5," +
+ "1.2,0.9,1.7,1.4L29.7,64.1z M39.4,74.7c-1.8-1.8-3.6-3.8-5.3-5.7" +
+ "l2.6-2.4c0.9,0.9,1.8,1.8,2.7,2.7c0.9,0.9,1.8,1.7,2.7,2.6L39.4," +
+ "74.7z M50.8,84.2c-1.1-0.7-2.2-1.5-3.3-2.3c-0.5-0.4-1.1-0.8-1.6" +
+ "-1.2c-0.5-0.4-1-0.8-1.5-1.2l2.7-3.4c0.5,0.4,1,0.8,1.5,1.1c0.5," +
+ "0.3,1,0.7,1.5,1c1,0.7,2.1,1.3,3.1,1.9L50.8,84.2z M61.3," +
+ "88.7c-0.7-0.1-1.4-0.3-2.1-0.5c-0.7-0.2-1.4-0.5-2-0.7l1.8" +
+ "-4.8c0.6,0.2,1.1,0.4,1.6,0.5c0.5,0.2,1.1,0.3,1.6,0.4c1,0.2,2.1," +
+ "0.2,3,0.1l0.7,5.1C64.3,89.1,62.7,88.9,61.3,88.7z M75.1,80.4c" +
+ "-0.2,0.7-0.5,1.4-0.9,2c-0.2,0.3-0.3,0.7-0.5,1l-0.3,0.5l-0.3," +
+ "0.4l-3.9-2.8l0.3-0.4l0.2-0.3c0.1-0.2,0.3-0.4,0.4-0.7c0.3-0.5," +
+ "0.5-0.9,0.7-1.5c0.4-1,0.8-2.1,1.1-3.3l4.2,0.9C75.9,77.7,75.6," +
+ "79,75.1,80.4z M73,69.2l0.2-1.9l0.1-1.9c0.1-1.2,0.1-2.5,0.1-" +
+ "3.8l2.5-0.2c0.2,1.3,0.4,2.6,0.5,3.9l0.1,2l0.1,2L73,69.2z " +
+ "M73,51l0.5-0.1c0.4,1.3,0.8,2.6,1.1,3.9L73.2,55C73.1,53.7,73.1," +
+ "52.3,73,51z M91.9,20.4c-0.7,1.4-3.6,3.6-4.2,3.9c-1.5,0.8-5," +
+ "2.8-10.1,7.7c3,2.9,5.8,5.4,7.3,6.4c2.6,1.8,3.4,4.3,3.6,6.1c0.1," +
+ "1.1-0.1,2.5-0.4,3c-0.5,0.9-1.6,2-3,1.4c-2-0.8-11.5-9.6-13-11c" +
+ "-3.5,3.9-7.4,8.9-11.7,15.1c0,0-3.1,3.4-5.2,0.9C52.9,51.5,61," +
+ "39.3,61,39.3s2.2-3.1,5.6-7c-2.9-3-5.9-6.3-6.6-7.3c0,0-3.7-5-1.3" +
+ "-6.6c3.2-2.1,6.3,0.8,6.3,0.8s3.1,3.3,7,7.2c4.7-4.7,10.1-9.2," +
+ "14.7-10c0,0,3.3-1,5.2,1.7C92.5,18.8,92.4,19.6,91.9,20.4z",
+
+ cycleLabels: "M72.5,33.9c0,0.6-0.2,1-0.5,1H40c-0.3,0-0.5-0.4" +
+ "-0.5-1V20.7c0-0.6,0.2-1,0.5-1h32c0.3,0,0.5,0.4,0.5,1V33.9z " +
+ "M41.2,61.8c0-0.6-0.2-1-0.5-1h-32c-0.3,0-0.5,0.4-0.5,1V75c0,0.6," +
+ "0.2,1,0.5,1h32c0.3,0,0.5-0.4,0.5-1V61.8z M101.8,61.8c0-0.6-0.2" +
+ "-1-0.5-1h-32c-0.3,0-0.5,0.4-0.5,1V75c0,0.6,0.2,1,0.5,1h32c0.3," +
+ "0,0.5-0.4,0.5-1V61.8z M17.2,52.9c0-0.1-0.3-7.1,4.6-13.6l-2.4-1.8" +
+ "c-5.4,7.3-5.2,15.2-5.1,15.5L17.2,52.9z M12.7,36.8l7.4,2.5l1.5," +
+ "7.6L29.5,31L12.7,36.8z M94.2,42.3c-2.1-8.9-8.3-13.7-8.6-13.9l" +
+ "-1.8,2.4c0.1,0,5.6,4.3,7.5,12.2L94.2,42.3z M99,37.8l-6.6,4.1l" +
+ "-6.8-3.7l7.1,16.2L99,37.8z M69,90.2l-1.2-2.8c-0.1,0-6.6,2.8" +
+ "-14.3,0.6l-0.8,2.9c2.5,0.7,4.9,1,7,1C65,91.8,68.7,90.2,69,90.2z " +
+ "M54.3,97.3L54,89.5l6.6-4.1l-17.6-1.7L54.3,97.3z",
+
+ oblique: "M80.9,30.2h4.3l15-16.9H24.8l-15,16.9h19v48.5h-4l-15," +
+ "16.9h75.3l15-16.9H80.9V30.2z M78.6,78.7H56.1V30.2h22.5V78.7z" +
+ "M79.7,17.4c2.4,0,4.3,1.9,4.3,4.3c0,2.4-1.9,4.3-4.3,4.3s-4.3" +
+ "-1.9-4.3-4.3C75.4,19.3,77.4,17.4,79.7,17.4z M55,17.4c2.4,0," +
+ "4.3,1.9,4.3,4.3c0,2.4-1.9,4.3-4.3,4.3s-4.3-1.9-4.3-4.3C50.7," +
+ "19.3,52.6,17.4,55,17.4z M26.1,21.7c0-2.4,1.9-4.3,4.3-4.3c2.4," +
+ "0,4.3,1.9,4.3,4.3c0,2.4-1.9,4.3-4.3,4.3C28,26,26.1,24.1,26.1," +
+ "21.7z M31.1,30.2h22.6v48.5H31.1V30.2z M30.3,91.4c-2.4,0-4.3" +
+ "-1.9-4.3-4.3c0-2.4,1.9-4.3,4.3-4.3c2.4,0,4.3,1.9,4.3,4.3C34.6," +
+ "89.5,32.7,91.4,30.3,91.4z M54.9,91.4c-2.4,0-4.3-1.9-4.3-4.3c0" +
+ "-2.4,1.9-4.3,4.3-4.3c2.4,0,4.3,1.9,4.3,4.3C59.2,89.5,57.3," +
+ "91.4,54.9,91.4z M84,87.1c0,2.4-1.9,4.3-4.3,4.3c-2.4,0-4.3-1.9" +
+ "-4.3-4.3c0-2.4,1.9-4.3,4.3-4.3C82.1,82.8,84,84.7,84,87.1z",
+
+ filters: "M24.8,13.3L9.8,40.5h75.3l15.0-27.2H24.8z M72.8,32.1l-" +
+ "9.7-8.9l-19.3,8.9l-6.0-7.4L24.1,30.9l-1.2-2.7l15.7-7.1l6.0,7.4" +
+ "l19.0-8.8l9.7,8.8l11.5-5.6l1.3,2.7L72.8,32.1zM24.3,68.3L9.3," +
+ "95.5h75.3l15.0-27.2H24.3z M84.3,85.9L70.7,79.8l-6.0,7.4l-19.3" +
+ "-8.9l-9.7,8.9l-13.3-6.5l1.3-2.7l11.5,5.6l9.7-8.8l19.0,8.8l6.0" +
+ "-7.4l15.7,7.1L84.3,85.9z M15.3,57h-6v-4h6V57zM88.1,57H76.0v-4h" +
+ "12.1V57z M69.9,57H57.8v-4h12.1V57z M51.7,57H39.6v-4H51.7V57z " +
+ "M33.5,57H21.4v-4h12.1V57zM100.2,57h-6v-4h6V57z",
+
+ resetZoom: "M86,79.8L61.7,54.3c1.8-2.9,2.8-6.3,2.9-10c0.3-11.2" +
+ "-8.6-20.5-19.8-20.8C33.7,23.2,24.3,32,24.1,43.2c-0.3,11.2,8.6," +
+ "20.5,19.8,20.8c4,0.1,8.9-0.8,11.9-3.6l23.7,25c1.5,1.6,4,2.3," +
+ "5.3,1l1.6-1.6C87.7,83.7,87.5,81.4,86,79.8z M31.4,43.4c0.2-7.1," +
+ "6.1-12.8,13.2-12.6C51.8,31,57.5,37,57.3,44.1c-0.2,7.1-6.1,12.8" +
+ "-13.2,12.6C36.9,56.5,31.3,50.6,31.4,43.4zM22.6,104H6V86.4c0" +
+ "-1.7,1.4-3.1,3.1-3.1s3.1,1.4,3.1,3.1v11.4h10.4c1.7,0,3.1,1.4," +
+ "3.1,3.1S24.3,104,22.6,104z M25.7,9.1c0,1.7-1.4,3.1-3.1,3.1" +
+ "H12.2v11.4c0,1.7-1.4,3.1-3.1,3.1S6,25.3,6,23.6V6h16.6C24.3,6," +
+ "25.7,7.4,25.7,9.1z M84.3,100.9c0-1.7,1.4-3.1,3.1-3.1h10.4V86.4" +
+ "c0-1.7,1.4-3.1,3.1-3.1s3.1,1.4,3.1,3.1V104H87.4C85.7,104,84.3," +
+ "102.6,84.3,100.9z M87.4,6H104v17.6c0,1.7-1.4,3.1-3.1,3.1s-3.1" +
+ "-1.4-3.1-3.1V12.2H87.4c-1.7,0-3.1-1.4-3.1-3.1S85.7,6,87.4,6z",
+
+ relatedIntents: "M99.9,43.7v22.6c0,1.9-1.5,3.4-3.4,3.4H73.9c" +
+ "-1.9,0-3.4-1.5-3.4-3.4V43.7c0-1.9,1.5-3.4,3.4-3.4h22.6C98.4," +
+ "40.3,99.9,41.8,99.9,43.7z M48.4,46.3l6.2,6.7h-4.6L38.5,38v9.7" +
+ "l4.7,5.3H10.1V57h33.2l-4.8,5.3v9.5L49.8,57h5.1v0l-6.5,7v11.5" +
+ "L64.1,55L48.4,34.4V46.3z",
+
+ nextIntent: "M88.1,55.7L34.6,13.1c0,0-1.6-0.5-2.1-0.2c-1.9,1.2" +
+ "-6.5,13.8-3.1,17.2c7,6.9,30.6,24.5,32.4,25.9c-1.8,1.4-25.4,19" +
+ "-32.4,25.9c-3.4,3.4,1.2,16,3.1,17.2c0.6,0.4,2.1-0.2,2.1-0.2" +
+ "s53.1-42.4,53.5-42.7C88.5,56,88.1,55.7,88.1,55.7z",
+
+ prevIntent: "M22.5,55.6L76,12.9c0,0,1.6-0.5,2.2-0.2c1.9,1.2," +
+ "6.5,13.8,3.1,17.2c-7,6.9-30.6,24.5-32.4,25.9c1.8,1.4,25.4,19," +
+ "32.4,25.9c3.4,3.4-1.2,16-3.1,17.2c-0.6,0.4-2.2-0.2-2.2-0.2" +
+ "S22.9,56.3,22.5,56C22.2,55.8,22.5,55.6,22.5,55.6z",
+
+ intentTraffic: "M14.7,71.5h-6v-33h6V71.5z M88.5,38.5H76.9v33" +
+ "h11.7V38.5z M70.1,38.5H58.4v33h11.7V38.5z M51.6,38.5H39.9v33" +
+ "h11.7V38.5z M33.1,38.5H21.5v33h11.7V38.5z M101.3,38.5h-6v33h6" +
+ "V38.5z",
+
+ allTraffic: "M15.7,64.5h-7v-19h7V64.5z M78.6,45.5H62.9v19h15.7" +
+ "V45.5z M47.1,45.5H31.4v19h15.7V45.5z M101.3,45.5h-7v19h7V45.5z" +
+ "M14.7,14.1h-6v19h6V14.1z M88.5,14.1H76.9v19h11.7V14.1z M70.1," +
+ "14.1H58.4v19h11.7V14.1z M51.6,14.1H39.9v19h11.7V14.1z M33.1,14.1" +
+ "H21.5v19h11.7V14.1z M101.3,14.1h-6v19h6V14.1z M14.7,76.9h-6v19" +
+ "h6V76.9z M88.5,76.9H76.9v19h11.7V76.9z M70.1,76.9H58.4v19h11.7" +
+ "V76.9z M51.6,76.9H39.9v19h11.7V76.9z M33.1,76.9H21.5v19h11.7" +
+ "V76.9z M101.3,76.9h-6v19h6V76.9z",
+
+ flows: "M93.8,46.1c-4.3,0-8,3-9,7H67.9v-8.8c0-1.3-1.1-2.4-2.4" +
+ "-2.4h-8.1V25.3c4-1,7-4.7,7-9.1c0-5.2-4.2-9.4-9.4-9.4c-5.2,0" +
+ "-9.4,4.2-9.4,9.4c0,4.3,3,8,7,9v16.5H44c-1.3,0-2.4,1.1-2.4,2.4" +
+ "v8.8H25.3c-1-4.1-4.7-7.1-9.1-7.1c-5.2,0-9.4,4.2-9.4,9.4s4.2," +
+ "9.4,9.4,9.4c4.3,0,8-2.9,9-6.9h16.4v7.9c0,1.3,1.1,2.4,2.4,2.4" +
+ "h8.6v16.6c-4,1.1-6.9,4.7-6.9,9c0,5.2,4.2,9.4,9.4,9.4c5.2,0," +
+ "9.4-4.2,9.4-9.4c0-4.4-3-8-7.1-9.1V68.2h8.1c1.3,0,2.4-1.1,2.4" +
+ "-2.4v-7.9h16.8c1.1,4,4.7,7,9,7c5.2,0,9.4-4.2,9.4-9.4S99,46.1," +
+ "93.8,46.1z M48.7,16.3c0-3.5,2.9-6.4,6.4-6.4c3.5,0,6.4,2.9,6.4," +
+ "6.4s-2.9,6.4-6.4,6.4C51.5,22.6,48.7,19.8,48.7,16.3zM16.2,61.7c" +
+ "-3.5,0-6.4-2.9-6.4-6.4c0-3.5,2.9-6.4,6.4-6.4s6.4,2.9,6.4,6.4" +
+ "C22.6,58.9,19.7,61.7,16.2,61.7z M61.4,93.7c0,3.5-2.9,6.4-6.4," +
+ "6.4c-3.5,0-6.4-2.9-6.4-6.4c0-3.5,2.9-6.4,6.4-6.4C58.6,87.4," +
+ "61.4,90.2,61.4,93.7z M93.8,61.8c-3.5,0-6.4-2.9-6.4-6.4c0-3.5," +
+ "2.9-6.4,6.4-6.4s6.4,2.9,6.4,6.4C100.1,58.9,97.3,61.8,93.8,61.8z",
+
+ eqMaster: "M100.1,46.9l-10.8-25h0.2c0.5,0,0.8-0.5,0.8-1.1v-3.2" +
+ "c0-0.6-0.4-1.1-0.8-1.1H59.2v-5.1c0-0.5-0.8-1-1.7-1h-5.1c-0.9,0" +
+ "-1.7,0.4-1.7,1v5.1l-30.2,0c-0.5,0-0.8,0.5-0.8,1.1v3.2c0,0.6," +
+ "0.4,1.1,0.8,1.1h0.1l-10.8,25C9,47.3,8.4,48,8.4,48.8v1.6l0,0h0" +
+ "v6.4c0,1.3,1.4,2.3,3.2,2.3h21.7c1.8,0,3.2-1,3.2-2.3v-8c0-0.9" +
+ "-0.7-1.6-1.7-2L22.9,21.9h27.9v59.6l-29,15.9c0,1.2,1.8,2.2,4.1," +
+ "2.2h58.3c2.3,0,4.1-1,4.1-2.2l-29-15.9V21.9h27.8L75.2,46.8c-1," +
+ "0.4-1.7,1.1-1.7,2v8c0,1.3,1.4,2.3,3.2,2.3h21.7c1.8,0,3.2-1,3.2" +
+ "-2.3v-8C101.6,48,101,47.3,100.1,46.9z M22,23.7l10.8,22.8H12.1" +
+ "L22,23.7z M97.9,46.5H77.2L88,23.7L97.9,46.5z"
+ },
+
+ badgeDataSet = {
+ _viewbox: "0 0 10 10",
+
+ uiAttached: "M2,2.5a.5,.5,0,0,1,.5-.5h5a.5,.5,0,0,1,.5,.5v3" +
+ "a.5,.5,0,0,1-.5,.5h-5a.5,.5,0,0,1-.5-.5zM2.5,2.8a.3,.3,0,0,1," +
+ ".3-.3h4.4a.3,.3,0,0,1,.3,.3v2.4a.3,.3,0,0,1-.3,.3h-4.4" +
+ "a.3,.3,0,0,1-.3-.3zM2,6.55h6l1,1.45h-8z",
+
+ checkMark: "M2.6,4.5c0,0,0.7-0.4,1.2,0.3l1.0," +
+ "1.8c0,0,2.7-5.4,2.8-5.7c0,0,0.5-0.9,1.4-0.1c0," +
+ "0,0.5,0.5,0,1.3S6.8,7.3,5.6,9.2c0,0-0.4," +
+ "0.5-1.2,0.1S2.2,5.4,2.2,5.4S2.2,4.7,2.6,4.5z",
+
+ xMark: "M9.0,7.2C8.2,6.9,7.4,6.1,6.7,5.2c0.4-0.5," +
+ "0.7-0.8,0.8-1.0C7.8,3.5,9.4,1.6,8.1,1.1" +
+ "C6.8,0.6,6.6,1.7,6.6,1.7C6.4,2.1,6.0,2.7,5.4," +
+ "3.4C4.9,2.5,4.5,1.9,4.5,1.9" +
+ "S3.8,0.2,2.9,0.7C1.9,1.1,2.3,2.3,2.3,2.3c0.3,1.1,0.8,2.1,1.4,2.9" +
+ "C2.5,6.4,1.3,7.4,1.3,7.4S0.8,7.8,0.8,8.1C0.9,8.3,0.9,9.6,2.4,9.1" +
+ "C3.1,8.8,4.1,7.9,5.1,7.0c1.3,1.3,2.5,1.9,2.5,1.9s0.5,0.5,1.4-0.2" +
+ "C9.8,7.9,9.0,7.2,9.0,7.2z",
+
+ triangleUp: "M0.5,6.2c0,0,3.8-3.8,4.2-4.2C5,1.7,5.3,2,5.3,2l4.3," +
+ "4.3c0,0,0.4,0.4-0.1,0.4c-1.7,0-8.2,0-8.8,0C0,6.6,0.5,6.2,0.5,6.2z",
+
+ triangleDown: "M9.5,4.2c0,0-3.8,3.8-4.2,4.2c-0.3,0.3-0.5,0-0.5," +
+ "0L0.5,4.2c0,0-0.4-0.4,0.1-0.4c1.7,0,8.2,0,8.8,0C10,3.8,9.5,4.2," +
+ "9.5,4.2z",
+
+ plus: "M4,2h2v2h2v2h-2v2h-2v-2h-2v-2h2z",
+
+ minus: "M2,4h6v2h-6z",
+
+ play: "M2.5,2l5.5,3l-5.5,3z",
+
+ stop: "M2.5,2.5h5v5h-5z"
+ },
+
+ spriteData = {
+ _cloud: '0 0 110 110',
+ cloud: "M37.6,79.5c-6.9,8.7-20.4,8.6-22.2-2.7" +
+ "M16.3,41.2c-0.8-13.9,19.4-19.2,23.5-7.8" +
+ "M38.9,30.9c5.1-9.4,15.1-8.5,16.9-1.3" +
+ "M54.4,32.9c4-12.9,14.8-9.6,18.6-3.8" +
+ "M95.8,58.5c10-4.1,11.7-17.8-0.9-19.8" +
+ "M18.1,76.4C5.6,80.3,3.8,66,13.8,61.5" +
+ "M16.2,62.4C2.1,58.4,3.5,36,16.8,36.6" +
+ "M93.6,74.7c10.2-2,10.7-14,5.8-18.3" +
+ "M71.1,79.3c11.2,7.6,24.6,6.4,22.1-11.7" +
+ "M36.4,76.8c3.4,13.3,35.4,11.6,36.1-1.4" +
+ "M70.4,31c11.8-10.4,26.2-5.2,24.7,10.1"
+ };
+
+ // ----------------------------------------------------------------------
+ // === Constants
+
+ var msgGS = 'GlyphService.',
+ rg = "registerGlyphs(): ",
+ rgs = "registerGlyphSet(): ";
+
+ // ----------------------------------------------------------------------
+
+ function warn(msg) {
+ $log.warn(msgGS + msg);
+ }
+
+ function addToMap(key, value, vbox, overwrite, dups) {
+ if (!overwrite && glyphs.get(key)) {
+ dups.push(key);
+ } else {
+ glyphs.set(key, {id: key, vb: vbox, d: value});
+ }
+ }
+
+ function reportDups(dups, which) {
+ var ok = (dups.length == 0),
+ msg = 'ID collision: ';
+
+ if (!ok) {
+ dups.forEach(function (id) {
+ warn(which + msg + '"' + id + '"');
+ });
+ }
+ return ok;
+ }
+
+ function reportMissVb(missing, which) {
+ var ok = (missing.length == 0),
+ msg = 'Missing viewbox property: ';
+
+ if (!ok) {
+ missing.forEach(function (vbk) {
+ warn(which + msg + '"' + vbk + '"');
+ });
+ }
+ return ok;
+ }
+
+ // ----------------------------------------------------------------------
+ // === API functions ===
+
+ function clear() {
+ // start with a fresh map
+ glyphs = d3.map();
+ }
+
+ function init() {
+ registerGlyphs(birdData);
+ registerGlyphSet(glyphDataSet);
+ registerGlyphSet(badgeDataSet);
+ registerGlyphs(spriteData);
+ }
+
+ function registerGlyphs(data, overwrite) {
+ var dups = [],
+ missvb = [];
+
+ angular.forEach(data, function (value, key) {
+ var vbk = '_' + key,
+ vb = data[vbk];
+
+ if (key[0] !== '_') {
+ if (!vb) {
+ missvb.push(vbk);
+ return;
+ }
+ addToMap(key, value, vb, overwrite, dups);
+ }
+ });
+ return reportDups(dups, rg) && reportMissVb(missvb, rg);
+ }
+
+ function registerGlyphSet(data, overwrite) {
+ var dups = [],
+ vb = data._viewbox;
+
+ if (!vb) {
+ warn(rgs + 'no "_viewbox" property found');
+ return false;
+ }
+
+ angular.forEach(data, function (value, key) {
+ if (key[0] !== '_') {
+ addToMap(key, value, vb, overwrite, dups);
+ }
+ });
+ return reportDups(dups, rgs);
+ }
+
+ function ids() {
+ return glyphs.keys();
+ }
+
+ function glyph(id) {
+ return glyphs.get(id);
+ }
+
+ // Note: defs should be a D3 selection of a single <defs> element
+ function loadDefs(defs, glyphIds, noClear) {
+ var list = fs.isA(glyphIds) || ids(),
+ clearCache = !noClear;
+
+ if (clearCache) {
+ // remove all existing content
+ defs.html(null);
+ }
+
+ // load up the requested glyphs
+ list.forEach(function (id) {
+ var g = glyph(id);
+ if (g) {
+ if (noClear) {
+ // quick exit if symbol is already present
+ if (defs.select('symbol#' + g.id).size() > 0) {
+ return;
+ }
+ }
+ defs.append('symbol')
+ .attr({ id: g.id, viewBox: g.vb })
+ .append('path').attr('d', g.d);
+ }
+ });
+ }
+
+ // trans can specify translation [x,y]
+ function addGlyph(elem, glyphId, size, overlay, trans) {
+ var sz = size || 40,
+ ovr = !!overlay,
+ xns = fs.isA(trans),
+ atr = {
+ width: sz,
+ height: sz,
+ 'class': 'glyph',
+ 'xlink:href': '#' + glyphId
+ };
+
+ if (xns) {
+ atr.transform = sus.translate(trans);
+ }
+ return elem.append('use').attr(atr).classed('overlay', ovr);
+ }
+
+ // ----------------------------------------------------------------------
+
+ angular.module('onosSvg')
+ .factory('GlyphService',
+ ['$log', 'FnService', 'SvgUtilService',
+
+ function (_$log_, _fs_, _sus_) {
+ $log = _$log_;
+ fs = _fs_;
+ sus = _sus_;
+
+ return {
+ clear: clear,
+ init: init,
+ registerGlyphs: registerGlyphs,
+ registerGlyphSet: registerGlyphSet,
+ ids: ids,
+ glyph: glyph,
+ loadDefs: loadDefs,
+ addGlyph: addGlyph
+ };
+ }]
+ )
+ .run(['$log', function ($log) {
+ $log.debug('Clearing glyph cache');
+ clear();
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/icon.css b/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/icon.css
new file mode 100644
index 00000000..6ade7c7e
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/icon.css
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Icon Service -- CSS file
+ */
+
+svg#IconLibDefs {
+ display: none;
+}
+
+svg .svgIcon {
+ fill-rule: evenodd;
+}
+
+svg.embeddedIcon g.icon {
+ fill: none;
+}
+
+svg.embeddedIcon g.icon rect {
+ stroke: none;
+ fill: none;
+}
+
+svg.embeddedIcon g.icon .glyph {
+ stroke: none;
+ fill: white;
+ fill-rule: evenodd;
+}
+
+
+/* Sortable table headers */
+.light div.tableColSort svg.embeddedIcon .icon .glyph {
+ fill: black;
+}
+.dark div.tableColSort svg.embeddedIcon .icon .glyph {
+ fill: #ccc;
+}
+
+
+/* color schemes for specific icon classes */
+
+svg.embeddedIcon .icon.appInactive .glyph {
+ fill: none;
+}
+
+.light svg.embeddedIcon .icon.active .glyph {
+ fill: green;
+}
+.dark svg.embeddedIcon .icon.active .glyph {
+ fill: #308C10;
+}
+
+
+.light table svg.embeddedIcon {
+ fill: #ccc;
+}
+.dark table svg.embeddedIcon {
+ fill: #222;
+}
+.light table svg.embeddedIcon .glyph {
+ fill: #333;
+}
+.dark table svg.embeddedIcon .glyph {
+ fill: #ccc;
+}
+
+.light svg.embeddedIcon .icon.active .glyph {
+ fill: green;
+}
+.light svg.embeddedIcon .icon.inactive .glyph {
+ fill: darkred;
+}
+.dark svg.embeddedIcon .icon.active .glyph {
+ fill: #308C10;
+}
+.dark svg.embeddedIcon .icon.inactive .glyph {
+ fill: #AD2D2D;
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/icon.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/icon.js
new file mode 100644
index 00000000..ba794313
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/icon.js
@@ -0,0 +1,265 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- SVG -- Icon Service
+ */
+(function () {
+ 'use strict';
+
+ var $log, fs, gs, sus;
+
+ var vboxSize = 50,
+ cornerSize = vboxSize / 10,
+ viewBox = '0 0 ' + vboxSize + ' ' + vboxSize;
+
+ // Maps icon ID to the glyph ID it uses.
+ // NOTE: icon ID maps to a CSS class for styling that icon
+ var glyphMapping = {
+ active: 'checkMark',
+ inactive: 'xMark',
+
+ plus: 'plus',
+ minus: 'minus',
+ play: 'play',
+ stop: 'stop',
+
+ refresh: 'refresh',
+ garbage: 'garbage',
+
+ upArrow: 'triangleUp',
+ downArrow: 'triangleDown',
+
+ loading: 'loading',
+
+ appInactive: 'unknown',
+
+ devIcon_SWITCH: 'switch',
+ devIcon_ROADM: 'roadm',
+ flowTable: 'flowTable',
+ portTable: 'portTable',
+ groupTable: 'groupTable',
+
+ hostIcon_endstation: 'endstation',
+ hostIcon_router: 'router',
+ hostIcon_bgpSpeaker: 'bgpSpeaker',
+
+ nav_apps: 'bird',
+ nav_settings: 'chain',
+ nav_cluster: 'node',
+ nav_topo: 'topo',
+ nav_devs: 'switch',
+ nav_links: 'ports',
+ nav_hosts: 'endstation',
+ nav_intents: 'relatedIntents'
+ };
+
+ function ensureIconLibDefs() {
+ var body = d3.select('body'),
+ svg = body.select('svg#IconLibDefs'),
+ defs;
+
+ if (svg.empty()) {
+ svg = body.append('svg').attr('id', 'IconLibDefs');
+ defs = svg.append('defs');
+ }
+ return svg.select('defs');
+ }
+
+ // div is a D3 selection of the <DIV> element into which icon should load
+ // glyphId identifies the glyph to use
+ // size is dimension of icon in pixels. Defaults to 20.
+ // installGlyph, if truthy, will cause the glyph to be added to
+ // well-known defs element. Defaults to false.
+ // svgClass is the CSS class used to identify the SVG layer.
+ // Defaults to 'embeddedIcon'.
+ function loadIcon(div, glyphId, size, installGlyph, svgClass) {
+ var dim = size || 20,
+ svgCls = svgClass || 'embeddedIcon',
+ gid = glyphId || 'unknown',
+ svg, g;
+
+ if (installGlyph) {
+ gs.loadDefs(ensureIconLibDefs(), [gid], true);
+ }
+
+ svg = div.append('svg').attr({
+ 'class': svgCls,
+ width: dim,
+ height: dim,
+ viewBox: viewBox
+ });
+
+ g = svg.append('g').attr({
+ 'class': 'icon'
+ });
+
+ g.append('rect').attr({
+ width: vboxSize,
+ height: vboxSize,
+ rx: cornerSize
+ });
+
+ g.append('use').attr({
+ width: vboxSize,
+ height: vboxSize,
+ 'class': 'glyph',
+ 'xlink:href': '#' + gid
+ });
+ }
+
+ // div is a D3 selection of the <DIV> element into which icon should load
+ // iconCls is the CSS class used to identify the icon
+ // size is dimension of icon in pixels. Defaults to 20.
+ // installGlyph, if truthy, will cause the glyph to be added to
+ // well-known defs element. Defaults to false.
+ // svgClass is the CSS class used to identify the SVG layer.
+ // Defaults to 'embeddedIcon'.
+ function loadIconByClass(div, iconCls, size, installGlyph, svgClass) {
+ loadIcon(div, glyphMapping[iconCls], size, installGlyph, svgClass);
+ div.select('svg g').classed(iconCls, true);
+ }
+
+ function loadEmbeddedIcon(div, iconCls, size) {
+ loadIconByClass(div, iconCls, size, true);
+ }
+
+
+ // configuration for device and host icons in the topology view
+ var config = {
+ device: {
+ dim: 36,
+ rx: 4
+ },
+ host: {
+ radius: {
+ noGlyph: 9,
+ withGlyph: 14
+ },
+ glyphed: {
+ endstation: 1,
+ bgpSpeaker: 1,
+ router: 1
+ }
+ }
+ };
+
+
+ // Adds a device icon to the specified element, using the given glyph.
+ // Returns the D3 selection of the icon.
+ function addDeviceIcon(elem, glyphId) {
+ var cfg = config.device,
+ g = elem.append('g')
+ .attr('class', 'svgIcon deviceIcon');
+
+ g.append('rect').attr({
+ x: 0,
+ y: 0,
+ rx: cfg.rx,
+ width: cfg.dim,
+ height: cfg.dim
+ });
+
+ g.append('use').attr({
+ 'xlink:href': '#' + glyphId,
+ width: cfg.dim,
+ height: cfg.dim
+ });
+
+ g.dim = cfg.dim;
+ return g;
+ }
+
+ function addHostIcon(elem, radius, glyphId) {
+ var dim = radius * 1.5,
+ xlate = -dim / 2,
+ g = elem.append('g')
+ .attr('class', 'svgIcon hostIcon');
+
+ g.append('circle').attr('r', radius);
+
+ g.append('use').attr({
+ 'xlink:href': '#' + glyphId,
+ width: dim,
+ height: dim,
+ transform: sus.translate(xlate,xlate)
+ });
+ return g;
+ }
+
+ function sortIcons() {
+ function sortAsc(div) {
+ div.style('display', 'inline-block');
+ loadEmbeddedIcon(div, 'upArrow', 10);
+ div.classed('tableColSort', true);
+ }
+
+ function sortDesc(div) {
+ div.style('display', 'inline-block');
+ loadEmbeddedIcon(div, 'downArrow', 10);
+ div.classed('tableColSort', true);
+ }
+
+ function sortNone(div) {
+ div.remove();
+ }
+
+ return {
+ sortAsc: sortAsc,
+ sortDesc: sortDesc,
+ sortNone: sortNone
+ };
+ }
+
+
+ // =========================
+ // === DEFINE THE MODULE
+
+ angular.module('onosSvg')
+ .directive('icon', ['IconService', function (is) {
+ return {
+ restrict: 'A',
+ link: function (scope, element, attrs) {
+ attrs.$observe('iconId', function () {
+ var div = d3.select(element[0]);
+ div.selectAll('*').remove();
+ is.loadEmbeddedIcon(div, attrs.iconId, attrs.iconSize);
+ });
+ }
+ };
+ }])
+
+ .factory('IconService', ['$log', 'FnService', 'GlyphService',
+ 'SvgUtilService',
+
+ function (_$log_, _fs_, _gs_, _sus_) {
+ $log = _$log_;
+ fs = _fs_;
+ gs = _gs_;
+ sus = _sus_;
+
+ return {
+ loadIcon: loadIcon,
+ loadIconByClass: loadIconByClass,
+ loadEmbeddedIcon: loadEmbeddedIcon,
+ addDeviceIcon: addDeviceIcon,
+ addHostIcon: addHostIcon,
+ iconConfig: function () { return config; },
+ sortIcons: sortIcons
+ };
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/map.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/map.js
new file mode 100644
index 00000000..f8d40f9c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/map.js
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- SVG -- Map Service
+ */
+
+/*
+ The Map Service provides a simple API for loading geographical maps into
+ an SVG layer. For example, as a background to the Topology View.
+
+ e.g. var promise = MapService.loadMapInto(svgLayer, '*continental-us');
+
+ The Map Service makes use of the GeoDataService to load the required data
+ from the server and to create the appropriate geographical projection.
+
+ A promise is returned to the caller, which is resolved with the
+ map projection once created.
+*/
+
+(function () {
+ 'use strict';
+
+ // injected references
+ var $log, $q, fs, gds;
+
+ // NOTE: This method assumes the datafile has exactly the map data
+ // that you want to load; for example id="*continental_us"
+ // mapping to ~/data/map/continental_us.topojson contains
+ // exactly the paths for the continental US.
+
+ function loadMapInto(mapLayer, id, opts) {
+ var promise = gds.fetchTopoData(id),
+ deferredProjection = $q.defer();
+
+ if (!promise) {
+ $log.warn('Failed to load map: ' + id);
+ return false;
+ }
+
+ promise.then(function () {
+ var gen = gds.createPathGenerator(promise.topodata, opts);
+
+ deferredProjection.resolve(gen.settings.projection);
+
+ mapLayer.selectAll('path')
+ .data(gen.geodata.features)
+ .enter()
+ .append('path')
+ .attr('d', gen.pathgen);
+ });
+ return deferredProjection.promise;
+ }
+
+ // ---
+
+ // NOTE: This method uses the countries.topojson data file, and then
+ // filters the results based on the supplied options.
+ // Usage:
+ // promise = loadMapRegionInto(svgGroup, {
+ // countryFilter: function (country) {
+ // return country.properties.continent === 'South America';
+ // }
+ // });
+
+ function loadMapRegionInto(mapLayer, filterOpts) {
+ var promise = gds.fetchTopoData("*countries"),
+ deferredProjection = $q.defer();
+
+ if (!promise) {
+ $log.warn('Failed to load countries TopoJSON data');
+ return false;
+ }
+
+ promise.then(function () {
+ var width = 1000,
+ height = 1000,
+ proj = d3.geo.mercator().translate([width/2, height/2]),
+ pathGen = d3.geo.path().projection(proj),
+ data = promise.topodata,
+ features = topojson.feature(data, data.objects.countries).features,
+ country = features.filter(filterOpts.countryFilter),
+ countryFeature = {
+ type: 'FeatureCollection',
+ features: country
+ },
+ path = d3.geo.path().projection(proj);
+
+ gds.rescaleProjection(proj, 0.95, 1000, path, countryFeature);
+
+ deferredProjection.resolve(proj);
+
+ mapLayer.selectAll('path.country')
+ .data([countryFeature])
+ .enter()
+ .append('path').classed('country', true)
+ .attr('d', pathGen);
+ });
+ return deferredProjection.promise;
+ }
+
+ angular.module('onosSvg')
+ .factory('MapService', ['$log', '$q', 'FnService', 'GeoDataService',
+ function (_$log_, _$q_, _fs_, _gds_) {
+ $log = _$log_;
+ $q = _$q_;
+ fs = _fs_;
+ gds = _gds_;
+
+ return {
+ loadMapRegionInto: loadMapRegionInto,
+ loadMapInto: loadMapInto
+ };
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/svg.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/svg.js
new file mode 100644
index 00000000..8fd441fe
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/svg.js
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Scalable Vector Graphics Module
+ */
+(function () {
+ 'use strict';
+
+ angular.module('onosSvg', ['onosUtil']);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/svgUtil.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/svgUtil.js
new file mode 100644
index 00000000..cb67ae83
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/svgUtil.js
@@ -0,0 +1,311 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- SVG -- Util Service
+ */
+
+/*
+ The SVG Util Service provides a miscellany of utility functions.
+ */
+
+(function () {
+ 'use strict';
+
+ // injected references
+ var $log, fs;
+
+ angular.module('onosSvg')
+ .factory('SvgUtilService', ['$log', 'FnService',
+ function (_$log_, _fs_) {
+ $log = _$log_;
+ fs = _fs_;
+
+ // TODO: change 'force' ref to be 'force.alpha' ref.
+ function createDragBehavior(force, selectCb, atDragEnd,
+ dragEnabled, clickEnabled) {
+ var draggedThreshold = d3.scale.linear()
+ .domain([0, 0.1])
+ .range([5, 20])
+ .clamp(true),
+ drag,
+ fSel = fs.isF(selectCb),
+ fEnd = fs.isF(atDragEnd),
+ fDEn = fs.isF(dragEnabled),
+ fCEn = fs.isF(clickEnabled),
+ bad = [];
+
+ function naf(what) {
+ return 'SvgUtilService: createDragBehavior(): ' + what +
+ ' is not a function';
+ }
+
+ if (!force) {
+ bad.push('SvgUtilService: createDragBehavior(): ' +
+ 'Bad force reference');
+ }
+ if (!fSel) {
+ bad.push(naf('selectCb'));
+ }
+ if (!fEnd) {
+ bad.push(naf('atDragEnd'));
+ }
+ if (!fDEn) {
+ bad.push(naf('dragEnabled'));
+ }
+ if (!fCEn) {
+ bad.push(naf('clickEnabled'));
+ }
+
+ if (bad.length) {
+ $log.error(bad.join('\n'));
+ return null;
+ }
+
+ function dragged(d) {
+ var threshold = draggedThreshold(force.alpha()),
+ dx = d.oldX - d.px,
+ dy = d.oldY - d.py;
+ if (Math.abs(dx) >= threshold || Math.abs(dy) >= threshold) {
+ d.dragged = true;
+ }
+ return d.dragged;
+ }
+
+ drag = d3.behavior.drag()
+ .origin(function(d) { return d; })
+ .on('dragstart', function(d) {
+ if (clickEnabled() || dragEnabled()) {
+ d3.event.sourceEvent.stopPropagation();
+
+ d.oldX = d.x;
+ d.oldY = d.y;
+ d.dragged = false;
+ d.fixed |= 2;
+ d.dragStarted = true;
+ }
+ })
+ .on('drag', function(d) {
+ if (dragEnabled()) {
+ d.px = d3.event.x;
+ d.py = d3.event.y;
+ if (dragged(d)) {
+ if (!force.alpha()) {
+ force.alpha(.025);
+ }
+ }
+ }
+ })
+ .on('dragend', function(d) {
+ if (d.dragStarted) {
+ d.dragStarted = false;
+ if (!dragged(d)) {
+ // consider this the same as a 'click'
+ // (selection of a node)
+ if (clickEnabled()) {
+ selectCb.call(this, d);
+ }
+ }
+ d.fixed &= ~6;
+
+ // hook at the end of a drag gesture
+ if (dragEnabled()) {
+ atDragEnd.call(this, d);
+ }
+ }
+ });
+
+ return drag;
+ }
+
+
+ function loadGlow(defs, r, g, b, id) {
+ var glow = defs.append('filter')
+ .attr('x', '-50%')
+ .attr('y', '-50%')
+ .attr('width', '200%')
+ .attr('height', '200%')
+ .attr('id', id);
+
+ glow.append('feColorMatrix')
+ .attr('type', 'matrix')
+ .attr('values',
+ '0 0 0 0 ' + r + ' ' +
+ '0 0 0 0 ' + g + ' ' +
+ '0 0 0 0 ' + b + ' ' +
+ '0 0 0 1 0 ');
+
+ glow.append('feGaussianBlur')
+ .attr('stdDeviation', 3)
+ .attr('result', 'coloredBlur');
+
+ glow.append('feMerge').selectAll('feMergeNode')
+ .data(['coloredBlur', 'SourceGraphic'])
+ .enter().append('feMergeNode')
+ .attr('in', String);
+ }
+
+ function loadGlowDefs(defs) {
+ loadGlow(defs, 0.0, 0.0, 0.7, 'blue-glow');
+ loadGlow(defs, 1.0, 1.0, 0.3, 'yellow-glow');
+ }
+
+ // --- Ordinal scales for 7 values.
+
+ // blue brown brick red sea green purple dark teal lime
+ var lightNorm = ['#3E5780', '#78533B', '#CB4D28', '#018D61', '#8A2979', '#006D73', '#56AF00'],
+ lightMute = ['#A8B8CC', '#CCB3A8', '#FFC2BD', '#96D6BF', '#D19FCE', '#8FCCCA', '#CAEAA4'],
+
+ darkNorm = ['#304860', '#664631', '#A8391B', '#00754B', '#77206D', '#005959', '#428700'],
+ darkMute = ['#304860', '#664631', '#A8391B', '#00754B', '#77206D', '#005959', '#428700'];
+
+ var colors= {
+ light: {
+ norm: d3.scale.ordinal().range(lightNorm),
+ mute: d3.scale.ordinal().range(lightMute)
+ },
+ dark: {
+ norm: d3.scale.ordinal().range(darkNorm),
+ mute: d3.scale.ordinal().range(darkMute)
+ }
+ };
+
+ function cat7() {
+ var tcid = 'd3utilTestCard';
+
+ function getColor(id, muted, theme) {
+ // NOTE: since we are lazily assigning domain ids, we need to
+ // get the color from all 4 scales, to keep the domains
+ // in sync.
+ var ln = colors.light.norm(id),
+ lm = colors.light.mute(id),
+ dn = colors.dark.norm(id),
+ dm = colors.dark.mute(id);
+ if (theme === 'dark') {
+ return muted ? dm : dn;
+ } else {
+ return muted ? lm : ln;
+ }
+ }
+
+ function testCard(svg) {
+ var g = svg.select('g#' + tcid),
+ dom = d3.range(7),
+ k, muted, theme, what;
+
+ if (!g.empty()) {
+ g.remove();
+
+ } else {
+ g = svg.append('g')
+ .attr('id', tcid)
+ .attr('transform', 'scale(4)translate(20,20)');
+
+ for (k=0; k<4; k++) {
+ muted = k%2;
+ what = muted ? ' muted' : ' normal';
+ theme = k < 2 ? 'light' : 'dark';
+ dom.forEach(function (id, i) {
+ var x = i * 20,
+ y = k * 20,
+ f = get(id, muted, theme);
+ g.append('circle').attr({
+ cx: x,
+ cy: y,
+ r: 5,
+ fill: f
+ });
+ });
+ g.append('rect').attr({
+ x: 140,
+ y: k * 20 - 5,
+ width: 32,
+ height: 10,
+ rx: 2,
+ fill: '#888'
+ });
+ g.append('text').text(theme + what)
+ .attr({
+ x: 142,
+ y: k * 20 + 2,
+ fill: 'white'
+ })
+ .style('font-size', '4pt');
+ }
+ }
+ }
+
+ return {
+ testCard: testCard,
+ getColor: getColor
+ };
+ }
+
+ function translate(x, y) {
+ if (fs.isA(x) && x.length === 2 && !y) {
+ return 'translate(' + x[0] + ',' + x[1] + ')';
+ }
+ return 'translate(' + x + ',' + y + ')';
+ }
+
+ function scale(x, y) {
+ return 'scale(' + x + ',' + y + ')';
+ }
+
+ function skewX(x) {
+ return 'skewX(' + x + ')';
+ }
+
+ function rotate(deg) {
+ return 'rotate(' + deg + ')';
+ }
+
+ function stripPx(s) {
+ return s.replace(/px$/,'');
+ }
+
+ function safeId(s) {
+ return s.replace(/[^a-z0-9]/gi, '-');
+ }
+
+ function makeVisible(el, b) {
+ el.style('visibility', (b ? 'visible' : 'hidden'));
+ }
+
+ function isVisible(el) {
+ return el.style('visibility') === 'visible';
+ }
+
+ return {
+ createDragBehavior: createDragBehavior,
+ loadGlowDefs: loadGlowDefs,
+ cat7: cat7,
+ translate: translate,
+ scale: scale,
+ skewX: skewX,
+ rotate: rotate,
+ stripPx: stripPx,
+ safeId: safeId,
+ visible: function (el, x) {
+ if (x === undefined) {
+ return isVisible(el);
+ } else {
+ makeVisible(el, x);
+ }
+ }
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/zoom.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/zoom.js
new file mode 100644
index 00000000..6acab794
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/zoom.js
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- SVG -- Zoom Service
+ */
+(function () {
+ 'use strict';
+
+ // configuration
+ var defaultSettings = {
+ zoomMin: 0.05,
+ zoomMax: 10,
+ zoomEnabled: function (ev) { return true; },
+ zoomCallback: function () {}
+ };
+
+ // injected references to services
+ var $log;
+
+ angular.module('onosSvg')
+ .factory('ZoomService', ['$log',
+
+ function (_$log_) {
+ $log = _$log_;
+
+/*
+ NOTE: opts is an object:
+ {
+ svg: svg, D3 selection of <svg> element
+ zoomLayer: zoomLayer, D3 selection of <g> element
+ zoomEnabled: function (ev) { ... },
+ zoomCallback: function () { ... }
+ }
+
+ where:
+ * svg and zoomLayer should be D3 selections of DOM elements.
+ * zoomLayer <g> is a child of <svg> element.
+ * zoomEnabled is an optional predicate based on D3 event.
+ * default is always enabled.
+ * zoomCallback is an optional callback invoked each time we pan/zoom.
+ * default is do nothing.
+
+ Optionally, zoomMin and zoomMax also can be defined.
+ These default to 0.25 and 10 respectively.
+*/
+ function createZoomer(opts) {
+ var cz = 'ZoomService.createZoomer(): ',
+ d3s = ' (D3 selection) property defined',
+ settings = angular.extend({}, defaultSettings, opts),
+ zoom = d3.behavior.zoom()
+ .translate([0, 0])
+ .scale(1)
+ .scaleExtent([settings.zoomMin, settings.zoomMax])
+ .on('zoom', zoomed),
+ fail = false,
+ zoomer;
+
+ if (!settings.svg) {
+ $log.error(cz + 'No "svg" (svg tag)' + d3s);
+ fail = true;
+ }
+ if (!settings.zoomLayer) {
+ $log.error(cz + 'No "zoomLayer" (g tag)' + d3s);
+ fail = true;
+ }
+
+ if (fail) {
+ return null;
+ }
+
+ // zoom events from mouse gestures...
+ function zoomed() {
+ var ev = d3.event.sourceEvent;
+ if (settings.zoomEnabled(ev)) {
+ adjustZoomLayer(d3.event.translate, d3.event.scale);
+ }
+ }
+
+ function adjustZoomLayer(translate, scale) {
+ settings.zoomLayer.attr('transform',
+ 'translate(' + translate + ')scale(' + scale + ')');
+ settings.zoomCallback();
+ }
+
+ zoomer = {
+ panZoom: function (translate, scale) {
+ zoom.translate(translate).scale(scale);
+ adjustZoomLayer(translate, scale);
+ },
+
+ reset: function () {
+ zoomer.panZoom([0,0], 1);
+ },
+
+ translate: function () {
+ return zoom.translate();
+ },
+
+ scale: function () {
+ return zoom.scale();
+ },
+
+ scaleExtent: function () {
+ return zoom.scaleExtent();
+ }
+ };
+
+ // apply the zoom behavior to the SVG element
+ settings.svg && settings.svg.call(zoom);
+ return zoomer;
+ }
+
+ return {
+ createZoomer: createZoomer
+ };
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/util/fn.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/util/fn.js
new file mode 100644
index 00000000..defb8458
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/util/fn.js
@@ -0,0 +1,292 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Util -- General Purpose Functions
+ */
+(function () {
+ 'use strict';
+
+ // injected services
+ var $window, $log;
+
+ // internal state
+ var debugFlags = {};
+
+
+ function _parseDebugFlags(dbgstr) {
+ var bits = dbgstr ? dbgstr.split(",") : [];
+ bits.forEach(function (key) {
+ debugFlags[key] = true;
+ });
+ $log.debug('Debug flags:', dbgstr);
+ }
+
+ function isF(f) {
+ return typeof f === 'function' ? f : null;
+ }
+
+ function isA(a) {
+ // NOTE: Array.isArray() is part of EMCAScript 5.1
+ return Array.isArray(a) ? a : null;
+ }
+
+ function isS(s) {
+ return typeof s === 'string' ? s : null;
+ }
+
+ function isO(o) {
+ return (o && typeof o === 'object' && o.constructor === Object) ? o : null;
+ }
+
+ function contains(a, x) {
+ return isA(a) && a.indexOf(x) > -1;
+ }
+
+ // Returns true if all names in the array are defined as functions
+ // on the given api object; false otherwise.
+ // Also returns false if there are properties on the api that are NOT
+ // listed in the array of names.
+ function areFunctions(api, fnNames) {
+ var fnLookup = {},
+ extraFound = false;
+
+ if (!isA(fnNames)) {
+ return false;
+ }
+ var n = fnNames.length,
+ i, name;
+ for (i=0; i<n; i++) {
+ name = fnNames[i];
+ if (!isF(api[name])) {
+ return false;
+ }
+ fnLookup[name] = true;
+ }
+
+ // check for properties on the API that are not listed in the array,
+ angular.forEach(api, function (value, key) {
+ if (!fnLookup[key]) {
+ extraFound = true;
+ }
+ });
+ return !extraFound;
+ }
+
+ // Returns true if all names in the array are defined as functions
+ // on the given api object; false otherwise. This is a non-strict version
+ // that does not care about other properties on the api.
+ function areFunctionsNonStrict(api, fnNames) {
+ if (!isA(fnNames)) {
+ return false;
+ }
+ var n = fnNames.length,
+ i, name;
+ for (i=0; i<n; i++) {
+ name = fnNames[i];
+ if (!isF(api[name])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ // Returns width and height of window inner dimensions.
+ // offH, offW : offset width/height are subtracted, if present
+ function windowSize(offH, offW) {
+ var oh = offH || 0,
+ ow = offW || 0;
+ return {
+ height: $window.innerHeight - oh,
+ width: $window.innerWidth - ow
+ };
+ }
+
+ // Returns true if current browser determined to be a mobile device
+ function isMobile() {
+ var ua = $window.navigator.userAgent,
+ patt = /iPhone|iPod|iPad|Silk|Android|BlackBerry|Opera Mini|IEMobile/;
+ return patt.test(ua);
+ }
+
+ // Returns true if the current browser determined to be Chrome
+ function isChrome() {
+ var isChromium = $window.chrome,
+ vendorName = $window.navigator.vendor,
+ isOpera = $window.navigator.userAgent.indexOf("OPR") > -1;
+ return (isChromium !== null &&
+ isChromium !== undefined &&
+ vendorName === "Google Inc." &&
+ isOpera == false);
+ }
+
+ // Returns true if the current browser determined to be Safari
+ function isSafari() {
+ return ($window.navigator.userAgent.indexOf('Safari') !== -1 &&
+ $window.navigator.userAgent.indexOf('Chrome') === -1);
+ }
+
+ // Returns true if the current browser determined to be Firefox
+ function isFirefox() {
+ return typeof InstallTrigger !== 'undefined';
+ }
+
+ // search through an array of objects, looking for the one with the
+ // tagged property matching the given key. tag defaults to 'id'.
+ // returns the index of the matching object, or -1 for no match.
+ function find(key, array, tag) {
+ var _tag = tag || 'id',
+ idx, n, d;
+ for (idx = 0, n = array.length; idx < n; idx++) {
+ d = array[idx];
+ if (d[_tag] === key) {
+ return idx;
+ }
+ }
+ return -1;
+ }
+
+ // search through array to find (the first occurrence of) item,
+ // returning its index if found; otherwise returning -1.
+ function inArray(item, array) {
+ var i;
+ if (isA(array)) {
+ for (i=0; i<array.length; i++) {
+ if (array[i] === item) {
+ return i;
+ }
+ }
+ }
+ return -1;
+ }
+
+ // remove (the first occurrence of) the specified item from the given
+ // array, if any. Return true if the removal was made; false otherwise.
+ function removeFromArray(item, array) {
+ var found = false,
+ i = inArray(item, array);
+ if (i >= 0) {
+ array.splice(i, 1);
+ found = true;
+ }
+ return found;
+ }
+
+ // return true if the object is empty, return false otherwise
+ function isEmptyObject(obj) {
+ var key;
+ for (key in obj) {
+ return false;
+ }
+ return true;
+ }
+
+ // returns true if the two objects have all the same properties
+ function sameObjProps(obj1, obj2) {
+ var key;
+ for (key in obj1) {
+ if (obj1.hasOwnProperty(key)) {
+ if (!(obj1[key] === obj2[key])) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ // returns true if the array contains the object
+ // does NOT use strict object reference equality,
+ // instead checks each property individually for equality
+ function containsObj(arr, obj) {
+ var i,
+ len = arr.length;
+ for (i = 0; i < len; i++) {
+ if (sameObjProps(arr[i], obj)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // return the given string with the first character capitalized.
+ function cap(s) {
+ return s.toLowerCase().replace(/^[a-z]/, function (m) {
+ return m.toUpperCase();
+ });
+ }
+
+ // return the parameter without a px suffix
+ function noPx(num) {
+ return Number(num.replace(/px$/, ''));
+ }
+
+ // return an element's given style property without px suffix
+ function noPxStyle(elem, prop) {
+ return Number(elem.style(prop).replace(/px$/, ''));
+ }
+
+ function endsWith(str, suffix) {
+ return str.indexOf(suffix, str.length - suffix.length) !== -1;
+ }
+
+ function parseBitRate(str) {
+ return Number(str.replace(/,/, '')
+ .replace(/\s+.bps/i, '')
+ .replace(/\.\d*/, ''));
+ }
+
+ // return true if the given debug flag was specified in the query params
+ function debugOn(tag) {
+ return debugFlags[tag];
+ }
+
+ angular.module('onosUtil')
+ .factory('FnService',
+ ['$window', '$location', '$log', function (_$window_, $loc, _$log_) {
+ $window = _$window_;
+ $log = _$log_;
+
+ _parseDebugFlags($loc.search().debug);
+
+ return {
+ isF: isF,
+ isA: isA,
+ isS: isS,
+ isO: isO,
+ contains: contains,
+ areFunctions: areFunctions,
+ areFunctionsNonStrict: areFunctionsNonStrict,
+ windowSize: windowSize,
+ isMobile: isMobile,
+ isChrome: isChrome,
+ isSafari: isSafari,
+ isFirefox: isFirefox,
+ debugOn: debugOn,
+ find: find,
+ inArray: inArray,
+ removeFromArray: removeFromArray,
+ isEmptyObject: isEmptyObject,
+ sameObjProps: sameObjProps,
+ containsObj: containsObj,
+ cap: cap,
+ noPx: noPx,
+ noPxStyle: noPxStyle,
+ endsWith: endsWith,
+ parseBitRate: parseBitRate
+ };
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/util/keys.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/util/keys.js
new file mode 100644
index 00000000..2985565c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/util/keys.js
@@ -0,0 +1,215 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Util -- Key Handler Service
+ */
+(function () {
+ 'use strict';
+
+ // references to injected services
+ var $log, fs, ts, ns, qhs;
+
+ // internal state
+ var enabled = true,
+ keyHandler = {
+ globalKeys: {},
+ maskedKeys: {},
+ viewKeys: {},
+ viewFn: null,
+ viewGestures: []
+ };
+
+ function whatKey(code) {
+ switch (code) {
+ case 13: return 'enter';
+ case 16: return 'shift';
+ case 17: return 'ctrl';
+ case 18: return 'alt';
+ case 27: return 'esc';
+ case 32: return 'space';
+ case 37: return 'leftArrow';
+ case 38: return 'upArrow';
+ case 39: return 'rightArrow';
+ case 40: return 'downArrow';
+ case 91: return 'cmdLeft';
+ case 93: return 'cmdRight';
+ case 187: return 'equals';
+ case 188: return 'comma';
+ case 189: return 'dash';
+ case 190: return 'dot';
+ case 191: return 'slash';
+ case 192: return 'backQuote';
+ case 220: return 'backSlash';
+ default:
+ if ((code >= 48 && code <= 57) ||
+ (code >= 65 && code <= 90)) {
+ return String.fromCharCode(code);
+ } else if (code >= 112 && code <= 123) {
+ return 'F' + (code - 111);
+ }
+ return '.';
+ }
+ }
+
+ function keyIn() {
+ var event = d3.event,
+ keyCode = event.keyCode,
+ key = whatKey(keyCode),
+ kh = keyHandler,
+ gk = kh.globalKeys[key],
+ gcb = fs.isF(gk) || (fs.isA(gk) && fs.isF(gk[0])),
+ vk = kh.viewKeys[key],
+ kl = fs.isF(kh.viewKeys._keyListener),
+ vcb = fs.isF(vk) || (fs.isA(vk) && fs.isF(vk[0])) || fs.isF(kh.viewFn),
+ token = 'keyev'; // indicate this was a key-pressed event
+
+ d3.event.stopPropagation();
+
+ if (enabled) {
+ // global callback?
+ if (gcb && gcb(token, key, keyCode, event)) {
+ // if the event was 'handled', we are done
+ return;
+ }
+ // otherwise, let the view callback have a shot
+ if (vcb) {
+ vcb(token, key, keyCode, event);
+ }
+ if (kl) {
+ kl(key);
+ }
+ }
+ }
+
+ function setupGlobalKeys() {
+ angular.extend(keyHandler, {
+ globalKeys: {
+ backSlash: [quickHelp, 'Show / hide Quick Help'],
+ slash: [quickHelp, 'Show / hide Quick Help'],
+ esc: [escapeKey, 'Dismiss dialog or cancel selections'],
+ T: [toggleTheme, "Toggle theme"]
+ },
+ globalFormat: ['backSlash', 'slash', 'esc', 'T'],
+
+ // Masked keys are global key handlers that always return true.
+ // That is, the view will never see the event for that key.
+ maskedKeys: {
+ slash: true,
+ backSlash: true,
+ T: true
+ }
+ });
+ }
+
+ function quickHelp(view, key, code, ev) {
+ qhs.showQuickHelp(keyHandler);
+ return true;
+ }
+
+ // returns true if we 'consumed' the ESC keypress, false otherwise
+ function escapeKey(view, key, code, ev) {
+ return ns.hideIfShown() || qhs.hideQuickHelp();
+ }
+
+ function toggleTheme(view, key, code, ev) {
+ ts.toggleTheme();
+ return true;
+ }
+
+ function setKeyBindings(keyArg) {
+ var viewKeys,
+ masked = [];
+
+ if (fs.isF(keyArg)) {
+ // set general key handler callback
+ keyHandler.viewFn = keyArg;
+ } else {
+ // set specific key filter map
+ viewKeys = d3.map(keyArg).keys();
+ viewKeys.forEach(function (key) {
+ if (keyHandler.maskedKeys[key]) {
+ masked.push('setKeyBindings(): Key "' + key + '" is reserved');
+ }
+ });
+
+ if (masked.length) {
+ $log.warn(masked.join('\n'));
+ }
+ keyHandler.viewKeys = keyArg;
+ }
+ }
+
+ function getKeyBindings() {
+ var gkeys = d3.map(keyHandler.globalKeys).keys(),
+ masked = d3.map(keyHandler.maskedKeys).keys(),
+ vkeys = d3.map(keyHandler.viewKeys).keys(),
+ vfn = !!fs.isF(keyHandler.viewFn);
+
+ return {
+ globalKeys: gkeys,
+ maskedKeys: masked,
+ viewKeys: vkeys,
+ viewFunction: vfn
+ };
+ }
+
+ function unbindKeys() {
+ keyHandler.viewKeys = {};
+ keyHandler.viewFn = null;
+ keyHandler.viewGestures = [];
+ }
+
+ angular.module('onosUtil')
+ .factory('KeyService',
+ ['$log', 'FnService', 'ThemeService', 'NavService',
+
+ function (_$log_, _fs_, _ts_, _ns_) {
+ $log = _$log_;
+ fs = _fs_;
+ ts = _ts_;
+ ns = _ns_;
+
+ return {
+ bindQhs: function (_qhs_) {
+ qhs = _qhs_;
+ },
+ installOn: function (elem) {
+ elem.on('keydown', keyIn);
+ setupGlobalKeys();
+ },
+ keyBindings: function (x) {
+ if (x === undefined) {
+ return getKeyBindings();
+ } else {
+ setKeyBindings(x);
+ }
+ },
+ unbindKeys: unbindKeys,
+ gestureNotes: function (g) {
+ if (g === undefined) {
+ return keyHandler.viewGestures;
+ } else {
+ keyHandler.viewGestures = fs.isA(g) || [];
+ }
+ },
+ enableKeys: function (b) {
+ enabled = b;
+ }
+ };
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/util/prefs.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/util/prefs.js
new file mode 100644
index 00000000..02a23909
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/util/prefs.js
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Util -- User Preference Service
+ */
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, $cookies, fs;
+
+ // internal state
+ var cache = {};
+
+ // NOTE: in Angular 1.3.5, $cookies is just a simple object, and
+ // cookie values are just strings. From the 1.3.5 docs:
+ //
+ // "Only a simple Object is exposed and by adding or removing
+ // properties to/from this object, new cookies are created/deleted
+ // at the end of current $eval. The object's properties can only
+ // be strings."
+ //
+ // We may want to upgrade the version of Angular sometime soon
+ // since later version support objects as cookie values.
+
+ // NOTE: prefs represented as simple name/value pairs
+ // => a temporary restriction while we are encoding into cookies
+ /*
+ {
+ foo: 1,
+ bar: 0,
+ goo: 2
+ }
+
+ stored as "foo:1,bar:0,goo:2"
+ */
+
+ // reads cookie with given name and returns an object rep of its value
+ // or null if no such cookie is set
+ function getPrefs(name) {
+ var cook = $cookies[name],
+ bits,
+ obj = {};
+
+ if (cook) {
+ bits = cook.split(',');
+ bits.forEach(function (value) {
+ var x = value.split(':');
+ obj[x[0]] = x[1];
+ });
+
+ // update the cache
+ cache[name] = obj;
+ return obj;
+ }
+ // perhaps we have a cached copy..
+ return cache[name];
+ }
+
+ // converts string values to numbers for selected (or all) keys
+ function asNumbers(obj, keys) {
+ if (!obj) return null;
+
+ if (!keys) {
+ // do them all
+ angular.forEach(obj, function (v, k) {
+ obj[k] = Number(obj[k]);
+ });
+ } else {
+ keys.forEach(function (k) {
+ obj[k] = Number(obj[k]);
+ });
+ }
+ return obj;
+ }
+
+ function setPrefs(name, obj) {
+ var bits = [],
+ str;
+
+ angular.forEach(obj, function (value, key) {
+ bits.push(key + ':' + value);
+ });
+ str = bits.join(',');
+
+ // keep a cached copy of the object
+ cache[name] = obj;
+
+ // The angular way of doing this...
+ // $cookies[name] = str;
+ // ...but it appears that this gets delayed, and doesn't 'stick' ??
+
+ // FORCE cookie to be set by writing directly to document.cookie...
+ document.cookie = name + '=' + encodeURIComponent(str);
+ if (fs.debugOn('prefs')) {
+ $log.debug('<<>> Wrote cookie <'+name+'>:', str);
+ }
+ }
+
+ angular.module('onosUtil')
+ .factory('PrefsService', ['$log', '$cookies', 'FnService',
+ function (_$log_, _$cookies_, _fs_) {
+ $log = _$log_;
+ $cookies = _$cookies_;
+ fs = _fs_;
+
+ return {
+ getPrefs: getPrefs,
+ asNumbers: asNumbers,
+ setPrefs: setPrefs
+ };
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/util/random.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/util/random.js
new file mode 100644
index 00000000..2298a944
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/util/random.js
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Random -- Encapsulated randomness
+ */
+(function () {
+ 'use strict';
+
+ var $log, fs;
+
+ var halfRoot2 = 0.7071;
+
+ // given some value, s, returns an integer between -s/2 and s/2
+ // e.g. s = 100; result in the range [-50..50)
+ function spread(s) {
+ return Math.floor((Math.random() * s) - s / 2);
+ }
+
+ // for a given dimension, d, choose a random value somewhere between
+ // 0 and d where the value is within (d / (2 * sqrt(2))) of d/2.
+ function randDim(d) {
+ return d / 2 + spread(d * halfRoot2);
+ }
+
+ angular.module('onosUtil')
+ .factory('RandomService', ['$log', 'FnService',
+
+ function (_$log_, _fs_) {
+ $log = _$log_;
+ fs = _fs_;
+
+ return {
+ spread: spread,
+ randDim: randDim
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/util/theme.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/util/theme.js
new file mode 100644
index 00000000..0e0ee649
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/util/theme.js
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Util -- Theme Service
+ */
+(function () {
+ 'use strict';
+
+ var $log, fs;
+
+ var themes = ['light', 'dark'],
+ themeStr = themes.join(' '),
+ thidx,
+ listeners = {},
+ nextListenerId = 1;
+
+ function init() {
+ thidx = 0;
+ updateBodyClass();
+ }
+
+ function getTheme() {
+ return themes[thidx];
+ }
+
+ function setTheme(t) {
+ var idx = themes.indexOf(t);
+ if (idx > -1 && idx !== thidx) {
+ thidx = idx;
+ updateBodyClass();
+ themeEvent('set');
+ }
+ }
+
+ function toggleTheme() {
+ var i = thidx + 1;
+ thidx = (i===themes.length) ? 0 : i;
+ updateBodyClass();
+ themeEvent('toggle');
+ return getTheme();
+ }
+
+ function updateBodyClass() {
+ var body = d3.select('body');
+ body.classed(themeStr, false);
+ body.classed(getTheme(), true);
+ }
+
+ function themeEvent(w) {
+ var t = getTheme(),
+ m = 'Theme-Change-('+w+'): ' + t;
+ $log.debug(m);
+ angular.forEach(listeners, function(value) {
+ value.cb(
+ {
+ event: 'themeChange',
+ value: t
+ }
+ );
+ });
+ }
+
+ function addListener(callback) {
+ var id = nextListenerId++,
+ cb = fs.isF(callback),
+ o = { id: id, cb: cb };
+
+ if (cb) {
+ listeners[id] = o;
+ } else {
+ $log.error('ThemeService.addListener(): callback not a function');
+ o.error = 'No callback defined';
+ }
+ return o;
+ }
+
+ function removeListener(lsnr) {
+ var id = lsnr && lsnr.id,
+ o = listeners[id];
+ if (o) {
+ delete listeners[id];
+ }
+ }
+
+ angular.module('onosUtil')
+ .factory('ThemeService', ['$log', 'FnService',
+ function (_$log_, _fs_) {
+ $log = _$log_;
+ fs = _fs_;
+ thidx = 0;
+
+ return {
+ init: init,
+ theme: function (x) {
+ if (x === undefined) {
+ return getTheme();
+ } else {
+ setTheme(x);
+ }
+ },
+ toggleTheme: toggleTheme,
+ addListener: addListener,
+ removeListener: removeListener
+ };
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/util/util.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/util/util.js
new file mode 100644
index 00000000..dc3b09c2
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/util/util.js
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Utilities Module
+ */
+(function () {
+ 'use strict';
+
+ angular.module('onosUtil', []);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/button.css b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/button.css
new file mode 100644
index 00000000..9ae03595
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/button.css
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Button Service -- CSS file
+ */
+
+.button,
+.toggleButton,
+.radioSet {
+ display: inline-block;
+ padding: 0 4px;
+}
+.radioButton {
+ display: inline-block;
+ padding: 0 2px;
+}
+
+.button svg.embeddedIcon,
+.toggleButton svg.embeddedIcon,
+.radioButton svg.embeddedIcon {
+ cursor: pointer;
+}
+.button svg.embeddedIcon .icon rect,
+.toggleButton svg.embeddedIcon .icon rect,
+.radioButton svg.embeddedIcon .icon rect{
+ stroke: none;
+}
+
+/* Selected button color */
+.light .button svg.embeddedIcon .icon rect,
+.light .toggleButton.selected svg.embeddedIcon .icon rect,
+.light .radioButton.selected svg.embeddedIcon .icon rect {
+ fill: #838383;
+}
+
+.light .button:hover svg.embeddedIcon .icon rect,
+.light .toggleButton.selected:hover svg.embeddedIcon .icon rect
+/* NOTE: selected radio button should NOT have hover highlight */
+{
+ fill: #444444;
+}
+
+.light .button svg.embeddedIcon .glyph,
+.light .toggleButton.selected svg.embeddedIcon .glyph,
+.light .radioButton.selected svg.embeddedIcon .glyph {
+ fill: white;
+}
+
+.dark .button svg.embeddedIcon .icon rect,
+.dark .toggleButton.selected svg.embeddedIcon .icon rect,
+.dark .radioButton.selected svg.embeddedIcon .icon rect {
+ fill: #151515;
+}
+
+.dark .button:hover svg.embeddedIcon .icon rect,
+.dark .toggleButton.selected:hover svg.embeddedIcon .icon rect
+/* NOTE: selected radio button should NOT have hover highlight */
+{
+ fill: #444;
+}
+
+.dark .button svg.embeddedIcon .glyph,
+.dark .toggleButton.selected svg.embeddedIcon .glyph,
+.dark .radioButton.selected svg.embeddedIcon .glyph {
+ fill: #B2B2B2;
+}
+
+/* Unselected button color */
+.light .toggleButton svg.embeddedIcon .icon rect,
+.light .radioButton svg.embeddedIcon .icon rect {
+ fill: #eee;
+}
+
+.light .toggleButton:hover svg.embeddedIcon .icon rect,
+.light .radioButton:hover:not(.selected) svg.embeddedIcon .icon rect {
+ fill: #ccc;
+}
+
+.light .toggleButton svg.embeddedIcon .glyph,
+.light .radioButton svg.embeddedIcon .glyph {
+ fill: #bbb;
+}
+.light .toggleButton:hover:not(.selected) svg.embeddedIcon .glyph,
+.light .radioButton:hover:not(.selected) svg.embeddedIcon .glyph {
+ fill: #999;
+}
+
+.dark .toggleButton svg.embeddedIcon .icon rect,
+.dark .radioButton svg.embeddedIcon .icon rect {
+ fill: #303030;
+}
+
+.dark .toggleButton:hover:not(.selected) svg.embeddedIcon .icon rect,
+.dark .radioButton:hover:not(.selected) svg.embeddedIcon .icon rect {
+ fill: #555;
+}
+
+.dark .toggleButton svg.embeddedIcon .glyph,
+.dark .radioButton svg.embeddedIcon .glyph {
+ fill: #565656;
+}
+
+.dark .toggleButton:hover:not(.selected) svg.embeddedIcon .glyph,
+.dark .radioButton:hover:not(.selected) svg.embeddedIcon .glyph {
+ fill: #777;
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/button.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/button.js
new file mode 100644
index 00000000..09cdd43a
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/button.js
@@ -0,0 +1,263 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Widget -- Button Service
+ */
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, fs, is, tts;
+
+ // configuration
+ var btnSize = 25,
+ btnPadding = 4;
+
+
+ // === Helper Functions
+
+ function divExists(div, msg) {
+ if (!div) {
+ $log.warn('div undefined (' + msg + ')');
+ }
+ return !!div;
+ }
+
+ function createDiv(div, cls, id) {
+ return div.append('div')
+ .classed(cls, true)
+ .attr('id', id);
+ }
+
+ function noop() {}
+
+ function buttonWidth() {
+ return btnSize + 2 * btnPadding;
+ }
+
+ // === BUTTON =================================================
+
+ // div is where to put the button (d3.selection of a DIV element)
+ // id should be globally unique
+ // gid is glyph ID (from Glyph Service)
+ // cb is callback function on click
+ // tooltip is text for tooltip
+ function button(div, id, gid, cb, tooltip) {
+ if (!divExists(div, 'button')) return null;
+
+ var btnDiv = createDiv(div, 'button', id),
+ cbFnc = fs.isF(cb) || noop;
+
+ is.loadIcon(btnDiv, gid, btnSize, true);
+ if (tooltip) { tts.addTooltip(btnDiv, tooltip); }
+
+ btnDiv.on('click', cbFnc);
+
+ return {
+ id: id,
+ width: buttonWidth
+ }
+ }
+
+
+ // === TOGGLE BUTTON ==========================================
+
+ // div is where to put the button (d3.selection of a DIV element)
+ // id should be globally unique
+ // gid is glyph ID (from Glyph Service)
+ // initState is whether the toggle is on or not to begin
+ // cb is callback function on click
+ // tooltip is text for tooltip
+ function toggle(div, id, gid, initState, cb, tooltip) {
+ if (!divExists(div, 'toggle button')) return null;
+
+ var sel = !!initState,
+ togDiv = createDiv(div, 'toggleButton', id),
+ cbFnc = fs.isF(cb) || noop;
+
+ is.loadIcon(togDiv, gid, btnSize, true);
+ togDiv.classed('selected', sel);
+ if (tooltip) { tts.addTooltip(togDiv, tooltip); }
+
+ function _toggle(b, nocb) {
+ sel = (b === undefined) ? !sel : !!b;
+ togDiv.classed('selected', sel);
+ nocb || cbFnc(sel);
+ }
+
+ // toggle the button state without invoking the callback
+ function toggleNoCb() {
+ _toggle(undefined, true);
+ }
+
+ togDiv.on('click', _toggle);
+
+ return {
+ id: id,
+ width: buttonWidth,
+ selected: function () { return sel; },
+ toggle: _toggle,
+ toggleNoCb: toggleNoCb
+ }
+ }
+
+
+ // === RADIO BUTTON SET =======================================
+
+
+ // div is where to put the button (d3.selection of a DIV element)
+ // id should be globally unique
+ // rset is an array of button descriptors of the following form:
+ // {
+ // gid: glyphId,
+ // tooltip: tooltipText,
+ // cb: callbackFunction
+ // }
+ function radioSet(div, id, rset) {
+ if (!divExists(div, 'radio button set')) return null;
+
+ if (!fs.isA(rset) || !rset.length) {
+ $log.warn('invalid array (radio button set)');
+ return null;
+ }
+
+ var rDiv = createDiv(div, 'radioSet', id),
+ rads = [],
+ idxByKey = {},
+ currIdx = 0;
+
+ function rsetWidth() {
+ return ((btnSize + btnPadding) * rads.length) + btnPadding;
+ }
+
+ function rbclick() {
+ var id = d3.select(this).attr('id'),
+ m = /^.*-(\d+)$/.exec(id),
+ idx = Number(m[1]);
+
+ if (idx !== currIdx) {
+ rads[currIdx].el.classed('selected', false);
+ currIdx = idx;
+ rads[currIdx].el.classed('selected', true);
+ invokeCurrent();
+ }
+ }
+
+ // {
+ // gid: gid,
+ // tooltip: ..., (optional)
+ // key: ..., (optional)
+ // cb: cb
+ // id: ... (added by us)
+ // index: ... (added by us)
+ // }
+
+ rset.forEach(function (btn, index) {
+
+ if (!fs.isO(btn)) {
+ $log.warn('radio button descriptor at index ' + index +
+ ' not an object');
+ return;
+ }
+
+ var rid = id + '-' + index,
+ initSel = (index === 0),
+ rbdiv = createDiv(rDiv, 'radioButton', rid);
+
+ rbdiv.classed('selected', initSel);
+ rbdiv.on('click', rbclick);
+ is.loadIcon(rbdiv, btn.gid, btnSize, true);
+ if (btn.tooltip) { tts.addTooltip(rbdiv, btn.tooltip); }
+ angular.extend(btn, {
+ el: rbdiv,
+ id: rid,
+ cb: fs.isF(btn.cb) || noop,
+ index: index
+ });
+
+ if (btn.key) {
+ idxByKey[btn.key] = index;
+ }
+
+ rads.push(btn);
+ });
+
+
+ function invokeCurrent() {
+ var curr = rads[currIdx];
+ curr.cb(curr.index, curr.key);
+ }
+
+ function selected(x) {
+ var curr = rads[currIdx],
+ idx;
+
+ if (x === undefined) {
+ return curr.key || curr.index;
+ } else {
+ idx = idxByKey[x];
+ if (idx === undefined) {
+ $log.warn('no radio button with key:', x);
+ } else {
+ selectedIndex(idx);
+ }
+ }
+ }
+
+ function selectedIndex(x) {
+ if (x === undefined) {
+ return currIdx;
+ } else {
+ if (x >= 0 && x < rads.length) {
+ if (currIdx !== x) {
+ currIdx = x;
+ invokeCurrent();
+ } else {
+ $log.warn('current index already selected:', x);
+ }
+ } else {
+ $log.warn('invalid radio button index:', x);
+ }
+ }
+ }
+
+ return {
+ width: rsetWidth,
+ selected: selected,
+ selectedIndex: selectedIndex
+ }
+ }
+
+
+ angular.module('onosWidget')
+ .factory('ButtonService',
+ ['$log', 'FnService', 'IconService', 'TooltipService',
+
+ function (_$log_, _fs_, _is_, _tts_) {
+ $log = _$log_;
+ fs = _fs_;
+ is = _is_;
+ tts = _tts_;
+
+ return {
+ button: button,
+ toggle: toggle,
+ radioSet: radioSet
+ };
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/table.css b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/table.css
new file mode 100644
index 00000000..18b81ba6
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/table.css
@@ -0,0 +1,215 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* ------ for summary-list tables ------ */
+
+div.summary-list {
+ margin: 0 20px 16px 10px;
+ font-size: 10pt;
+ border-spacing: 0;
+}
+
+div.loading-wheel {
+ display: inline-block;
+ position: absolute;
+ margin-top: 40px;
+ left: 47%;
+ animation: spin reverse 2s ease infinite;
+ z-index: 1000;
+}
+
+@keyframes spin {
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+div.loading-wheel svg.embeddedIcon g.icon .glyph {
+ opacity: .8;
+}
+.light div.loading-wheel svg.embeddedIcon g.icon .glyph {
+ fill: #964949;
+}
+.dark div.loading-wheel svg.embeddedIcon g.icon .glyph {
+ fill: whitesmoke;
+}
+
+div.summary-list table {
+ border-collapse: collapse;
+ table-layout: fixed;
+ empty-cells: show;
+ margin: 0;
+}
+
+div.summary-list div.table-body {
+ overflow-y: scroll;
+}
+
+div.summary-list div.table-body::-webkit-scrollbar {
+ display: none;
+}
+
+div.summary-list tr.no-data td {
+ text-align: center;
+ font-style: italic;
+}
+
+.light div.summary-list tr:nth-child(even) {
+ background-color: #ddd;
+}
+.light div.summary-list tr:nth-child(odd) {
+ background-color: #eee;
+}
+.dark div.summary-list tr:nth-child(even) {
+ background-color: #333;
+}
+.dark div.summary-list tr:nth-child(odd) {
+ background-color: #444;
+}
+
+.light div.summary-list tr.selected {
+ background-color: deepskyblue;
+}
+
+.dark div.summary-list tr.selected {
+ background-color: #304860;
+}
+
+/* highlighting */
+div.summary-list tr {
+ transition: background-color 500ms;
+}
+.light div.summary-list tr.data-change {
+ background-color: #FDFFDC;
+}
+.dark div.summary-list tr.data-change {
+ background-color: #5A5600;
+}
+
+div.summary-list td {
+ padding: 6px;
+ text-align: left;
+ word-wrap: break-word;
+}
+
+div.summary-list .table-header td {
+ letter-spacing: 0.02em;
+ cursor: pointer;
+ font-weight: bold;
+}
+div.summary-list .table-header td:first-child {
+ border-radius: 8px 0 0 0;
+}
+div.summary-list .table-header td:last-child {
+ border-radius: 0 8px 0 0;
+}
+
+.light div.summary-list .table-header td {
+ background-color: #bbb;
+}
+.dark div.summary-list .table-header td {
+ background-color: #222;
+ color: #ccc;
+}
+
+/* rows are selectable */
+div.summary-list .table-body td {
+ cursor: pointer;
+}
+
+.dark div.summary-list td {
+ color: #ccc;
+}
+
+/* Tabular view upper right control buttons */
+
+div.ctrl-btns {
+ display: inline-block;
+ float: right;
+ height: 44px;
+ margin-right: 24px;
+ margin-top: 7px;
+}
+
+
+div.ctrl-btns div {
+ display: inline-block;
+ padding: 4px;
+ cursor: pointer;
+}
+
+div.ctrl-btns div.separator {
+ cursor: auto;
+ width: 24px;
+ border: none;
+}
+
+/* Inactive */
+.light .ctrl-btns div g.icon rect,
+.light .ctrl-btns div:hover g.icon rect {
+ fill: #eee;
+}
+.dark .ctrl-btns div g.icon rect,
+.dark .ctrl-btns div:hover g.icon rect {
+ fill: #222;
+}
+
+.light .ctrl-btns div g.icon use {
+ fill: #ddd;
+}
+.dark .ctrl-btns div g.icon use {
+ fill: #333;
+}
+
+/* Active hover */
+.light .ctrl-btns div.active:hover g.icon rect {
+ fill: #800;
+}
+
+.dark .ctrl-btns div.active:hover g.icon rect {
+ fill: #CE5650;
+}
+
+/* Active */
+.light .ctrl-btns div.active g.icon use {
+ fill: #fff;
+}
+.dark .ctrl-btns div.active g.icon use {
+ fill: #eee;
+}
+
+.light .ctrl-btns div.active g.icon rect {
+ fill: #bbb;
+}
+.dark .ctrl-btns div.active g.icon rect {
+ fill: #444;
+}
+
+/* Refresh button specific */
+.light .ctrl-btns div.refresh.active g.icon rect {
+ fill: #964949;
+}
+
+.dark .ctrl-btns div.refresh.active g.icon rect {
+ fill: #9B4641;
+}
+.light .ctrl-btns div.refresh:hover g.icon rect {
+ fill: #964949;
+}
+
+.dark .ctrl-btns div.refresh:hover g.icon rect {
+ fill: #9B4641;
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/table.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/table.js
new file mode 100644
index 00000000..327aedb9
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/table.js
@@ -0,0 +1,272 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Widget -- Table Service
+ */
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, $window, fs, mast, is;
+
+ // constants
+ var tableIconTdSize = 33,
+ pdg = 22,
+ flashTime = 1500,
+ colWidth = 'col-width',
+ tableIcon = 'table-icon',
+ asc = 'asc',
+ desc = 'desc',
+ none = 'none';
+
+ // internal state
+ var currCol = {},
+ prevCol = {},
+ cstmWidths = {},
+ sortIconAPI;
+
+ // Functions for resizing a tabular view to the window
+
+ function _width(elem, width) {
+ elem.style('width', width);
+ }
+
+ function findCstmWidths(table) {
+ var headers = table.select('.table-header').selectAll('td');
+
+ headers.each(function (d, i) {
+ var h = d3.select(this),
+ index = i.toString();
+ if (h.classed(tableIcon)) {
+ cstmWidths[index] = tableIconTdSize + 'px';
+ }
+ if (h.attr(colWidth)) {
+ cstmWidths[index] = h.attr(colWidth);
+ }
+ });
+ if (fs.debugOn('widget')) {
+ $log.debug('Headers with custom widths: ', cstmWidths);
+ }
+ }
+
+ function setTdWidths(elem, width) {
+ var tds = elem.select('tr:first-child').selectAll('td');
+ _width(elem, width + 'px');
+
+ tds.each(function (d, i) {
+ var td = d3.select(this),
+ index = i.toString();
+ if (cstmWidths.hasOwnProperty(index)) {
+ _width(td, cstmWidths[index]);
+ }
+ });
+ }
+
+ function setHeight(thead, body, height) {
+ var h = height - (mast.mastHeight() +
+ fs.noPxStyle(d3.select('.tabular-header'), 'height') +
+ fs.noPxStyle(thead, 'height') + pdg);
+ body.style('height', h + 'px');
+ }
+
+ function adjustTable(haveItems, tableElems, width, height) {
+ if (haveItems) {
+ setTdWidths(tableElems.thead, width);
+ setTdWidths(tableElems.tbody, width);
+ setHeight(tableElems.thead, tableElems.table.select('.table-body'), height);
+ } else {
+ setTdWidths(tableElems.thead, width);
+ _width(tableElems.tbody, width + 'px');
+ }
+ }
+
+ // Functions for sorting table rows by header
+
+ function updateSortDirection(thElem) {
+ sortIconAPI.sortNone(thElem.select('div'));
+ currCol.div = thElem.append('div');
+ currCol.colId = thElem.attr('colId');
+
+ if (currCol.colId === prevCol.colId) {
+ (currCol.dir === desc) ? currCol.dir = asc : currCol.dir = desc;
+ prevCol.dir = currCol.dir;
+ } else {
+ currCol.dir = asc;
+ prevCol.dir = none;
+ }
+ (currCol.dir === asc) ?
+ sortIconAPI.sortAsc(currCol.div) : sortIconAPI.sortDesc(currCol.div);
+
+ if (prevCol.colId && prevCol.dir === none) {
+ sortIconAPI.sortNone(prevCol.div);
+ }
+
+ prevCol.colId = currCol.colId;
+ prevCol.div = currCol.div;
+ }
+
+ function sortRequestParams() {
+ return {
+ sortCol: currCol.colId,
+ sortDir: currCol.dir
+ };
+ }
+
+ function resetSort() {
+ if (currCol.div) {
+ sortIconAPI.sortNone(currCol.div);
+ }
+ if (prevCol.div) {
+ sortIconAPI.sortNone(prevCol.div);
+ }
+ currCol = {};
+ prevCol = {};
+ }
+
+ angular.module('onosWidget')
+ .directive('onosTableResize', ['$log','$window',
+ 'FnService', 'MastService',
+
+ function (_$log_, _$window_, _fs_, _mast_) {
+ return function (scope, element) {
+ $log = _$log_;
+ $window = _$window_;
+ fs = _fs_;
+ mast = _mast_;
+
+ var table = d3.select(element[0]),
+ tableElems = {
+ table: table,
+ thead: table.select('.table-header').select('table'),
+ tbody: table.select('.table-body').select('table')
+ },
+ wsz;
+
+ findCstmWidths(table);
+
+ // adjust table on window resize
+ scope.$watchCollection(function () {
+ return {
+ h: $window.innerHeight,
+ w: $window.innerWidth
+ };
+ }, function () {
+ wsz = fs.windowSize(0, 30);
+ adjustTable(
+ scope.tableData.length,
+ tableElems,
+ wsz.width, wsz.height
+ );
+ });
+
+ // adjust table when data changes
+ scope.$watchCollection('tableData', function () {
+ adjustTable(
+ scope.tableData.length,
+ tableElems,
+ wsz.width, wsz.height
+ );
+ });
+
+ scope.$on('$destroy', function () {
+ cstmWidths = {};
+ });
+ };
+ }])
+
+ .directive('onosSortableHeader', ['$log', 'IconService',
+ function (_$log_, _is_) {
+ return function (scope, element) {
+ $log = _$log_;
+ is = _is_;
+ var header = d3.select(element[0]);
+ sortIconAPI = is.sortIcons();
+
+ header.selectAll('td').on('click', function () {
+ var col = d3.select(this);
+
+ if (col.attr('sortable') === '') {
+ updateSortDirection(col);
+ scope.sortParams = sortRequestParams();
+ scope.sortCallback(scope.sortParams);
+ }
+ });
+
+ scope.$on('$destroy', function () {
+ resetSort();
+ });
+ };
+ }])
+
+ .directive('onosFlashChanges',
+ ['$log', '$parse', '$timeout', 'FnService',
+ function ($log, $parse, $timeout, fs) {
+
+ return function (scope, element, attrs) {
+ var idProp = attrs.idProp,
+ table = d3.select(element[0]),
+ trs, promise;
+
+ function highlightRows() {
+ var changedRows = [];
+ function classRows(b) {
+ if (changedRows.length) {
+ angular.forEach(changedRows, function (tr) {
+ tr.classed('data-change', b);
+ });
+ }
+ }
+ // timeout because 'row-id' was the un-interpolated value
+ // "{{link.one}}" for example, instead of link.one evaluated
+ // timeout executes on the next digest -- after evaluation
+ $timeout(function () {
+ if (scope.tableData.length) {
+ trs = table.selectAll('tr');
+ }
+
+ if (trs && !trs.empty()) {
+ trs.each(function () {
+ var tr = d3.select(this);
+ if (fs.find(tr.attr('row-id'),
+ scope.changedData,
+ idProp) > -1) {
+ changedRows.push(tr);
+ }
+ });
+ classRows(true);
+ promise = $timeout(function () {
+ classRows(false);
+ }, flashTime);
+ trs = undefined;
+ }
+ });
+ }
+
+ // new items added:
+ scope.$on('ngRepeatComplete', highlightRows);
+ // items changed in existing set:
+ scope.$watchCollection('changedData', highlightRows);
+
+ scope.$on('$destroy', function () {
+ if (promise) {
+ $timeout.cancel(promise);
+ }
+ });
+ };
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/tableBuilder.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/tableBuilder.js
new file mode 100644
index 00000000..24161bbb
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/tableBuilder.js
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Widget -- Table Service
+ */
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, $interval, $timeout, fs, wss;
+
+ // constants
+ var refreshInterval = 2000,
+ loadingWait = 500;
+
+ // example params to buildTable:
+ // {
+ // scope: $scope, <- controller scope
+ // tag: 'device', <- table identifier
+ // selCb: selCb, <- row selection callback (optional)
+ // respCb: respCb, <- websocket response callback (optional)
+ // query: params <- query parameters in URL (optional)
+ // }
+ // Note: selCb() is passed the row data model of the selected row,
+ // or null when no row is selected.
+ // Note: query is always an object (empty or containing properties)
+ // it comes from $location.search()
+
+ function buildTable(o) {
+ var handlers = {},
+ root = o.tag + 's',
+ req = o.tag + 'DataRequest',
+ resp = o.tag + 'DataResponse',
+ onSel = fs.isF(o.selCb),
+ onResp = fs.isF(o.respCb),
+ oldTableData = [],
+ loaded = false,
+ refreshPromise, loadingPromise;
+
+ o.scope.tableData = [];
+ o.scope.changedData = [];
+ o.scope.sortParams = {};
+ o.scope.loading = true;
+ o.scope.autoRefresh = true;
+ o.scope.autoRefreshTip = 'Toggle auto refresh';
+
+ // === websocket functions --------------------
+ // response
+ function respCb(data) {
+ loaded = true;
+ o.scope.loading = false;
+ o.scope.tableData = data[root];
+ onResp && onResp();
+
+ // checks if data changed for row flashing
+ if (!angular.equals(o.scope.tableData, oldTableData)) {
+ o.scope.changedData = [];
+ // only flash the row if the data already exists
+ if (oldTableData.length) {
+ angular.forEach(o.scope.tableData, function (item) {
+ if (!fs.containsObj(oldTableData, item)) {
+ o.scope.changedData.push(item);
+ }
+ });
+ }
+ angular.copy(o.scope.tableData, oldTableData);
+ }
+ o.scope.$apply();
+ }
+ handlers[resp] = respCb;
+ wss.bindHandlers(handlers);
+
+ // request
+ function sortCb(params) {
+ var p = angular.extend({}, params, o.query);
+ wss.sendEvent(req, p);
+ stillLoading();
+ }
+ o.scope.sortCallback = sortCb;
+
+ // show loading wheel if it's taking a while for the server to respond
+ function stillLoading() {
+ loaded = false;
+ loadingPromise = $timeout(function () {
+ if (!loaded) {
+ o.scope.loading = true;
+ }
+ }, loadingWait);
+ }
+
+ // === selecting a row functions ----------------
+ function selCb($event, selRow) {
+ o.scope.selId = (o.scope.selId === selRow.id) ? null : selRow.id;
+ onSel && onSel($event, selRow);
+ }
+ o.scope.selectCallback = selCb;
+
+ // === autoRefresh functions ------------------
+ function startRefresh() {
+ refreshPromise = $interval(function () {
+ if (fs.debugOn('widget')) {
+ $log.debug('Refreshing ' + root + ' page');
+ }
+ sortCb(o.scope.sortParams);
+ }, refreshInterval);
+ }
+
+ function stopRefresh() {
+ if (angular.isDefined(refreshPromise)) {
+ $interval.cancel(refreshPromise);
+ refreshPromise = undefined;
+ }
+ }
+
+ function toggleRefresh() {
+ o.scope.autoRefresh = !o.scope.autoRefresh;
+ o.scope.autoRefresh ? startRefresh() : stopRefresh();
+ }
+ o.scope.toggleRefresh = toggleRefresh;
+
+ // === Cleanup on destroyed scope -----------------
+ o.scope.$on('$destroy', function () {
+ wss.unbindHandlers(handlers);
+ stopRefresh();
+ if (angular.isDefined(loadingPromise)) {
+ $timeout.cancel(loadingPromise);
+ loadingPromise = undefined;
+ }
+ });
+
+ sortCb();
+ startRefresh();
+ }
+
+ angular.module('onosWidget')
+ .factory('TableBuilderService',
+ ['$log', '$interval', '$timeout', 'FnService', 'WebSocketService',
+
+ function (_$log_, _$interval_, _$timeout_, _fs_, _wss_) {
+ $log = _$log_;
+ $interval = _$interval_;
+ $timeout = _$timeout_;
+ fs = _fs_;
+ wss = _wss_;
+
+ return {
+ buildTable: buildTable
+ };
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/toolbar.css b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/toolbar.css
new file mode 100644
index 00000000..36a5971b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/toolbar.css
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Toolbar Service -- CSS file
+ */
+
+.light .tbar-arrow svg.embeddedIcon .icon .glyph {
+ fill: #838383;
+}
+.dark .tbar-arrow svg.embeddedIcon .icon .glyph {
+ fill: #B2B2B2;
+}
+
+
+div.tbar-arrow {
+ position: absolute;
+ top: 53%;
+ left: 96%;
+ margin-right: -4%;
+ transform: translate(-50%, -50%);
+ cursor: pointer;
+}
+.safari div.tbar-arrow {
+ top: 46%;
+}
+.firefox div.tbar-arrow {
+ left: 97%;
+ margin-right: -3%;
+}
+
+.tbar-arrow svg.embeddedIcon .icon rect {
+ stroke: none;
+}
+.light .tbar-arrow svg.embeddedIcon .icon rect {
+ fill: none;
+}
+.dark .tbar-arrow svg.embeddedIcon .icon rect {
+ fill: none;
+}
+
+
+.toolbar {
+ line-height: 125%;
+}
+.tbar-row {
+ display: inline-block;
+}
+
+
+
+.separator {
+ border: 1px solid;
+ margin: 0 4px 0 4px;
+ display: inline-block;
+ height: 23px;
+ width: 0;
+}
+.light .separator {
+ border-color: #ddd;
+}
+.dark .separator {
+ border-color: #1A1A1A;
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/toolbar.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/toolbar.js
new file mode 100644
index 00000000..050afd0f
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/toolbar.js
@@ -0,0 +1,268 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Widget -- Toolbar Service
+ */
+// TODO: Augment service to allow toolbars to exist on right edge of screen
+// TODO: also - make toolbar more object aware (rows etc.)
+
+
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, fs, ps, bns, is;
+
+ // configuration
+ var arrowSize = 10,
+ sepWidth = 6,
+ defaultSettings = {
+ edge: 'left',
+ width: 20,
+ margin: 0,
+ hideMargin: -20,
+ top: 'auto',
+ bottom: '10px',
+ fade: false,
+ shown: false
+ };
+
+ // internal state
+ var tbars = {};
+
+
+ // === Helper functions --------------------------------------
+
+ // translate uses 50 because the svg viewbox is 50
+ function rotateArrowLeft(adiv) {
+ adiv.select('g')
+ .attr('transform', 'translate(0 50) rotate(-90)');
+ }
+ function rotateArrowRight(adiv) {
+ adiv.select('g')
+ .attr('transform', 'translate(50 0) rotate(90)');
+ }
+
+ function createArrow(panel) {
+ var arrowDiv = panel.append('div')
+ .classed('tbar-arrow', true);
+ is.loadIcon(arrowDiv, 'triangleUp', arrowSize, true);
+ return arrowDiv;
+ }
+
+ function warn(msg, id) {
+ $log.warn('createToolbar: ' + msg + ': [' + id + ']');
+ return null;
+ }
+
+ // ==================================
+
+ function createToolbar(id, opts) {
+ if (!id) return warn('no ID given');
+ if (tbars[id]) return warn('duplicate ID given', id);
+
+ var settings = angular.extend({}, defaultSettings, fs.isO(opts)),
+ items = {},
+ tbid = 'toolbar-' + id,
+ panel = ps.createPanel(tbid, settings),
+ arrowDiv = createArrow(panel),
+ currentRow = panel.append('div').classed('tbar-row', true),
+ rowButtonIds = [], // for removable buttons
+ tbWidth = arrowSize + 2, // empty toolbar width
+ maxWidth = panel.width();
+
+ arrowDiv.on('click', toggle);
+
+ // add a descriptor for this toolbar
+ tbars[id] = {
+ settings: settings,
+ items: items,
+ panel: panel,
+ panelId: tbid
+ };
+
+ panel.classed('toolbar', true)
+ .style('top', settings.top)
+ .style('bottom', settings.bottom);
+
+ // Helper functions
+
+ function dupId(id, caller) {
+ if (items[id]) {
+ $log.warn(caller + ': duplicate ID:', id);
+ return true;
+ }
+ return false;
+ }
+
+ function adjustWidth(btnWidth) {
+ if (fs.noPxStyle(currentRow, 'width') >= maxWidth) {
+ tbWidth += btnWidth;
+ maxWidth = tbWidth;
+ }
+ panel.width(tbWidth);
+ }
+
+ // API functions
+
+ function addButton(id, gid, cb, tooltip) {
+ if (dupId(id, 'addButton')) return null;
+
+ var bid = tbid + '-' + id,
+ btn = bns.button(currentRow, bid, gid, cb, tooltip);
+
+ items[id] = btn;
+ adjustWidth(btn.width());
+ return btn;
+ }
+
+ function addToggle(id, gid, initState, cb, tooltip) {
+ if (dupId(id, 'addToggle')) return null;
+
+ var tid = tbid + '-' + id,
+ tog = bns.toggle(currentRow, tid, gid, initState, cb, tooltip);
+
+ items[id] = tog;
+ adjustWidth(tog.width());
+ return tog;
+ }
+
+ function addRadioSet(id, rset) {
+ if (dupId(id, 'addRadioSet')) return null;
+
+ var rid = tbid + '-' + id,
+ rad = bns.radioSet(currentRow, rid, rset);
+
+ items[id] = rad;
+ adjustWidth(rad.width());
+ return rad;
+ }
+
+ function addSeparator() {
+ currentRow.append('div')
+ .classed('separator', true);
+ tbWidth += sepWidth;
+ }
+
+ function addRow() {
+ if (currentRow.select('div').empty()) {
+ return null;
+ } else {
+ panel.append('br');
+ currentRow = panel.append('div').classed('tbar-row', true);
+
+ // return API to allow caller more access to the row
+ return {
+ clear: rowClear,
+ setText: rowSetText,
+ addButton: rowAddButton,
+ classed: rowClassed
+ };
+ }
+ }
+
+ function rowClear() {
+ currentRow.selectAll('*').remove();
+ rowButtonIds.forEach(function (bid) {
+ delete items[bid];
+ });
+ rowButtonIds = [];
+ }
+
+ // installs a div with text into the button row
+ function rowSetText(text) {
+ rowClear();
+ currentRow.append('div').classed('tbar-row-text', true)
+ .html(text);
+ }
+
+ function rowAddButton(id, gid, cb, tooltip) {
+ var b = addButton(id, gid, cb, tooltip);
+ if (b) {
+ rowButtonIds.push(id);
+ }
+ }
+
+ function rowClassed(classes, bool) {
+ currentRow.classed(classes, bool);
+ }
+
+ function show(cb) {
+ rotateArrowLeft(arrowDiv);
+ panel.show(cb);
+ }
+
+ function hide(cb) {
+ rotateArrowRight(arrowDiv);
+ panel.hide(cb);
+ }
+
+ function toggle(cb) {
+ if (panel.isVisible()) {
+ hide(cb);
+ } else {
+ show(cb);
+ }
+ }
+
+ return {
+ addButton: addButton,
+ addToggle: addToggle,
+ addRadioSet: addRadioSet,
+ addSeparator: addSeparator,
+ addRow: addRow,
+
+ show: show,
+ hide: hide,
+ toggle: toggle
+ };
+ }
+
+ function destroyToolbar(id) {
+ var tb = tbars[id];
+ delete tbars[id];
+
+ if (tb) {
+ ps.destroyPanel(tb.panelId);
+ }
+ }
+
+ // === Module Definition ===
+
+ angular.module('onosWidget')
+ .factory('ToolbarService',
+ ['$log', 'FnService', 'PanelService', 'ButtonService', 'IconService',
+
+ function (_$log_, _fs_, _ps_, _bns_, _is_) {
+ $log = _$log_;
+ fs = _fs_;
+ ps = _ps_;
+ bns = _bns_;
+ is = _is_;
+
+ // this function is only used in testing
+ function init() {
+ tbars = {};
+ }
+
+ return {
+ init: init,
+ createToolbar: createToolbar,
+ destroyToolbar: destroyToolbar
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/tooltip.css b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/tooltip.css
new file mode 100644
index 00000000..f967793c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/tooltip.css
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Tooltip Service -- CSS file
+ */
+
+#tooltip {
+ text-align: center;
+ font-size: 80%;
+ border: 1px solid;
+ padding: 5px;
+ position: absolute;
+ z-index: 5000;
+ display: none;
+ pointer-events: none;
+}
+
+/* colors subject to change */
+
+.light #tooltip {
+ background-color: #ddd;
+ color: #444;
+ border-color: #ccc;
+}
+
+.dark #tooltip {
+ background-color: #151515;
+ color: #B2B2B2;
+ border-color: #252525;
+} \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/tooltip.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/tooltip.js
new file mode 100644
index 00000000..dd8a6950
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/tooltip.js
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Widget -- Tooltip Service
+ */
+
+(function () {
+ 'use strict';
+
+ // injected references
+ var $log, $rootScope, fs;
+
+ // constants
+ var hoverHeight = 35,
+ hoverDelay = 150,
+ exitDelay = 150;
+
+ // internal state
+ var tooltip, currElemId;
+
+ // === Helper functions ---------------------------------------------
+
+ function init() {
+ tooltip = d3.select('#tooltip');
+ tooltip.html('');
+ }
+
+ function tipStyle(mouseX, mouseY) {
+ var winWidth = fs.windowSize().width,
+ winHeight = fs.windowSize().height,
+ style = {
+ display: 'inline-block',
+ left: 'auto',
+ right: 'auto'
+ };
+
+ if (mouseX <= (winWidth / 2)) {
+ style.left = mouseX + 'px';
+ } else {
+ style.right = (winWidth - mouseX) + 'px';
+ }
+
+ if (mouseY <= (winHeight / 2)) {
+ style.top = (mouseY + (hoverHeight - 10)) + 'px';
+ } else {
+ style.top = (mouseY - hoverHeight) + 'px';
+ }
+
+ return style;
+ }
+
+ // === API functions ------------------------------------------------
+
+ function addTooltip(elem, tooltip) {
+ elem.on('mouseover', function () { showTooltip(this, tooltip); });
+ elem.on('mouseout', function () { cancelTooltip(this); });
+ $rootScope.$on('$routeChangeStart', function () {
+ cancelTooltip(elem.node());
+ });
+ }
+
+ function showTooltip(el, msg) {
+ // tooltips don't make sense on mobile devices
+ if (!el || !msg || fs.isMobile()) {
+ return;
+ }
+
+ var elem = d3.select(el),
+ mouseX = d3.event.pageX,
+ mouseY = d3.event.pageY,
+ style = tipStyle(mouseX, mouseY);
+ currElemId = elem.attr('id');
+
+ tooltip.transition()
+ .delay(hoverDelay)
+ .each('start', function () {
+ d3.select(this).style('display', 'none');
+ })
+ .each('end', function () {
+ d3.select(this).style(style)
+ .text(msg);
+ });
+ }
+
+ function cancelTooltip(el) {
+ if (!el) {
+ return;
+ }
+ var elem = d3.select(el);
+
+ if (elem.attr('id') === currElemId) {
+ tooltip.transition()
+ .delay(exitDelay)
+ .style({
+ display: 'none'
+ })
+ .text('');
+ }
+ }
+
+ angular.module('onosWidget')
+
+ .directive('tooltip', ['$rootScope', 'FnService',
+ function (_$rootScope_, _fs_) {
+ $rootScope = _$rootScope_;
+ fs = _fs_;
+
+ init();
+
+ return {
+ restrict: 'A',
+ link: function (scope, elem, attrs) {
+ addTooltip(d3.select(elem[0]), scope[attrs.ttMsg]);
+ }
+ };
+ }])
+
+ .factory('TooltipService', ['$log', '$rootScope', 'FnService',
+ function (_$log_, _$rootScope_, _fs_) {
+ $log = _$log_;
+ $rootScope = _$rootScope_;
+ fs = _fs_;
+
+ init();
+
+ return {
+ addTooltip: addTooltip,
+ showTooltip: showTooltip,
+ cancelTooltip: cancelTooltip
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/widget.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/widget.js
new file mode 100644
index 00000000..d11c8287
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/widget.js
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Widgets Module
+ */
+(function () {
+ 'use strict';
+
+ angular.module('onosWidget', []);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/onos.css b/framework/src/onos/web/gui/src/main/webapp/app/onos.css
new file mode 100644
index 00000000..b42af35e
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/onos.css
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- core -- CSS file
+ */
+
+html {
+ font-family: sans-serif;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+ height: 100%;
+}
+
+/*
+ overflow hidden is to ensure that the body does not expand to account
+ for any flyout panes, that are positioned "off screen".
+ */
+body {
+ height: 100%;
+ margin: 0;
+ overflow: hidden;
+}
+
+body.light {
+ background-color: white;
+}
+body.dark {
+ background-color: #2b2b2b;
+}
+
+#view {
+ padding: 6px;
+ width: 100%;
+ height: 100%;
+}
+
+#view h2 {
+ padding-left: 12px;
+}
+
+.light #view h2 {
+ color: #800;
+}
+.dark #view h2 {
+ color: #CE5650;
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/app/app.css b/framework/src/onos/web/gui/src/main/webapp/app/view/app/app.css
new file mode 100644
index 00000000..9413369a
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/app/app.css
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Host View -- CSS file
+ */
+
+#ov-app h2 {
+ display: inline-block;
+}
+
+#ov-app div.ctrl-btns {
+ width: 290px;
+}
+
+#ov-app form#inputFileForm,
+#ov-app input#uploadFile {
+ display: none;
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/app/app.html b/framework/src/onos/web/gui/src/main/webapp/app/view/app/app.html
new file mode 100644
index 00000000..85b044fb
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/app/app.html
@@ -0,0 +1,80 @@
+<!-- app partial HTML -->
+<div id="ov-app">
+ <div class="tabular-header">
+ <h2>Applications ({{tableData.length}} total)</h2>
+ <div class="ctrl-btns">
+ <div class="refresh" ng-class="{active: autoRefresh}"
+ icon icon-size="36" icon-id="refresh"
+ tooltip tt-msg="autoRefreshTip"
+ ng-click="toggleRefresh()"></div>
+ <div class="separator"></div>
+
+ <form id="inputFileForm">
+ <input id="uploadFile"
+ type="file" size="50" accept=".oar"
+ file-model="appFile">
+ </form>
+ <div icon icon-size="36" icon-id="plus"
+ class="active" trigger-form
+ tooltip tt-msg="uploadTip">
+ </div>
+ <div icon icon-size="36" icon-id="play"
+ ng-click="appAction('activate')"
+ tooltip tt-msg="activateTip"
+ ng-class="{active: ctrlBtnState.installed}">
+ </div>
+ <div icon icon-size="36" icon-id="stop"
+ ng-click="appAction('deactivate')"
+ tooltip tt-msg="deactivateTip"
+ ng-class="{active: ctrlBtnState.active}">
+ </div>
+ <div icon icon-size="36" icon-id="garbage"
+ ng-click="appAction('uninstall')"
+ tooltip tt-msg="uninstallTip"
+ ng-class="{active: ctrlBtnState.selection}">
+ </div>
+ </div>
+ </div>
+
+ <div class="summary-list" onos-table-resize>
+ <div ng-show="loading" class="loading-wheel"
+ icon icon-id="loading" icon-size="75"></div>
+
+ <div class="table-header" onos-sortable-header>
+ <table>
+ <tr>
+ <td colId="state" class="table-icon" sortable></td>
+ <td colId="id" sortable>App ID </td>
+ <td colId="version" sortable>Version </td>
+ <td colId="origin" sortable>Origin </td>
+ <td colId="desc" col-width="475px">Description </td>
+ </tr>
+ </table>
+ </div>
+
+ <div class="table-body">
+ <table onos-flash-changes id-prop="id">
+ <tr ng-if="!tableData.length" class="no-data">
+ <td colspan="5">
+ No Applications found
+ </td>
+ </tr>
+
+ <tr ng-repeat="app in tableData track by $index"
+ ng-click="selectCallback($event, app)"
+ ng-class="{selected: app.id === selId}"
+ ng-repeat-complete row-id="{{app.id}}">
+ <td class="table-icon">
+ <div icon icon-id="{{app._iconid_state}}"></div>
+ </td>
+ <td>{{app.id}}</td>
+ <td>{{app.version}}</td>
+ <td>{{app.origin}}</td>
+ <td>{{app.desc}}</td>
+ </tr>
+ </table>
+ </div>
+
+ </div>
+
+</div>
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/app/app.js b/framework/src/onos/web/gui/src/main/webapp/app/view/app/app.js
new file mode 100644
index 00000000..7cc081cb
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/app/app.js
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the 'License');
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an 'AS IS' BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- App View Module
+ */
+
+(function () {
+ 'use strict';
+
+ // constants
+ var INSTALLED = 'INSTALLED',
+ ACTIVE = 'ACTIVE',
+ APP_MGMENT_REQ = 'appManagementRequest',
+ FILE_UPLOAD_URL = 'applications/upload';
+
+ angular.module('ovApp', [])
+ .controller('OvAppCtrl',
+ ['$log', '$scope', '$http',
+ 'FnService', 'TableBuilderService', 'WebSocketService', 'UrlFnService',
+ 'KeyService',
+
+ function ($log, $scope, $http, fs, tbs, wss, ufs, ks) {
+ $scope.ctrlBtnState = {};
+ $scope.uploadTip = 'Upload an application (.oar file)';
+ $scope.activateTip = 'Activate selected application';
+ $scope.deactivateTip = 'Deactivate selected application';
+ $scope.uninstallTip = 'Uninstall selected application';
+
+ function selCb($event, row) {
+ // selId comes from tableBuilder
+ $scope.ctrlBtnState.selection = !!$scope.selId;
+ refreshCtrls();
+ }
+
+ function refreshCtrls() {
+ var row, rowIdx;
+ if ($scope.ctrlBtnState.selection) {
+ rowIdx = fs.find($scope.selId, $scope.tableData);
+ row = rowIdx >= 0 ? $scope.tableData[rowIdx] : null;
+
+ $scope.ctrlBtnState.installed = row && row.state === INSTALLED;
+ $scope.ctrlBtnState.active = row && row.state === ACTIVE;
+ } else {
+ $scope.ctrlBtnState.installed = false;
+ $scope.ctrlBtnState.active = false;
+ }
+ }
+
+ tbs.buildTable({
+ scope: $scope,
+ tag: 'app',
+ selCb: selCb,
+ respCb: refreshCtrls
+ });
+
+ // TODO: reexamine where keybindings should be - directive or controller?
+ ks.keyBindings({
+ esc: [$scope.selectCallback, 'Deselect app'],
+ _helpFormat: ['esc']
+ });
+ ks.gestureNotes([
+ ['click row', 'Select / deselect app'],
+ ['scroll down', 'See more apps']
+ ]);
+
+ $scope.appAction = function (action) {
+ if ($scope.ctrlBtnState.selection) {
+ $log.debug('Initiating ' + action + ' of ' + $scope.selId);
+ wss.sendEvent(APP_MGMENT_REQ, {
+ action: action,
+ name: $scope.selId,
+ sortCol: $scope.sortParams.sortCol,
+ sortDir: $scope.sortParams.sortDir
+ });
+ }
+ };
+
+ $scope.$on('FileChanged', function () {
+ var formData = new FormData();
+ if ($scope.appFile) {
+ formData.append('file', $scope.appFile);
+ $http.post(ufs.rsUrl(FILE_UPLOAD_URL), formData, {
+ transformRequest: angular.identity,
+ headers: {
+ 'Content-Type': undefined
+ }
+ })
+ .finally(function () {
+ $scope.sortCallback($scope.sortParams);
+ document.getElementById('inputFileForm').reset();
+ });
+ }
+ });
+
+ $scope.$on('$destroy', function () {
+ ks.unbindKeys();
+ });
+
+ $log.log('OvAppCtrl has been created');
+ }])
+
+ // triggers the input form to appear when button is clicked
+ .directive('triggerForm', function () {
+ return {
+ restrict: 'A',
+ link: function (scope, elem) {
+ elem.bind('click', function () {
+ document.getElementById('uploadFile')
+ .dispatchEvent(new MouseEvent('click'));
+ });
+ }
+ };
+ })
+
+ // binds the model file to the scope in scope.appFile
+ // sends upload request to the server
+ .directive('fileModel', ['$parse',
+ function ($parse) {
+ return {
+ restrict: 'A',
+ link: function (scope, elem, attrs) {
+ var model = $parse(attrs.fileModel),
+ modelSetter = model.assign;
+
+ elem.bind('change', function () {
+ scope.$apply(function () {
+ modelSetter(scope, elem[0].files[0]);
+ });
+ scope.$emit('FileChanged');
+ });
+ }
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/cluster/cluster.css b/framework/src/onos/web/gui/src/main/webapp/app/view/cluster/cluster.css
new file mode 100644
index 00000000..83ba8d87
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/cluster/cluster.css
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Cluster View -- CSS file
+ */
+
+#ov-cluster h2 {
+ display: inline-block;
+}
+
+#ov-cluster div.ctrl-btns {
+ width: 45px;
+} \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/cluster/cluster.html b/framework/src/onos/web/gui/src/main/webapp/app/view/cluster/cluster.html
new file mode 100644
index 00000000..c5048884
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/cluster/cluster.html
@@ -0,0 +1,68 @@
+<!--
+ ~ Copyright 2015 Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<!-- Cluster partial HTML -->
+<div id="ov-cluster">
+ <div class="tabular-header">
+ <h2>Cluster Nodes ({{tableData.length}} total)</h2>
+ <div class="ctrl-btns">
+ <div class="refresh" ng-class="{active: autoRefresh}"
+ icon icon-size="36" icon-id="refresh"
+ tooltip tt-msg="autoRefreshTip"
+ ng-click="toggleRefresh()"></div>
+ </div>
+ </div>
+
+ <div class="summary-list" onos-table-resize>
+ <div ng-show="loading" class="loading-wheel"
+ icon icon-id="loading" icon-size="75"></div>
+
+ <div class="table-header" onos-sortable-header>
+ <table>
+ <tr>
+ <td colId="_iconid_state" class="table-icon" sortable></td>
+ <td colId="id" sortable>ID </td>
+ <td colId="ip" sortable>IP Address </td>
+ <td colId="tcp" sortable>TCP Port </td>
+ <td colId="updated" sortable>Last Updated </td>
+ </tr>
+ </table>
+ </div>
+
+ <div class="table-body">
+ <table onos-flash-changes id-prop="id">
+ <tr ng-if="!tableData.length" class="no-data">
+ <td colspan="5">
+ No Cluster Nodes found
+ </td>
+ </tr>
+
+ <tr ng-repeat="node in tableData track by $index"
+ ng-repeat-complete row-id="{{node.id}}">
+ <td class="table-icon">
+ <div icon icon-id="{{node._iconid_state}}"></div>
+ </td>
+ <td>{{node.id}}</td>
+ <td>{{node.ip}}</td>
+ <td>{{node.tcp}}</td>
+ <td>{{node.updated}}</td>
+ </tr>
+ </table>
+ </div>
+
+ </div>
+
+</div>
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/cluster/cluster.js b/framework/src/onos/web/gui/src/main/webapp/app/view/cluster/cluster.js
new file mode 100644
index 00000000..006808c0
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/cluster/cluster.js
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Cluster View Module
+ */
+
+(function () {
+ 'use strict';
+
+ angular.module('ovCluster', [])
+ .controller('OvClusterCtrl',
+ ['$log', '$scope', 'TableBuilderService',
+
+ function ($log, $scope, tbs) {
+ tbs.buildTable({
+ scope: $scope,
+ tag: 'cluster'
+ });
+
+ $log.log('OvClusterCtrl has been created');
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/device/device.css b/framework/src/onos/web/gui/src/main/webapp/app/view/device/device.css
new file mode 100644
index 00000000..fc08f68b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/device/device.css
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Device View -- CSS file
+ */
+
+#ov-device h2 {
+ display: inline-block;
+}
+
+#ov-device div.ctrl-btns {
+ width: 240px;
+}
+
+/* More in generic panel.css */
+
+#device-details-panel.floatpanel {
+ -moz-border-radius: 0;
+ border-radius: 0;
+ z-index: 0;
+}
+
+.light #device-details-panel.floatpanel {
+ background-color: rgb(229, 234, 237);
+}
+.dark #device-details-panel.floatpanel {
+ background-color: #3A4042;
+}
+
+#device-details-panel .container {
+ padding: 0 12px;
+}
+
+#device-details-panel .close-btn {
+ position: absolute;
+ right: 10px;
+ top: 0;
+ cursor: pointer;
+}
+.light .close-btn svg.embeddedIcon .icon.plus .glyph {
+ fill: #aaa;
+}
+.dark .close-btn svg.embeddedIcon .icon.plus .glyph {
+ fill: #ccc;
+}
+
+#device-details-panel .dev-icon {
+ display: inline-block;
+ padding: 0 6px 0 0;
+ vertical-align: middle;
+}
+.light .dev-icon svg.embeddedIcon .glyph {
+ fill: rgb(0, 172, 229);
+}
+.dark .dev-icon svg.embeddedIcon .glyph {
+ fill: #486D91;
+}
+
+#device-details-panel h2 {
+ display: inline-block;
+ margin: 8px 0;
+}
+
+#device-details-panel .top div.left {
+ float: left;
+ padding: 0 18px 0 0;
+}
+#device-details-panel .top div.right {
+ display: inline-block;
+}
+
+#device-details-panel td.label {
+ font-style: italic;
+ padding-right: 12px;
+ /* works for both light and dark themes ... */
+ color: #777;
+}
+
+#device-details-panel .actionBtns div {
+ padding: 12px 6px;
+}
+
+#device-details-panel .top hr {
+ width: 95%;
+ margin: 0 auto;
+}
+
+.light #device-details-panel hr {
+ opacity: .5;
+ border-color: #FFF;
+}
+.dark #device-details-panel hr {
+ border-color: #666;
+}
+
+#device-details-panel .bottom table {
+ border-spacing: 0;
+}
+
+#device-details-panel .bottom th {
+ letter-spacing: 0.02em;
+}
+
+.light #device-details-panel .bottom th {
+ background-color: #CCC;
+ /* default text color */
+}
+.dark #device-details-panel .bottom th {
+ background-color: #131313;
+ color: #ccc;
+}
+
+#device-details-panel .bottom th,
+#device-details-panel .bottom td {
+ padding: 6px 12px;
+ text-align: center;
+}
+
+.light #device-details-panel .bottom tr:nth-child(odd) {
+ background-color: #f9f9f9;
+}
+.light #device-details-panel .bottom tr:nth-child(even) {
+ background-color: #EBEDF2;
+}
+.dark #device-details-panel .bottom tr:nth-child(odd) {
+ background-color: #333;
+}
+.dark #device-details-panel .bottom tr:nth-child(even) {
+ background-color: #555;
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/device/device.html b/framework/src/onos/web/gui/src/main/webapp/app/view/device/device.html
new file mode 100644
index 00000000..5d51d1d4
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/device/device.html
@@ -0,0 +1,82 @@
+<!-- Device partial HTML -->
+<div id="ov-device">
+ <div class="tabular-header">
+ <h2>Devices ({{tableData.length}} total)</h2>
+ <div class="ctrl-btns">
+ <div class="refresh" ng-class="{active: autoRefresh}"
+ icon icon-id="refresh" icon-size="36"
+ tooltip tt-msg="autoRefreshTip"
+ ng-click="toggleRefresh()"></div>
+ <div class="separator"></div>
+
+ <div ng-class="{active: !!selId}"
+ icon icon-id="flowTable" icon-size="36"
+ tooltip tt-msg="flowTip"
+ ng-click="nav('flow')"></div>
+
+ <div ng-class="{active: !!selId}"
+ icon icon-id="portTable" icon-size="36"
+ tooltip tt-msg="portTip"
+ ng-click="nav('port')"></div>
+
+ <div ng-class="{active: !!selId}"
+ icon icon-id="groupTable" icon-size="36"
+ tooltip tt-msg="groupTip"
+ ng-click="nav('group')"></div>
+ </div>
+ </div>
+
+ <div class="summary-list" onos-table-resize>
+ <div ng-show="loading" class="loading-wheel"
+ icon icon-id="loading" icon-size="75"></div>
+
+ <div class="table-header" onos-sortable-header>
+ <table>
+ <tr>
+ <td colId="available" class="table-icon" sortable></td>
+ <td colId="type" class="table-icon" sortable></td>
+ <td colId="id" sortable>Device ID </td>
+ <td colId="masterid" sortable>Master Instance </td>
+ <td colId="num_ports" sortable>Ports </td>
+ <td colId="mfr" sortable>Vendor </td>
+ <td colId="hw" sortable>H/W Version </td>
+ <td colId="sw" sortable>S/W Version </td>
+ <td colId="protocol" sortable>Protocol </td>
+ </tr>
+ </table>
+ </div>
+
+ <div class="table-body">
+ <table onos-flash-changes id-prop="id">
+ <tr ng-if="!tableData.length" class="no-data">
+ <td colspan="9">
+ No Devices found
+ </td>
+ </tr>
+
+ <tr ng-repeat="dev in tableData track by $index"
+ ng-click="selectCallback($event, dev)"
+ ng-class="{selected: dev.id === selId}"
+ ng-repeat-complete row-id="{{dev.id}}">
+ <td class="table-icon">
+ <div icon icon-id="{{dev._iconid_available}}"></div>
+ </td>
+ <td class="table-icon">
+ <div icon icon-id="{{dev._iconid_type}}"></div>
+ </td>
+ <td>{{dev.id}}</td>
+ <td>{{dev.masterid}}</td>
+ <td>{{dev.num_ports}}</td>
+ <td>{{dev.mfr}}</td>
+ <td>{{dev.hw}}</td>
+ <td>{{dev.sw}}</td>
+ <td>{{dev.protocol}}</td>
+ </tr>
+ </table>
+ </div>
+
+ </div>
+
+ <device-details-panel></device-details-panel>
+
+</div>
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/device/device.js b/framework/src/onos/web/gui/src/main/webapp/app/view/device/device.js
new file mode 100644
index 00000000..7a2dc4f9
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/device/device.js
@@ -0,0 +1,319 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Device View Module
+ */
+
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, $scope, $location, fs, mast, ps, wss, is, ns;
+
+ // internal state
+ var detailsPanel,
+ pStartY, pHeight,
+ top, bottom, iconDiv,
+ wSize;
+
+ // constants
+ var topPdg = 13,
+ ctnrPdg = 24,
+ scrollSize = 17,
+ portsTblPdg = 50,
+
+ pName = 'device-details-panel',
+ detailsReq = 'deviceDetailsRequest',
+ detailsResp = 'deviceDetailsResponse',
+
+ propOrder = [
+ 'type', 'masterid', 'chassisid',
+ 'mfr', 'hw', 'sw', 'protocol', 'serial'
+ ],
+ friendlyProps = [
+ 'Type', 'Master ID', 'Chassis ID',
+ 'Vendor', 'H/W Version', 'S/W Version', 'Protocol', 'Serial #'
+ ],
+ portCols = [
+ 'enabled', 'id', 'speed', 'type', 'elinks_dest', 'name'
+ ],
+ friendlyPortCols = [
+ 'Enabled', 'ID', 'Speed', 'Type', 'Egress Links', 'Name'
+ ];
+
+ function closePanel() {
+ if (detailsPanel.isVisible()) {
+ $scope.selId = null;
+ detailsPanel.hide();
+ }
+ }
+
+ function addCloseBtn(div) {
+ is.loadEmbeddedIcon(div, 'plus', 30);
+ div.select('g').attr('transform', 'translate(25, 0) rotate(45)');
+ div.on('click', closePanel);
+ }
+
+ function setUpPanel() {
+ var container, closeBtn, tblDiv;
+ detailsPanel.empty();
+
+ container = detailsPanel.append('div').classed('container', true);
+
+ top = container.append('div').classed('top', true);
+ closeBtn = top.append('div').classed('close-btn', true);
+ addCloseBtn(closeBtn);
+ iconDiv = top.append('div').classed('dev-icon', true);
+ top.append('h2');
+
+ tblDiv = top.append('div').classed('top-tables', true);
+ tblDiv.append('div').classed('left', true).append('table');
+ tblDiv.append('div').classed('right', true).append('table');
+
+ top.append('hr');
+
+ bottom = container.append('div').classed('bottom', true);
+ bottom.append('h2').classed('ports-title', true).html('Ports');
+ bottom.append('table');
+ }
+
+ function addProp(tbody, index, value) {
+ var tr = tbody.append('tr');
+
+ function addCell(cls, txt) {
+ tr.append('td').attr('class', cls).html(txt);
+ }
+ addCell('label', friendlyProps[index] + ' :');
+ addCell('value', value);
+ }
+
+ function populateTop(tblDiv, details) {
+ var leftTbl = tblDiv.select('.left')
+ .select('table')
+ .append('tbody'),
+ rightTbl = tblDiv.select('.right')
+ .select('table')
+ .append('tbody');
+
+ is.loadEmbeddedIcon(iconDiv, details._iconid_type, 40);
+ top.select('h2').html(details.id);
+
+ propOrder.forEach(function (prop, i) {
+ // properties are split into two tables
+ addProp(i < 3 ? leftTbl : rightTbl, i, details[prop]);
+ });
+ }
+
+ function addPortRow(tbody, port) {
+ var tr = tbody.append('tr');
+
+ portCols.forEach(function (col) {
+ tr.append('td').html(port[col]);
+ });
+ }
+
+ function populateBottom(table, ports) {
+ var theader = table.append('thead').append('tr'),
+ tbody = table.append('tbody'),
+ tbWidth, tbHeight;
+
+ friendlyPortCols.forEach(function (col) {
+ theader.append('th').html(col);
+ });
+ ports.forEach(function (port) {
+ addPortRow(tbody, port);
+ });
+
+ tbWidth = fs.noPxStyle(tbody, 'width') + scrollSize;
+ tbHeight = pHeight
+ - (fs.noPxStyle(detailsPanel.el()
+ .select('.top'), 'height')
+ + fs.noPxStyle(detailsPanel.el()
+ .select('.ports-title'), 'height')
+ + portsTblPdg);
+
+ table.style({
+ height: tbHeight + 'px',
+ width: tbWidth + 'px',
+ overflow: 'auto',
+ display: 'block'
+ });
+
+ detailsPanel.width(tbWidth + ctnrPdg);
+ }
+
+ function populateDetails(details) {
+ var topTbs, btmTbl, ports;
+ setUpPanel();
+
+ topTbs = top.select('.top-tables');
+ btmTbl = bottom.select('table');
+ ports = details.ports;
+
+ populateTop(topTbs, details);
+ populateBottom(btmTbl, ports);
+
+ detailsPanel.height(pHeight);
+ }
+
+ function respDetailsCb(data) {
+ $scope.panelData = data.details;
+ $scope.$apply();
+ }
+
+ function createDetailsPane() {
+ detailsPanel = ps.createPanel(pName, {
+ width: wSize.width,
+ margin: 0,
+ hideMargin: 0
+ });
+ detailsPanel.el().style({
+ position: 'absolute',
+ top: pStartY + 'px'
+ });
+ $scope.hidePanel = function () { detailsPanel.hide(); };
+ detailsPanel.hide();
+ }
+
+ angular.module('ovDevice', [])
+ .controller('OvDeviceCtrl',
+ ['$log', '$scope', '$location', 'TableBuilderService', 'FnService',
+ 'MastService', 'PanelService', 'WebSocketService', 'IconService',
+ 'NavService',
+
+ function (_$log_, _$scope_, _$location_,
+ tbs, _fs_, _mast_, _ps_, _wss_, _is_, _ns_) {
+ $log = _$log_;
+ $scope = _$scope_;
+ $location = _$location_;
+ fs = _fs_;
+ mast = _mast_;
+ ps = _ps_;
+ wss = _wss_;
+ is = _is_;
+ ns = _ns_;
+ var params = $location.search(),
+ handlers = {};
+ $scope.panelData = {};
+ $scope.flowTip = 'Show flow view for selected device';
+ $scope.portTip = 'Show port view for selected device';
+ $scope.groupTip = 'Show group view for selected device';
+
+ // details panel handlers
+ handlers[detailsResp] = respDetailsCb;
+ wss.bindHandlers(handlers);
+
+ // query for if a certain device needs to be highlighted
+ if (params.hasOwnProperty('devId')) {
+ $scope.selId = params['devId'];
+ wss.sendEvent(detailsReq, { id: $scope.selId });
+ }
+
+ function selCb($event, row) {
+ if ($scope.selId) {
+ wss.sendEvent(detailsReq, { id: row.id });
+ } else {
+ $scope.hidePanel();
+ }
+ $log.debug('Got a click on:', row);
+ }
+
+ tbs.buildTable({
+ scope: $scope,
+ tag: 'device',
+ selCb: selCb
+ });
+
+ $scope.nav = function (path) {
+ if ($scope.selId) {
+ ns.navTo(path, { devId: $scope.selId });
+ }
+ };
+
+ $scope.$on('$destroy', function () {
+ wss.unbindHandlers(handlers);
+ });
+
+ $log.log('OvDeviceCtrl has been created');
+ }])
+
+ .directive('deviceDetailsPanel',
+ ['$rootScope', '$window', '$timeout', 'KeyService',
+ function ($rootScope, $window, $timeout, ks) {
+ return function (scope) {
+ var unbindWatch;
+
+ function heightCalc() {
+ pStartY = fs.noPxStyle(d3.select('.tabular-header'), 'height')
+ + mast.mastHeight() + topPdg;
+ wSize = fs.windowSize(pStartY);
+ pHeight = wSize.height;
+ }
+
+ function initPanel() {
+ heightCalc();
+ createDetailsPane();
+ }
+
+ // Safari has a bug where it renders the fixed-layout table wrong
+ // if you ask for the window's size too early
+ if (scope.onos.browser === 'safari') {
+ $timeout(initPanel);
+ } else {
+ initPanel();
+ }
+ // create key bindings to handle panel
+ ks.keyBindings({
+ esc: [closePanel, 'Close the details panel'],
+ _helpFormat: ['esc']
+ });
+ ks.gestureNotes([
+ ['click', 'Select a row to show device details'],
+ ['scroll down', 'See more devices']
+ ]);
+
+ // if the panelData changes
+ scope.$watch('panelData', function () {
+ if (!fs.isEmptyObject(scope.panelData)) {
+ populateDetails(scope.panelData);
+ detailsPanel.show();
+ }
+ });
+
+ // if the window size changes
+ unbindWatch = $rootScope.$watchCollection(
+ function () {
+ return {
+ h: $window.innerHeight,
+ w: $window.innerWidth
+ };
+ }, function () {
+ if (!fs.isEmptyObject(scope.panelData)) {
+ heightCalc();
+ populateDetails(scope.panelData);
+ }
+ }
+ );
+
+ scope.$on('$destroy', function () {
+ unbindWatch();
+ ks.unbindKeys();
+ ps.destroyPanel(pName);
+ });
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/flow/flow.css b/framework/src/onos/web/gui/src/main/webapp/app/view/flow/flow.css
new file mode 100644
index 00000000..4aa96210
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/flow/flow.css
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Flow View -- CSS file
+ */
+
+#ov-flow h2 {
+ display: inline-block;
+}
+
+#ov-flow div.ctrl-btns {
+ width: 240px;
+}
+
+.light #ov-flow .current-view use {
+ fill: white;
+}
+.dark #ov-flow .current-view use {
+ fill: #304860;
+}
+
+.light #ov-flow .current-view rect {
+ fill: deepskyblue;
+}
+.dark #ov-flow .current-view rect {
+ fill: #eee;
+}
+
+.light #ov-flow tr:nth-child(6n + 1),
+.light #ov-flow tr:nth-child(6n + 2),
+.light #ov-flow tr:nth-child(6n + 3) {
+ background-color: #eee;
+}
+.light #ov-flow tr:nth-child(6n + 4),
+.light #ov-flow tr:nth-child(6n + 5),
+.light #ov-flow tr:nth-child(6n) {
+ background-color: #ddd;
+}
+.dark #ov-flow tr:nth-child(6n + 1),
+.dark #ov-flow tr:nth-child(6n + 2),
+.dark #ov-flow tr:nth-child(6n + 3) {
+ background-color: #444;
+}
+.dark #ov-flow tr:nth-child(6n + 4),
+.dark #ov-flow tr:nth-child(6n + 5),
+.dark #ov-flow tr:nth-child(6n) {
+ background-color: #333;
+}
+
+/* highlighted color */
+.light #ov-flow tr:nth-child(6n + 1).data-change,
+.light #ov-flow tr:nth-child(6n + 2).data-change,
+.light #ov-flow tr:nth-child(6n + 3).data-change,
+.light #ov-flow tr:nth-child(6n + 4).data-change,
+.light #ov-flow tr:nth-child(6n + 5).data-change,
+.light #ov-flow tr:nth-child(6n).data-change {
+ background-color: #FDFFDC;
+}
+.dark #ov-flow tr:nth-child(6n + 1).data-change,
+.dark #ov-flow tr:nth-child(6n + 2).data-change,
+.dark #ov-flow tr:nth-child(6n + 3).data-change,
+.dark #ov-flow tr:nth-child(6n + 4).data-change,
+.dark #ov-flow tr:nth-child(6n + 5).data-change,
+.dark #ov-flow tr:nth-child(6n).data-change {
+ background-color: #5A5600;
+}
+
+#ov-flow td.selector,
+#ov-flow td.treatment {
+ padding-left: 36px;
+ opacity: 0.65;
+} \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/flow/flow.html b/framework/src/onos/web/gui/src/main/webapp/app/view/flow/flow.html
new file mode 100644
index 00000000..5fce98cf
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/flow/flow.html
@@ -0,0 +1,84 @@
+<!-- Flow partial HTML -->
+<div id="ov-flow">
+ <div class="tabular-header">
+ <h2>
+ Flows for Device {{devId || "(No device selected)"}}
+ ({{tableData.length}} total)
+ </h2>
+ <div class="ctrl-btns">
+ <div class="refresh" ng-class="{active: autoRefresh}"
+ icon icon-size="36" icon-id="refresh"
+ tooltip tt-msg="autoRefreshTip"
+ ng-click="toggleRefresh()"></div>
+
+ <div class="separator"></div>
+
+ <div class="current-view"
+ icon icon-id="flowTable" icon-size="36"></div>
+
+ <div class="active"
+ icon icon-id="portTable" icon-size="36"
+ tooltip tt-msg="portTip"
+ ng-click="nav('port')"></div>
+
+ <div class="active"
+ icon icon-id="groupTable" icon-size="36"
+ tooltip tt-msg="groupTip"
+ ng-click="nav('group')"></div>
+ </div>
+ </div>
+
+ <div class="summary-list" onos-table-resize>
+ <div ng-show="loading" class="loading-wheel"
+ icon icon-id="loading" icon-size="75"></div>
+
+ <div class="table-header" onos-sortable-header>
+ <table>
+ <tr>
+ <td colId="id" col-width="180px" sortable>Flow ID </td>
+ <td colId="appId" sortable>App ID </td>
+ <td colId="groupId" sortable>Group ID </td>
+ <td colId="tableId" sortable>Table ID </td>
+ <td colId="priority" sortable>Priority </td>
+ <td colId="timeout" sortable>Timeout </td>
+ <td colId="permanent" sortable>Permanent </td>
+ <td colId="state" sortable>State </td>
+ <td colId="packets" sortable>Packets </td>
+ <td colId="bytes" sortable>Bytes </td>
+ </tr>
+ </table>
+ </div>
+
+ <div class="table-body">
+ <table onos-flash-changes id-prop="id">
+ <tr ng-if="!tableData.length" class="no-data">
+ <td colspan="10">
+ No Flows found
+ </td>
+ </tr>
+
+ <tr ng-repeat-start="flow in tableData track by $index"
+ ng-repeat-complete row-id="{{flow.id}}">
+ <td>{{flow.id}}</td>
+ <td>{{flow.appId}}</td>
+ <td>{{flow.groupId}}</td>
+ <td>{{flow.tableId}}</td>
+ <td>{{flow.priority}}</td>
+ <td>{{flow.timeout}}</td>
+ <td>{{flow.permanent}}</td>
+ <td>{{flow.state}}</td>
+ <td>{{flow.packets}}</td>
+ <td>{{flow.bytes}}</td>
+ </tr>
+ <tr row-id="{{flow.id}}">
+ <td class="selector" colspan="10">{{flow.selector}}</td>
+ </tr>
+ <tr row-id="{{flow.id}}" ng-repeat-end>
+ <td class="treatment" colspan="10">{{flow.treatment}}</td>
+ </tr>
+ </table>
+ </div>
+
+ </div>
+
+</div>
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/flow/flow.js b/framework/src/onos/web/gui/src/main/webapp/app/view/flow/flow.js
new file mode 100644
index 00000000..15678d5e
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/flow/flow.js
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Flow View Module
+ */
+
+(function () {
+ 'use strict';
+
+ // injected references
+ var $log, $scope, $location, fs, tbs, ns;
+
+ angular.module('ovFlow', [])
+ .controller('OvFlowCtrl',
+ ['$log', '$scope', '$location',
+ 'FnService', 'TableBuilderService', 'NavService',
+
+ function (_$log_, _$scope_, _$location_, _fs_, _tbs_, _ns_) {
+ var params;
+ $log = _$log_;
+ $scope = _$scope_;
+ $location = _$location_;
+ fs = _fs_;
+ tbs = _tbs_;
+ ns = _ns_;
+ $scope.portTip = 'Show port view for this device';
+ $scope.groupTip = 'Show group view for this device';
+
+ params = $location.search();
+ if (params.hasOwnProperty('devId')) {
+ $scope.devId = params['devId'];
+ }
+
+ tbs.buildTable({
+ scope: $scope,
+ tag: 'flow',
+ query: params
+ });
+
+ $scope.nav = function (path) {
+ if ($scope.devId) {
+ ns.navTo(path, { devId: $scope.devId });
+ }
+ };
+
+ $log.log('OvFlowCtrl has been created');
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/group/group.css b/framework/src/onos/web/gui/src/main/webapp/app/view/group/group.css
new file mode 100644
index 00000000..42f1c31d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/group/group.css
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Group View -- CSS file
+ */
+
+#ov-group h2 {
+ display: inline-block;
+}
+
+#ov-group div.ctrl-btns {
+ width: 240px;
+}
+
+.light #ov-group .current-view use {
+ fill: white;
+}
+.dark #ov-group .current-view use {
+ fill: #304860;
+}
+
+.light #ov-group .current-view rect {
+ fill: deepskyblue;
+}
+.dark #ov-group .current-view rect {
+ fill: #eee;
+}
+
+.light #ov-group tr:nth-child(4n + 1),
+.light #ov-group tr:nth-child(4n + 2) {
+ background-color: #eee;
+}
+.light #ov-group tr:nth-child(4n + 3),
+.light #ov-group tr:nth-child(4n) {
+ background-color: #ddd;
+}
+.dark #ov-group tr:nth-child(4n + 1),
+.dark #ov-group tr:nth-child(4n + 2) {
+ background-color: #444;
+}
+.dark #ov-group tr:nth-child(4n + 3),
+.dark #ov-group tr:nth-child(4n) {
+ background-color: #333;
+}
+
+/* highlighted color */
+.light #ov-group tr:nth-child(4n + 1).data-change,
+.light #ov-group tr:nth-child(4n + 2).data-change,
+.light #ov-group tr:nth-child(4n + 3).data-change,
+.light #ov-group tr:nth-child(4n).data-change {
+ background-color: #FDFFDC;
+}
+.dark #ov-group tr:nth-child(4n + 1).data-change,
+.dark #ov-group tr:nth-child(4n + 2).data-change,
+.dark #ov-group tr:nth-child(4n + 3).data-change,
+.dark #ov-group tr:nth-child(4n).data-change {
+ background-color: #5A5600;
+}
+
+#ov-group td.buckets {
+ padding-left: 36px;
+ opacity: 0.65;
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/group/group.html b/framework/src/onos/web/gui/src/main/webapp/app/view/group/group.html
new file mode 100644
index 00000000..b963f469
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/group/group.html
@@ -0,0 +1,90 @@
+<!--
+ ~ Copyright 2015 Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<!-- Group partial HTML -->
+<div id="ov-group">
+ <div class="tabular-header">
+ <h2>
+ Groups for Device {{devId || "(No device selected)"}}
+ ({{tableData.length}} total)
+ </h2>
+ <div class="ctrl-btns">
+ <div class="refresh" ng-class="{active: autoRefresh}"
+ icon icon-size="36" icon-id="refresh"
+ tooltip tt-msg="autoRefreshTip"
+ ng-click="toggleRefresh()"></div>
+
+ <div class="separator"></div>
+
+ <div class="active"
+ icon icon-id="flowTable" icon-size="36"
+ tooltip tt-msg="flowTip"
+ ng-click="nav('flow')"></div>
+
+ <div class="active"
+ icon icon-id="portTable" icon-size="36"
+ tooltip tt-msg="portTip"
+ ng-click="nav('port')"></div>
+
+ <div class="current-view"
+ icon icon-id="groupTable" icon-size="36"></div>
+ </div>
+ </div>
+
+ <div class="summary-list" onos-table-resize>
+ <div ng-show="loading" class="loading-wheel"
+ icon icon-id="loading" icon-size="75"></div>
+
+ <div class="table-header" onos-sortable-header>
+ <table>
+ <tr>
+ <td colId="id" sortable>Group ID </td>
+ <td colId="app_id" sortable>App ID </td>
+ <td colId="state" sortable>State </td>
+ <td colId="type" sortable>Type </td>
+ <td colId="packets" sortable>Packets </td>
+ <td colId="bytes" sortable>Bytes </td>
+ </tr>
+ </table>
+ </div>
+
+ <div class="table-body">
+ <table onos-flash-changes id-prop="id">
+ <tr ng-if="!tableData.length" class="no-data">
+ <td colspan="6">
+ No Groups found
+ </td>
+ </tr>
+
+ <tr ng-repeat-start="group in tableData track by $index"
+ ng-repeat-complete row-id="{{group.id}}">
+ <td>{{group.id}}</td>
+ <td>{{group.app_id}}</td>
+ <td>{{group.state}}</td>
+ <td>{{group.type}}</td>
+ <td>{{group.packets}}</td>
+ <td>{{group.bytes}}</td>
+ </tr>
+ <tr row-id="{{group.id}}" ng-repeat-end>
+ <td class="buckets" colspan="6"
+ ng-bind-html="group.buckets"></td>
+ </tr>
+ </table>
+ </div>
+
+ </div>
+
+</div>
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/group/group.js b/framework/src/onos/web/gui/src/main/webapp/app/view/group/group.js
new file mode 100644
index 00000000..2510190b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/group/group.js
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Group View Module
+ */
+
+(function () {
+ 'use strict';
+
+ // injected references
+ var $log, $scope, $location, fs, tbs, ns;
+
+ angular.module('ovGroup', [])
+ .controller('OvGroupCtrl',
+ ['$log', '$scope', '$location', '$sce',
+ 'FnService', 'TableBuilderService', 'NavService',
+
+ function (_$log_, _$scope_, _$location_, $sce, _fs_, _tbs_, _ns_) {
+ var params;
+ $log = _$log_;
+ $scope = _$scope_;
+ $location = _$location_;
+ fs = _fs_;
+ tbs = _tbs_;
+ ns = _ns_;
+ $scope.flowTip = 'Show flow view for this device';
+ $scope.portTip = 'Show port view for this device';
+
+ params = $location.search();
+ if (params.hasOwnProperty('devId')) {
+ $scope.devId = params['devId'];
+ }
+
+ tbs.buildTable({
+ scope: $scope,
+ tag: 'group',
+ query: params
+ });
+
+ $scope.$watch('tableData', function () {
+ if (!fs.isEmptyObject($scope.tableData)) {
+ $scope.tableData.forEach(function (group) {
+ group.buckets = $sce.trustAsHtml(group.buckets);
+ });
+ }
+ });
+
+ $scope.nav = function (path) {
+ if ($scope.devId) {
+ ns.navTo(path, { devId: $scope.devId });
+ }
+ };
+
+ $log.log('OvGroupCtrl has been created');
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/host/host.css b/framework/src/onos/web/gui/src/main/webapp/app/view/host/host.css
new file mode 100644
index 00000000..60672759
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/host/host.css
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Host View -- CSS file
+ */
+
+#ov-host h2 {
+ display: inline-block;
+}
+
+#ov-host div.ctrl-btns {
+ width: 45px;
+} \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/host/host.html b/framework/src/onos/web/gui/src/main/webapp/app/view/host/host.html
new file mode 100644
index 00000000..19a7ee1d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/host/host.html
@@ -0,0 +1,54 @@
+<!-- Host partial HTML -->
+<div id="ov-host">
+ <div class="tabular-header">
+ <h2>Hosts ({{tableData.length}} total)</h2>
+ <div class="ctrl-btns">
+ <div class="refresh" ng-class="{active: autoRefresh}"
+ icon icon-size="36" icon-id="refresh"
+ tooltip tt-msg="autoRefreshTip"
+ ng-click="toggleRefresh()"></div>
+ </div>
+ </div>
+
+ <div class="summary-list" onos-table-resize>
+ <div ng-show="loading" class="loading-wheel"
+ icon icon-id="loading" icon-size="75"></div>
+
+ <div class="table-header" onos-sortable-header>
+ <table>
+ <tr>
+ <td colId="type" class="table-icon" sortable></td>
+ <td colId="id" sortable>Host ID </td>
+ <td colId="mac" sortable>MAC Address </td>
+ <td colId="vlan" sortable>VLAN ID </td>
+ <td colId="ips" sortable>IP Addresses </td>
+ <td colId="location" sortable>Location </td>
+ </tr>
+ </table>
+ </div>
+
+ <div class="table-body">
+ <table onos-flash-changes id-prop="id">
+ <tr ng-if="!tableData.length" class="no-data">
+ <td colspan="6">
+ No Hosts found
+ </td>
+ </tr>
+
+ <tr ng-repeat="host in tableData track by $index"
+ ng-repeat-complete row-id="{{host.id}}">
+ <td class="table-icon">
+ <div icon icon-id="{{host._iconid_type}}"></div>
+ </td>
+ <td>{{host.id}}</td>
+ <td>{{host.mac}}</td>
+ <td>{{host.vlan}}</td>
+ <td>{{host.ips}}</td>
+ <td>{{host.location}}</td>
+ </tr>
+ </table>
+ </div>
+
+ </div>
+
+</div>
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/host/host.js b/framework/src/onos/web/gui/src/main/webapp/app/view/host/host.js
new file mode 100644
index 00000000..1ccca401
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/host/host.js
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Host View Module
+ */
+
+(function () {
+ 'use strict';
+
+ angular.module('ovHost', [])
+ .controller('OvHostCtrl',
+ ['$log', '$scope', 'TableBuilderService',
+
+ function ($log, $scope, tbs) {
+ tbs.buildTable({
+ scope: $scope,
+ tag: 'host'
+ });
+
+ $log.log('OvHostCtrl has been created');
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/intent/intent.css b/framework/src/onos/web/gui/src/main/webapp/app/view/intent/intent.css
new file mode 100644
index 00000000..ed9cd48d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/intent/intent.css
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Intent View -- CSS file
+ */
+
+#ov-intent h2 {
+ display: inline-block;
+}
+
+#ov-intent div.ctrl-btns {
+ width: 45px;
+}
+
+.light #ov-intent tr:nth-child(6n + 1),
+.light #ov-intent tr:nth-child(6n + 2),
+.light #ov-intent tr:nth-child(6n + 3) {
+ background-color: #eee;
+}
+.light #ov-intent tr:nth-child(6n + 4),
+.light #ov-intent tr:nth-child(6n + 5),
+.light #ov-intent tr:nth-child(6n) {
+ background-color: #ddd;
+}
+.dark #ov-intent tr:nth-child(6n + 1),
+.dark #ov-intent tr:nth-child(6n + 2),
+.dark #ov-intent tr:nth-child(6n + 3) {
+ background-color: #444;
+}
+.dark #ov-intent tr:nth-child(6n + 4),
+.dark #ov-intent tr:nth-child(6n + 5),
+.dark #ov-intent tr:nth-child(6n) {
+ background-color: #333;
+}
+
+.light #ov-intent tr:nth-child(6n + 1).data-change,
+.light #ov-intent tr:nth-child(6n + 2).data-change,
+.light #ov-intent tr:nth-child(6n + 3).data-change,
+.light #ov-intent tr:nth-child(6n + 4).data-change,
+.light #ov-intent tr:nth-child(6n + 5).data-change,
+.light #ov-intent tr:nth-child(6n).data-change {
+ background-color: #FDFFDC;
+}
+.dark #ov-intent tr:nth-child(6n + 1).data-change,
+.dark #ov-intent tr:nth-child(6n + 2).data-change,
+.dark #ov-intent tr:nth-child(6n + 3).data-change,
+.dark #ov-intent tr:nth-child(6n + 4).data-change,
+.dark #ov-intent tr:nth-child(6n + 5).data-change,
+.dark #ov-intent tr:nth-child(6n).data-change {
+ background-color: #5A5600;
+}
+
+#ov-intent td.resources,
+#ov-intent td.details {
+ padding-left: 36px;
+ opacity: 0.65;
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/intent/intent.html b/framework/src/onos/web/gui/src/main/webapp/app/view/intent/intent.html
new file mode 100644
index 00000000..4883beed
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/intent/intent.html
@@ -0,0 +1,72 @@
+<!--
+ ~ Copyright 2015 Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<!-- Intent partial HTML -->
+<div id="ov-intent">
+ <div class="tabular-header">
+ <h2>Intents ({{tableData.length}} total)</h2>
+ <div class="ctrl-btns">
+ <div class="refresh" ng-class="{active: autoRefresh}"
+ icon icon-size="36" icon-id="refresh"
+ tooltip tt-msg="autoRefreshTip"
+ ng-click="toggleRefresh()"></div>
+ </div>
+ </div>
+
+ <div class="summary-list" onos-table-resize>
+ <div ng-show="loading" class="loading-wheel"
+ icon icon-id="loading" icon-size="75"></div>
+
+ <div class="table-header" onos-sortable-header>
+ <table>
+ <tr>
+ <td colId="appId" sortable>Application ID </td>
+ <td colId="key" sortable>Key </td>
+ <td colId="type" sortable>Type </td>
+ <td colId="priority" sortable>Priority </td>
+ <td colId="state" sortable>State </td>
+ </tr>
+ </table>
+ </div>
+
+ <div class="table-body">
+ <table onos-flash-changes id-prop="key">
+ <tr ng-if="!tableData.length" class="no-data">
+ <td colspan="5">
+ No Intents found
+ </td>
+ </tr>
+
+ <tr ng-repeat-start="intent in tableData track by $index"
+ ng-repeat-complete row-id="{{intent.key}}">
+ <td>{{intent.appId}}</td>
+ <td>{{intent.key}}</td>
+ <td>{{intent.type}}</td>
+ <td>{{intent.priority}}</td>
+ <td>{{intent.state}}</td>
+ </tr>
+ <tr row-id="{{intent.key}}">
+ <td class="resources" colspan="5">{{intent.resources}}</td>
+ </tr>
+ <tr row-id="{{intent.key}}" ng-repeat-end>
+ <td class="details" colspan="5">{{intent.details}}</td>
+ </tr>
+ </table>
+ </div>
+
+ </div>
+
+</div>
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/intent/intent.js b/framework/src/onos/web/gui/src/main/webapp/app/view/intent/intent.js
new file mode 100644
index 00000000..5810f347
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/intent/intent.js
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Intent View Module
+ */
+
+(function () {
+ 'use strict';
+
+ angular.module('ovIntent', [])
+ .controller('OvIntentCtrl',
+ ['$log', '$scope', 'TableBuilderService',
+
+ function ($log, $scope, tbs) {
+ tbs.buildTable({
+ scope: $scope,
+ tag: 'intent'
+ });
+
+ $log.log('OvIntentCtrl has been created');
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/link/link.css b/framework/src/onos/web/gui/src/main/webapp/app/view/link/link.css
new file mode 100644
index 00000000..4f049cdb
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/link/link.css
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Link View -- CSS file
+ */
+
+#ov-link h2 {
+ display: inline-block;
+}
+
+#ov-link div.ctrl-btns {
+ width: 45px;
+} \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/link/link.html b/framework/src/onos/web/gui/src/main/webapp/app/view/link/link.html
new file mode 100644
index 00000000..371d6b13
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/link/link.html
@@ -0,0 +1,70 @@
+<!--
+ ~ Copyright 2015 Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<!-- Link partial HTML -->
+<div id="ov-link">
+ <div class="tabular-header">
+ <h2>Links ({{tableData.length}} total)</h2>
+ <div class="ctrl-btns">
+ <div class="refresh" ng-class="{active: autoRefresh}"
+ icon icon-size="36" icon-id="refresh"
+ tooltip tt-msg="autoRefreshTip"
+ ng-click="toggleRefresh()"></div>
+ </div>
+ </div>
+
+ <div class="summary-list" onos-table-resize>
+ <div ng-show="loading" class="loading-wheel"
+ icon icon-id="loading" icon-size="75"></div>
+
+ <div class="table-header" onos-sortable-header>
+ <table>
+ <tr>
+ <td colId="_iconid_state" class="table-icon" sortable></td>
+ <td colId="one" sortable>Port 1 </td>
+ <td colId="two" sortable>Port 2 </td>
+ <td colId="type" sortable>Type </td>
+ <td colId="direction" sortable>Direction </td>
+ <td colId="durable" sortable>Durable </td>
+ </tr>
+ </table>
+ </div>
+
+ <div class="table-body">
+ <table onos-flash-changes id-prop="one">
+ <tr ng-if="!tableData.length" class="no-data">
+ <td colspan="6">
+ No Links found
+ </td>
+ </tr>
+
+ <tr ng-repeat="link in tableData track by $index"
+ ng-repeat-complete row-id="{{link.one}}">
+ <td class="table-icon">
+ <div icon icon-id="{{link._iconid_state}}"></div>
+ </td>
+ <td>{{link.one}}</td>
+ <td>{{link.two}}</td>
+ <td>{{link.type}}</td>
+ <td ng-bind-html="link.direction"></td>
+ <td>{{link.durable}}</td>
+ </tr>
+ </table>
+ </div>
+
+ </div>
+
+</div>
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/link/link.js b/framework/src/onos/web/gui/src/main/webapp/app/view/link/link.js
new file mode 100644
index 00000000..fcf2a83e
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/link/link.js
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Host View Module
+ */
+
+(function () {
+ 'use strict';
+
+ angular.module('ovLink', [])
+ .controller('OvLinkCtrl',
+ ['$log', '$scope', '$sce', 'FnService', 'TableBuilderService',
+
+ function ($log, $scope, $sce, fs, tbs) {
+ tbs.buildTable({
+ scope: $scope,
+ tag: 'link'
+ });
+
+ $scope.$watch('tableData', function () {
+ if (!fs.isEmptyObject($scope.tableData)) {
+ $scope.tableData.forEach(function (link) {
+ link.direction = $sce.trustAsHtml(link.direction);
+ });
+ }
+ });
+
+ $log.log('OvLinkCtrl has been created');
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/port/port.css b/framework/src/onos/web/gui/src/main/webapp/app/view/port/port.css
new file mode 100644
index 00000000..7fcfee3f
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/port/port.css
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Port View -- CSS file
+ */
+
+#ov-port h2 {
+ display: inline-block;
+}
+
+#ov-port div.ctrl-btns {
+ width: 240px;
+}
+
+.light #ov-port .current-view use {
+ fill: white;
+}
+.dark #ov-port .current-view use {
+ fill: #304860;
+}
+
+.light #ov-port .current-view rect {
+ fill: deepskyblue;
+}
+.dark #ov-port .current-view rect {
+ fill: #eee;
+}
+
+#ov-port td {
+ text-align: right;
+}
+
+#ov-port tr.no-data td {
+ text-align: center;
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/port/port.html b/framework/src/onos/web/gui/src/main/webapp/app/view/port/port.html
new file mode 100644
index 00000000..8eecb9d6
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/port/port.html
@@ -0,0 +1,90 @@
+<!--
+ ~ Copyright 2015 Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<!-- Port partial HTML -->
+<div id="ov-port">
+ <div class="tabular-header">
+ <h2>
+ Port Statistics for Device {{devId || "(No device selected)"}}
+ ({{tableData.length}} Ports total)
+ </h2>
+ <div class="ctrl-btns">
+ <div class="refresh" ng-class="{active: autoRefresh}"
+ icon icon-size="36" icon-id="refresh"
+ tooltip tt-msg="autoRefreshTip"
+ ng-click="toggleRefresh()"></div>
+
+ <div class="separator"></div>
+
+ <div class="active"
+ icon icon-id="flowTable" icon-size="36"
+ tooltip tt-msg="flowTip"
+ ng-click="nav('flow')"></div>
+
+ <div class="current-view"
+ icon icon-id="portTable" icon-size="36"></div>
+
+ <div class="active"
+ icon icon-id="groupTable" icon-size="36"
+ tooltip tt-msg="groupTip"
+ ng-click="nav('group')"></div>
+ </div>
+ </div>
+
+ <div class="summary-list" onos-table-resize>
+ <div ng-show="loading" class="loading-wheel"
+ icon icon-id="loading" icon-size="75"></div>
+
+ <div class="table-header" onos-sortable-header>
+ <table>
+ <tr>
+ <td colId="id" col-width="60px" sortable>Port ID </td>
+ <td colId="pkt_rx" sortable>Pkts Received </td>
+ <td colId="pkt_tx" sortable>Pkts Sent </td>
+ <td colId="bytes_rx" sortable>Bytes Received </td>
+ <td colId="bytes_tx" sortable>Bytes Sent </td>
+ <td colId="pkt_rx_drp" sortable>Pkts Received Dropped </td>
+ <td colId="pkt_tx_drp" sortable>Pkts Sent Dropped </td>
+ <td colId="duration" sortable>Duration (sec) </td>
+ </tr>
+ </table>
+ </div>
+
+ <div class="table-body">
+ <table onos-flash-changes id-prop="id">
+ <tr ng-if="!tableData.length" class="no-data">
+ <td colspan="8">
+ No Ports found
+ </td>
+ </tr>
+
+ <tr ng-repeat="port in tableData track by $index"
+ ng-repeat-complete row-id="{{port.id}}">
+ <td>{{port.id}}</td>
+ <td>{{port.pkt_rx}}</td>
+ <td>{{port.pkt_tx}}</td>
+ <td>{{port.bytes_rx}}</td>
+ <td>{{port.bytes_tx}}</td>
+ <td>{{port.pkt_rx_drp}}</td>
+ <td>{{port.pkt_tx_drp}}</td>
+ <td>{{port.duration}}</td>
+ </tr>
+ </table>
+ </div>
+
+ </div>
+
+</div>
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/port/port.js b/framework/src/onos/web/gui/src/main/webapp/app/view/port/port.js
new file mode 100644
index 00000000..a157c5be
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/port/port.js
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Port View Module
+ */
+
+(function () {
+ 'use strict';
+
+ // injected references
+ var $log, $scope, $location, fs, tbs, ns;
+
+ angular.module('ovPort', [])
+ .controller('OvPortCtrl',
+ ['$log', '$scope', '$location',
+ 'FnService', 'TableBuilderService', 'NavService',
+
+ function (_$log_, _$scope_, _$location_, _fs_, _tbs_, _ns_) {
+ var params;
+ $log = _$log_;
+ $scope = _$scope_;
+ $location = _$location_;
+ fs = _fs_;
+ tbs = _tbs_;
+ ns = _ns_;
+ $scope.flowTip = 'Show flow view for this device';
+ $scope.groupTip = 'Show group view for this device';
+
+ params = $location.search();
+ if (params.hasOwnProperty('devId')) {
+ $scope.devId = params['devId'];
+ }
+
+ tbs.buildTable({
+ scope: $scope,
+ tag: 'port',
+ query: params
+ });
+
+ $scope.nav = function (path) {
+ if ($scope.devId) {
+ ns.navTo(path, { devId: $scope.devId });
+ }
+ };
+
+ $log.log('OvPortCtrl has been created');
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/settings/settings.css b/framework/src/onos/web/gui/src/main/webapp/app/view/settings/settings.css
new file mode 100644
index 00000000..e748c5ac
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/settings/settings.css
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Settings View -- CSS file
+ */
+
+#ov-settings h2 {
+ display: inline-block;
+}
+
+#ov-settings div.ctrl-btns {
+ width: 45px;
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/settings/settings.html b/framework/src/onos/web/gui/src/main/webapp/app/view/settings/settings.html
new file mode 100644
index 00000000..ee069d37
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/settings/settings.html
@@ -0,0 +1,52 @@
+<!-- settings partial HTML -->
+<div id="ov-settings">
+ <div class="tabular-header">
+ <h2>Component Settings ({{tableData.length}} total)</h2>
+ <div class="ctrl-btns">
+ <div class="refresh" ng-class="{active: autoRefresh}"
+ icon icon-size="36" icon-id="refresh"
+ tooltip tt-msg="autoRefreshTip"
+ ng-click="toggleRefresh()"></div>
+ </div>
+ </div>
+
+ <div class="summary-list" onos-table-resize>
+ <div ng-show="loading" class="loading-wheel"
+ icon icon-id="loading" icon-size="75"></div>
+
+ <div class="table-header" onos-sortable-header>
+ <table>
+ <tr>
+ <td colId="component" sortable col-width="200px">Component </td>
+ <td colId="id" sortable>Property </td>
+ <td colId="type" sortable col-width="70px">Type </td>
+ <td colId="value" sortable>Value </td>
+ <td colId="defValue" sortable>Default </td>
+ <td colId="desc" col-width="400px">Description </td>
+ </tr>
+ </table>
+ </div>
+
+ <div class="table-body">
+ <table onos-flash-changes id-prop="id">
+ <tr ng-if="!tableData.length" class="no-data">
+ <td colspan="6">
+ No Settings found
+ </td>
+ </tr>
+
+ <tr ng-repeat="prop in tableData track by $index"
+ ng-repeat-complete row-id="{{prop.id}}">
+ <td>{{prop.component}}</td>
+ <td>{{prop.id}}</td>
+ <td>{{prop.type}}</td>
+ <td>{{prop.value}}</td>
+ <td>{{prop.defValue}}</td>
+ <td>{{prop.desc}}</td>
+ </tr>
+ </table>
+ </div>
+
+ </div>
+
+</div>
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/settings/settings.js b/framework/src/onos/web/gui/src/main/webapp/app/view/settings/settings.js
new file mode 100644
index 00000000..cec0e70e
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/settings/settings.js
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Component Settings View Module
+ */
+
+(function () {
+ 'use strict';
+
+ angular.module('ovSettings', [])
+ .controller('OvSettingsCtrl',
+ ['$log', '$scope', 'TableBuilderService',
+
+ function ($log, $scope, tbs) {
+ tbs.buildTable({
+ scope: $scope,
+ tag: 'setting'
+ });
+
+ $log.log('OvSettingsCtrl has been created');
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/README.txt b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/README.txt
new file mode 100644
index 00000000..61089bf6
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/README.txt
@@ -0,0 +1,3 @@
+# ONOS Topology View
+
+Code and resources for implementing the client-side for the Topology View.
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topo.css b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topo.css
new file mode 100644
index 00000000..f4b089a0
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topo.css
@@ -0,0 +1,729 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topology View -- CSS file
+ */
+
+/* --- Base SVG Layer --- */
+
+#ov-topo svg {
+ /* prevents the little cut/copy/paste square that would appear on iPad */
+ -webkit-user-select: none;
+}
+.light #ov-topo svg {
+ background-color: #fff;
+}
+.dark #ov-topo svg {
+ background-color: #2b2b2b;
+}
+
+
+/* --- "No Devices" Layer --- */
+
+#ov-topo svg #topo-noDevsLayer {
+ visibility: hidden;
+}
+
+.light #ov-topo svg .noDevsBird {
+ fill: #ecd;
+}
+.dark #ov-topo svg .noDevsBird {
+ fill: #683434;
+}
+
+#ov-topo svg #topo-noDevsLayer text {
+ font-size: 60pt;
+ font-style: italic;
+}
+.light #ov-topo svg #topo-noDevsLayer text {
+ fill: #dde;
+}
+.dark #ov-topo svg #topo-noDevsLayer text {
+ fill: #3b3b4f;
+}
+
+
+/* --- Topo Map --- */
+
+#ov-topo svg #topo-map {
+ stroke-width: 2px;
+ fill: transparent;
+}
+
+.light #ov-topo svg #topo-map {
+ stroke: #ddd;
+}
+.dark #ov-topo svg #topo-map {
+ stroke: #444;
+}
+
+
+/* --- Topo Summary Panel --- */
+
+#topo-p-summary {
+ /* Base css from panel.css */
+}
+
+/* --- Topo Detail Panel --- */
+
+#topo-p-detail {
+ /* Base css from panel.css */
+ top: 320px;
+}
+html[data-platform='iPad'] #topo-p-detail {
+ top: 336px;
+}
+
+#topo-p-detail .actionBtns .actionBtn {
+ display: inline-block;
+}
+#topo-p-detail .actionBtns .actionBtn svg {
+ width: 30px;
+ height: 30px;
+}
+
+/* --- general topo-panel styling --- */
+
+.topo-p div.header div.icon {
+ vertical-align: middle;
+ display: inline-block;
+}
+.topo-p div.body {
+ overflow-y: scroll;
+}
+
+.topo-p div.body::-webkit-scrollbar {
+ display: none;
+}
+
+.topo-p svg {
+ display: inline-block;
+ width: 42px;
+ height: 42px;
+}
+
+.light .topo-p svg .glyph {
+ fill: #222;
+}
+
+.dark .topo-p svg .glyph.overlay {
+ fill: #222;
+}
+
+.dark .topo-p svg .glyph {
+ fill: #ddd;
+}
+.light .topo-p svg .glyph.overlay {
+ fill: #fff;
+}
+
+
+.topo-p h2 {
+ padding: 0 4px;
+ margin: 0;
+ word-wrap: break-word;
+ display: inline-block;
+ width: 210px;
+ vertical-align: middle;
+}
+.light .topo-p h2 {
+ color: black;
+}
+.dark .topo-p h2 {
+ color: #ddd;
+}
+
+.topo-p h3 {
+ padding: 0 4px;
+ margin: 0;
+ word-wrap: break-word;
+ top: 20px;
+ left: 50px;
+}
+.light .topo-p h3 {
+ color: black;
+}
+.dark .topo-p h3 {
+ color: #ddd;
+}
+
+.topo-p p, table {
+ padding: 4px;
+ margin: 0;
+}
+
+.topo-p td {
+ word-wrap: break-word;
+}
+.topo-p td.label {
+ font-style: italic;
+ padding-right: 12px;
+ /* works for both light and dark themes ... */
+ color: #777;
+}
+.topo-p td.value {
+}
+
+.topo-p hr {
+ height: 1px;
+ border: 0;
+}
+.light .topo-p hr {
+ background-color: #ccc;
+ color: #ccc;
+}
+.dark .topo-p hr {
+ background-color: #888;
+ color: #888;
+}
+
+/* --- Topo Instance Panel --- */
+
+#topo-p-instance {
+ height: 100px;
+}
+
+#topo-p-instance div.onosInst {
+ display: inline-block;
+ width: 170px;
+ height: 85px;
+ cursor: pointer;
+}
+
+#topo-p-instance svg rect {
+ stroke-width: 3.5;
+}
+#topo-p-instance .online svg rect {
+ opacity: 1;
+}
+.light #topo-p-instance svg rect {
+ fill: #ccc;
+ stroke: #aaa;
+}
+.light #topo-p-instance .online svg rect {
+ fill: #9cf;
+ stroke: #555;
+}
+.dark #topo-p-instance svg rect {
+ fill: #666;
+ stroke: #222;
+}
+.dark #topo-p-instance .online svg rect {
+ fill: #9cf;
+ stroke: #999;
+}
+
+
+#topo-p-instance svg .glyph {
+ fill: #888;
+ fill-rule: evenodd;
+}
+#topo-p-instance .online svg .glyph {
+ fill: #000;
+}
+
+#topo-p-instance svg .badgeIcon {
+ fill-rule: evenodd;
+ opacity: 0.4;
+}
+.light #topo-p-instance svg .badgeIcon {
+ fill: #777;
+}
+.dark #topo-p-instance svg .badgeIcon {
+ fill: #555;
+}
+
+#topo-p-instance .online svg .badgeIcon {
+ opacity: 1.0;
+}
+.light #topo-p-instance .online svg .badgeIcon {
+ fill: #fff;
+}
+.dark #topo-p-instance .online svg .badgeIcon {
+ fill: #fff;
+}
+
+#topo-p-instance svg text {
+ text-anchor: middle;
+ opacity: 0.3;
+}
+#topo-p-instance .online svg text {
+ opacity: 1.0;
+}
+.light #topo-p-instance svg text {
+ fill: #444;
+}
+.light #topo-p-instance .online svg text {
+ fill: #eee;
+}
+.dark #topo-p-instance svg text {
+ fill: #aaa;
+}
+.dark #topo-p-instance .online svg text {
+ fill: #ccc;
+}
+
+#topo-p-instance svg text.instTitle {
+ font-size: 11pt;
+ font-weight: bold;
+}
+#topo-p-instance svg text.instLabel {
+ font-size: 9pt;
+ font-style: italic;
+}
+
+#topo-p-instance .onosInst.mastership {
+ opacity: 0.3;
+}
+#topo-p-instance .onosInst.mastership.affinity {
+ opacity: 1.0;
+}
+.light #topo-p-instance .onosInst.mastership.affinity svg rect {
+ filter: url(#blue-glow);
+}
+.dark #topo-p-instance .onosInst.mastership.affinity svg rect {
+ filter: url(#yellow-glow);
+}
+.light.firefox #topo-p-instance .onosInst.mastership.affinity svg rect {
+ filter: url("data:image/svg+xml;utf8, <svg xmlns = \'http://www.w3.org/2000/svg\'><filter x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\" id=\"blue-glow\"><feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0 0 0 1 0 \"></feColorMatrix><feGaussianBlur stdDeviation=\"3\" result=\"coloredBlur\"></feGaussianBlur><feMerge><feMergeNode in=\"coloredBlur\"></feMergeNode><feMergeNode in=\"SourceGraphic\"></feMergeNode></feMerge></filter></svg>#blue-glow");
+}
+.dark.firefox #topo-p-instance .onosInst.mastership.affinity svg rect {
+ filter: url("data:image/svg+xml;utf8, <svg xmlns = \'http://www.w3.org/2000/svg\'><filter x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\" id=\"yellow-glow\"><feColorMatrix type=\"matrix\" values=\"0 0 0 0 1.0 0 0 0 0 1.0 0 0 0 0 0.3 0 0 0 1 0 \"></feColorMatrix><feGaussianBlur stdDeviation=\"3\" result=\"coloredBlur\"></feGaussianBlur><feMerge><feMergeNode in=\"coloredBlur\"></feMergeNode><feMergeNode in=\"SourceGraphic\"></feMergeNode></feMerge></filter></svg>#yellow-glow");
+}
+
+
+/* --- Toolbar --- */
+
+#toolbar-topo-tbar .tbar-row.right {
+ width: 100%;
+}
+
+#toolbar-topo-tbar .tbar-row-text {
+ height: 21px;
+ text-align: right;
+ padding: 8px 60px 0 0;
+ font-style: italic;
+}
+
+
+/* --- Topo Nodes --- */
+
+#ov-topo svg .suppressed {
+ opacity: 0.5 !important;
+}
+
+#ov-topo svg .suppressedmax {
+ opacity: 0.2 !important;
+}
+
+#ov-topo svg .node {
+ cursor: pointer;
+}
+
+.light #ov-topo svg .node.selected rect,
+.light #ov-topo svg .node.selected circle {
+ fill: #f90;
+ filter: url(#blue-glow);
+}
+.dark #ov-topo svg .node.selected rect,
+.dark #ov-topo svg .node.selected circle {
+ fill: #f90;
+ filter: url(#yellow-glow);
+}
+.light.firefox #ov-topo svg .node.selected rect,
+.light.firefox #ov-topo svg .node.selected circle {
+ filter: url("data:image/svg+xml;utf8, <svg xmlns = \'http://www.w3.org/2000/svg\'><filter x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\" id=\"blue-glow\"><feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0 0 0 1 0 \"></feColorMatrix><feGaussianBlur stdDeviation=\"3\" result=\"coloredBlur\"></feGaussianBlur><feMerge><feMergeNode in=\"coloredBlur\"></feMergeNode><feMergeNode in=\"SourceGraphic\"></feMergeNode></feMerge></filter></svg>#blue-glow");
+}
+.dark.firefox #ov-topo svg .node.selected rect,
+.dark.firefox #ov-topo svg .node.selected circle {
+ filter: url("data:image/svg+xml;utf8, <svg xmlns = \'http://www.w3.org/2000/svg\'><filter x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\" id=\"yellow-glow\"><feColorMatrix type=\"matrix\" values=\"0 0 0 0 1.0 0 0 0 0 1.0 0 0 0 0 0.3 0 0 0 1 0 \"></feColorMatrix><feGaussianBlur stdDeviation=\"3\" result=\"coloredBlur\"></feGaussianBlur><feMerge><feMergeNode in=\"coloredBlur\"></feMergeNode><feMergeNode in=\"SourceGraphic\"></feMergeNode></feMerge></filter></svg>#yellow-glow");
+}
+
+#ov-topo svg .node text {
+ pointer-events: none;
+}
+
+/* Device Nodes */
+
+#ov-topo svg .node.device {
+}
+
+#ov-topo svg .node.device rect {
+ stroke-width: 1.5;
+}
+
+#ov-topo svg .node.device.fixed rect {
+ stroke-width: 1.5;
+}
+.light #ov-topo svg .node.device.fixed rect {
+ stroke: #aaa;
+}
+.dark #ov-topo svg .node.device.fixed rect {
+ stroke: #999;
+}
+
+/* note: device is offline without the 'online' class */
+.light #ov-topo svg .node.device {
+ fill: #777;
+}
+.dark #ov-topo svg .node.device {
+ fill: #555;
+}
+
+.light #ov-topo svg .node.device rect {
+ stroke: #666;
+}
+.light #ov-topo svg .node.device rect {
+ stroke: #999;
+}
+
+.light #ov-topo svg .node.device.online {
+ fill: #6e7fa3;
+}
+.dark #ov-topo svg .node.device.online {
+ fill: #4E5C7F;
+}
+
+/* note: device is offline without the 'online' class */
+#ov-topo svg .node.device text {
+ fill: #bbb;
+ font: 10pt sans-serif;
+}
+
+#ov-topo svg .node.device.online text {
+ fill: white;
+}
+
+#ov-topo svg .node.device .svgIcon rect {
+ fill: #aaa;
+}
+#ov-topo svg .node.device .svgIcon use {
+ fill: #777;
+}
+#ov-topo svg .node.device.selected .svgIcon rect {
+ fill: #f90;
+}
+#ov-topo svg .node.device.online .svgIcon rect {
+ fill: #ccc;
+}
+#ov-topo svg .node.device.online .svgIcon use {
+ fill: #000;
+}
+#ov-topo svg .node.device.online.selected .svgIcon rect {
+ fill: #f90;
+}
+
+
+/* Host Nodes */
+
+#ov-topo svg .node.host {
+}
+
+#ov-topo svg .node.host text {
+ stroke: none;
+ font: 9pt sans-serif;
+}
+.light #ov-topo svg .node.host text {
+ fill: #846;
+}
+.dark #ov-topo svg .node.host text {
+ fill: #BB809D;
+}
+
+.light svg .node.host circle {
+ stroke: #000;
+ fill: #edb;
+}
+.dark svg .node.host circle {
+ stroke: #eee;
+ fill: #B2A180;
+}
+
+.light svg .node.host .svgIcon {
+ fill: #444;
+}
+.dark svg .node.host .svgIcon {
+ fill: #222;
+}
+
+/* --- Topo Links --- */
+
+#ov-topo svg .link {
+ opacity: .9;
+}
+
+#ov-topo svg .link.selected,
+#ov-topo svg .link.enhanced {
+ stroke-width: 4.5px;
+}
+.light #ov-topo svg .link.selected,
+.light #ov-topo svg .link.enhanced {
+ filter: url(#blue-glow);
+}
+.dark #ov-topo svg .link.selected,
+.dark #ov-topo svg .link.enhanced {
+ filter: url(#yellow-glow);
+}
+.light.firefox #ov-topo svg .link.selected,
+.light.firefox #ov-topo svg .link.enhanced {
+ filter: url("data:image/svg+xml;utf8, <svg xmlns = \'http://www.w3.org/2000/svg\'><filter x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\" id=\"blue-glow\"><feColorMatrix type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0 0 0 1 0 \"></feColorMatrix><feGaussianBlur stdDeviation=\"3\" result=\"coloredBlur\"></feGaussianBlur><feMerge><feMergeNode in=\"coloredBlur\"></feMergeNode><feMergeNode in=\"SourceGraphic\"></feMergeNode></feMerge></filter></svg>#blue-glow");
+}
+.dark.firefox #ov-topo svg .link.selected,
+.dark.firefox #ov-topo svg .link.enhanced {
+ filter: url("data:image/svg+xml;utf8, <svg xmlns = \'http://www.w3.org/2000/svg\'><filter x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\" id=\"yellow-glow\"><feColorMatrix type=\"matrix\" values=\"0 0 0 0 1.0 0 0 0 0 1.0 0 0 0 0 0.3 0 0 0 1 0 \"></feColorMatrix><feGaussianBlur stdDeviation=\"3\" result=\"coloredBlur\"></feGaussianBlur><feMerge><feMergeNode in=\"coloredBlur\"></feMergeNode><feMergeNode in=\"SourceGraphic\"></feMergeNode></feMerge></filter></svg>#yellow-glow");
+
+}
+
+#ov-topo svg .link.inactive {
+ opacity: .5;
+ stroke-dasharray: 8 4;
+}
+
+#ov-topo svg .link.secondary {
+ stroke-width: 3px;
+}
+.light #ov-topo svg .link.secondary {
+ stroke: rgba(0,153,51,0.5);
+}
+.dark #ov-topo svg .link.secondary {
+ stroke: rgba(121,231,158,0.5);
+}
+
+/* Port traffic color visualization for Kbps, Mbps, and Gbps */
+
+.light #ov-topo svg .link.secondary.port-traffic-Kbps {
+ stroke: rgb(0,153,51);
+ stroke-width: 5.0;
+}
+.dark #ov-topo svg .link.secondary.port-traffic-Kbps {
+ stroke: rgb(98, 153, 118);
+ stroke-width: 5.0;
+}
+
+.light #ov-topo svg .link.secondary.port-traffic-Mbps {
+ stroke: rgb(128,145,27);
+ stroke-width: 6.5;
+}
+.dark #ov-topo svg .link.secondary.port-traffic-Mbps {
+ stroke: rgb(91, 109, 54);
+ stroke-width: 6.5;
+}
+
+.light #ov-topo svg .link.secondary.port-traffic-Gbps {
+ stroke: rgb(255, 137, 3);
+ stroke-width: 8.0;
+}
+.dark #ov-topo svg .link.secondary.port-traffic-Gbps {
+ stroke: rgb(174, 119, 55);
+ stroke-width: 8.0;
+}
+
+.light #ov-topo svg .link.secondary.port-traffic-Gbps-choked {
+ stroke: rgb(183, 30, 21);
+ stroke-width: 8.0;
+}
+.dark #ov-topo svg .link.secondary.port-traffic-Gbps-choked {
+ stroke: rgb(127, 40, 39);
+ stroke-width: 8.0;
+}
+
+
+#ov-topo svg .link.animated {
+ stroke-dasharray: 8 5;
+ animation: ants 5s infinite linear;
+ /* below line will be added via Javascript based on path */
+ /*animation-direction: reverse;*/
+}
+@keyframes ants {
+ from {
+ stroke-dashoffset: 0;
+ }
+ to {
+ stroke-dashoffset: 400;
+ }
+}
+
+#ov-topo svg .link.primary {
+ stroke-width: 4px;
+}
+.light #ov-topo svg .link.primary {
+ stroke: #ffA300;
+}
+.dark #ov-topo svg .link.primary {
+ stroke: #D58E0F;
+}
+
+#ov-topo svg .link.secondary.optical {
+ stroke-width: 4px;
+}
+.light #ov-topo svg .link.secondary.optical {
+ stroke: rgba(128,64,255,0.5);
+}
+.dark #ov-topo svg .link.secondary.optical {
+ stroke: rgba(164,139,215,0.5);
+}
+
+#ov-topo svg .link.primary.optical {
+ stroke-width: 6px;
+}
+.light #ov-topo svg .link.primary.optical {
+ stroke: #74f;
+}
+.dark #ov-topo svg .link.primary.optical {
+ stroke: #7352CD;
+}
+
+/* Link Labels */
+
+#ov-topo svg .linkLabel rect {
+ stroke: none;
+}
+.light #ov-topo svg .linkLabel rect {
+ fill: #eee;
+}
+.dark #ov-topo svg .linkLabel rect {
+ fill: #555;
+}
+
+#ov-topo svg .linkLabel text {
+ text-anchor: middle;
+ stroke-width: 0.1;
+ font-size: 9pt;
+}
+.light #ov-topo svg .linkLabel text {
+ fill: #444;
+}
+.dark #ov-topo svg .linkLabel text {
+ fill: #eee;
+}
+
+/* Port Labels */
+
+#ov-topo svg .portLabel rect {
+ stroke: none;
+}
+.light #ov-topo svg .portLabel rect {
+ fill: #eee;
+}
+.dark #ov-topo svg .portLabel rect {
+ fill: #222;
+}
+
+#ov-topo svg .portLabel text {
+ text-anchor: middle;
+ stroke-width: 0.1;
+ font-size: 11pt;
+}
+.light #ov-topo svg .portLabel text {
+ fill: #444;
+}
+.dark #ov-topo svg .portLabel text {
+ fill: #eee;
+}
+
+/* Number of Links Labels */
+#ov-topo line.numLinkHash {
+ stroke-width: 3;
+}
+
+#ov-topo text.numLinkText {
+ font-size: 15pt;
+}
+
+#ov-topo text.numLinkText {
+ text-anchor: middle;
+}
+
+.light #ov-topo text.numLinkText {
+ fill: #444;
+}
+.dark #ov-topo text.numLinkText {
+ fill: #eee;
+}
+
+/* ------------------------------------------------- */
+/* Sprite Layer */
+
+#ov-topo svg #topo-sprites use {
+ stroke-width: 2;
+}
+#ov-topo svg #topo-sprites text {
+ text-anchor: middle;
+ font-size: 20pt;
+ font-style: italic;
+}
+
+.light #ov-topo svg #topo-sprites .gold1 use {
+ stroke: #fda;
+ fill: none;
+}
+.dark #ov-topo svg #topo-sprites .gold1 use {
+ stroke: #541;
+ fill: none;
+}
+.light #ov-topo svg #topo-sprites .gold1 text {
+ fill: #eda;
+}
+.dark #ov-topo svg #topo-sprites .gold1 text {
+ fill: #543;
+}
+
+.light #ov-topo svg #topo-sprites .blue1 use {
+ stroke: #bbd;
+ fill: none;
+}
+.dark #ov-topo svg #topo-sprites .blue1 use {
+ stroke: #445;
+ fill: none;
+}
+.light #ov-topo svg #topo-sprites .blue1 text {
+ fill: #cce;
+}
+.dark #ov-topo svg #topo-sprites .blue1 text {
+ fill: #446;
+}
+
+.light #ov-topo svg #topo-sprites .gray1 use {
+ stroke: #ccc;
+ fill: none;
+}
+.dark #ov-topo svg #topo-sprites .gray1 use {
+ stroke: #333;
+ fill: none;
+}
+.light #ov-topo svg #topo-sprites .gray1 text {
+ fill: #ddd;
+}
+.dark #ov-topo svg #topo-sprites .gray1 text {
+ fill: #444;
+}
+
+/* fills */
+.light #ov-topo svg #topo-sprites use.fill-gray2 {
+ fill: #eee;
+}
+.dark #ov-topo svg #topo-sprites use.fill-gray2 {
+ fill: #444;
+}
+
+.light #ov-topo svg #topo-sprites use.fill-blue2 {
+ fill: #bce;
+}
+.dark #ov-topo svg #topo-sprites use.fill-blue2 {
+ fill: #447;
+}
+
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topo.html b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topo.html
new file mode 100644
index 00000000..8a64abb5
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topo.html
@@ -0,0 +1,7 @@
+<!-- Topology View partial HTML -->
+<div id="ov-topo">
+ <svg viewBox="0 0 1000 1000"
+ resize offset-height="56" offset-width="12"
+ notifier="notifyResize()">
+ </svg>
+</div>
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topo.js b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topo.js
new file mode 100644
index 00000000..21894100
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topo.js
@@ -0,0 +1,529 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topology View Module
+ */
+
+(function () {
+ 'use strict';
+
+ var moduleDependencies = [
+ 'ngCookies',
+ 'onosUtil',
+ 'onosSvg',
+ 'onosRemote'
+ ];
+
+ // references to injected services etc.
+ var $scope, $log, $cookies, fs, ks, zs, gs, ms, sus, flash, wss, ps,
+ tes, tfs, tps, tis, tss, tls, tts, tos, fltr, ttbs, ttip, tov;
+
+ // DOM elements
+ var ovtopo, svg, defs, zoomLayer, mapG, spriteG, forceG, noDevsLayer;
+
+ // Internal state
+ var zoomer, actionMap;
+
+ // --- Short Cut Keys ------------------------------------------------
+
+ function setUpKeys(overlayKeys) {
+ // key bindings need to be made after the services have been injected
+ // thus, deferred to here...
+ actionMap = {
+ I: [toggleInstances, 'Toggle ONOS instances panel'],
+ O: [toggleSummary, 'Toggle ONOS summary panel'],
+ D: [toggleUseDetailsFlag, 'Disable / enable details panel'],
+
+ H: [toggleHosts, 'Toggle host visibility'],
+ M: [toggleOffline, 'Toggle offline visibility'],
+ P: [togglePorts, 'Toggle Port Highlighting'],
+ dash: [tfs.showBadLinks, 'Show bad links'],
+ B: [toggleMap, 'Toggle background map'],
+ S: [toggleSprites, 'Toggle sprite layer'],
+
+ //X: [toggleNodeLock, 'Lock / unlock node positions'],
+ Z: [tos.toggleOblique, 'Toggle oblique view (Experimental)'],
+ N: [fltr.clickAction, 'Cycle node layers'],
+ L: [tfs.cycleDeviceLabels, 'Cycle device labels'],
+ U: [tfs.unpin, 'Unpin node (hover mouse over)'],
+ R: [resetZoom, 'Reset pan / zoom'],
+ dot: [ttbs.toggleToolbar, 'Toggle Toolbar'],
+
+ E: [equalizeMasters, 'Equalize mastership roles'],
+
+ esc: handleEscape,
+
+ _keyListener: ttbs.keyListener,
+
+ _helpFormat: [
+ ['I', 'O', 'D', 'H', 'M', 'P', 'dash', 'B', 'S' ],
+ ['X', 'Z', 'N', 'L', 'U', 'R', '-', 'E', '-', 'dot'],
+ [] // this column reserved for overlay actions
+ ]
+ };
+
+ if (fs.isO(overlayKeys)) {
+ mergeKeys(overlayKeys);
+ }
+
+ ks.keyBindings(actionMap);
+
+ ks.gestureNotes([
+ ['click', 'Select the item and show details'],
+ ['shift-click', 'Toggle selection state'],
+ ['drag', 'Reposition (and pin) device / host'],
+ ['cmd-scroll', 'Zoom in / out'],
+ ['cmd-drag', 'Pan']
+ ]);
+ }
+
+ // when a topology overlay is activated, we need to bind their keystrokes
+ // and include them in the quick-help panel
+ function mergeKeys(extra) {
+ var _hf = actionMap._helpFormat[2];
+ extra._keyOrder.forEach(function (k) {
+ var d = extra[k],
+ cb = d && d.cb,
+ tt = d && d.tt;
+ // NOTE: ignore keys that are already defined
+ if (d && !actionMap[k]) {
+ actionMap[k] = [cb, tt];
+ _hf.push(k);
+ }
+ });
+ }
+
+ // --- Keystroke functions -------------------------------------------
+
+ function toggleInstances(x) {
+ updatePrefsState('insts', tis.toggle(x));
+ tfs.updateDeviceColors();
+ }
+
+ function toggleSummary(x) {
+ updatePrefsState('summary', tps.toggleSummary(x));
+ }
+
+ function toggleUseDetailsFlag(x) {
+ updatePrefsState('detail', tps.toggleUseDetailsFlag(x));
+ }
+
+ function toggleHosts(x) {
+ updatePrefsState('hosts', tfs.toggleHosts(x));
+ }
+
+ function toggleOffline(x) {
+ updatePrefsState('offdev', tfs.toggleOffline(x));
+ }
+
+ function togglePorts(x) {
+ updatePrefsState('porthl', tfs.togglePorts(x));
+ }
+
+ function _togSvgLayer(x, G, tag, what) {
+ var on = (x === 'keyev') ? !sus.visible(G) : !!x,
+ verb = on ? 'Show' : 'Hide';
+ sus.visible(G, on);
+ updatePrefsState(tag, on);
+ flash.flash(verb + ' ' + what);
+ }
+
+ function toggleMap(x) {
+ _togSvgLayer(x, mapG, 'bg', 'background map');
+ }
+
+ function toggleSprites(x) {
+ _togSvgLayer(x, spriteG, 'spr', 'sprite layer');
+ }
+
+ function resetZoom() {
+ zoomer.reset();
+ flash.flash('Pan and zoom reset');
+ }
+
+ function equalizeMasters() {
+ wss.sendEvent('equalizeMasters');
+ flash.flash('Equalizing master roles');
+ }
+
+ function handleEscape() {
+ if (tis.showMaster()) {
+ // if an instance is selected, cancel the affinity mapping
+ tis.cancelAffinity()
+
+ } else if (tov.hooks.escape()) {
+ // else if the overlay consumed the ESC event...
+ // (work already done)
+
+ } else if (tss.deselectAll()) {
+ // else if we have node selections, deselect them all
+ // (work already done)
+
+ } else if (tls.deselectLink()) {
+ // else if we have a link selected, deselect it
+ // (work already done)
+
+ } else if (tis.isVisible()) {
+ // else if the Instance Panel is visible, hide it
+ tis.hide();
+ tfs.updateDeviceColors();
+
+ } else if (tps.summaryVisible()) {
+ // else if the Summary Panel is visible, hide it
+ tps.hideSummaryPanel();
+ }
+ }
+
+ // --- Toolbar Functions ---------------------------------------------
+
+ function notValid(what) {
+ $log.warn('topo.js getActionEntry(): Not a valid ' + what);
+ }
+
+ function getActionEntry(key) {
+ var entry;
+
+ if (!key) {
+ notValid('key');
+ return null;
+ }
+
+ entry = actionMap[key];
+
+ if (!entry) {
+ notValid('actionMap entry');
+ return null;
+ }
+ return fs.isA(entry) || [entry, ''];
+ }
+
+ function setUpToolbar() {
+ ttbs.init({
+ getActionEntry: getActionEntry,
+ setUpKeys: setUpKeys
+ });
+ ttbs.createToolbar();
+ }
+
+ // --- Glyphs, Icons, and the like -----------------------------------
+
+ function setUpDefs() {
+ defs = svg.append('defs');
+ gs.loadDefs(defs);
+ sus.loadGlowDefs(defs);
+ }
+
+
+ // --- Pan and Zoom --------------------------------------------------
+
+ // zoom enabled predicate. ev is a D3 source event.
+ function zoomEnabled(ev) {
+ return fs.isMobile() || (ev.metaKey || ev.altKey);
+ }
+
+ function zoomCallback() {
+ var sc = zoomer.scale(),
+ tr = zoomer.translate();
+
+ ps.setPrefs('topo_zoom', {tx:tr[0], ty:tr[1], sc:sc});
+
+ // keep the map lines constant width while zooming
+ mapG.style('stroke-width', (2.0 / sc) + 'px');
+ }
+
+ function setUpZoom() {
+ zoomLayer = svg.append('g').attr('id', 'topo-zoomlayer');
+ zoomer = zs.createZoomer({
+ svg: svg,
+ zoomLayer: zoomLayer,
+ zoomEnabled: zoomEnabled,
+ zoomCallback: zoomCallback
+ });
+ }
+
+
+ // callback invoked when the SVG view has been resized..
+ function svgResized(s) {
+ tfs.newDim([s.width, s.height]);
+ }
+
+ // --- Background Map ------------------------------------------------
+
+ function setUpNoDevs() {
+ var g, box;
+ noDevsLayer = svg.append('g').attr({
+ id: 'topo-noDevsLayer',
+ transform: sus.translate(500,500)
+ });
+ // Note, SVG viewbox is '0 0 1000 1000', defined in topo.html.
+ // We are translating this layer to have its origin at the center
+
+ g = noDevsLayer.append('g');
+ gs.addGlyph(g, 'bird', 100).attr('class', 'noDevsBird');
+ g.append('text').text('No devices are connected')
+ .attr({ x: 120, y: 80});
+
+ box = g.node().getBBox();
+ box.x -= box.width/2;
+ box.y -= box.height/2;
+ g.attr('transform', sus.translate(box.x, box.y));
+
+ showNoDevs(true);
+ }
+
+ function showNoDevs(b) {
+ sus.visible(noDevsLayer, b);
+ }
+
+
+ var countryFilters = {
+ world: function (c) {
+ return c.properties.continent !== 'Antarctica';
+ },
+
+ // NOTE: for "usa" we are using our hand-crafted topojson file
+
+ s_america: function (c) {
+ return c.properties.continent === 'South America';
+ },
+
+ japan: function (c) {
+ return c.properties.geounit === 'Japan';
+ },
+
+ europe: function (c) {
+ return c.properties.continent === 'Europe';
+ },
+
+ italy: function (c) {
+ return c.properties.geounit === 'Italy';
+ },
+
+ uk: function (c) {
+ // technically, Ireland is not part of the United Kingdom,
+ // but the map looks weird without it showing.
+ return c.properties.adm0_a3 === 'GBR' ||
+ c.properties.adm0_a3 === 'IRL';
+ },
+
+ s_korea: function (c) {
+ return c.properties.adm0_a3 === 'KOR';
+ },
+
+ australia: function (c) {
+ return c.properties.adm0_a3 === 'AUS';
+ }
+ };
+
+
+ function setUpMap($loc) {
+ var s1 = $loc.search().mapid,
+ s2 = ps.getPrefs('topo_mapid'),
+ mapId = s1 || (s2 && s2.id) || 'usa',
+ promise,
+ cfilter,
+ opts;
+
+ mapG = zoomLayer.append('g').attr('id', 'topo-map');
+ if (mapId === 'usa') {
+ promise = ms.loadMapInto(mapG, '*continental_us');
+ } else {
+ ps.setPrefs('topo_mapid', {id:mapId});
+ cfilter = countryFilters[mapId] || countryFilters.world;
+ opts = { countryFilter: cfilter };
+ promise = ms.loadMapRegionInto(mapG, opts);
+ }
+ return promise;
+ }
+
+ function opacifyMap(b) {
+ mapG.transition()
+ .duration(1000)
+ .attr('opacity', b ? 1 : 0);
+ }
+
+ function setUpSprites($loc, tspr) {
+ var s1 = $loc.search().sprites,
+ s2 = ps.getPrefs('topo_sprites'),
+ sprId = s1 || (s2 && s2.id);
+
+ spriteG = zoomLayer.append ('g').attr('id', 'topo-sprites');
+ if (sprId) {
+ ps.setPrefs('topo_sprites', {id:sprId});
+ tspr.loadSprites(spriteG, defs, sprId);
+ }
+ }
+
+ // --- User Preferemces ----------------------------------------------
+
+ var prefsState = {};
+
+ function updatePrefsState(what, b) {
+ prefsState[what] = b ? 1 : 0;
+ ps.setPrefs('topo_prefs', prefsState);
+ }
+
+
+ function restoreConfigFromPrefs() {
+ // NOTE: toolbar will have set this for us..
+ prefsState = ps.asNumbers(ps.getPrefs('topo_prefs'));
+
+ $log.debug('TOPO- Prefs State:', prefsState);
+
+ flash.enable(false);
+ toggleInstances(prefsState.insts);
+ toggleSummary(prefsState.summary);
+ toggleUseDetailsFlag(prefsState.detail);
+ toggleHosts(prefsState.hosts);
+ toggleOffline(prefsState.offdev);
+ togglePorts(prefsState.porthl);
+ toggleMap(prefsState.bg);
+ toggleSprites(prefsState.spr);
+ flash.enable(true);
+ }
+
+
+ // somewhat hackish, because summary update cannot happen until we
+ // have opened the websocket to the server; hence this extra function
+ // invoked after tes.start()
+ function restoreSummaryFromPrefs() {
+ prefsState = ps.asNumbers(ps.getPrefs('topo_prefs'));
+ $log.debug('TOPO- Prefs SUMMARY State:', prefsState.summary);
+
+ flash.enable(false);
+ toggleSummary(prefsState.summary);
+ flash.enable(true);
+ }
+
+
+ // --- Controller Definition -----------------------------------------
+
+ angular.module('ovTopo', moduleDependencies)
+ .controller('OvTopoCtrl', ['$scope', '$log', '$location', '$timeout',
+ '$cookies', 'FnService', 'MastService', 'KeyService', 'ZoomService',
+ 'GlyphService', 'MapService', 'SvgUtilService', 'FlashService',
+ 'WebSocketService', 'PrefsService',
+ 'TopoEventService', 'TopoForceService', 'TopoPanelService',
+ 'TopoInstService', 'TopoSelectService', 'TopoLinkService',
+ 'TopoTrafficService', 'TopoObliqueService', 'TopoFilterService',
+ 'TopoToolbarService', 'TopoSpriteService', 'TooltipService',
+ 'TopoOverlayService',
+
+ function (_$scope_, _$log_, $loc, $timeout, _$cookies_, _fs_, mast, _ks_,
+ _zs_, _gs_, _ms_, _sus_, _flash_, _wss_, _ps_, _tes_, _tfs_,
+ _tps_, _tis_, _tss_, _tls_, _tts_, _tos_, _fltr_, _ttbs_, tspr,
+ _ttip_, _tov_) {
+ var projection,
+ dim,
+ uplink = {
+ // provides function calls back into this space
+ showNoDevs: showNoDevs,
+ projection: function () { return projection; },
+ zoomLayer: function () { return zoomLayer; },
+ zoomer: function () { return zoomer; },
+ opacifyMap: opacifyMap
+ };
+
+ $scope = _$scope_;
+ $log = _$log_;
+ $cookies = _$cookies_;
+ fs = _fs_;
+ ks = _ks_;
+ zs = _zs_;
+ gs = _gs_;
+ ms = _ms_;
+ sus = _sus_;
+ flash = _flash_;
+ wss = _wss_;
+ ps = _ps_;
+ tes = _tes_;
+ tfs = _tfs_;
+ // TODO: consider funnelling actions through TopoForceService...
+ // rather than injecting references to these 'sub-modules',
+ // just so we can invoke functions on them.
+ tps = _tps_;
+ tis = _tis_;
+ tss = _tss_;
+ tls = _tls_;
+ tts = _tts_;
+ tos = _tos_;
+ fltr = _fltr_;
+ ttbs = _ttbs_;
+ ttip = _ttip_;
+ tov = _tov_;
+
+ $scope.notifyResize = function () {
+ svgResized(fs.windowSize(mast.mastHeight()));
+ };
+
+ // Cleanup on destroyed scope..
+ $scope.$on('$destroy', function () {
+ $log.log('OvTopoCtrl is saying Buh-Bye!');
+ tes.stop();
+ ks.unbindKeys();
+ tps.destroyPanels();
+ tis.destroyInst();
+ tfs.destroyForce();
+ ttbs.destroyToolbar();
+ });
+
+ // svg layer and initialization of components
+ ovtopo = d3.select('#ov-topo');
+ svg = ovtopo.select('svg');
+ // set the svg size to match that of the window, less the masthead
+ svg.attr(fs.windowSize(mast.mastHeight()));
+ dim = [svg.attr('width'), svg.attr('height')];
+
+ setUpKeys();
+ setUpToolbar();
+ setUpDefs();
+ setUpZoom();
+ setUpNoDevs();
+ setUpMap($loc).then(
+ function (proj) {
+ var z = ps.getPrefs('topo_zoom') || {tx:0, ty:0, sc:1};
+ zoomer.panZoom([z.tx, z.ty], z.sc);
+ $log.debug('** Zoom restored:', z);
+
+ projection = proj;
+ $log.debug('** We installed the projection:', proj);
+ flash.enable(false);
+ toggleMap(prefsState.bg);
+ flash.enable(true);
+
+ // now we have the map projection, we are ready for
+ // the server to send us device/host data...
+ tes.start();
+ // need to do the following so we immediately get
+ // the summary panel data back from the server
+ restoreSummaryFromPrefs();
+ }
+ );
+ setUpSprites($loc, tspr);
+
+ forceG = zoomLayer.append('g').attr('id', 'topo-force');
+ tfs.initForce(svg, forceG, uplink, dim);
+ tis.initInst({ showMastership: tfs.showMastership });
+ tps.initPanels();
+
+ // temporary solution for persisting user settings
+ restoreConfigFromPrefs();
+
+ $log.debug('registered overlays...', tov.list());
+ $log.log('OvTopoCtrl has been created');
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoD3.js b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoD3.js
new file mode 100644
index 00000000..d29748b1
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoD3.js
@@ -0,0 +1,576 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topology D3 Module.
+ Functions for manipulating the D3 visualizations of the Topology
+ */
+
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, fs, sus, is, ts;
+
+ // api to topoForce
+ var api;
+ /*
+ node() // get ref to D3 selection of nodes
+ link() // get ref to D3 selection of links
+ linkLabel() // get ref to D3 selection of link labels
+ instVisible() // true if instances panel is visible
+ posNode() // position node
+ showHosts() // true if hosts are to be shown
+ restyleLinkElement() // update link styles based on backing data
+ updateLinkLabelModel() // update backing data for link labels
+ */
+
+ // configuration
+ var devCfg = {
+ xoff: -20,
+ yoff: -18
+ },
+ labelConfig = {
+ imgPad: 16,
+ padLR: 4,
+ padTB: 3,
+ marginLR: 3,
+ marginTB: 2,
+ port: {
+ gap: 3,
+ width: 18,
+ height: 14
+ }
+ },
+ icfg;
+
+ // internal state
+ var deviceLabelIndex = 0,
+ hostLabelIndex = 0;
+
+
+ var dCol = {
+ black: '#000',
+ paleblue: '#acf',
+ offwhite: '#ddd',
+ darkgrey: '#444',
+ midgrey: '#888',
+ lightgrey: '#bbb',
+ orange: '#f90'
+ };
+
+ // note: these are the device icon colors without affinity
+ var dColTheme = {
+ light: {
+ rfill: dCol.offwhite,
+ online: {
+ glyph: dCol.darkgrey,
+ rect: dCol.paleblue
+ },
+ offline: {
+ glyph: dCol.midgrey,
+ rect: dCol.lightgrey
+ }
+ },
+ dark: {
+ rfill: dCol.midgrey,
+ online: {
+ glyph: dCol.darkgrey,
+ rect: dCol.paleblue
+ },
+ offline: {
+ glyph: dCol.midgrey,
+ rect: dCol.darkgrey
+ }
+ }
+ };
+
+ function devBaseColor(d) {
+ var o = d.online ? 'online' : 'offline';
+ return dColTheme[ts.theme()][o];
+ }
+
+ function setDeviceColor(d) {
+ var o = d.online,
+ s = d.el.classed('selected'),
+ c = devBaseColor(d),
+ a = instColor(d.master, o),
+ icon = d.el.select('g.deviceIcon'),
+ g, r;
+
+ if (s) {
+ g = c.glyph;
+ r = dCol.orange;
+ } else if (api.instVisible()) {
+ g = o ? a : c.glyph;
+ r = o ? c.rfill : a;
+ } else {
+ g = c.glyph;
+ r = c.rect;
+ }
+
+ icon.select('use').style('fill', g);
+ icon.select('rect').style('fill', r);
+ }
+
+ function instColor(id, online) {
+ return sus.cat7().getColor(id, !online, ts.theme());
+ }
+
+ // ====
+
+ function incDevLabIndex() {
+ deviceLabelIndex = (deviceLabelIndex+1) % 3;
+ switch(deviceLabelIndex) {
+ case 0: return 'Hide device labels';
+ case 1: return 'Show friendly device labels';
+ case 2: return 'Show device ID labels';
+ }
+ }
+
+ // Returns the newly computed bounding box of the rectangle
+ function adjustRectToFitText(n) {
+ var text = n.select('text'),
+ box = text.node().getBBox(),
+ lab = labelConfig;
+
+ text.attr('text-anchor', 'middle')
+ .attr('y', '-0.8em')
+ .attr('x', lab.imgPad/2);
+
+ // translate the bbox so that it is centered on [x,y]
+ box.x = -box.width / 2;
+ box.y = -box.height / 2;
+
+ // add padding
+ box.x -= (lab.padLR + lab.imgPad/2);
+ box.width += lab.padLR * 2 + lab.imgPad;
+ box.y -= lab.padTB;
+ box.height += lab.padTB * 2;
+
+ return box;
+ }
+
+ function hostLabel(d) {
+ var idx = (hostLabelIndex < d.labels.length) ? hostLabelIndex : 0;
+ return d.labels[idx];
+ }
+ function deviceLabel(d) {
+ var idx = (deviceLabelIndex < d.labels.length) ? deviceLabelIndex : 0;
+ return d.labels[idx];
+ }
+ function trimLabel(label) {
+ return (label && label.trim()) || '';
+ }
+
+ function emptyBox() {
+ return {
+ x: -2,
+ y: -2,
+ width: 4,
+ height: 4
+ };
+ }
+
+
+ function updateDeviceLabel(d) {
+ var label = trimLabel(deviceLabel(d)),
+ noLabel = !label,
+ node = d.el,
+ dim = icfg.device.dim,
+ box, dx, dy;
+
+ node.select('text')
+ .text(label)
+ .style('opacity', 0)
+ .transition()
+ .style('opacity', 1);
+
+ if (noLabel) {
+ box = emptyBox();
+ dx = -dim/2;
+ dy = -dim/2;
+ } else {
+ box = adjustRectToFitText(node);
+ dx = box.x + devCfg.xoff;
+ dy = box.y + devCfg.yoff;
+ }
+
+ node.select('rect')
+ .transition()
+ .attr(box);
+
+ node.select('g.deviceIcon')
+ .transition()
+ .attr('transform', sus.translate(dx, dy));
+ }
+
+ function updateHostLabel(d) {
+ var label = trimLabel(hostLabel(d));
+ d.el.select('text').text(label);
+ }
+
+ function updateDeviceColors(d) {
+ if (d) {
+ setDeviceColor(d);
+ } else {
+ api.node().filter('.device').each(function (d) {
+ setDeviceColor(d);
+ });
+ }
+ }
+
+
+ // ==========================
+ // updateNodes - subfunctions
+
+ function deviceExisting(d) {
+ var node = d.el;
+ node.classed('online', d.online);
+ updateDeviceLabel(d);
+ api.posNode(d, true);
+ }
+
+ function hostExisting(d) {
+ updateHostLabel(d);
+ api.posNode(d, true);
+ }
+
+ function deviceEnter(d) {
+ var node = d3.select(this),
+ glyphId = d.type || 'unknown',
+ label = trimLabel(deviceLabel(d)),
+ //devCfg = deviceIconConfig,
+ noLabel = !label,
+ box, dx, dy, icon;
+
+ d.el = node;
+
+ node.append('rect').attr({ rx: 5, ry: 5 });
+ node.append('text').text(label).attr('dy', '1.1em');
+ box = adjustRectToFitText(node);
+ node.select('rect').attr(box);
+
+ icon = is.addDeviceIcon(node, glyphId);
+
+ if (noLabel) {
+ dx = -icon.dim/2;
+ dy = -icon.dim/2;
+ } else {
+ box = adjustRectToFitText(node);
+ dx = box.x + devCfg.xoff;
+ dy = box.y + devCfg.yoff;
+ }
+
+ icon.attr('transform', sus.translate(dx, dy));
+ }
+
+ function hostEnter(d) {
+ var node = d3.select(this),
+ gid = d.type || 'unknown',
+ rad = icfg.host.radius,
+ r = d.type ? rad.withGlyph : rad.noGlyph,
+ textDy = r + 10;
+
+ d.el = node;
+ sus.visible(node, api.showHosts());
+
+ is.addHostIcon(node, r, gid);
+
+ node.append('text')
+ .text(hostLabel)
+ .attr('dy', textDy)
+ .attr('text-anchor', 'middle');
+ }
+
+ function hostExit(d) {
+ var node = d.el;
+ node.select('use')
+ .style('opacity', 0.5)
+ .transition()
+ .duration(800)
+ .style('opacity', 0);
+
+ node.select('text')
+ .style('opacity', 0.5)
+ .transition()
+ .duration(800)
+ .style('opacity', 0);
+
+ node.select('circle')
+ .style('stroke-fill', '#555')
+ .style('fill', '#888')
+ .style('opacity', 0.5)
+ .transition()
+ .duration(1500)
+ .attr('r', 0);
+ }
+
+ function deviceExit(d) {
+ var node = d.el;
+ node.select('use')
+ .style('opacity', 0.5)
+ .transition()
+ .duration(800)
+ .style('opacity', 0);
+
+ node.selectAll('rect')
+ .style('stroke-fill', '#555')
+ .style('fill', '#888')
+ .style('opacity', 0.5);
+ }
+
+
+ // ==========================
+ // updateLinks - subfunctions
+
+ function linkEntering(d) {
+ var link = d3.select(this);
+ d.el = link;
+ api.restyleLinkElement(d);
+ if (d.type() === 'hostLink') {
+ sus.visible(link, api.showHosts());
+ }
+ }
+
+ var linkLabelOffset = '0.3em';
+
+ function applyLinkLabels() {
+ var entering;
+
+ api.updateLinkLabelModel();
+
+ // for elements already existing, we need to update the text
+ // and adjust the rectangle size to fit
+ api.linkLabel().each(function (d) {
+ var el = d3.select(this),
+ rect = el.select('rect'),
+ text = el.select('text');
+ text.text(d.label);
+ rect.attr(rectAroundText(el));
+ });
+
+ entering = api.linkLabel().enter().append('g')
+ .classed('linkLabel', true)
+ .attr('id', function (d) { return d.id; });
+
+ entering.each(function (d) {
+ var el = d3.select(this),
+ rect,
+ text;
+
+ if (d.ldata.type() === 'hostLink') {
+ el.classed('hostLinkLabel', true);
+ sus.visible(el, api.showHosts());
+ }
+
+ d.el = el;
+ rect = el.append('rect');
+ text = el.append('text').text(d.label);
+ rect.attr(rectAroundText(el));
+ text.attr('dy', linkLabelOffset);
+
+ el.attr('transform', transformLabel(d.ldata.position));
+ });
+
+ // Remove any labels that are no longer required.
+ api.linkLabel().exit().remove();
+ }
+
+ function rectAroundText(el) {
+ var text = el.select('text'),
+ box = text.node().getBBox();
+
+ // translate the bbox so that it is centered on [x,y]
+ box.x = -box.width / 2;
+ box.y = -box.height / 2;
+
+ // add padding
+ box.x -= 1;
+ box.width += 2;
+ return box;
+ }
+
+ function transformLabel(p) {
+ var dx = p.x2 - p.x1,
+ dy = p.y2 - p.y1,
+ xMid = dx/2 + p.x1,
+ yMid = dy/2 + p.y1;
+ return sus.translate(xMid, yMid);
+ }
+
+ function applyPortLabels(data, portLabelG) {
+ var entering = portLabelG.selectAll('.portLabel')
+ .data(data).enter().append('g')
+ .classed('portLabel', true)
+ .attr('id', function (d) { return d.id; });
+
+ entering.each(function (d) {
+ var el = d3.select(this),
+ rect = el.append('rect'),
+ text = el.append('text').text(d.num);
+
+ rect.attr(rectAroundText(el));
+ text.attr('dy', linkLabelOffset);
+ el.attr('transform', sus.translate(d.x, d.y));
+ });
+ }
+
+ function labelPoint(linkPos) {
+ var lengthUpLine = 1 / 3,
+ dx = linkPos.x2 - linkPos.x1,
+ dy = linkPos.y2 - linkPos.y1,
+ movedX = dx * lengthUpLine,
+ movedY = dy * lengthUpLine;
+
+ return {
+ x: movedX,
+ y: movedY
+ };
+ }
+
+ function calcGroupPos(linkPos) {
+ var moved = labelPoint(linkPos);
+ return sus.translate(linkPos.x1 + moved.x, linkPos.y1 + moved.y);
+ }
+
+ // calculates where on the link that the hash line for 5+ label appears
+ function hashAttrs(linkPos) {
+ var hashLength = 25,
+ halfLength = hashLength / 2,
+ dx = linkPos.x2 - linkPos.x1,
+ dy = linkPos.y2 - linkPos.y1,
+ length = Math.sqrt((dx * dx) + (dy * dy)),
+ moveAmtX = (dx / length) * halfLength,
+ moveAmtY = (dy / length) * halfLength,
+ mid = labelPoint(linkPos),
+ angle = Math.atan(dy / dx) + 45;
+
+ return {
+ x1: mid.x - moveAmtX,
+ y1: mid.y - moveAmtY,
+ x2: mid.x + moveAmtX,
+ y2: mid.y + moveAmtY,
+ stroke: api.linkConfig()[ts.theme()].baseColor,
+ transform: 'rotate(' + angle + ',' + mid.x + ',' + mid.y + ')'
+ };
+ }
+
+ function textLabelPos(linkPos) {
+ var point = labelPoint(linkPos),
+ dist = 20;
+ return {
+ x: point.x + dist,
+ y: point.y + dist
+ };
+ }
+
+ function applyNumLinkLabels(data, lblsG) {
+ var labels = lblsG.selectAll('g.numLinkLabel')
+ .data(data, function (d) { return 'pair-' + d.id; }),
+ entering;
+
+ // update existing labels
+ labels.each(function (d) {
+ var el = d3.select(this);
+
+ el.attr({
+ transform: function (d) { return calcGroupPos(d.linkCoords); }
+ });
+ el.select('line')
+ .attr(hashAttrs(d.linkCoords));
+ el.select('text')
+ .attr(textLabelPos(d.linkCoords))
+ .text(d.num);
+ });
+
+ // add new labels
+ entering = labels
+ .enter()
+ .append('g')
+ .attr({
+ transform: function (d) { return calcGroupPos(d.linkCoords); },
+ id: function (d) { return 'pair-' + d.id; }
+ })
+ .classed('numLinkLabel', true);
+
+ entering.each(function (d) {
+ var el = d3.select(this);
+
+ el.append('line')
+ .classed('numLinkHash', true)
+ .attr(hashAttrs(d.linkCoords));
+ el.append('text')
+ .classed('numLinkText', true)
+ .attr(textLabelPos(d.linkCoords))
+ .text(d.num);
+ });
+
+ // remove old labels
+ labels.exit().remove();
+ }
+
+ // ==========================
+ // Module definition
+
+ angular.module('ovTopo')
+ .factory('TopoD3Service',
+ ['$log', 'FnService', 'SvgUtilService', 'IconService', 'ThemeService',
+
+ function (_$log_, _fs_, _sus_, _is_, _ts_) {
+ $log = _$log_;
+ fs = _fs_;
+ sus = _sus_;
+ is = _is_;
+ ts = _ts_;
+
+ icfg = is.iconConfig();
+
+ function initD3(_api_) {
+ api = _api_;
+ }
+
+ function destroyD3() { }
+
+ return {
+ initD3: initD3,
+ destroyD3: destroyD3,
+
+ incDevLabIndex: incDevLabIndex,
+ adjustRectToFitText: adjustRectToFitText,
+ hostLabel: hostLabel,
+ deviceLabel: deviceLabel,
+ trimLabel: trimLabel,
+
+ updateDeviceLabel: updateDeviceLabel,
+ updateHostLabel: updateHostLabel,
+ updateDeviceColors: updateDeviceColors,
+
+ deviceExisting: deviceExisting,
+ hostExisting: hostExisting,
+ deviceEnter: deviceEnter,
+ hostEnter: hostEnter,
+ hostExit: hostExit,
+ deviceExit: deviceExit,
+
+ linkEntering: linkEntering,
+ applyLinkLabels: applyLinkLabels,
+ transformLabel: transformLabel,
+ applyPortLabels: applyPortLabels,
+ applyNumLinkLabels: applyNumLinkLabels
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoEvent.js b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoEvent.js
new file mode 100644
index 00000000..5fd38bf6
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoEvent.js
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topology Event Module.
+
+ Defines the conduit between the client and the server:
+ - provides a clean API for sending events to the server
+ - dispatches incoming events from the server to the appropriate sub-module
+
+ */
+
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, $interval, wss, tps, tis, tfs, tss, tov, tspr;
+
+ // internal state
+ var handlerMap,
+ openListener,
+ heartbeatTimer;
+
+ var heartbeatPeriod = 9000; // 9 seconds
+
+ // ==========================
+
+ function createHandlerMap() {
+ handlerMap = {
+ showSummary: tps,
+
+ showDetails: tss,
+
+ showHighlights: tov,
+
+ addInstance: tis,
+ updateInstance: tis,
+ removeInstance: tis,
+
+ addDevice: tfs,
+ updateDevice: tfs,
+ removeDevice: tfs,
+ addHost: tfs,
+ updateHost: tfs,
+ removeHost: tfs,
+ addLink: tfs,
+ updateLink: tfs,
+ removeLink: tfs,
+
+ spriteListResponse: tspr,
+ spriteDataResponse: tspr
+ };
+ }
+
+ function wsOpen(host, url) {
+ $log.debug('TOPO: web socket open - cluster node:', host, 'URL:', url);
+ // Request batch of initial data from the new server
+ wss.sendEvent('topoStart');
+ }
+
+ function cancelHeartbeat() {
+ if (heartbeatTimer) {
+ $interval.cancel(heartbeatTimer);
+ }
+ heartbeatTimer = null;
+ }
+
+ function scheduleHeartbeat() {
+ cancelHeartbeat();
+ heartbeatTimer = $interval(function () {
+ wss.sendEvent('topoHeartbeat');
+ }, heartbeatPeriod);
+ }
+
+
+ angular.module('ovTopo')
+ .factory('TopoEventService',
+ ['$log', '$interval', 'WebSocketService',
+ 'TopoPanelService', 'TopoInstService', 'TopoForceService',
+ 'TopoSelectService', 'TopoOverlayService', 'TopoSpriteService',
+
+ function (_$log_, _$interval_, _wss_,
+ _tps_, _tis_, _tfs_, _tss_, _tov_, _tspr_) {
+ $log = _$log_;
+ $interval = _$interval_;
+ wss = _wss_;
+ tps = _tps_;
+ tis = _tis_;
+ tfs = _tfs_;
+ tss = _tss_;
+ tov = _tov_;
+ tspr = _tspr_;
+
+ createHandlerMap();
+
+ function start() {
+ openListener = wss.addOpenListener(wsOpen);
+ wss.bindHandlers(handlerMap);
+ wss.sendEvent('topoStart');
+ scheduleHeartbeat();
+ $log.debug('topo comms started');
+ }
+
+ function stop() {
+ cancelHeartbeat();
+ wss.sendEvent('topoStop');
+ wss.unbindHandlers(handlerMap);
+ wss.removeOpenListener(openListener);
+ openListener = null;
+ $log.debug('topo comms stopped');
+ }
+
+ return {
+ start: start,
+ stop: stop
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoFilter.js b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoFilter.js
new file mode 100644
index 00000000..f9b96ae8
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoFilter.js
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topology layer filtering Module.
+ Provides functionality to visually differentiate between the packet and
+ optical layers of the topology.
+ */
+
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, fs, flash, tps, tts;
+
+ // api to topoForce
+ var api;
+ /*
+ node() // get ref to D3 selection of nodes
+ link() // get ref to D3 selection of links
+ */
+
+ var smax = 'suppressedmax';
+
+ // which "layer" a particular item "belongs to"
+ var layerLookup = {
+ host: {
+ endstation: 'pkt', // default, if host event does not define type
+ router: 'pkt',
+ bgpSpeaker: 'pkt'
+ },
+ device: {
+ switch: 'pkt',
+ roadm: 'opt'
+ },
+ link: {
+ hostLink: 'pkt',
+ direct: 'pkt',
+ indirect: '',
+ tunnel: '',
+ optical: 'opt'
+ }
+ },
+ // order of layer cycling in button
+ dispatch = [
+ {
+ type: 'all',
+ action: function () { suppressLayers(false); },
+ msg: 'All Layers Shown'
+ },
+ {
+ type: 'pkt',
+ action: function () { showLayer('pkt'); },
+ msg: 'Packet Layer Shown'
+ },
+ {
+ type: 'opt',
+ action: function () { showLayer('opt'); },
+ msg: 'Optical Layer Shown'
+ }
+ ],
+ layer = 0;
+
+ function clickAction() {
+ layer = (layer + 1) % dispatch.length;
+ dispatch[layer].action();
+ flash.flash(dispatch[layer].msg);
+ }
+
+ function selected() {
+ return dispatch[layer].type;
+ }
+
+ function inLayer(d, layer) {
+ var type = d.class === 'link' ? d.type() : d.type,
+ look = layerLookup[d.class],
+ lyr = look && look[type];
+ return lyr === layer;
+ }
+
+ function unsuppressLayer(which) {
+ api.node().each(function (d) {
+ var node = d.el;
+ if (inLayer(d, which)) {
+ node.classed(smax, false);
+ }
+ });
+
+ api.link().each(function (d) {
+ var link = d.el;
+ if (inLayer(d, which)) {
+ link.classed(smax, false);
+ }
+ });
+ }
+
+ function suppressLayers(b) {
+ api.node().classed(smax, b);
+ api.link().classed(smax, b);
+ }
+
+ function showLayer(which) {
+ suppressLayers(true);
+ unsuppressLayer(which);
+ }
+
+ // === -----------------------------------------------------
+ // === MODULE DEFINITION ===
+
+ angular.module('ovTopo')
+ .factory('TopoFilterService',
+ ['$log', 'FnService',
+ 'FlashService',
+ 'TopoPanelService',
+ 'TopoTrafficService',
+
+ function (_$log_, _fs_, _flash_, _tps_, _tts_) {
+ $log = _$log_;
+ fs = _fs_;
+ flash = _flash_;
+ tps = _tps_;
+ tts = _tts_;
+
+ function initFilter(_api_) {
+ api = _api_;
+ }
+
+ return {
+ initFilter: initFilter,
+
+ clickAction: clickAction,
+ selected: selected,
+ inLayer: inLayer
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoForce.js b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoForce.js
new file mode 100644
index 00000000..dbe8f9f5
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoForce.js
@@ -0,0 +1,1134 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topology Force Module.
+ Visualization of the topology in an SVG layer, using a D3 Force Layout.
+ */
+
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, $timeout, fs, sus, ts, flash, wss, tov,
+ tis, tms, td3, tss, tts, tos, fltr, tls, uplink, svg;
+
+ // configuration
+ var linkConfig = {
+ light: {
+ baseColor: '#666',
+ inColor: '#66f',
+ outColor: '#f00'
+ },
+ dark: {
+ baseColor: '#aaa',
+ inColor: '#66f',
+ outColor: '#f66'
+ },
+ inWidth: 12,
+ outWidth: 10
+ };
+
+ // internal state
+ var settings, // merged default settings and options
+ force, // force layout object
+ drag, // drag behavior handler
+ network = {
+ nodes: [],
+ links: [],
+ linksByDevice: {},
+ lookup: {},
+ revLinkToKey: {}
+ },
+ lu, // shorthand for lookup
+ rlk, // shorthand for revLinktoKey
+ showHosts = false, // whether hosts are displayed
+ showOffline = true, // whether offline devices are displayed
+ nodeLock = false, // whether nodes can be dragged or not (locked)
+ fTimer, // timer for delayed force layout
+ fNodesTimer, // timer for delayed nodes update
+ fLinksTimer, // timer for delayed links update
+ dim, // the dimensions of the force layout [w,h]
+ linkNums = []; // array of link number labels
+
+ // SVG elements;
+ var linkG, linkLabelG, numLinkLblsG, portLabelG, nodeG;
+
+ // D3 selections;
+ var link, linkLabel, node;
+
+ // default settings for force layout
+ var defaultSettings = {
+ gravity: 0.4,
+ friction: 0.7,
+ charge: {
+ // note: key is node.class
+ device: -8000,
+ host: -5000,
+ _def_: -12000
+ },
+ linkDistance: {
+ // note: key is link.type
+ direct: 100,
+ optical: 120,
+ hostLink: 3,
+ _def_: 50
+ },
+ linkStrength: {
+ // note: key is link.type
+ // range: {0.0 ... 1.0}
+ //direct: 1.0,
+ //optical: 1.0,
+ //hostLink: 1.0,
+ _def_: 1.0
+ }
+ };
+
+
+ // ==========================
+ // === EVENT HANDLERS
+
+ function addDevice(data) {
+ var id = data.id,
+ d;
+
+ uplink.showNoDevs(false);
+
+ // although this is an add device event, if we already have the
+ // device, treat it as an update instead..
+ if (lu[id]) {
+ updateDevice(data);
+ return;
+ }
+
+ d = tms.createDeviceNode(data);
+ network.nodes.push(d);
+ lu[id] = d;
+ updateNodes();
+ fStart();
+ }
+
+ function updateDevice(data) {
+ var id = data.id,
+ d = lu[id],
+ wasOnline;
+
+ if (d) {
+ wasOnline = d.online;
+ angular.extend(d, data);
+ if (tms.positionNode(d, true)) {
+ sendUpdateMeta(d);
+ }
+ updateNodes();
+ if (wasOnline !== d.online) {
+ tms.findAttachedLinks(d.id).forEach(restyleLinkElement);
+ updateOfflineVisibility(d);
+ }
+ }
+ }
+
+ function removeDevice(data) {
+ var id = data.id,
+ d = lu[id];
+ if (d) {
+ removeDeviceElement(d);
+ }
+ }
+
+ function addHost(data) {
+ var id = data.id,
+ d, lnk;
+
+ // although this is an add host event, if we already have the
+ // host, treat it as an update instead..
+ if (lu[id]) {
+ updateHost(data);
+ return;
+ }
+
+ d = tms.createHostNode(data);
+ network.nodes.push(d);
+ lu[id] = d;
+ updateNodes();
+
+ lnk = tms.createHostLink(data);
+ if (lnk) {
+ d.linkData = lnk; // cache ref on its host
+ network.links.push(lnk);
+ lu[d.ingress] = lnk;
+ lu[d.egress] = lnk;
+ updateLinks();
+ }
+ fStart();
+ }
+
+ function updateHost(data) {
+ var id = data.id,
+ d = lu[id];
+ if (d) {
+ angular.extend(d, data);
+ if (tms.positionNode(d, true)) {
+ sendUpdateMeta(d);
+ }
+ updateNodes();
+ }
+ }
+
+ function removeHost(data) {
+ var id = data.id,
+ d = lu[id];
+ if (d) {
+ removeHostElement(d, true);
+ }
+ }
+
+ function addLink(data) {
+ var result = tms.findLink(data, 'add'),
+ bad = result.badLogic,
+ d = result.ldata;
+
+ if (bad) {
+ //logicError(bad + ': ' + link.id);
+ return;
+ }
+
+ if (d) {
+ // we already have a backing store link for src/dst nodes
+ addLinkUpdate(d, data);
+ return;
+ }
+
+ // no backing store link yet
+ d = tms.createLink(data);
+ if (d) {
+ network.links.push(d);
+ aggregateLink(d, data);
+ lu[d.key] = d;
+ updateLinks();
+ fStart();
+ }
+ }
+
+ function updateLink(data) {
+ var result = tms.findLink(data, 'update'),
+ bad = result.badLogic;
+ if (bad) {
+ //logicError(bad + ': ' + link.id);
+ return;
+ }
+ result.updateWith(link);
+ }
+
+ function removeLink(data) {
+ var result = tms.findLink(data, 'remove');
+
+ if (!result.badLogic) {
+ result.removeRawLink();
+ }
+ }
+
+ // ========================
+
+ function nodeById(id) {
+ return lu[id];
+ }
+
+ function makeNodeKey(node1, node2) {
+ return node1 + '-' + node2;
+ }
+
+ function findNodePair(key, keyRev) {
+ if (network.linksByDevice[key]) {
+ return key;
+ } else if (network.linksByDevice[keyRev]) {
+ return keyRev;
+ } else {
+ return false;
+ }
+ }
+
+ function aggregateLink(ldata, link) {
+ var key = makeNodeKey(link.src, link.dst),
+ keyRev = makeNodeKey(link.dst, link.src),
+ found = findNodePair(key, keyRev);
+
+ if (found) {
+ network.linksByDevice[found].push(ldata);
+ ldata.devicePair = found;
+ } else {
+ network.linksByDevice[key] = [ ldata ];
+ ldata.devicePair = key;
+ }
+ }
+
+ function addLinkUpdate(ldata, link) {
+ // add link event, but we already have the reverse link installed
+ ldata.fromTarget = link;
+ rlk[link.id] = ldata.key;
+ // possible solution to el being undefined in restyleLinkElement:
+ //_updateLinks();
+ restyleLinkElement(ldata);
+ }
+
+
+ var widthRatio = 1.4,
+ linkScale = d3.scale.linear()
+ .domain([1, 12])
+ .range([widthRatio, 12 * widthRatio])
+ .clamp(true),
+ allLinkTypes = 'direct indirect optical tunnel';
+
+ function restyleLinkElement(ldata, immediate) {
+ // this fn's job is to look at raw links and decide what svg classes
+ // need to be applied to the line element in the DOM
+ var th = ts.theme(),
+ el = ldata.el,
+ type = ldata.type(),
+ lw = ldata.linkWidth(),
+ online = ldata.online(),
+ delay = immediate ? 0 : 1000;
+
+ // FIXME: understand why el is sometimes undefined on addLink events...
+ // Investigated:
+ // el is undefined when it's a reverse link that is being added.
+ // updateLinks (which sets ldata.el) isn't called before this is called.
+ // Calling _updateLinks in addLinkUpdate fixes it, but there might be
+ // a more efficient way to fix it.
+ if (el && !el.empty()) {
+ el.classed('link', true);
+ el.classed('inactive', !online);
+ el.classed(allLinkTypes, false);
+ if (type) {
+ el.classed(type, true);
+ }
+ el.transition()
+ .duration(delay)
+ .attr('stroke-width', linkScale(lw))
+ .attr('stroke', linkConfig[th].baseColor);
+ }
+ }
+
+ function removeLinkElement(d) {
+ var idx = fs.find(d.key, network.links, 'key'),
+ removed;
+ if (idx >=0) {
+ // remove from links array
+ removed = network.links.splice(idx, 1);
+ // remove from lookup cache
+ delete lu[removed[0].key];
+ updateLinks();
+ fResume();
+ }
+ }
+
+ function removeHostElement(d, upd) {
+ // first, remove associated hostLink...
+ removeLinkElement(d.linkData);
+
+ // remove hostLink bindings
+ delete lu[d.ingress];
+ delete lu[d.egress];
+
+ // remove from lookup cache
+ delete lu[d.id];
+ // remove from nodes array
+ var idx = fs.find(d.id, network.nodes);
+ network.nodes.splice(idx, 1);
+
+ // remove from SVG
+ // NOTE: upd is false if we were called from removeDeviceElement()
+ if (upd) {
+ updateNodes();
+ fResume();
+ }
+ }
+
+ function removeDeviceElement(d) {
+ var id = d.id,
+ idx;
+ // first, remove associated hosts and links..
+ tms.findAttachedHosts(id).forEach(removeHostElement);
+ tms.findAttachedLinks(id).forEach(removeLinkElement);
+
+ // remove from lookup cache
+ delete lu[id];
+ // remove from nodes array
+ idx = fs.find(id, network.nodes);
+ if (idx > -1) {
+ network.nodes.splice(idx, 1);
+ }
+
+ if (!network.nodes.length) {
+ uplink.showNoDevs(true);
+ }
+
+ // remove from SVG
+ updateNodes();
+ fResume();
+ }
+
+ function updateHostVisibility() {
+ sus.visible(nodeG.selectAll('.host'), showHosts);
+ sus.visible(linkG.selectAll('.hostLink'), showHosts);
+ sus.visible(linkLabelG.selectAll('.hostLinkLabel'), showHosts);
+ }
+
+ function updateOfflineVisibility(dev) {
+ function updDev(d, show) {
+ var b;
+ sus.visible(d.el, show);
+
+ tms.findAttachedLinks(d.id).forEach(function (link) {
+ b = show && ((link.type() !== 'hostLink') || showHosts);
+ sus.visible(link.el, b);
+ });
+ tms.findAttachedHosts(d.id).forEach(function (host) {
+ b = show && showHosts;
+ sus.visible(host.el, b);
+ });
+ }
+
+ if (dev) {
+ // updating a specific device that just toggled off/on-line
+ updDev(dev, dev.online || showOffline);
+ } else {
+ // updating all offline devices
+ tms.findDevices(true).forEach(function (d) {
+ updDev(d, showOffline);
+ });
+ }
+ }
+
+
+ function sendUpdateMeta(d, clearPos) {
+ var metaUi = {},
+ ll;
+
+ // if we are not clearing the position data (unpinning),
+ // attach the x, y, longitude, latitude...
+ if (!clearPos) {
+ ll = tms.lngLatFromCoord([d.x, d.y]);
+ metaUi = {x: d.x, y: d.y, lng: ll[0], lat: ll[1]};
+ }
+ d.metaUi = metaUi;
+ wss.sendEvent('updateMeta', {
+ id: d.id,
+ class: d.class,
+ memento: metaUi
+ });
+ }
+
+
+ function mkSvgClass(d) {
+ return d.fixed ? d.svgClass + ' fixed' : d.svgClass;
+ }
+
+ function vis(b) {
+ return b ? 'visible' : 'hidden';
+ }
+
+ function toggleHosts(x) {
+ var kev = (x === 'keyev'),
+ on = kev ? !showHosts : !!x;
+
+ showHosts = on;
+ updateHostVisibility();
+ flash.flash('Hosts ' + vis(on));
+ return on;
+ }
+
+ function toggleOffline(x) {
+ var kev = (x === 'keyev'),
+ on = kev ? !showOffline : !!x;
+
+ showOffline = on;
+ updateOfflineVisibility();
+ flash.flash('Offline devices ' + vis(on));
+ return on;
+ }
+
+ function cycleDeviceLabels() {
+ flash.flash(td3.incDevLabIndex());
+ tms.findDevices().forEach(function (d) {
+ td3.updateDeviceLabel(d);
+ });
+ }
+
+ function unpin() {
+ var hov = tss.hovered();
+ if (hov) {
+ sendUpdateMeta(hov, true);
+ hov.fixed = false;
+ hov.el.classed('fixed', false);
+ fResume();
+ }
+ }
+
+ function showMastership(masterId) {
+ if (!masterId) {
+ restoreLayerState();
+ } else {
+ showMastershipFor(masterId);
+ }
+ }
+
+ function restoreLayerState() {
+ // NOTE: this level of indirection required, for when we have
+ // the layer filter functionality re-implemented
+ suppressLayers(false);
+ }
+
+ function showMastershipFor(id) {
+ suppressLayers(true);
+ node.each(function (n) {
+ if (n.master === id) {
+ n.el.classed('suppressedmax', false);
+ }
+ });
+ }
+
+ function supAmt(less) {
+ return less ? "suppressed" : "suppressedmax";
+ }
+
+ function suppressLayers(b, less) {
+ var cls = supAmt(less);
+ node.classed(cls, b);
+ link.classed(cls, b);
+ }
+
+ function unsuppressNode(id, less) {
+ var cls = supAmt(less);
+ node.each(function (n) {
+ if (n.id === id) {
+ n.el.classed(cls, false);
+ }
+ });
+ }
+
+ function unsuppressLink(key, less) {
+ var cls = supAmt(less);
+ link.each(function (n) {
+ if (n.key === key) {
+ n.el.classed(cls, false);
+ }
+ });
+ }
+
+ function showBadLinks() {
+ var badLinks = tms.findBadLinks();
+ flash.flash('Bad Links: ' + badLinks.length);
+ $log.debug('Bad Link List (' + badLinks.length + '):');
+ badLinks.forEach(function (d) {
+ $log.debug('bad link: (' + d.bad + ') ' + d.key, d);
+ if (d.el) {
+ d.el.attr('stroke-width', linkScale(2.8))
+ .attr('stroke', 'red');
+ }
+ });
+ // back to normal after 2 seconds...
+ $timeout(updateLinks, 2000);
+ }
+
+ // ==========================================
+
+ function updateNodes() {
+ if (fNodesTimer) {
+ $timeout.cancel(fNodesTimer);
+ }
+ fNodesTimer = $timeout(_updateNodes, 150);
+ }
+
+ // IMPLEMENTATION NOTE: _updateNodes() should NOT stop, start, or resume
+ // the force layout; that needs to be determined and implemented elsewhere
+ function _updateNodes() {
+ // select all the nodes in the layout:
+ node = nodeG.selectAll('.node')
+ .data(network.nodes, function (d) { return d.id; });
+
+ // operate on existing nodes:
+ node.filter('.device').each(td3.deviceExisting);
+ node.filter('.host').each(td3.hostExisting);
+
+ // operate on entering nodes:
+ var entering = node.enter()
+ .append('g')
+ .attr({
+ id: function (d) { return sus.safeId(d.id); },
+ class: mkSvgClass,
+ transform: function (d) {
+ // Need to guard against NaN here ??
+ return sus.translate(d.x, d.y);
+ },
+ opacity: 0
+ })
+ .call(drag)
+ .on('mouseover', tss.nodeMouseOver)
+ .on('mouseout', tss.nodeMouseOut)
+ .transition()
+ .attr('opacity', 1);
+
+ // augment entering nodes:
+ entering.filter('.device').each(td3.deviceEnter);
+ entering.filter('.host').each(td3.hostEnter);
+
+ // operate on both existing and new nodes:
+ td3.updateDeviceColors();
+
+ // operate on exiting nodes:
+ // Note that the node is removed after 2 seconds.
+ // Sub element animations should be shorter than 2 seconds.
+ var exiting = node.exit()
+ .transition()
+ .duration(2000)
+ .style('opacity', 0)
+ .remove();
+
+ // exiting node specifics:
+ exiting.filter('.host').each(td3.hostExit);
+ exiting.filter('.device').each(td3.deviceExit);
+ }
+
+ // ==========================
+
+ function getDefaultPos(link) {
+ return {
+ x1: link.source.x,
+ y1: link.source.y,
+ x2: link.target.x,
+ y2: link.target.y
+ };
+ }
+
+ // returns amount of adjustment along the normal for given link
+ function amt(numLinks, linkIdx) {
+ var gap = 6;
+ return (linkIdx - ((numLinks - 1) / 2)) * gap;
+ }
+
+ function calcMovement(d, amt, flipped) {
+ var pos = getDefaultPos(d),
+ mult = flipped ? -amt : amt,
+ dx = pos.x2 - pos.x1,
+ dy = pos.y2 - pos.y1,
+ length = Math.sqrt((dx * dx) + (dy * dy));
+
+ return {
+ x1: pos.x1 + (mult * dy / length),
+ y1: pos.y1 + (mult * -dx / length),
+ x2: pos.x2 + (mult * dy / length),
+ y2: pos.y2 + (mult * -dx / length)
+ };
+ }
+
+ function calcPosition() {
+ var lines = this,
+ linkSrcId;
+ linkNums = [];
+ lines.each(function (d) {
+ if (d.type() === 'hostLink') {
+ d.position = getDefaultPos(d);
+ }
+ });
+
+ function normalizeLinkSrc(link) {
+ // ensure source device is consistent across set of links
+ // temporary measure until link modeling is refactored
+ if (!linkSrcId) {
+ linkSrcId = link.source.id;
+ return false;
+ }
+
+ return link.source.id !== linkSrcId;
+ }
+
+ angular.forEach(network.linksByDevice, function (linkArr, key) {
+ var numLinks = linkArr.length,
+ link;
+
+ if (numLinks === 1) {
+ link = linkArr[0];
+ link.position = getDefaultPos(link);
+ link.position.multiLink = false;
+ } else if (numLinks >= 5) {
+ // this code is inefficient, in the future the way links
+ // are modeled will be changed
+ angular.forEach(linkArr, function (link) {
+ link.position = getDefaultPos(link);
+ link.position.multiLink = true;
+ });
+ linkNums.push({
+ id: key,
+ num: numLinks,
+ linkCoords: linkArr[0].position
+ });
+ } else {
+ linkSrcId = null;
+ angular.forEach(linkArr, function (link, index) {
+ var offsetAmt = amt(numLinks, index),
+ needToFlip = normalizeLinkSrc(link);
+ link.position = calcMovement(link, offsetAmt, needToFlip);
+ link.position.multiLink = false;
+ });
+ }
+ });
+ }
+
+ function updateLinks() {
+ if (fLinksTimer) {
+ $timeout.cancel(fLinksTimer);
+ }
+ fLinksTimer = $timeout(_updateLinks, 150);
+ }
+
+ // IMPLEMENTATION NOTE: _updateLinks() should NOT stop, start, or resume
+ // the force layout; that needs to be determined and implemented elsewhere
+ function _updateLinks() {
+ var th = ts.theme();
+
+ link = linkG.selectAll('.link')
+ .data(network.links, function (d) { return d.key; });
+
+ // operate on existing links:
+ link.each(function (d) {
+ // this is supposed to be an existing link, but we have observed
+ // occasions (where links are deleted and added rapidly?) where
+ // the DOM element has not been defined. So protect against that...
+ if (d.el) {
+ restyleLinkElement(d, true);
+ }
+ });
+
+ // operate on entering links:
+ var entering = link.enter()
+ .append('line')
+ .call(calcPosition)
+ .attr({
+ x1: function (d) { return d.position.x1; },
+ y1: function (d) { return d.position.y1; },
+ x2: function (d) { return d.position.x2; },
+ y2: function (d) { return d.position.y2; },
+ stroke: linkConfig[th].inColor,
+ 'stroke-width': linkConfig.inWidth
+ });
+
+ // augment links
+ entering.each(td3.linkEntering);
+
+ // operate on both existing and new links:
+ //link.each(...)
+
+ // add labels for how many links are in a thick line
+ td3.applyNumLinkLabels(linkNums, numLinkLblsG);
+
+ // apply or remove labels
+ td3.applyLinkLabels();
+
+ // operate on exiting links:
+ link.exit()
+ .attr('stroke-dasharray', '3 3')
+ .attr('stroke', linkConfig[th].outColor)
+ .style('opacity', 0.5)
+ .transition()
+ .duration(1500)
+ .attr({
+ 'stroke-dasharray': '3 12',
+ 'stroke-width': linkConfig.outWidth
+ })
+ .style('opacity', 0.0)
+ .remove();
+ }
+
+
+ // ==========================
+ // force layout tick function
+
+ function fResume() {
+ if (!tos.isOblique()) {
+ force.resume();
+ }
+ }
+
+ function fStart() {
+ if (!tos.isOblique()) {
+ if (fTimer) {
+ $timeout.cancel(fTimer);
+ }
+ fTimer = $timeout(function () {
+ $log.debug("Starting force-layout");
+ force.start();
+ }, 200);
+ }
+ }
+
+ var tickStuff = {
+ nodeAttr: {
+ transform: function (d) {
+ var dx = isNaN(d.x) ? 0 : d.x,
+ dy = isNaN(d.y) ? 0 : d.y;
+ return sus.translate(dx, dy);
+ }
+ },
+ linkAttr: {
+ x1: function (d) { return d.position.x1; },
+ y1: function (d) { return d.position.y1; },
+ x2: function (d) { return d.position.x2; },
+ y2: function (d) { return d.position.y2; }
+ },
+ linkLabelAttr: {
+ transform: function (d) {
+ var lnk = tms.findLinkById(d.key);
+ if (lnk) {
+ return td3.transformLabel(lnk.position);
+ }
+ }
+ }
+ };
+
+ function tick() {
+ // guard against null (which can happen when our view pages out)...
+ if (node && node.size()) {
+ node.attr(tickStuff.nodeAttr);
+ }
+ if (link && link.size()) {
+ link.call(calcPosition)
+ .attr(tickStuff.linkAttr);
+ td3.applyNumLinkLabels(linkNums, numLinkLblsG);
+ }
+ if (linkLabel && linkLabel.size()) {
+ linkLabel.attr(tickStuff.linkLabelAttr);
+ }
+ }
+
+
+ // ==========================
+ // === MOUSE GESTURE HANDLERS
+
+ function zoomingOrPanning(ev) {
+ return ev.metaKey || ev.altKey;
+ }
+
+ function atDragEnd(d) {
+ // once we've finished moving, pin the node in position
+ d.fixed = true;
+ d3.select(this).classed('fixed', true);
+ sendUpdateMeta(d);
+ tss.clickConsumed(true);
+ }
+
+ // predicate that indicates when dragging is active
+ function dragEnabled() {
+ var ev = d3.event.sourceEvent;
+ // nodeLock means we aren't allowing nodes to be dragged...
+ return !nodeLock && !zoomingOrPanning(ev);
+ }
+
+ // predicate that indicates when clicking is active
+ function clickEnabled() {
+ return true;
+ }
+
+ // =============================================
+ // function entry points for overlay module
+
+ // TODO: find an automatic way of tracking via the "showHighlights" events
+ var allTrafficClasses = 'primary secondary optical animated ' +
+ 'port-traffic-Kbps port-traffic-Mbps port-traffic-Gbps ' +
+ 'port-traffic-Gbps-choked';
+
+ function clearLinkTrafficStyle() {
+ link.style('stroke-width', null)
+ .classed(allTrafficClasses, false);
+ }
+
+ function removeLinkLabels() {
+ network.links.forEach(function (d) {
+ d.label = '';
+ });
+ }
+
+ function updateLinkLabelModel() {
+ // create the backing data for showing labels..
+ var data = [];
+ link.each(function (d) {
+ if (d.label) {
+ data.push({
+ id: 'lab-' + d.key,
+ key: d.key,
+ label: d.label,
+ ldata: d
+ });
+ }
+ });
+
+ linkLabel = linkLabelG.selectAll('.linkLabel')
+ .data(data, function (d) { return d.id; });
+ }
+
+ // ==========================
+ // Module definition
+
+ function mkModelApi(uplink) {
+ return {
+ projection: uplink.projection,
+ network: network,
+ restyleLinkElement: restyleLinkElement,
+ removeLinkElement: removeLinkElement
+ };
+ }
+
+ function mkD3Api() {
+ return {
+ node: function () { return node; },
+ link: function () { return link; },
+ linkLabel: function () { return linkLabel; },
+ instVisible: function () { return tis.isVisible(); },
+ posNode: tms.positionNode,
+ showHosts: function () { return showHosts; },
+ restyleLinkElement: restyleLinkElement,
+ updateLinkLabelModel: updateLinkLabelModel,
+ linkConfig: function () { return linkConfig; }
+ };
+ }
+
+ function mkSelectApi() {
+ return {
+ node: function () { return node; },
+ zoomingOrPanning: zoomingOrPanning,
+ updateDeviceColors: td3.updateDeviceColors,
+ deselectLink: tls.deselectLink
+ };
+ }
+
+ function mkTrafficApi() {
+ return {
+ hovered: tss.hovered,
+ somethingSelected: tss.somethingSelected,
+ selectOrder: tss.selectOrder
+ };
+ }
+
+ function mkOverlayApi() {
+ return {
+ clearLinkTrafficStyle: clearLinkTrafficStyle,
+ removeLinkLabels: removeLinkLabels,
+ findLinkById: tms.findLinkById,
+ findNodeById: nodeById,
+ updateLinks: updateLinks,
+ updateNodes: updateNodes,
+ supLayers: suppressLayers,
+ unsupNode: unsuppressNode,
+ unsupLink: unsuppressLink
+ };
+ }
+
+ function mkObliqueApi(uplink, fltr) {
+ return {
+ force: function() { return force; },
+ zoomLayer: uplink.zoomLayer,
+ nodeGBBox: function() { return nodeG.node().getBBox(); },
+ node: function () { return node; },
+ link: function () { return link; },
+ linkLabel: function () { return linkLabel; },
+ nodes: function () { return network.nodes; },
+ tickStuff: tickStuff,
+ nodeLock: function (b) {
+ var old = nodeLock;
+ nodeLock = b;
+ return old;
+ },
+ opacifyMap: uplink.opacifyMap,
+ inLayer: fltr.inLayer,
+ calcLinkPos: calcPosition,
+ applyNumLinkLabels: function () {
+ td3.applyNumLinkLabels(linkNums, numLinkLblsG);
+ }
+ };
+ }
+
+ function mkFilterApi() {
+ return {
+ node: function () { return node; },
+ link: function () { return link; }
+ };
+ }
+
+ function mkLinkApi(svg, uplink) {
+ return {
+ svg: svg,
+ zoomer: uplink.zoomer(),
+ network: network,
+ portLabelG: function () { return portLabelG; },
+ showHosts: function () { return showHosts; }
+ };
+ }
+
+ angular.module('ovTopo')
+ .factory('TopoForceService',
+ ['$log', '$timeout', 'FnService', 'SvgUtilService',
+ 'ThemeService', 'FlashService', 'WebSocketService',
+ 'TopoOverlayService', 'TopoInstService', 'TopoModelService',
+ 'TopoD3Service', 'TopoSelectService', 'TopoTrafficService',
+ 'TopoObliqueService', 'TopoFilterService', 'TopoLinkService',
+
+ function (_$log_, _$timeout_, _fs_, _sus_, _ts_, _flash_, _wss_, _tov_,
+ _tis_, _tms_, _td3_, _tss_, _tts_, _tos_, _fltr_, _tls_) {
+ $log = _$log_;
+ $timeout = _$timeout_;
+ fs = _fs_;
+ sus = _sus_;
+ ts = _ts_;
+ flash = _flash_;
+ wss = _wss_;
+ tov = _tov_;
+ tis = _tis_;
+ tms = _tms_;
+ td3 = _td3_;
+ tss = _tss_;
+ tts = _tts_;
+ tos = _tos_;
+ fltr = _fltr_;
+ tls = _tls_;
+
+ var themeListener = ts.addListener(function () {
+ updateLinks();
+ updateNodes();
+ });
+
+ // forceG is the SVG group to display the force layout in
+ // uplink is the api from the main topo source file
+ // dim is the initial dimensions of the SVG as [w,h]
+ // opts are, well, optional :)
+ function initForce(_svg_, forceG, _uplink_, _dim_, opts) {
+ uplink = _uplink_;
+ dim = _dim_;
+ svg = _svg_;
+
+ lu = network.lookup;
+ rlk = network.revLinkToKey;
+
+ $log.debug('initForce().. dim = ' + dim);
+
+ tov.setApi(mkOverlayApi(), tss);
+ tms.initModel(mkModelApi(uplink), dim);
+ td3.initD3(mkD3Api());
+ tss.initSelect(mkSelectApi());
+ tts.initTraffic(mkTrafficApi());
+ tos.initOblique(mkObliqueApi(uplink, fltr));
+ fltr.initFilter(mkFilterApi());
+ tls.initLink(mkLinkApi(svg, uplink), td3);
+
+ settings = angular.extend({}, defaultSettings, opts);
+
+ linkG = forceG.append('g').attr('id', 'topo-links');
+ linkLabelG = forceG.append('g').attr('id', 'topo-linkLabels');
+ numLinkLblsG = forceG.append('g').attr('id', 'topo-numLinkLabels');
+ nodeG = forceG.append('g').attr('id', 'topo-nodes');
+ portLabelG = forceG.append('g').attr('id', 'topo-portLabels');
+
+ link = linkG.selectAll('.link');
+ linkLabel = linkLabelG.selectAll('.linkLabel');
+ node = nodeG.selectAll('.node');
+
+ force = d3.layout.force()
+ .size(dim)
+ .nodes(network.nodes)
+ .links(network.links)
+ .gravity(settings.gravity)
+ .friction(settings.friction)
+ .charge(settings.charge._def_)
+ .linkDistance(settings.linkDistance._def_)
+ .linkStrength(settings.linkStrength._def_)
+ .on('tick', tick);
+
+ drag = sus.createDragBehavior(force,
+ tss.selectObject, atDragEnd, dragEnabled, clickEnabled);
+ }
+
+ function newDim(_dim_) {
+ dim = _dim_;
+ force.size(dim);
+ tms.newDim(dim);
+ }
+
+ function destroyForce() {
+ force.stop();
+
+ tls.destroyLink();
+ tos.destroyOblique();
+ tts.destroyTraffic();
+ tss.destroySelect();
+ td3.destroyD3();
+ tms.destroyModel();
+ // note: no need to destroy overlay service
+ ts.removeListener(themeListener);
+ themeListener = null;
+
+ // clean up the DOM
+ svg.selectAll('g').remove();
+ svg.selectAll('defs').remove();
+
+ // clean up internal state
+ network.nodes = [];
+ network.links = [];
+ network.linksByDevice = {};
+ network.lookup = {};
+ network.revLinkToKey = {};
+
+ linkNums = [];
+
+ linkG = linkLabelG = numLinkLblsG = nodeG = portLabelG = null;
+ link = linkLabel = node = null;
+ force = drag = null;
+
+ // clean up $timeout promises
+ if (fTimer) {
+ $timeout.cancel(fTimer);
+ }
+ if (fNodesTimer) {
+ $timeout.cancel(fNodesTimer);
+ }
+ if (fLinksTimer) {
+ $timeout.cancel(fLinksTimer);
+ }
+ }
+
+ return {
+ initForce: initForce,
+ newDim: newDim,
+ destroyForce: destroyForce,
+
+ updateDeviceColors: td3.updateDeviceColors,
+ toggleHosts: toggleHosts,
+ togglePorts: tls.togglePorts,
+ toggleOffline: toggleOffline,
+ cycleDeviceLabels: cycleDeviceLabels,
+ unpin: unpin,
+ showMastership: showMastership,
+ showBadLinks: showBadLinks,
+
+ addDevice: addDevice,
+ updateDevice: updateDevice,
+ removeDevice: removeDevice,
+ addHost: addHost,
+ updateHost: updateHost,
+ removeHost: removeHost,
+ addLink: addLink,
+ updateLink: updateLink,
+ removeLink: removeLink
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoInst.js b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoInst.js
new file mode 100644
index 00000000..7e929977
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoInst.js
@@ -0,0 +1,373 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topology Instances Module.
+ Defines modeling of ONOS instances.
+ */
+
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, ps, sus, gs, ts, fs, flash;
+
+ // api from topo
+ var api;
+ /*
+ showMastership( id )
+ */
+
+ // configuration
+ var instCfg = {
+ rectPad: 8,
+ nodeOx: 9,
+ nodeOy: 9,
+ nodeDim: 40,
+ birdOx: 19,
+ birdOy: 21,
+ birdDim: 21,
+ uiDy: 45,
+ titleDy: 30,
+ textYOff: 20,
+ textYSpc: 15
+ },
+ showLogicErrors = true,
+ idIns = 'topo-p-instance',
+ instOpts = {
+ edge: 'left',
+ width: 20
+ };
+
+ // internal state
+ var onosInstances,
+ onosOrder,
+ oiShowMaster,
+ oiBox,
+ themeListener;
+
+
+ // ==========================
+
+ function addInstance(data) {
+ var id = data.id;
+
+ if (onosInstances[id]) {
+ updateInstance(data);
+ return;
+ }
+ onosInstances[id] = data;
+ onosOrder.push(data);
+ updateInstances();
+ }
+
+ function updateInstance(data) {
+ var id = data.id,
+ d = onosInstances[id];
+ if (d) {
+ angular.extend(d, data);
+ updateInstances();
+ } else {
+ logicError('updateInstance: lookup fail: ID = "' + id + '"');
+ }
+ }
+
+ function removeInstance(data) {
+ var id = data.id,
+ d = onosInstances[id];
+ if (d) {
+ var idx = fs.find(id, onosOrder);
+ if (idx >= 0) {
+ onosOrder.splice(idx, 1);
+ }
+ delete onosInstances[id];
+ updateInstances();
+ } else {
+ logicError('removeInstance lookup fail. ID = "' + id + '"');
+ }
+ }
+
+ // ==========================
+
+ function computeDim(self) {
+ var css = window.getComputedStyle(self);
+ return {
+ w: sus.stripPx(css.width),
+ h: sus.stripPx(css.height)
+ };
+ }
+
+ function clickInst(d) {
+ var el = d3.select(this),
+ aff = el.classed('affinity');
+ if (!aff) {
+ setAffinity(el, d);
+ } else {
+ cancelAffinity();
+ }
+ }
+
+ function setAffinity(el, d) {
+ d3.selectAll('.onosInst')
+ .classed('mastership', true)
+ .classed('affinity', false);
+ el.classed('affinity', true);
+
+ // suppress all elements except nodes whose master is this instance
+ api.showMastership(d.id);
+ oiShowMaster = true;
+ }
+
+ function cancelAffinity() {
+ d3.selectAll('.onosInst')
+ .classed('mastership affinity', false);
+
+ api.showMastership(null);
+ oiShowMaster = false;
+ }
+
+ function instRectAttr(dim) {
+ var pad = instCfg.rectPad;
+ return {
+ x: pad,
+ y: pad,
+ width: dim.w - pad*2,
+ height: dim.h - pad*2,
+ rx: 6
+ };
+ }
+
+ function viewBox(dim) {
+ return '0 0 ' + dim.w + ' ' + dim.h;
+ }
+
+ function attachUiBadge(svg) {
+ gs.addGlyph(svg, 'uiAttached', 30, true, [12, instCfg.uiDy])
+ .classed('badgeIcon uiBadge', true);
+ }
+
+ function instColor(id, online) {
+ return sus.cat7().getColor(id, !online, ts.theme());
+ }
+
+ // ==============================
+
+ function updateInstances() {
+ var onoses = oiBox.el().selectAll('.onosInst')
+ .data(onosOrder, function (d) { return d.id; }),
+ instDim = {w:0,h:0},
+ c = instCfg;
+
+ function nSw(n) {
+ return '# Switches: ' + n;
+ }
+
+ // operate on existing onos instances if necessary
+ onoses.each(function (d) {
+ var el = d3.select(this),
+ svg = el.select('svg');
+ instDim = computeDim(this);
+
+ // update online state
+ el.classed('online', d.online);
+
+ // update ui-attached state
+ svg.select('use.uiBadge').remove();
+ if (d.uiAttached) {
+ attachUiBadge(svg);
+ }
+
+ function updAttr(id, value) {
+ svg.select('text.instLabel.'+id).text(value);
+ }
+
+ updAttr('ip', d.ip);
+ updAttr('ns', nSw(d.switches));
+ });
+
+
+ // operate on new onos instances
+ var entering = onoses.enter()
+ .append('div')
+ .attr('class', 'onosInst')
+ .classed('online', function (d) { return d.online; })
+ .on('click', clickInst);
+
+ entering.each(function (d) {
+ var el = d3.select(this),
+ rectAttr,
+ svg;
+ instDim = computeDim(this);
+ rectAttr = instRectAttr(instDim);
+
+ svg = el.append('svg').attr({
+ width: instDim.w,
+ height: instDim.h,
+ viewBox: viewBox(instDim)
+ });
+
+ svg.append('rect').attr(rectAttr);
+
+ gs.addGlyph(svg, 'bird', 28, true, [14, 14])
+ .classed('badgeIcon', true);
+
+ if (d.uiAttached) {
+ attachUiBadge(svg);
+ }
+
+ var left = c.nodeOx + c.nodeDim,
+ len = rectAttr.width - left,
+ hlen = len / 2,
+ midline = hlen + left;
+
+ // title
+ svg.append('text')
+ .attr({
+ class: 'instTitle',
+ x: midline,
+ y: c.titleDy
+ })
+ .text(d.id);
+
+ // a couple of attributes
+ var ty = c.titleDy + c.textYOff;
+
+ function addAttr(id, label) {
+ svg.append('text').attr({
+ class: 'instLabel ' + id,
+ x: midline,
+ y: ty
+ }).text(label);
+ ty += c.textYSpc;
+ }
+
+ addAttr('ip', d.ip);
+ addAttr('ns', nSw(d.switches));
+ });
+
+ // operate on existing + new onoses here
+ // set the affinity colors...
+ onoses.each(function (d) {
+ var el = d3.select(this),
+ rect = el.select('svg').select('rect'),
+ col = instColor(d.id, d.online);
+ rect.style('fill', col);
+ });
+
+ // adjust the panel size appropriately...
+ oiBox.width(instDim.w * onosOrder.length);
+ oiBox.height(instDim.h);
+
+ // remove any outgoing instances
+ onoses.exit().remove();
+ }
+
+
+ // ==========================
+
+ function logicError(msg) {
+ if (showLogicErrors) {
+ $log.warn('TopoInstService: ' + msg);
+ }
+ }
+
+ function initInst(_api_) {
+ api = _api_;
+ oiBox = ps.createPanel(idIns, instOpts);
+ oiBox.show();
+
+ onosInstances = {};
+ onosOrder = [];
+ oiShowMaster = false;
+
+ // we want to update the instances, each time the theme changes
+ themeListener = ts.addListener(updateInstances);
+ }
+
+ function destroyInst() {
+ ts.removeListener(themeListener);
+ themeListener = null;
+
+ ps.destroyPanel(idIns);
+ oiBox = null;
+
+ onosInstances = {};
+ onosOrder = [];
+ oiShowMaster = false;
+ }
+
+ function showInsts() {
+ oiBox.show();
+ }
+
+ function hideInsts() {
+ oiBox.hide();
+ }
+
+ function toggleInsts(x) {
+ var kev = (x === 'keyev'),
+ on,
+ verb;
+
+ if (kev) {
+ on = oiBox.toggle();
+ } else {
+ on = !!x;
+ if (on) {
+ showInsts();
+ } else {
+ hideInsts();
+ }
+ }
+ verb = on ? 'Show' : 'Hide';
+ flash.flash(verb + ' instances panel');
+ return on;
+ }
+
+ // ==========================
+
+ angular.module('ovTopo')
+ .factory('TopoInstService',
+ ['$log', 'PanelService', 'SvgUtilService', 'GlyphService',
+ 'ThemeService', 'FnService', 'FlashService',
+
+ function (_$log_, _ps_, _sus_, _gs_, _ts_, _fs_, _flash_) {
+ $log = _$log_;
+ ps = _ps_;
+ sus = _sus_;
+ gs = _gs_;
+ ts = _ts_;
+ fs = _fs_;
+ flash = _flash_;
+
+ return {
+ initInst: initInst,
+ destroyInst: destroyInst,
+
+ addInstance: addInstance,
+ updateInstance: updateInstance,
+ removeInstance: removeInstance,
+
+ cancelAffinity: cancelAffinity,
+
+ isVisible: function () { return oiBox.isVisible(); },
+ show: showInsts,
+ hide: hideInsts,
+ toggle: toggleInsts,
+ showMaster: function () { return oiShowMaster; }
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoLink.js b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoLink.js
new file mode 100644
index 00000000..38f3a6c3
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoLink.js
@@ -0,0 +1,338 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topology Link Module.
+ Functions for highlighting/selecting links
+ */
+
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, fs, sus, ts, flash, tss, tps;
+
+ // internal state
+ var api,
+ td3,
+ network,
+ showPorts = true, // enable port highlighting by default
+ enhancedLink = null, // the link over which the mouse is hovering
+ selectedLink = null; // the link which is currently selected
+
+ // SVG elements;
+ var svg;
+
+
+ // ======== ALGORITHM TO FIND LINK CLOSEST TO MOUSE ========
+
+ function getLogicalMousePosition(container) {
+ var m = d3.mouse(container),
+ sc = api.zoomer.scale(),
+ tr = api.zoomer.translate(),
+ mx = (m[0] - tr[0]) / sc,
+ my = (m[1] - tr[1]) / sc;
+ return {x: mx, y: my};
+ }
+
+
+ function sq(x) { return x * x; }
+
+ function mdist(p, m) {
+ return Math.sqrt(sq(p.x - m.x) + sq(p.y - m.y));
+ }
+
+ function prox(dist) {
+ return dist / api.zoomer.scale();
+ }
+
+ function computeNearestNode(mouse) {
+ var proximity = prox(30),
+ nearest = null,
+ minDist;
+
+ if (network.nodes.length) {
+ minDist = proximity * 2;
+
+ network.nodes.forEach(function (d) {
+ var dist;
+
+ if (!api.showHosts() && d.class === 'host') {
+ return; // skip hidden hosts
+ }
+
+ dist = mdist({x: d.x, y: d.y}, mouse);
+ if (dist < minDist && dist < proximity) {
+ minDist = dist;
+ nearest = d;
+ }
+ });
+ }
+ return nearest;
+ }
+
+
+ function computeNearestLink(mouse) {
+ var proximity = prox(30),
+ nearest = null,
+ minDist;
+
+ function pdrop(line, mouse) {
+ var x1 = line.x1,
+ y1 = line.y1,
+ x2 = line.x2,
+ y2 = line.y2,
+ x3 = mouse.x,
+ y3 = mouse.y,
+ k = ((y2-y1) * (x3-x1) - (x2-x1) * (y3-y1)) /
+ (sq(y2-y1) + sq(x2-x1)),
+ x4 = x3 - k * (y2-y1),
+ y4 = y3 + k * (x2-x1);
+ return {x:x4, y:y4};
+ }
+
+ function lineHit(line, p, m) {
+ if (p.x < line.x1 && p.x < line.x2) return false;
+ if (p.x > line.x1 && p.x > line.x2) return false;
+ if (p.y < line.y1 && p.y < line.y2) return false;
+ if (p.y > line.y1 && p.y > line.y2) return false;
+ // line intersects, but are we close enough?
+ return mdist(p, m) <= proximity;
+ }
+
+ if (network.links.length) {
+ minDist = proximity * 2;
+
+ network.links.forEach(function (d) {
+ if (!api.showHosts() && d.type() === 'hostLink') {
+ return; // skip hidden host links
+ }
+
+ var line = d.position,
+ point = pdrop(line, mouse),
+ hit = lineHit(line, point, mouse),
+ dist;
+
+ if (hit) {
+ dist = mdist(point, mouse);
+ if (dist < minDist) {
+ minDist = dist;
+ nearest = d;
+ }
+ }
+ });
+ }
+ return nearest;
+ }
+
+ function enhanceLink(ldata) {
+ // if the new link is same as old link, do nothing
+ if (enhancedLink && ldata && enhancedLink.key === ldata.key) return;
+
+ // first, unenhance the currently enhanced link
+ if (enhancedLink) {
+ unenhance(enhancedLink);
+ }
+ enhancedLink = ldata;
+ if (enhancedLink) {
+ enhance(enhancedLink);
+ }
+ }
+
+ function unenhance(d) {
+ // guard against link element not set
+ if (d.el) {
+ d.el.classed('enhanced', false);
+ }
+ api.portLabelG().selectAll('.portLabel').remove();
+ }
+
+ function enhance(d) {
+ var data = [],
+ point;
+
+ // guard against link element not set
+ if (!d.el) return;
+
+ d.el.classed('enhanced', true);
+
+ // Define port label data objects.
+ // NOTE: src port is absent in the case of host-links.
+
+ point = locatePortLabel(d);
+ angular.extend(point, {
+ id: 'topo-port-tgt',
+ num: d.tgtPort
+ });
+ data.push(point);
+
+ if (d.srcPort) {
+ point = locatePortLabel(d, 1);
+ angular.extend(point, {
+ id: 'topo-port-src',
+ num: d.srcPort
+ });
+ data.push(point);
+ }
+
+ td3.applyPortLabels(data, api.portLabelG());
+ }
+
+ function locatePortLabel(link, src) {
+ var offset = 32,
+ pos = link.position,
+ nearX = src ? pos.x1 : pos.x2,
+ nearY = src ? pos.y1 : pos.y2,
+ farX = src ? pos.x2 : pos.x1,
+ farY = src ? pos.y2 : pos.y1;
+
+ function dist(x, y) { return Math.sqrt(x*x + y*y); }
+
+ var dx = farX - nearX,
+ dy = farY - nearY,
+ k = offset / dist(dx, dy);
+
+ return {x: k * dx + nearX, y: k * dy + nearY};
+ }
+
+ function selectLink(ldata) {
+ // if the new link is same as old link, do nothing
+ if (selectedLink && ldata && selectedLink.key === ldata.key) return;
+
+ // make sure no nodes are selected
+ tss.deselectAll();
+
+ // first, unenhance the currently enhanced link
+ if (selectedLink) {
+ unselLink(selectedLink);
+ }
+ selectedLink = ldata;
+ if (selectedLink) {
+ selLink(selectedLink);
+ }
+ }
+
+ function unselLink(d) {
+ // guard against link element not set
+ if (d.el) {
+ d.el.classed('selected', false);
+ }
+ }
+
+ function selLink(d) {
+ // guard against link element not set
+ if (!d.el) return;
+
+ d.el.classed('selected', true);
+
+ tps.displayLink(d);
+ tps.displaySomething();
+ }
+
+ // ====== MOUSE EVENT HANDLERS ======
+
+ function mouseMoveHandler() {
+ var mp = getLogicalMousePosition(this),
+ link = computeNearestLink(mp);
+ enhanceLink(link);
+ }
+
+ function mouseClickHandler() {
+ var mp, link, node;
+
+ if (!tss.clickConsumed()) {
+ mp = getLogicalMousePosition(this);
+ node = computeNearestNode(mp);
+ if (node) {
+ $log.debug('found nearest node:', node.labels[1]);
+ tss.selectObject(node);
+ } else {
+ link = computeNearestLink(mp);
+ selectLink(link);
+ }
+ }
+ }
+
+
+ // ======================
+
+ function togglePorts(x) {
+ var kev = (x === 'keyev'),
+ on = kev ? !showPorts : !!x,
+ what = on ? 'Enable' : 'Disable',
+ handler = on ? mouseMoveHandler : null;
+
+ showPorts = on;
+
+ if (!on) {
+ enhanceLink(null);
+ }
+ svg.on('mousemove', handler);
+ flash.flash(what + ' port highlighting');
+ return on;
+ }
+
+ function deselectLink() {
+ if (selectedLink) {
+ unselLink(selectedLink);
+ selectedLink = null;
+ return true;
+ }
+ return false;
+ }
+
+ // ==========================
+ // Module definition
+
+ angular.module('ovTopo')
+ .factory('TopoLinkService',
+ ['$log', 'FnService', 'SvgUtilService', 'ThemeService', 'FlashService',
+ 'TopoSelectService', 'TopoPanelService',
+
+ function (_$log_, _fs_, _sus_, _ts_, _flash_, _tss_, _tps_) {
+ $log = _$log_;
+ fs = _fs_;
+ sus = _sus_;
+ ts = _ts_;
+ flash = _flash_;
+ tss = _tss_;
+ tps = _tps_;
+
+ function initLink(_api_, _td3_) {
+ api = _api_;
+ td3 = _td3_;
+ svg = api.svg;
+ network = api.network;
+ if (showPorts && !fs.isMobile()) {
+ svg.on('mousemove', mouseMoveHandler);
+ }
+ svg.on('click', mouseClickHandler);
+ }
+
+ function destroyLink() {
+ // unconditionally remove any event handlers
+ svg.on('mousemove', null);
+ svg.on('click', null);
+ }
+
+ return {
+ initLink: initLink,
+ destroyLink: destroyLink,
+ togglePorts: togglePorts,
+ deselectLink: deselectLink
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoModel.js b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoModel.js
new file mode 100644
index 00000000..fb98fc2b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoModel.js
@@ -0,0 +1,439 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topology Model Module.
+ Auxiliary functions for the model of the topology; that is, our internal
+ representations of devices, hosts, links, etc.
+ */
+
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, fs, rnd;
+
+ // api to topoForce
+ var api;
+ /*
+ projection()
+ network {...}
+ restyleLinkElement( ldata )
+ removeLinkElement( ldata )
+ */
+
+ // shorthand
+ var lu, rlk, nodes, links, linksByDevice;
+
+ var dim; // dimensions of layout [w,h]
+
+ // configuration 'constants'
+ var defaultLinkType = 'direct',
+ nearDist = 15;
+
+
+ function coordFromLngLat(loc) {
+ var p = api.projection();
+ // suspected cause of ONOS-2109
+ return p ? p([loc.lng, loc.lat]) : [0, 0];
+ }
+
+ function lngLatFromCoord(coord) {
+ var p = api.projection();
+ return p ? p.invert(coord) : [0, 0];
+ }
+
+ function positionNode(node, forUpdate) {
+ var meta = node.metaUi,
+ x = meta && meta.x,
+ y = meta && meta.y,
+ xy;
+
+ // If we have [x,y] already, use that...
+ if (x && y) {
+ node.fixed = true;
+ node.px = node.x = x;
+ node.py = node.y = y;
+ return;
+ }
+
+ var location = node.location,
+ coord;
+
+ if (location && location.type === 'latlng') {
+ coord = coordFromLngLat(location);
+ node.fixed = true;
+ node.px = node.x = coord[0];
+ node.py = node.y = coord[1];
+ return true;
+ }
+
+ // if this is a node update (not a node add).. skip randomizer
+ if (forUpdate) {
+ return;
+ }
+
+ // Note: Placing incoming unpinned nodes at exactly the same point
+ // (center of the view) causes them to explode outwards when
+ // the force layout kicks in. So, we spread them out a bit
+ // initially, to provide a more serene layout convergence.
+ // Additionally, if the node is a host, we place it near
+ // the device it is connected to.
+
+ function rand() {
+ return {
+ x: rnd.randDim(dim[0]),
+ y: rnd.randDim(dim[1])
+ };
+ }
+
+ function near(node) {
+ return {
+ x: node.x + nearDist + rnd.spread(nearDist),
+ y: node.y + nearDist + rnd.spread(nearDist)
+ };
+ }
+
+ function getDevice(cp) {
+ var d = lu[cp.device];
+ return d || rand();
+ }
+
+ xy = (node.class === 'host') ? near(getDevice(node.cp)) : rand();
+ angular.extend(node, xy);
+ }
+
+ function mkSvgCls(dh, t, on) {
+ var ndh = 'node ' + dh,
+ ndht = t ? ndh + ' ' + t : ndh;
+ return on ? ndht + ' online' : ndht;
+ }
+
+ function createDeviceNode(device) {
+ var node = device;
+
+ // Augment as needed...
+ node.class = 'device';
+ node.svgClass = mkSvgCls('device', device.type, device.online);
+ positionNode(node);
+ return node;
+ }
+
+ function createHostNode(host) {
+ var node = host;
+
+ // Augment as needed...
+ node.class = 'host';
+ if (!node.type) {
+ node.type = 'endstation';
+ }
+ node.svgClass = mkSvgCls('host', node.type);
+ positionNode(node);
+ return node;
+ }
+
+ function createHostLink(host) {
+ var src = host.id,
+ dst = host.cp.device,
+ id = host.ingress,
+ lnk = linkEndPoints(src, dst);
+
+ if (!lnk) {
+ return null;
+ }
+
+ // Synthesize link ...
+ angular.extend(lnk, {
+ key: id,
+ class: 'link',
+ // NOTE: srcPort left undefined (host end of the link)
+ tgtPort: host.cp.port,
+
+ type: function () { return 'hostLink'; },
+ online: function () {
+ // hostlink target is edge switch
+ return lnk.target.online;
+ },
+ linkWidth: function () { return 1; }
+ });
+ return lnk;
+ }
+
+ function createLink(link) {
+ var lnk = linkEndPoints(link.src, link.dst);
+
+ if (!lnk) {
+ return null;
+ }
+
+ angular.extend(lnk, {
+ key: link.id,
+ class: 'link',
+ fromSource: link,
+ srcPort: link.srcPort,
+ tgtPort: link.dstPort,
+ position: {
+ x1: 0,
+ y1: 0,
+ x2: 0,
+ y2: 0
+ },
+
+ // functions to aggregate dual link state
+ type: function () {
+ var s = lnk.fromSource,
+ t = lnk.fromTarget;
+ return (s && s.type) || (t && t.type) || defaultLinkType;
+ },
+ online: function () {
+ var s = lnk.fromSource,
+ t = lnk.fromTarget,
+ both = lnk.source.online && lnk.target.online;
+ return both && ((s && s.online) || (t && t.online));
+ },
+ linkWidth: function () {
+ var s = lnk.fromSource,
+ t = lnk.fromTarget,
+ ws = (s && s.linkWidth) || 0,
+ wt = (t && t.linkWidth) || 0;
+ return lnk.position.multiLink ? 5 : Math.max(ws, wt);
+ }
+ });
+ return lnk;
+ }
+
+
+ function linkEndPoints(srcId, dstId) {
+ var srcNode = lu[srcId],
+ dstNode = lu[dstId],
+ sMiss = !srcNode ? missMsg('src', srcId) : '',
+ dMiss = !dstNode ? missMsg('dst', dstId) : '';
+
+ if (sMiss || dMiss) {
+ $log.error('Node(s) not on map for link:' + sMiss + dMiss);
+ //logicError('Node(s) not on map for link:\n' + sMiss + dMiss);
+ return null;
+ }
+ return {
+ source: srcNode,
+ target: dstNode
+ };
+ }
+
+ function missMsg(what, id) {
+ return '\n[' + what + '] "' + id + '" missing';
+ }
+
+
+ function makeNodeKey(d, what) {
+ var port = what + 'Port';
+ return d[what] + '/' + d[port];
+ }
+
+ function makeLinkKey(d, flipped) {
+ var one = flipped ? makeNodeKey(d, 'dst') : makeNodeKey(d, 'src'),
+ two = flipped ? makeNodeKey(d, 'src') : makeNodeKey(d, 'dst');
+ return one + '-' + two;
+ }
+
+ function findLinkById(id) {
+ // check to see if this is a reverse lookup, else default to given id
+ var key = rlk[id] || id;
+ return key && lu[key];
+ }
+
+ function findLink(linkData, op) {
+ var key = makeLinkKey(linkData),
+ keyrev = makeLinkKey(linkData, 1),
+ link = lu[key],
+ linkRev = lu[keyrev],
+ result = {},
+ ldata = link || linkRev,
+ rawLink;
+
+ if (op === 'add') {
+ if (link) {
+ // trying to add a link that we already know about
+ result.ldata = link;
+ result.badLogic = 'addLink: link already added';
+
+ } else if (linkRev) {
+ // we found the reverse of the link to be added
+ result.ldata = linkRev;
+ if (linkRev.fromTarget) {
+ result.badLogic = 'addLink: link already added';
+ }
+ }
+ } else if (op === 'update') {
+ if (!ldata) {
+ result.badLogic = 'updateLink: link not found';
+ } else {
+ rawLink = link ? ldata.fromSource : ldata.fromTarget;
+ result.updateWith = function (data) {
+ angular.extend(rawLink, data);
+ api.restyleLinkElement(ldata);
+ }
+ }
+ } else if (op === 'remove') {
+ if (!ldata) {
+ result.badLogic = 'removeLink: link not found';
+ } else {
+ rawLink = link ? ldata.fromSource : ldata.fromTarget;
+
+ if (!rawLink) {
+ result.badLogic = 'removeLink: link not found';
+
+ } else {
+ result.removeRawLink = function () {
+ // remove link out of aggregate linksByDevice list
+ var linksForDevPair = linksByDevice[ldata.devicePair],
+ rmvIdx = fs.find(ldata.key, linksForDevPair, 'key');
+ if (rmvIdx >= 0) {
+ linksForDevPair.splice(rmvIdx, 1);
+ }
+ ldata.position.multilink = linksForDevPair.length >= 5;
+
+ if (link) {
+ // remove fromSource
+ ldata.fromSource = null;
+ if (ldata.fromTarget) {
+ // promote target into source position
+ ldata.fromSource = ldata.fromTarget;
+ ldata.fromTarget = null;
+ ldata.key = keyrev;
+ delete lu[key];
+ lu[keyrev] = ldata;
+ delete rlk[keyrev];
+ }
+ } else {
+ // remove fromTarget
+ ldata.fromTarget = null;
+ delete rlk[keyrev];
+ }
+ if (ldata.fromSource) {
+ api.restyleLinkElement(ldata);
+ } else {
+ api.removeLinkElement(ldata);
+ }
+ }
+ }
+ }
+ }
+ return result;
+ }
+
+ function findDevices(offlineOnly) {
+ var a = [];
+ nodes.forEach(function (d) {
+ if (d.class === 'device' && !(offlineOnly && d.online)) {
+ a.push(d);
+ }
+ });
+ return a;
+ }
+
+ function findAttachedHosts(devId) {
+ var hosts = [];
+ nodes.forEach(function (d) {
+ if (d.class === 'host' && d.cp.device === devId) {
+ hosts.push(d);
+ }
+ });
+ return hosts;
+ }
+
+ function findAttachedLinks(devId) {
+ var lnks = [];
+ links.forEach(function (d) {
+ if (d.source.id === devId || d.target.id === devId) {
+ lnks.push(d);
+ }
+ });
+ return lnks;
+ }
+
+ // returns one-way links or where the internal link types differ
+ function findBadLinks() {
+ var lnks = [],
+ src, tgt;
+ links.forEach(function (d) {
+ // NOTE: skip edge links, which are synthesized
+ if (d.type() !== 'hostLink') {
+ delete d.bad;
+ src = d.fromSource;
+ tgt = d.fromTarget;
+ if (src && !tgt) {
+ d.bad = 'missing link';
+ } else if (src.type !== tgt.type) {
+ d.bad = 'type mismatch';
+ }
+ if (d.bad) {
+ lnks.push(d);
+ }
+ }
+ });
+ return lnks;
+ }
+
+ // ==========================
+ // Module definition
+
+ angular.module('ovTopo')
+ .factory('TopoModelService',
+ ['$log', 'FnService', 'RandomService',
+
+ function (_$log_, _fs_, _rnd_) {
+ $log = _$log_;
+ fs = _fs_;
+ rnd = _rnd_;
+
+ function initModel(_api_, _dim_) {
+ api = _api_;
+ dim = _dim_;
+ lu = api.network.lookup;
+ rlk = api.network.revLinkToKey;
+ nodes = api.network.nodes;
+ links = api.network.links;
+ linksByDevice = api.network.linksByDevice;
+ }
+
+ function newDim(_dim_) {
+ dim = _dim_;
+ }
+
+ function destroyModel() { }
+
+ return {
+ initModel: initModel,
+ newDim: newDim,
+ destroyModel: destroyModel,
+
+ positionNode: positionNode,
+ createDeviceNode: createDeviceNode,
+ createHostNode: createHostNode,
+ createHostLink: createHostLink,
+ createLink: createLink,
+ coordFromLngLat: coordFromLngLat,
+ lngLatFromCoord: lngLatFromCoord,
+ findLink: findLink,
+ findLinkById: findLinkById,
+ findDevices: findDevices,
+ findAttachedHosts: findAttachedHosts,
+ findAttachedLinks: findAttachedLinks,
+ findBadLinks: findBadLinks
+ }
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoOblique.js b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoOblique.js
new file mode 100644
index 00000000..e84b1173
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoOblique.js
@@ -0,0 +1,257 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topology Oblique View Module.
+ Provides functionality to view the topology as two planes (packet & optical)
+ from an oblique (side-on) perspective.
+ */
+
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, fs, sus, flash;
+
+ // api to topoForce
+ var api;
+ /*
+ force() // get ref to force layout object
+ zoomLayer() // get ref to zoom layer
+ nodeGBBox() // get bounding box of node group layer
+ node() // get ref to D3 selection of nodes
+ link() // get ref to D3 selection of links
+ nodes() // get ref to network nodes array
+ tickStuff // ref to tick functions
+ nodeLock(b) // test-and-set nodeLock state
+ opacifyMap(b) // show or hide map layer
+ inLayer(d, layer) // return true if d in layer {'pkt'|'opt'}
+ calcLinkPos() // recomputes link pos based on node data
+ */
+
+ // configuration
+ var xsky = -.7, // x skew y factor
+ xsk = -35, // x skew angle
+ ysc = .5, // y scale
+ pad = 50,
+ time = 1500,
+ fill = {
+ pkt: 'rgba(130,130,170,0.3)', // blue-ish
+ opt: 'rgba(170,130,170,0.3)' // magenta-ish
+ };
+
+ // internal state
+ var oblique = false,
+ xffn = null,
+ plane = {},
+ oldNodeLock;
+
+
+ function planeId(tag) {
+ return 'topo-obview-' + tag + 'Plane';
+ }
+
+ function ytfn(h, dir) {
+ return h * ysc * dir * 1.1;
+ }
+
+ function obXform(h, dir) {
+ var yt = ytfn(h, dir);
+ return sus.scale(1, ysc) + sus.translate(0, yt) + sus.skewX(xsk);
+ }
+
+ function noXform() {
+ return sus.skewX(0) + sus.translate(0,0) + sus.scale(1,1);
+ }
+
+ function padBox(box, p) {
+ box.x -= p;
+ box.y -= p;
+ box.width += p*2;
+ box.height += p*2;
+ }
+
+ function toObliqueView() {
+ var box = api.nodeGBBox(),
+ ox, oy;
+
+ padBox(box, pad);
+
+ ox = box.x + box.width / 2;
+ oy = box.y + box.height / 2;
+
+ // remember node lock state, then lock the nodes down
+ oldNodeLock = api.nodeLock(true);
+ api.opacifyMap(false);
+
+ insertPlanes(ox, oy);
+
+ xffn = function (xy, dir) {
+ var yt = ytfn(box.height, dir),
+ ax = xy.x - ox,
+ ay = xy.y - oy,
+ x = ax + ay * xsky,
+ y = (ay + yt) * ysc;
+ return {x: ox + x, y: oy + y};
+ };
+
+ showPlane('pkt', box, -1);
+ showPlane('opt', box, 1);
+ obTransitionNodes();
+ }
+
+ function toNormalView() {
+ xffn = null;
+
+ hidePlane('pkt');
+ hidePlane('opt');
+ obTransitionNodes();
+
+ removePlanes();
+
+ // restore node lock state
+ api.nodeLock(oldNodeLock);
+ api.opacifyMap(true);
+ }
+
+ function obTransitionNodes() {
+ // return the direction for the node
+ // -1 for pkt layer, 1 for optical layer
+ function dir(d) {
+ return api.inLayer(d, 'pkt') ? -1 : 1;
+ }
+
+ if (xffn) {
+ api.nodes().forEach(function (d) {
+ var oldxy = {x: d.x, y: d.y},
+ coords = xffn(oldxy, dir(d));
+ d.oldxy = oldxy;
+ d.px = d.x = coords.x;
+ d.py = d.y = coords.y;
+ });
+ } else {
+ api.nodes().forEach(function (d) {
+ var old = d.oldxy || {x: d.x, y: d.y};
+ d.px = d.x = old.x;
+ d.py = d.y = old.y;
+ delete d.oldxy;
+ });
+ }
+
+ api.node().transition()
+ .duration(time)
+ .attr(api.tickStuff.nodeAttr);
+ api.link().transition()
+ .duration(time)
+ .call(api.calcLinkPos)
+ .attr(api.tickStuff.linkAttr)
+ .call(api.applyNumLinkLabels);
+ api.linkLabel().transition()
+ .duration(time)
+ .attr(api.tickStuff.linkLabelAttr);
+ }
+
+ function showPlane(tag, box, dir) {
+ // set box origin at center..
+ box.x = -box.width/2;
+ box.y = -box.height/2;
+
+ plane[tag].select('rect')
+ .attr(box)
+ .attr('opacity', 0)
+ .transition()
+ .duration(time)
+ .attr('opacity', 1)
+ .attr('transform', obXform(box.height, dir));
+ }
+
+ function hidePlane(tag) {
+ plane[tag].select('rect')
+ .transition()
+ .duration(time)
+ .attr('opacity', 0)
+ .attr('transform', noXform());
+ }
+
+ function insertPlanes(ox, oy) {
+ function ins(tag) {
+ var id = planeId(tag),
+ g = api.zoomLayer().insert('g', '#topo-G')
+ .attr('id', id)
+ .attr('transform', sus.translate(ox,oy));
+ g.append('rect')
+ .attr('fill', fill[tag])
+ .attr('opacity', 0);
+ plane[tag] = g;
+ }
+ ins('opt');
+ ins('pkt');
+ }
+
+ function removePlanes() {
+ function rem(tag) {
+ var id = planeId(tag);
+ api.zoomLayer().select('#'+id)
+ .transition()
+ .duration(time + 50)
+ .remove();
+ delete plane[tag];
+ }
+ rem('opt');
+ rem('pkt');
+ }
+
+
+// === -----------------------------------------------------
+// === MODULE DEFINITION ===
+
+angular.module('ovTopo')
+ .factory('TopoObliqueService',
+ ['$log', 'FnService', 'SvgUtilService', 'FlashService',
+
+ function (_$log_, _fs_, _sus_, _flash_) {
+ $log = _$log_;
+ fs = _fs_;
+ sus = _sus_;
+ flash = _flash_;
+
+ function initOblique(_api_) {
+ api = _api_;
+ }
+
+ function destroyOblique() { }
+
+ function toggleOblique() {
+ oblique = !oblique;
+ if (oblique) {
+ api.force().stop();
+ flash.flash('Oblique view');
+ toObliqueView();
+ } else {
+ flash.flash('Normal view');
+ toNormalView();
+ }
+ }
+
+ return {
+ initOblique: initOblique,
+ destroyOblique: destroyOblique,
+
+ isOblique: function () { return oblique; },
+ toggleOblique: toggleOblique
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoOverlay.js b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoOverlay.js
new file mode 100644
index 00000000..7eb45ba4
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoOverlay.js
@@ -0,0 +1,418 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/*
+ ONOS GUI -- Topology Overlay Module.
+
+ Provides overlay capabilities, allowing ONOS apps to provide additional
+ custom data/behavior for the topology view.
+
+ */
+
+(function () {
+ 'use strict';
+
+ // constants
+ var tos = 'TopoOverlayService: ';
+
+ // injected refs
+ var $log, fs, gs, wss, ns, tss, tps, api;
+
+ // internal state
+ var overlays = {},
+ current = null;
+
+ function error(fn, msg) {
+ $log.error(tos + fn + '(): ' + msg);
+ }
+
+ function warn(fn, msg) {
+ $log.warn(tos + fn + '(): ' + msg);
+ }
+
+ function mkGlyphId(oid, gid) {
+ return (gid[0] === '*') ? oid + '-' + gid.slice(1) : gid;
+ }
+
+ function handleGlyphs(o) {
+ var gdata = fs.isO(o.glyphs),
+ oid = o.overlayId,
+ gid = o.glyphId || 'unknown',
+ data = {},
+ note = [];
+
+ o._glyphId = mkGlyphId(oid, gid);
+
+ o.mkGid = function (g) {
+ return mkGlyphId(oid, g);
+ };
+ o.mkId = function (s) {
+ return oid + '-' + s;
+ };
+
+ // process glyphs if defined
+ if (gdata) {
+ angular.forEach(gdata, function (value, key) {
+ var fullkey = oid + '-' + key;
+ data['_' + fullkey] = value.vb;
+ data[fullkey] = value.d;
+ note.push('*' + key);
+ });
+ gs.registerGlyphs(data);
+ $log.debug('registered overlay glyphs:', oid, note);
+ }
+ }
+
+ function register(overlay) {
+ var r = 'register',
+ over = fs.isO(overlay),
+ kb = over ? fs.isO(overlay.keyBindings) : null,
+ id = over ? over.overlayId : '';
+
+ if (!id) {
+ return error(r, 'not a recognized overlay');
+ }
+ if (overlays[id]) {
+ return warn(r, 'already registered: "' + id + '"');
+ }
+ overlays[id] = overlay;
+ handleGlyphs(overlay);
+
+ if (kb) {
+ if (!fs.isA(kb._keyOrder)) {
+ warn(r, 'no _keyOrder array defined on keyBindings');
+ } else {
+ kb._keyOrder.forEach(function (k) {
+ if (k !== '-' && !kb[k]) {
+ warn(r, 'no "' + k + '" property defined on keyBindings');
+ }
+ });
+ }
+ }
+
+ $log.debug(tos + 'registered overlay: ' + id, overlay);
+ }
+
+ // TODO: remove this redundant code.......
+ // NOTE: unregister needs to be called if an app is ever
+ // deactivated/uninstalled via the applications view
+/*
+ function unregister(overlay) {
+ var u = 'unregister',
+ over = fs.isO(overlay),
+ id = over ? over.overlayId : '';
+
+ if (!id) {
+ return error(u, 'not a recognized overlay');
+ }
+ if (!overlays[id]) {
+ return warn(u, 'not registered: "' + id + "'")
+ }
+ delete overlays[id];
+ $log.debug(tos + 'unregistered overlay: ' + id);
+ }
+*/
+
+
+ // returns the list of overlay identifiers
+ function list() {
+ return d3.map(overlays).keys();
+ }
+
+ // add a radio button for each registered overlay
+ function augmentRbset(rset, switchFn) {
+ angular.forEach(overlays, function (ov) {
+ rset.push({
+ gid: ov._glyphId,
+ tooltip: (ov.tooltip || '(no tooltip)'),
+ cb: function () {
+ tbSelection(ov.overlayId, switchFn);
+ }
+ });
+ });
+ }
+
+ // an overlay was selected via toolbar radio button press from user
+ function tbSelection(id, switchFn) {
+ var same = current && current.overlayId === id,
+ payload = {},
+ actions;
+
+ function doop(op) {
+ var oid = current.overlayId;
+ $log.debug('Overlay:', op, oid);
+ current[op]();
+ payload[op] = oid;
+ }
+
+ if (!same) {
+ current && doop('deactivate');
+ current = overlays[id];
+ current && doop('activate');
+ actions = current && fs.isO(current.keyBindings);
+ switchFn(id, actions);
+
+ wss.sendEvent('topoSelectOverlay', payload);
+
+ // Ensure summary and details panels are updated immediately..
+ wss.sendEvent('requestSummary');
+ tss.updateDetail();
+ }
+ }
+
+ var coreButtons = {
+ showDeviceView: {
+ gid: 'switch',
+ tt: 'Show Device View',
+ path: 'device'
+ },
+ showFlowView: {
+ gid: 'flowTable',
+ tt: 'Show Flow View for this Device',
+ path: 'flow'
+ },
+ showPortView: {
+ gid: 'portTable',
+ tt: 'Show Port View for this Device',
+ path: 'port'
+ },
+ showGroupView: {
+ gid: 'groupTable',
+ tt: 'Show Group View for this Device',
+ path: 'group'
+ }
+ };
+
+ // retrieves a button definition from the current overlay and generates
+ // a button descriptor to be added to the panel, with the data baked in
+ function _getButtonDef(id, data) {
+ var btns = current && current.buttons,
+ b = btns && btns[id],
+ cb = fs.isF(b.cb),
+ f = cb ? function () { cb(data); } : function () {};
+
+ return b ? {
+ id: current.mkId(id),
+ gid: current.mkGid(b.gid),
+ tt: b.tt,
+ cb: f
+ } : null;
+ }
+
+ // install core buttons, and include any additional from the current overlay
+ function installButtons(buttons, data, devId) {
+ buttons.forEach(function (id) {
+ var btn = coreButtons[id],
+ gid = btn && btn.gid,
+ tt = btn && btn.tt,
+ path = btn && btn.path;
+
+ if (btn) {
+ tps.addAction({
+ id: 'core-' + id,
+ gid: gid,
+ tt: tt,
+ cb: function () { ns.navTo(path, {devId: devId }); }
+ });
+ } else if (btn = _getButtonDef(id, data)) {
+ tps.addAction(btn);
+ }
+ });
+ }
+
+ function addDetailButton(id) {
+ var b = _getButtonDef(id);
+ if (b) {
+ tps.addAction({
+ id: current.mkId(id),
+ gid: current.mkGid(b.gid),
+ cb: b.cb,
+ tt: b.tt
+ });
+ }
+ }
+
+
+ // === -----------------------------------------------------
+ // Hooks for overlays
+
+ function _hook(x) {
+ var h = current && current.hooks;
+ return h && fs.isF(h[x]);
+ }
+
+ function escapeHook() {
+ var eh = _hook('escape');
+ return eh ? eh() : false;
+ }
+
+ function emptySelectHook() {
+ var cb = _hook('empty');
+ cb && cb();
+ }
+
+ function singleSelectHook(data) {
+ var cb = _hook('single');
+ cb && cb(data);
+ }
+
+ function multiSelectHook(selectOrder) {
+ var cb = _hook('multi');
+ cb && cb(selectOrder);
+ }
+
+ function mouseOverHook(what) {
+ var cb = _hook('mouseover');
+ cb && cb(what);
+ }
+
+ function mouseOutHook() {
+ var cb = _hook('mouseout');
+ cb && cb();
+ }
+
+ // === -----------------------------------------------------
+ // Event (from server) Handlers
+
+ function setApi(_api_, _tss_) {
+ api = _api_;
+ tss = _tss_;
+ }
+
+ function showHighlights(data) {
+ var less;
+
+ /*
+ API to topoForce
+ clearLinkTrafficStyle()
+ removeLinkLabels()
+ findLinkById( id )
+ findNodeById( id )
+ updateLinks()
+ updateNodes()
+ supLayers( bool, [less] )
+ unsupNode( id, [less] )
+ unsupLink( key, [less] )
+ */
+
+ // TODO: clear node highlighting
+ api.clearLinkTrafficStyle();
+ api.removeLinkLabels();
+
+ // handle element suppression
+ if (data.subdue) {
+ less = data.subdue === 'min';
+ api.supLayers(true, less);
+
+ } else {
+ api.supLayers(false);
+ api.supLayers(false, true);
+ }
+
+ data.hosts.forEach(function (host) {
+ var hdata = api.findNodeById(host.id);
+ if (hdata && !hdata.el.empty()) {
+ if (!host.subdue) {
+ api.unsupNode(hdata.id, less);
+ }
+ // TODO: further highlighting?
+ }
+ });
+
+ data.devices.forEach(function (device) {
+ var ddata = api.findNodeById(device.id);
+ if (ddata && !ddata.el.empty()) {
+ if (!device.subdue) {
+ api.unsupNode(ddata.id, less);
+ }
+ // TODO: further highlighting?
+ }
+ });
+
+ data.links.forEach(function (link) {
+ var ldata = api.findLinkById(link.id),
+ lab = link.label,
+ units, portcls, magnitude;
+
+ if (ldata && !ldata.el.empty()) {
+ if (!link.subdue) {
+ api.unsupLink(ldata.key, less);
+ }
+ ldata.el.classed(link.css, true);
+ ldata.label = lab;
+
+ // TODO: this needs to be pulled out into traffic overlay
+ // inject additional styling for port-based traffic
+ if (fs.endsWith(lab, 'bps')) {
+ units = lab.substring(lab.length-4);
+ portcls = 'port-traffic-' + units;
+
+ // for GBps
+ if (units.substring(0,1) === 'G') {
+ magnitude = fs.parseBitRate(lab);
+ if (magnitude >= 9) {
+ portcls += '-choked'
+ }
+ }
+ ldata.el.classed(portcls, true);
+ }
+ }
+ });
+
+ api.updateNodes();
+ api.updateLinks();
+ }
+
+ // ========================================================================
+
+ angular.module('ovTopo')
+ .factory('TopoOverlayService',
+ ['$log', 'FnService', 'GlyphService', 'WebSocketService', 'NavService',
+ 'TopoPanelService',
+
+ function (_$log_, _fs_, _gs_, _wss_, _ns_, _tps_) {
+ $log = _$log_;
+ fs = _fs_;
+ gs = _gs_;
+ wss = _wss_;
+ ns = _ns_;
+ tps = _tps_;
+
+ return {
+ register: register,
+ //unregister: unregister,
+ setApi: setApi,
+ list: list,
+ augmentRbset: augmentRbset,
+ mkGlyphId: mkGlyphId,
+ tbSelection: tbSelection,
+ installButtons: installButtons,
+ addDetailButton: addDetailButton,
+ hooks: {
+ escape: escapeHook,
+ emptySelect: emptySelectHook,
+ singleSelect: singleSelectHook,
+ multiSelect: multiSelectHook,
+ mouseOver: mouseOverHook,
+ mouseOut: mouseOutHook
+ },
+
+ showHighlights: showHighlights
+ }
+ }]);
+
+}()); \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoPanel.js b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoPanel.js
new file mode 100644
index 00000000..7db17f0d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoPanel.js
@@ -0,0 +1,539 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topology Panel Module.
+ Defines functions for manipulating the summary, detail, and instance panels.
+ */
+
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, $window, $rootScope, fs, ps, gs, flash, wss, bns, mast, ns;
+
+ // constants
+ var pCls = 'topo-p',
+ idSum = 'topo-p-summary',
+ idDet = 'topo-p-detail',
+ panelOpts = {
+ width: 260
+ },
+ sumMax = 240,
+ padTop = 20,
+ devPath = 'device';
+
+ // internal state
+ var useDetails = true, // should we show details if we have 'em?
+ haveDetails = false, // do we have details that we could show?
+ sumFromTop, // summary panel distance from top of screen
+ unbindWatch;
+
+ // panels
+ var summary, detail;
+
+ // === -----------------------------------------------------
+ // Panel API
+ function createTopoPanel(id, opts) {
+ var p = ps.createPanel(id, opts),
+ pid = id,
+ header, body, footer;
+ p.classed(pCls, true);
+
+ function panel() {
+ return p;
+ }
+
+ function hAppend(x) {
+ return header.append(x);
+ }
+
+ function bAppend(x) {
+ return body.append(x);
+ }
+
+ function fAppend(x) {
+ return footer.append(x);
+ }
+
+ function setup() {
+ p.empty();
+
+ p.append('div').classed('header', true);
+ p.append('div').classed('body', true);
+ p.append('div').classed('footer', true);
+
+ header = p.el().select('.header');
+ body = p.el().select('.body');
+ footer = p.el().select('.footer');
+ }
+
+ function destroy() {
+ ps.destroyPanel(pid);
+ }
+
+ // fromTop is how many pixels from the top of the page the panel is
+ // max is the max height of the panel in pixels
+ // only adjusts if the body content would be 10px or larger
+ function adjustHeight(fromTop, max) {
+ var totalPHeight, avSpace,
+ overflow = 0,
+ pdg = 30;
+
+ if (!fromTop) {
+ $log.warn('adjustHeight: height from top of page not given');
+ return null;
+ } else if (!body || !p) {
+ $log.warn('adjustHeight: panel contents are not defined');
+ return null;
+ }
+
+ p.el().style('height', null);
+ body.style('height', null);
+
+ totalPHeight = fromTop + p.height();
+ avSpace = fs.windowSize(pdg).height;
+
+ if (totalPHeight >= avSpace) {
+ overflow = totalPHeight - avSpace;
+ }
+
+ function _adjustBody(height) {
+ if (height < 10) {
+ return false;
+ } else {
+ body.style('height', height + 'px');
+ }
+ return true;
+ }
+
+ if (!_adjustBody(fs.noPxStyle(body, 'height') - overflow)) {
+ return;
+ }
+
+ if (max && p.height() > max) {
+ _adjustBody(fs.noPxStyle(body, 'height') - (p.height() - max));
+ }
+ }
+
+ return {
+ panel: panel,
+ setup: setup,
+ destroy: destroy,
+ appendHeader: hAppend,
+ appendBody: bAppend,
+ appendFooter: fAppend,
+ adjustHeight: adjustHeight
+ };
+ }
+
+ // === -----------------------------------------------------
+ // Utility functions
+
+ function addSep(tbody) {
+ tbody.append('tr').append('td').attr('colspan', 2).append('hr');
+ }
+
+ function addBtnFooter() {
+ detail.appendFooter('hr');
+ detail.appendFooter('div').classed('actionBtns', true);
+ }
+
+ function addProp(tbody, label, value) {
+ var tr = tbody.append('tr'),
+ lab;
+ if (typeof label === 'string') {
+ lab = label.replace(/_/g, ' ');
+ } else {
+ lab = label;
+ }
+
+ function addCell(cls, txt) {
+ tr.append('td').attr('class', cls).html(txt);
+ }
+ addCell('label', lab + ' :');
+ addCell('value', value);
+ }
+
+ function listProps(tbody, data) {
+ data.propOrder.forEach(function (p) {
+ if (p === '-') {
+ addSep(tbody);
+ } else {
+ addProp(tbody, p, data.props[p]);
+ }
+ });
+ }
+
+ function watchWindow() {
+ unbindWatch = $rootScope.$watchCollection(
+ function () {
+ return {
+ h: $window.innerHeight,
+ w: $window.innerWidth
+ };
+ }, function () {
+ summary.adjustHeight(sumFromTop, sumMax);
+ detail.adjustHeight(detail.ypos.current);
+ }
+ );
+ }
+
+ // === -----------------------------------------------------
+ // Functions for populating the summary panel
+
+ function populateSummary(data) {
+ summary.setup();
+
+ var svg = summary.appendHeader('div')
+ .classed('icon', true)
+ .append('svg'),
+ title = summary.appendHeader('h2'),
+ table = summary.appendBody('table'),
+ tbody = table.append('tbody'),
+ glyphId = data.type || 'node';
+
+ gs.addGlyph(svg, glyphId, 40);
+
+ if (glyphId === 'node') {
+ gs.addGlyph(svg, 'bird', 24, true, [8,12]);
+ }
+
+ title.text(data.title);
+ listProps(tbody, data);
+ }
+
+ // === -----------------------------------------------------
+ // Functions for populating the detail panel
+
+ var isDevice = {
+ switch: 1,
+ roadm: 1
+ };
+
+ function displaySingle(data) {
+ detail.setup();
+
+ var svg = detail.appendHeader('div')
+ .classed('icon clickable', true)
+ .append('svg'),
+ title = detail.appendHeader('h2')
+ .classed('clickable', true),
+ table = detail.appendBody('table'),
+ tbody = table.append('tbody'),
+ navFn;
+
+ gs.addGlyph(svg, (data.type || 'unknown'), 40);
+ title.text(data.title);
+
+ // only add navigation when displaying a device
+ if (isDevice[data.type]) {
+ navFn = function () {
+ ns.navTo(devPath, { devId: data.id });
+ };
+
+ svg.on('click', navFn);
+ title.on('click', navFn);
+ }
+
+ listProps(tbody, data);
+ addBtnFooter();
+ }
+
+ function displayMulti(ids) {
+ detail.setup();
+
+ var title = detail.appendHeader('h3'),
+ table = detail.appendBody('table'),
+ tbody = table.append('tbody');
+
+ title.text('Selected Nodes');
+ ids.forEach(function (d, i) {
+ addProp(tbody, i+1, d);
+ });
+ addBtnFooter();
+ }
+
+ function addAction(o) {
+ var btnDiv = d3.select('#' + idDet)
+ .select('.actionBtns')
+ .append('div')
+ .classed('actionBtn', true);
+ bns.button(btnDiv, idDet + '-' + o.id, o.gid, o.cb, o.tt);
+ }
+
+ var friendlyIndex = {
+ device: 1,
+ host: 0
+ };
+
+ function friendly(d) {
+ var i = friendlyIndex[d.class] || 0;
+ return (d.labels && d.labels[i]) || '';
+ }
+
+ function linkSummary(d) {
+ var o = d && d.online ? 'online' : 'offline';
+ return d ? d.type + ' / ' + o : '-';
+ }
+
+ // provided to change presentation of internal type name
+ var linkTypePres = {
+ hostLink: 'edge link'
+ };
+
+ function linkType(d) {
+ return linkTypePres[d.type()] || d.type();
+ }
+
+ var coreOrder = [
+ 'Type', '-',
+ 'A_type', 'A_id', 'A_label', 'A_port', '-',
+ 'B_type', 'B_id', 'B_label', 'B_port', '-'
+ ],
+ edgeOrder = [
+ 'Type', '-',
+ 'A_type', 'A_id', 'A_label', '-',
+ 'B_type', 'B_id', 'B_label', 'B_port'
+ ];
+
+ function displayLink(data) {
+ detail.setup();
+
+ var svg = detail.appendHeader('div')
+ .classed('icon', true)
+ .append('svg'),
+ title = detail.appendHeader('h2'),
+ table = detail.appendBody('table'),
+ tbody = table.append('tbody'),
+ edgeLink = data.type() === 'hostLink',
+ order = edgeLink ? edgeOrder : coreOrder;
+
+ gs.addGlyph(svg, 'ports', 40);
+ title.text('Link');
+
+
+ listProps(tbody, {
+ propOrder: order,
+ props: {
+ Type: linkType(data),
+
+ A_type: data.source.class,
+ A_id: data.source.id,
+ A_label: friendly(data.source),
+ A_port: data.srcPort,
+
+ B_type: data.target.class,
+ B_id: data.target.id,
+ B_label: friendly(data.target),
+ B_port: data.tgtPort
+ }
+ });
+
+ if (!edgeLink) {
+ addProp(tbody, 'A &rarr; B', linkSummary(data.fromSource));
+ addProp(tbody, 'B &rarr; A', linkSummary(data.fromTarget));
+ }
+ }
+
+ function displayNothing() {
+ haveDetails = false;
+ hideDetailPanel();
+ }
+
+ function displaySomething() {
+ haveDetails = true;
+ if (useDetails) {
+ showDetailPanel();
+ }
+ }
+
+ // === -----------------------------------------------------
+ // Event Handlers
+
+ function showSummary(data) {
+ populateSummary(data);
+ showSummaryPanel();
+ }
+
+ function toggleSummary(x) {
+ var kev = (x === 'keyev'),
+ on = kev ? !summary.panel().isVisible() : !!x,
+ verb = on ? 'Show' : 'Hide';
+
+ if (on) {
+ // ask server to start sending summary data.
+ wss.sendEvent('requestSummary');
+ // note: the summary panel will appear, once data arrives
+ } else {
+ hideSummaryPanel();
+ }
+ flash.flash(verb + ' summary panel');
+ return on;
+ }
+
+ // === -----------------------------------------------------
+ // === LOGIC For showing/hiding summary and detail panels...
+
+ function showSummaryPanel() {
+ function _show() {
+ summary.panel().show();
+ summary.adjustHeight(sumFromTop, sumMax);
+ }
+ if (detail.panel().isVisible()) {
+ detail.down(_show);
+ } else {
+ _show();
+ }
+ }
+
+ function hideSummaryPanel() {
+ // instruct server to stop sending summary data
+ wss.sendEvent("cancelSummary");
+ summary.panel().hide(detail.up);
+ }
+
+ function showDetailPanel() {
+ if (summary.panel().isVisible()) {
+ detail.down(detail.panel().show);
+ } else {
+ detail.up(detail.panel().show);
+ }
+ }
+
+ function hideDetailPanel() {
+ detail.panel().hide();
+ }
+
+ // ==========================
+
+ function augmentDetailPanel() {
+ var d = detail,
+ downPos = sumFromTop + sumMax + 20;
+ d.ypos = { up: sumFromTop, down: downPos, current: downPos};
+
+ d._move = function (y, cb) {
+ var yp = d.ypos,
+ endCb;
+
+ if (fs.isF(cb)) {
+ endCb = function () {
+ cb();
+ d.adjustHeight(d.ypos.current);
+ }
+ } else {
+ endCb = function () {
+ d.adjustHeight(d.ypos.current);
+ }
+ }
+ if (yp.current !== y) {
+ yp.current = y;
+ d.panel().el().transition().duration(300)
+ .each('end', endCb)
+ .style('top', yp.current + 'px');
+ } else {
+ endCb();
+ }
+ };
+
+ d.down = function (cb) { d._move(d.ypos.down, cb); };
+ d.up = function (cb) { d._move(d.ypos.up, cb); };
+ }
+
+ function toggleUseDetailsFlag(x) {
+ var kev = (x === 'keyev'),
+ verb;
+
+ useDetails = kev ? !useDetails : !!x;
+ verb = useDetails ? 'Enable' : 'Disable';
+
+ if (useDetails) {
+ if (haveDetails) {
+ showDetailPanel();
+ }
+ } else {
+ hideDetailPanel();
+ }
+ flash.flash(verb + ' details panel');
+ return useDetails;
+ }
+
+ // ==========================
+
+ function initPanels() {
+ sumFromTop = mast.mastHeight() + padTop;
+ summary = createTopoPanel(idSum, panelOpts);
+ detail = createTopoPanel(idDet, panelOpts);
+
+ augmentDetailPanel();
+ watchWindow();
+ }
+
+ function destroyPanels() {
+ summary.destroy();
+ summary = null;
+
+ detail.destroy();
+ detail = null;
+ haveDetails = false;
+ unbindWatch();
+ }
+
+ // ==========================
+
+ angular.module('ovTopo')
+ .factory('TopoPanelService',
+ ['$log', '$window', '$rootScope', 'FnService', 'PanelService', 'GlyphService',
+ 'FlashService', 'WebSocketService', 'ButtonService', 'MastService',
+ 'NavService',
+
+ function (_$log_, _$window_, _$rootScope_,
+ _fs_, _ps_, _gs_, _flash_, _wss_, _bns_, _mast_, _ns_) {
+ $log = _$log_;
+ $window = _$window_;
+ $rootScope = _$rootScope_;
+ fs = _fs_;
+ ps = _ps_;
+ gs = _gs_;
+ flash = _flash_;
+ wss = _wss_;
+ bns = _bns_;
+ mast = _mast_;
+ ns = _ns_;
+
+ return {
+ initPanels: initPanels,
+ destroyPanels: destroyPanels,
+ createTopoPanel: createTopoPanel,
+
+ showSummary: showSummary,
+ toggleSummary: toggleSummary,
+
+ toggleUseDetailsFlag: toggleUseDetailsFlag,
+ displaySingle: displaySingle,
+ displayMulti: displayMulti,
+ displayLink: displayLink,
+ displayNothing: displayNothing,
+ displaySomething: displaySomething,
+ addAction: addAction,
+
+ hideSummaryPanel: hideSummaryPanel,
+
+ detailVisible: function () { return detail.panel().isVisible(); },
+ summaryVisible: function () { return summary.panel().isVisible(); }
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoSelect.js b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoSelect.js
new file mode 100644
index 00000000..483c4baa
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoSelect.js
@@ -0,0 +1,286 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topology Selection Module.
+ Defines behavior when selecting nodes.
+ */
+
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, fs, wss, tov, tps, tts, ns;
+
+ // api to topoForce
+ var api;
+ /*
+ node() // get ref to D3 selection of nodes
+ zoomingOrPanning( ev )
+ updateDeviceColors( [dev] )
+ deselectLink()
+ */
+
+ // internal state
+ var hovered, // the node over which the mouse is hovering
+ selections = {}, // currently selected nodes (by id)
+ selectOrder = [], // the order in which we made selections
+ consumeClick = false; // used to coordinate with SVG click handler
+
+ // ==========================
+
+ function nSel() {
+ return selectOrder.length;
+ }
+ function getSel(idx) {
+ return selections[selectOrder[idx]];
+ }
+ function allSelectionsClass(cls) {
+ for (var i=0, n=nSel(); i<n; i++) {
+ if (getSel(i).obj.class !== cls) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ // ==========================
+
+ function nodeMouseOver(m) {
+ if (!m.dragStarted) {
+ if (hovered != m) {
+ hovered = m;
+ tov.hooks.mouseOver({
+ id: m.id,
+ class: m.class,
+ type: m.type
+ });
+ }
+ }
+ }
+
+ function nodeMouseOut(m) {
+ if (!m.dragStarted) {
+ if (hovered) {
+ hovered = null;
+ tov.hooks.mouseOut();
+ }
+ }
+ }
+
+ // ==========================
+
+ function selectObject(obj) {
+ var el = this,
+ nodeEv = el && el.tagName === 'g',
+ ev = d3.event.sourceEvent || {},
+ n;
+
+ if (api.zoomingOrPanning(ev)) {
+ return;
+ }
+
+ if (nodeEv) {
+ n = d3.select(el);
+ } else {
+ api.node().each(function (d) {
+ if (d == obj) {
+ n = d3.select(el = this);
+ }
+ });
+ }
+ if (!n) return;
+
+ if (nodeEv) {
+ consumeClick = true;
+ }
+ api.deselectLink();
+
+ if (ev.shiftKey && n.classed('selected')) {
+ deselectObject(obj.id);
+ updateDetail();
+ return;
+ }
+
+ if (!ev.shiftKey) {
+ deselectAll(true);
+ }
+
+ selections[obj.id] = { obj: obj, el: el };
+ selectOrder.push(obj.id);
+
+ n.classed('selected', true);
+ api.updateDeviceColors(obj);
+ updateDetail();
+ }
+
+ function deselectObject(id) {
+ var obj = selections[id];
+ if (obj) {
+ d3.select(obj.el).classed('selected', false);
+ delete selections[id];
+ fs.removeFromArray(id, selectOrder);
+ api.updateDeviceColors(obj.obj);
+ }
+ }
+
+ function deselectAll(skipUpdate) {
+ var something = (selectOrder.length > 0);
+
+ // deselect all nodes in the network...
+ api.node().classed('selected', false);
+ selections = {};
+ selectOrder = [];
+ api.updateDeviceColors();
+ if (!skipUpdate) {
+ updateDetail();
+ }
+
+ // return true if something was selected
+ return something;
+ }
+
+ // === -----------------------------------------------------
+
+ function requestDetails(data) {
+ wss.sendEvent('requestDetails', {
+ id: data.id,
+ class: data.class
+ });
+ }
+
+ // === -----------------------------------------------------
+
+ function updateDetail() {
+ var nSel = selectOrder.length;
+ if (!nSel) {
+ emptySelect();
+ } else if (nSel === 1) {
+ singleSelect();
+ } else {
+ multiSelect();
+ }
+ }
+
+ function emptySelect() {
+ tov.hooks.emptySelect();
+ tps.displayNothing();
+ }
+
+ function singleSelect() {
+ var data = getSel(0).obj;
+ requestDetails(data);
+ // NOTE: detail panel is shown as a response to receiving
+ // a 'showDetails' event from the server. See 'showDetails'
+ // callback function below...
+ }
+
+ function multiSelect() {
+ // display the selected nodes in the detail panel
+ tps.displayMulti(selectOrder);
+ addHostSelectionActions();
+ tov.hooks.multiSelect(selectOrder);
+ tps.displaySomething();
+ }
+
+ function addHostSelectionActions() {
+ if (allSelectionsClass('host')) {
+ if (nSel() === 2) {
+ tps.addAction({
+ id: 'host-flow-btn',
+ gid: 'endstation',
+ cb: tts.addHostIntent,
+ tt: 'Create Host-to-Host Flow'
+ });
+ } else if (nSel() >= 2) {
+ tps.addAction({
+ id: 'mult-src-flow-btn',
+ gid: 'flows',
+ cb: tts.addMultiSourceIntent,
+ tt: 'Create Multi-Source Flow'
+ });
+ }
+ }
+ }
+
+
+ // === -----------------------------------------------------
+ // Event Handlers
+
+ // display the data for the single selected node
+ function showDetails(data) {
+ var buttons = fs.isA(data.buttons) || [];
+ tps.displaySingle(data);
+ tov.installButtons(buttons, data, data.props['URI']);
+ tov.hooks.singleSelect(data);
+ tps.displaySomething();
+ }
+
+ // returns true if one or more nodes are selected.
+ function somethingSelected() {
+ return nSel();
+ }
+
+ function clickConsumed(x) {
+ var cc = consumeClick;
+ consumeClick = !!x;
+ return cc;
+ }
+
+ // === -----------------------------------------------------
+ // === MODULE DEFINITION ===
+
+ angular.module('ovTopo')
+ .factory('TopoSelectService',
+ ['$log', 'FnService', 'WebSocketService', 'TopoOverlayService',
+ 'TopoPanelService', 'TopoTrafficService', 'NavService',
+
+ function (_$log_, _fs_, _wss_, _tov_, _tps_, _tts_, _ns_) {
+ $log = _$log_;
+ fs = _fs_;
+ wss = _wss_;
+ tov = _tov_;
+ tps = _tps_;
+ tts = _tts_;
+ ns = _ns_;
+
+ function initSelect(_api_) {
+ api = _api_;
+ }
+
+ function destroySelect() { }
+
+ return {
+ initSelect: initSelect,
+ destroySelect: destroySelect,
+
+ showDetails: showDetails,
+
+ nodeMouseOver: nodeMouseOver,
+ nodeMouseOut: nodeMouseOut,
+ selectObject: selectObject,
+ deselectObject: deselectObject,
+ deselectAll: deselectAll,
+ updateDetail: updateDetail,
+
+ hovered: function () { return hovered; },
+ selectOrder: function () { return selectOrder; },
+ somethingSelected: somethingSelected,
+
+ clickConsumed: clickConsumed
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoSprite.js b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoSprite.js
new file mode 100644
index 00000000..1c957412
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoSprite.js
@@ -0,0 +1,262 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topology Sprite Module.
+ Defines behavior for loading sprites into the sprite layer.
+ */
+
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, $http, fs, gs, sus, wss;
+
+ // constants
+ var tssid = 'TopoSpriteService: ',
+ fontsize = 20; // default font size 20pt.
+
+ // internal state
+ var spriteLayer, defsElement;
+
+
+ function registerPathsAsGlyphs(paths) {
+ var custom = {},
+ ids = [];
+
+ function mkd(d) {
+ return fs.isA(d) ? d.join('') : d;
+ }
+
+ paths.forEach(function (path) {
+ var tag = 'spr_' + path.tag;
+
+ if (path.glyph) {
+ // assumption is that we are using a built-in glyph
+ return;
+ }
+
+ custom['_' + tag] = path.viewbox || '0 0 1000 1000';
+ custom[tag] = mkd(path.d);
+ ids.push(tag);
+ });
+
+ gs.registerGlyphs(custom);
+ gs.loadDefs(defsElement, ids, true);
+ }
+
+ function applyStrokeStyle(s, use) {
+ var style;
+ if (s) {
+ style = {};
+ angular.forEach(s, function (value, key) {
+ style['stroke-' + key] = value;
+ });
+ use.style(style);
+ }
+ }
+
+ function applyFillClass(f, use) {
+ use.classed('fill-' + f, true);
+ }
+
+ function doSprite(spr, def, pathmeta) {
+ var pmeta = pathmeta[def.path],
+ c = spr.class || 'gray1',
+ p = spr.pos || [0,0],
+ lab = spr.label,
+ dim = def.dim || [40,40],
+ w = dim[0],
+ h = dim[1],
+ dy = def.labelyoff || 1,
+ sc = def.scale,
+ xfm = sus.translate(p),
+ g, attr, use;
+
+ if (sc) {
+ xfm += sus.scale(sc, sc);
+ }
+
+ g = spriteLayer.append('g')
+ .classed(c, true)
+ .attr('transform', xfm);
+
+ attr = {
+ width: w,
+ height: h,
+ 'xlink:href': '#' + pmeta.u
+ };
+
+ use = g.append('use').attr(attr);
+ applyStrokeStyle(pmeta.s, use);
+ applyFillClass(def.fill, use);
+
+
+ // add subpaths if they have been defined
+ if (fs.isA(def.subpaths)) {
+ def.subpaths.forEach(function (v) {
+ pmeta = pathmeta[v.path];
+ attr = {
+ width: w,
+ height: h,
+ 'xlink:href': '#' + pmeta.u,
+ transform: sus.translate(v.pos)
+ };
+ use = g.append('use').attr(attr);
+ applyStrokeStyle(pmeta.s, use);
+ applyFillClass(def.subpathfill, use);
+ });
+ }
+
+ if (lab) {
+ g.append('text')
+ .text(lab)
+ .attr({ x: w / 2, y: h * dy });
+ }
+ }
+
+ function doLabel(label) {
+ var c = label.class || 'gray1',
+ p = label.pos || [0,0],
+ sz = label.size || 1.0,
+ g = spriteLayer.append('g')
+ .classed(c, true)
+ .attr('transform', sus.translate(p))
+ .append('text')
+ .text(label.text)
+ .style('font-size', (fontsize * sz)+'pt');
+ }
+
+
+ // ==========================
+ // event handlers
+
+ // Handles response from 'spriteListRequest' which lists all the
+ // registered sprite definitions on the server.
+ // (see onos-upload-sprites)
+ function inList(payload) {
+ $log.debug(tssid + 'Registered sprite definitions:', payload.names);
+ // Some day, we will make this list available to the user in
+ // a dropdown selection box...
+ }
+
+ // Handles response from 'spriteDataRequest' which provides the
+ // data for the requested sprite definition.
+ function inData(payload) {
+ var data = payload.data,
+ name, desc, pfx, sprites, labels, alpha,
+ paths, defn, load,
+ pathmeta = {},
+ defs = {},
+ warn = [];
+
+ if (!data) {
+ $log.warn(tssid + 'No sprite data loaded.');
+ return;
+ }
+ name = data.defn_name;
+ desc = data.defn_desc;
+ paths = data.paths;
+ defn = data.defn;
+ load = data.load;
+ pfx = tssid + '[' + name + ']: ';
+
+ $log.debug("Loading sprites...[" + name + "]", desc);
+
+ function no(what) {
+ warn.push(pfx + 'No ' + what + ' property defined');
+ }
+
+ if (!paths) no('paths');
+ if (!defn) no('defn');
+ if (!load) no('load');
+
+ if (warn.length) {
+ $log.error(warn.join('\n'));
+ return;
+ }
+
+ // any custom paths need to be added to the glyph DB, and imported
+ registerPathsAsGlyphs(paths);
+
+ paths.forEach(function (p) {
+ pathmeta[p.tag] = {
+ s: p.stroke,
+ u: p.glyph || 'spr_' + p.tag
+ };
+ });
+
+ defn.forEach(function (d) {
+ defs[d.id] = d;
+ });
+
+ // sprites, labels and alpha are each optional components of the load
+ sprites = load.sprites;
+ labels = load.labels;
+ alpha = load.alpha;
+
+ if (alpha) {
+ spriteLayer.style('opacity', alpha);
+ }
+
+ if (sprites) {
+ sprites.forEach(function (spr) {
+ var def = defs[spr.id];
+ doSprite(spr, def, pathmeta);
+ });
+ }
+
+ if (labels) {
+ labels.forEach(doLabel);
+ }
+ }
+
+
+ function loadSprites(layer, defsElem, defname) {
+ var name = defname || 'sprites';
+ spriteLayer = layer;
+ defsElement = defsElem;
+
+ $log.info(tssid + 'Requesting sprite definition ['+name+']...');
+
+ wss.sendEvent('spriteListRequest');
+ wss.sendEvent('spriteDataRequest', {name: name});
+ }
+
+ // === -----------------------------------------------------
+ // === MODULE DEFINITION ===
+
+ angular.module('ovTopo')
+ .factory('TopoSpriteService',
+ ['$log', '$http', 'FnService', 'GlyphService',
+ 'SvgUtilService', 'WebSocketService',
+
+ function (_$log_, _$http_, _fs_, _gs_, _sus_, _wss_) {
+ $log = _$log_;
+ $http = _$http_;
+ fs = _fs_;
+ gs = _gs_;
+ sus = _sus_;
+ wss = _wss_;
+
+ return {
+ loadSprites: loadSprites,
+ spriteListResponse: inList,
+ spriteDataResponse: inData
+ };
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoToolbar.js b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoToolbar.js
new file mode 100644
index 00000000..84de261b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoToolbar.js
@@ -0,0 +1,284 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topology Toolbar Module.
+ Functions for creating and interacting with the toolbar.
+ */
+
+(function () {
+ 'use strict';
+
+ // injected references
+ var $log, fs, tbs, ps, tov, api;
+
+ // API:
+ // getActionEntry
+ // setUpKeys
+
+ // internal state
+ var toolbar, keyData, cachedState, thirdRow;
+
+ // constants
+ var name = 'topo-tbar',
+ cooktag = 'topo_prefs',
+ soa = 'switchOverlayActions: ',
+ selOver = 'Select overlay here &#x21e7;';
+
+
+ // key to button mapping data
+ var k2b = {
+ O: { id: 'summary-tog', gid: 'summary', isel: true},
+ I: { id: 'instance-tog', gid: 'uiAttached', isel: true },
+ D: { id: 'details-tog', gid: 'details', isel: true },
+ H: { id: 'hosts-tog', gid: 'endstation', isel: false },
+ M: { id: 'offline-tog', gid: 'switch', isel: true },
+ P: { id: 'ports-tog', gid: 'ports', isel: true },
+ B: { id: 'bkgrnd-tog', gid: 'map', isel: false },
+ S: { id: 'sprite-tog', gid: 'cloud', isel: false },
+
+ //X: { id: 'nodelock-tog', gid: 'lock', isel: false },
+ Z: { id: 'oblique-tog', gid: 'oblique', isel: false },
+ N: { id: 'filters-btn', gid: 'filters' },
+ L: { id: 'cycleLabels-btn', gid: 'cycleLabels' },
+ R: { id: 'resetZoom-btn', gid: 'resetZoom' },
+
+ E: { id: 'eqMaster-btn', gid: 'eqMaster' }
+ };
+
+ var prohibited = [
+ 'T', 'backSlash', 'slash',
+ 'X' // needed until we re-instate X above.
+ ];
+ prohibited = prohibited.concat(d3.map(k2b).keys());
+
+
+ // initial toggle state: default settings and tag to key mapping
+ var defaultPrefsState = {
+ summary: 1,
+ insts: 1,
+ detail: 1,
+ hosts: 0,
+ offdev: 1,
+ porthl: 1,
+ bg: 0,
+ spr: 0,
+ toolbar: 0
+ },
+ prefsMap = {
+ summary: 'O',
+ insts: 'I',
+ detail: 'D',
+ hosts: 'H',
+ offdev: 'M',
+ porthl: 'P',
+ bg: 'B',
+ spr: 'S'
+ // NOTE: toolbar state is handled separately
+ };
+
+ function init(_api_) {
+ api = _api_;
+
+ // retrieve initial toggle button settings from user prefs
+ setInitToggleState();
+ }
+
+ function topoDefPrefs() {
+ return angular.extend({}, defaultPrefsState);
+ }
+
+ function setInitToggleState() {
+ cachedState = ps.asNumbers(ps.getPrefs(cooktag));
+ $log.debug('TOOLBAR---- read prefs state:', cachedState);
+
+ if (!cachedState) {
+ cachedState = topoDefPrefs();
+ ps.setPrefs(cooktag, cachedState);
+ $log.debug('TOOLBAR---- Set default prefs state:', cachedState);
+ }
+
+ angular.forEach(prefsMap, function (v, k) {
+ var cfg = k2b[v];
+ cfg && (cfg.isel = !!cachedState[k]);
+ });
+ }
+
+ function initKeyData() {
+ // TODO: use angular forEach instead of d3.map
+ keyData = d3.map(k2b);
+ keyData.forEach(function(key, value) {
+ var data = api.getActionEntry(key);
+ value.cb = data[0]; // on-click callback
+ value.tt = data[1] + ' (' + key + ')'; // tooltip
+ });
+ }
+
+ function addButton(key) {
+ var v = keyData.get(key);
+ v.btn = toolbar.addButton(v.id, v.gid, v.cb, v.tt);
+ }
+
+ function addToggle(key, suppressIfMobile) {
+ var v = keyData.get(key);
+ if (suppressIfMobile && fs.isMobile()) { return; }
+ v.tog = toolbar.addToggle(v.id, v.gid, v.isel, v.cb, v.tt);
+ }
+
+ function addFirstRow() {
+ addToggle('I');
+ addToggle('O');
+ addToggle('D');
+ toolbar.addSeparator();
+
+ addToggle('H');
+ addToggle('M');
+ addToggle('P', true);
+ addToggle('B');
+ addToggle('S', true);
+ }
+
+ function addSecondRow() {
+ //addToggle('X');
+ addToggle('Z');
+ addButton('N');
+ addButton('L');
+ addButton('R');
+ toolbar.addSeparator();
+ addButton('E');
+ }
+
+ function addOverlays() {
+ toolbar.addSeparator();
+
+ // generate radio button set for overlays; start with 'none'
+ var rset = [{
+ gid: 'topo',
+ tooltip: 'No Overlay',
+ cb: function () {
+ tov.tbSelection(null, switchOverlayActions);
+ }
+ }];
+ tov.augmentRbset(rset, switchOverlayActions);
+ toolbar.addRadioSet('topo-overlays', rset);
+ }
+
+ // invoked by overlay service to switch out old buttons and switch in new
+ function switchOverlayActions(oid, keyBindings) {
+ var prohibits = [],
+ kb = fs.isO(keyBindings) || {},
+ order = fs.isA(kb._keyOrder) || [];
+
+ if (keyBindings && !keyBindings._keyOrder) {
+ $log.warn(soa + 'no _keyOrder property defined');
+ } else {
+ // sanity removal of reserved property names
+ ['esc', '_keyListener', '_helpFormat'].forEach(function (k) {
+ fs.removeFromArray(k, order);
+ });
+ }
+
+ thirdRow.clear();
+
+ if (!order.length) {
+ thirdRow.setText(selOver);
+ thirdRow.classed('right', true);
+ api.setUpKeys(); // clear previous overlay key bindings
+
+ } else {
+ thirdRow.classed('right', false);
+ angular.forEach(order, function (key) {
+ var value, bid, gid, tt;
+
+ if (prohibited.indexOf(key) > -1) {
+ prohibits.push(key);
+
+ } else {
+ value = keyBindings[key];
+ bid = oid + '-' + key;
+ gid = tov.mkGlyphId(oid, value.gid);
+ tt = value.tt + ' (' + key + ')';
+ thirdRow.addButton(bid, gid, value.cb, tt);
+ }
+ });
+ api.setUpKeys(keyBindings); // add overlay key bindings
+ }
+
+ if (prohibits.length) {
+ $log.warn(soa + 'Prohibited key bindings ignored:', prohibits);
+ }
+ }
+
+ function createToolbar() {
+ initKeyData();
+ toolbar = tbs.createToolbar(name);
+ addFirstRow();
+ toolbar.addRow();
+ addSecondRow();
+ addOverlays();
+ thirdRow = toolbar.addRow();
+ thirdRow.setText(selOver);
+ thirdRow.classed('right', true);
+
+ if (cachedState.toolbar) {
+ toolbar.show();
+ } else {
+ toolbar.hide();
+ }
+ }
+
+ function destroyToolbar() {
+ tbs.destroyToolbar(name);
+ }
+
+ // allows us to ensure the button states track key strokes
+ function keyListener(key) {
+ var v = keyData.get(key);
+
+ if (v) {
+ // we have a valid button mapping
+ if (v.tog) {
+ // it's a toggle button
+ v.tog.toggleNoCb();
+ }
+ }
+ }
+
+ function toggleToolbar() {
+ toolbar.toggle();
+ }
+
+ angular.module('ovTopo')
+ .factory('TopoToolbarService',
+ ['$log', 'FnService', 'ToolbarService', 'PrefsService',
+ 'TopoOverlayService',
+
+ function (_$log_, _fs_, _tbs_, _ps_, _tov_) {
+ $log = _$log_;
+ fs = _fs_;
+ tbs = _tbs_;
+ ps = _ps_;
+ tov = _tov_;
+
+ return {
+ init: init,
+ createToolbar: createToolbar,
+ destroyToolbar: destroyToolbar,
+ keyListener: keyListener,
+ toggleToolbar: toggleToolbar
+ };
+ }]);
+}()); \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoTraffic.js b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoTraffic.js
new file mode 100644
index 00000000..ca379360
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoTraffic.js
@@ -0,0 +1,220 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topology Traffic Module.
+ Defines behavior for viewing different traffic modes.
+ */
+
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, fs, flash, wss, api;
+
+ /*
+ API to topoForce
+ hovered()
+ somethingSelected()
+ selectOrder()
+ */
+
+ // internal state
+ var trafficMode = null,
+ hoverMode = null;
+
+
+ // === -----------------------------------------------------
+ // Helper functions
+
+ // invoked in response to change in selection and/or mouseover/out:
+ function requestTrafficForMode(mouse) {
+ if (trafficMode === 'flows') {
+ requestDeviceLinkFlows();
+ } else if (trafficMode === 'intents') {
+ if (!mouse || hoverMode === 'intents') {
+ requestRelatedIntents();
+ }
+ } else {
+ // do nothing
+ }
+ }
+
+ function requestDeviceLinkFlows() {
+ // generates payload based on current hover-state
+ var hov = api.hovered();
+
+ function hoverValid() {
+ return hoverMode === 'flows' &&
+ hov && (hov.class === 'device');
+ }
+
+ if (api.somethingSelected()) {
+ wss.sendEvent('requestDeviceLinkFlows', {
+ ids: api.selectOrder(),
+ hover: hoverValid() ? hov.id : ''
+ });
+ }
+ }
+
+ function requestRelatedIntents() {
+ // generates payload based on current hover-state
+ var hov = api.hovered();
+
+ function hoverValid() {
+ return hoverMode === 'intents' &&
+ hov && (hov.class === 'host' || hov.class === 'device');
+ }
+
+ if (api.somethingSelected()) {
+ wss.sendEvent('requestRelatedIntents', {
+ ids: api.selectOrder(),
+ hover: hoverValid() ? hov.id : ''
+ });
+ }
+ }
+
+
+ // === -------------------------------------------------------------
+ // Traffic requests invoked from keystrokes or toolbar buttons...
+
+ function cancelTraffic(forced) {
+ if (!trafficMode || (!forced && trafficMode === 'allFlowPort')) {
+ return false;
+ }
+
+ trafficMode = hoverMode = null;
+ wss.sendEvent('cancelTraffic');
+ flash.flash('Traffic monitoring canceled');
+ return true;
+ }
+
+ function showAllFlowTraffic() {
+ trafficMode = 'allFlowPort';
+ hoverMode = null;
+ wss.sendEvent('requestAllFlowTraffic');
+ flash.flash('All Flow Traffic');
+ }
+
+ function showAllPortTraffic() {
+ trafficMode = 'allFlowPort';
+ hoverMode = null;
+ wss.sendEvent('requestAllPortTraffic');
+ flash.flash('All Port Traffic');
+ }
+
+ function showDeviceLinkFlows () {
+ trafficMode = hoverMode = 'flows';
+ requestDeviceLinkFlows();
+ flash.flash('Device Flows');
+ }
+
+ function showRelatedIntents () {
+ trafficMode = hoverMode = 'intents';
+ requestRelatedIntents();
+ flash.flash('Related Paths');
+ }
+
+ function showPrevIntent() {
+ if (trafficMode === 'intents') {
+ hoverMode = null;
+ wss.sendEvent('requestPrevRelatedIntent');
+ flash.flash('Previous related intent');
+ }
+ }
+
+ function showNextIntent() {
+ if (trafficMode === 'intents') {
+ hoverMode = null;
+ wss.sendEvent('requestNextRelatedIntent');
+ flash.flash('Next related intent');
+ }
+ }
+
+ function showSelectedIntentTraffic() {
+ if (trafficMode === 'intents') {
+ hoverMode = null;
+ wss.sendEvent('requestSelectedIntentTraffic');
+ flash.flash('Traffic on Selected Path');
+ }
+ }
+
+
+ // === ------------------------------------------------------
+ // action buttons on detail panel (multiple selection)
+
+ function addHostIntent () {
+ var so = api.selectOrder();
+ wss.sendEvent('addHostIntent', {
+ one: so[0],
+ two: so[1],
+ ids: so
+ });
+ trafficMode = 'intents';
+ hoverMode = null;
+ flash.flash('Host-to-Host flow added');
+ }
+
+ function addMultiSourceIntent () {
+ var so = api.selectOrder();
+ wss.sendEvent('addMultiSourceIntent', {
+ src: so.slice(0, so.length - 1),
+ dst: so[so.length - 1],
+ ids: so
+ });
+ trafficMode = 'intents';
+ hoverMode = null;
+ flash.flash('Multi-Source flow added');
+ }
+
+
+ // === -----------------------------------------------------
+ // === MODULE DEFINITION ===
+
+ angular.module('ovTopo')
+ .factory('TopoTrafficService',
+ ['$log', 'FnService', 'FlashService', 'WebSocketService',
+
+ function (_$log_, _fs_, _flash_, _wss_) {
+ $log = _$log_;
+ fs = _fs_;
+ flash = _flash_;
+ wss = _wss_;
+
+ return {
+ initTraffic: function (_api_) { api = _api_; },
+ destroyTraffic: function () { },
+
+ // invoked from toolbar overlay buttons or keystrokes
+ cancelTraffic: cancelTraffic,
+ showAllFlowTraffic: showAllFlowTraffic,
+ showAllPortTraffic: showAllPortTraffic,
+ showDeviceLinkFlows: showDeviceLinkFlows,
+ showRelatedIntents: showRelatedIntents,
+ showPrevIntent: showPrevIntent,
+ showNextIntent: showNextIntent,
+ showSelectedIntentTraffic: showSelectedIntentTraffic,
+
+ // invoked from mouseover/mouseout and selection change
+ requestTrafficForMode: requestTrafficForMode,
+
+ // TODO: these should move to new UI demo app
+ // invoked from buttons on detail (multi-select) panel
+ addHostIntent: addHostIntent,
+ addMultiSourceIntent: addMultiSourceIntent
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoTrafficNew.js b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoTrafficNew.js
new file mode 100644
index 00000000..cb4bc49a
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoTrafficNew.js
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/*
+ ONOS GUI -- Topology Traffic Overlay Module.
+ Defines behavior for viewing different traffic modes.
+ Installed as a Topology Overlay.
+ */
+(function () {
+ 'use strict';
+
+ // injected refs
+ var $log, tov, tts;
+
+ // NOTE: no internal state here -- see TopoTrafficService for that
+
+ // NOTE: providing button disabling requires too big a refactoring of
+ // the button factory etc. Will have to be done another time.
+
+
+ // traffic overlay definition
+ var overlay = {
+ overlayId: 'traffic',
+ glyphId: 'allTraffic',
+ tooltip: 'Traffic Overlay',
+
+ // NOTE: Traffic glyphs already installed as part of the base ONOS set.
+
+ activate: function () {
+ $log.debug("Traffic overlay ACTIVATED");
+ },
+
+ deactivate: function () {
+ tts.cancelTraffic(true);
+ $log.debug("Traffic overlay DEACTIVATED");
+ },
+
+ // detail panel button definitions
+ // (keys match button identifiers, also defined in TrafficOverlay.java)
+ buttons: {
+ showDeviceFlows: {
+ gid: 'flows',
+ tt: 'Show Device Flows',
+ cb: function (data) { tts.showDeviceLinkFlows(); }
+ },
+
+ showRelatedTraffic: {
+ gid: 'relatedIntents',
+ tt: 'Show Related Traffic',
+ cb: function (data) { tts.showRelatedIntents(); }
+ }
+ },
+
+ // key bindings for traffic overlay toolbar buttons
+ // NOTE: fully qual. button ID is derived from overlay-id and key-name
+ keyBindings: {
+ 0: {
+ cb: function () { tts.cancelTraffic(true); },
+ tt: 'Cancel traffic monitoring',
+ gid: 'xMark'
+ },
+
+ A: {
+ cb: function () { tts.showAllFlowTraffic(); },
+ tt: 'Monitor all traffic using flow stats',
+ gid: 'allTraffic'
+ },
+ Q: {
+ cb: function () { tts.showAllPortTraffic(); },
+ tt: 'Monitor all traffic using port stats',
+ gid: 'allTraffic'
+ },
+ F: {
+ cb: function () { tts.showDeviceLinkFlows(); },
+ tt: 'Show device link flows',
+ gid: 'flows'
+ },
+ V: {
+ cb: function () { tts.showRelatedIntents(); },
+ tt: 'Show all related intents',
+ gid: 'relatedIntents'
+ },
+ leftArrow: {
+ cb: function () { tts.showPrevIntent(); },
+ tt: 'Show previous related intent',
+ gid: 'prevIntent'
+ },
+ rightArrow: {
+ cb: function () { tts.showNextIntent(); },
+ tt: 'Show next related intent',
+ gid: 'nextIntent'
+ },
+ W: {
+ cb: function () { tts.showSelectedIntentTraffic(); },
+ tt: 'Monitor traffic of selected intent',
+ gid: 'intentTraffic'
+ },
+
+ _keyOrder: [
+ '0', 'A', 'Q', 'F', 'V', 'leftArrow', 'rightArrow', 'W'
+ ]
+ },
+
+ hooks: {
+ // hook for handling escape key
+ escape: function () {
+ // Must return true to consume ESC, false otherwise.
+ return tts.cancelTraffic(true);
+ },
+
+ // hooks for when the selection changes...
+ empty: function () {
+ tts.cancelTraffic();
+ },
+ single: function (data) {
+ tts.requestTrafficForMode();
+ },
+ multi: function (selectOrder) {
+ tts.requestTrafficForMode();
+ tov.addDetailButton('showRelatedTraffic');
+ },
+
+ // mouse hooks
+ mouseover: function (m) {
+ // m has id, class, and type properties
+ tts.requestTrafficForMode(true);
+ },
+ mouseout: function () {
+ tts.requestTrafficForMode(true);
+ }
+ }
+ };
+
+ // invoke code to register with the overlay service
+ angular.module('ovTopo')
+ .run(['$log', 'TopoOverlayService', 'TopoTrafficService',
+
+ function (_$log_, _tov_, _tts_) {
+ $log = _$log_;
+ tov = _tov_;
+ tts = _tts_;
+ tov.register(overlay);
+ }]);
+
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/tunnel/tunnel.css b/framework/src/onos/web/gui/src/main/webapp/app/view/tunnel/tunnel.css
new file mode 100644
index 00000000..da7d06da
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/tunnel/tunnel.css
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Link View -- CSS file
+ */
+
+#ov-tunnel h2 {
+ display: inline-block;
+}
+
+#ov-tunnel div.ctrl-btns {
+ width: 45px;
+} \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/tunnel/tunnel.html b/framework/src/onos/web/gui/src/main/webapp/app/view/tunnel/tunnel.html
new file mode 100644
index 00000000..4909cc0e
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/tunnel/tunnel.html
@@ -0,0 +1,72 @@
+<!--
+ ~ Copyright 2015 Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<!-- Tunnel partial HTML -->
+<div id="ov-tunnel">
+ <div class="tabular-header">
+ <h2>Tunnels ({{tableData.length}} total)</h2>
+ <div class="ctrl-btns">
+ <div class="refresh" ng-class="{active: autoRefresh}"
+ icon icon-size="36" icon-id="refresh"
+ tooltip tt-msg="autoRefreshTip"
+ ng-click="toggleRefresh()"></div>
+ </div>
+ </div>
+
+ <div class="summary-list" onos-table-resize>
+ <div ng-show="loading" class="loading-wheel"
+ icon icon-id="loading" icon-size="75"></div>
+
+ <div class="table-header" onos-sortable-header>
+ <table>
+ <tr>
+ <td colId="id" sortable>ID </td>
+ <td colId="name" sortable>Name</td>
+ <td colId="one" sortable>Port 1 </td>
+ <td colId="two" sortable>Port 2 </td>
+ <td colId="type" sortable>Type </td>
+ <td colId="group_id" sortable>Group Id</td>
+ <td colId="bandwidth" sortable>Bandwidth</td>
+ <td colId="path" sortable>Path</td>
+ </tr>
+ </table>
+ </div>
+
+ <div class="table-body">
+ <table onos-flash-changes id-prop="one">
+ <tr ng-if="!tableData.length" class="no-data">
+ <td colspan="6">
+ No tunnels found
+ </td>
+ </tr>
+
+ <tr ng-repeat="tunnel in tableData track by $index"
+ ng-repeat-complete row-id="{{tunnel.id}}">
+ <td>{{tunnel.id}}</td>
+ <td>{{tunnel.name}}</td>
+ <td>{{tunnel.one}}</td>
+ <td>{{tunnel.two}}</td>
+ <td>{{tunnel.type}}</td>
+ <td>{{tunnel.group_id}}</td>
+ <td>{{tunnel.bandwidth}}</td>
+ <td>{{tunnel.path}}</td>
+ </tr>
+ </table>
+ </div>
+
+ </div>
+
+</div>
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/tunnel/tunnel.js b/framework/src/onos/web/gui/src/main/webapp/app/view/tunnel/tunnel.js
new file mode 100644
index 00000000..5cde0457
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/app/view/tunnel/tunnel.js
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Host View Module
+ */
+
+(function () {
+ 'use strict';
+
+ angular.module('ovTunnel', [])
+ .controller('OvTunnelCtrl',
+ ['$log', '$scope', '$sce', 'FnService', 'TableBuilderService',
+
+ function ($log, $scope, $sce, fs, tbs) {
+ tbs.buildTable({
+ scope: $scope,
+ tag: 'tunnel'
+ });
+
+ $scope.$watch('tableData', function () {
+ if (!fs.isEmptyObject($scope.tableData)) {
+ $scope.tableData.forEach(function (tunnel) {
+ //tunnel.direction = $sce.trustAsHtml(tunnel.direction);
+ });
+ }
+ });
+
+ $log.log('OvTunnelCtrl has been created');
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/data/img/apple-touch-icon.png b/framework/src/onos/web/gui/src/main/webapp/data/img/apple-touch-icon.png
new file mode 100644
index 00000000..3bf5eb6e
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/data/img/apple-touch-icon.png
Binary files differ
diff --git a/framework/src/onos/web/gui/src/main/webapp/data/img/nav-menu.png b/framework/src/onos/web/gui/src/main/webapp/data/img/nav-menu.png
new file mode 100644
index 00000000..07bbcf1b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/data/img/nav-menu.png
Binary files differ
diff --git a/framework/src/onos/web/gui/src/main/webapp/data/img/onos-logo-fliprotate.png b/framework/src/onos/web/gui/src/main/webapp/data/img/onos-logo-fliprotate.png
new file mode 100644
index 00000000..7368017f
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/data/img/onos-logo-fliprotate.png
Binary files differ
diff --git a/framework/src/onos/web/gui/src/main/webapp/data/img/onos-logo.lg.png b/framework/src/onos/web/gui/src/main/webapp/data/img/onos-logo.lg.png
new file mode 100644
index 00000000..afbd438c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/data/img/onos-logo.lg.png
Binary files differ
diff --git a/framework/src/onos/web/gui/src/main/webapp/data/img/onos-logo.png b/framework/src/onos/web/gui/src/main/webapp/data/img/onos-logo.png
new file mode 100644
index 00000000..8688cd6b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/data/img/onos-logo.png
Binary files differ
diff --git a/framework/src/onos/web/gui/src/main/webapp/data/map/README.txt b/framework/src/onos/web/gui/src/main/webapp/data/map/README.txt
new file mode 100644
index 00000000..5cd26346
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/data/map/README.txt
@@ -0,0 +1,61 @@
+see: http://bost.ocks.org/mike/map/
+
+brew install gdal
+npm install -g topojson
+
+To generate continental US map:
+
+ $ wget 'http://www.naturalearthdata.com/download/50m/cultural/ne_50m_admin_1_states_provinces_lakes.zip'
+ $ unzip ne_50m_admin_1_states_provinces_lakes.zip
+ $ ogr2ogr -f GeoJSON -where "sr_adm0_a3 IN ('USA')" states.json ne_50m_admin_1_states_provinces_lakes.shp
+
+edit states.json to remove data for Hawaii and Alaska
+
+ $ topojson states.json > topology.json
+
+
+The .shp file above is incomplete (USA and part of Candada.)
+So it may be that each region requires a bit of research to generate.
+Ideally a source for public domain shp files can be found that covers all geographic regions.
+
+
+For Canada:
+
+ # wget 'http://www12.statcan.gc.ca/census-recensement/2011/geo/bound-limit/files-fichiers/gpr_000b11a_e.zip'
+ # unzip gpr_000b11a_e.zip
+ # ogr2ogr -f "GeoJSON" -s_srs EPSG:21781 -t_srs EPSG:4326 canada.json gpr_000b11a_e.shp
+ # topojson --id-property CFSAUID -p name=PRNAME -p name canada.json > topology.json
+
+
+This produces a very large (5MB) file and draws very slowly in Chrome.
+So some additional processing is required to simplify the geometry. (It is not checked in.)
+
+Also, the specification of object structure within the geojson is unclear.
+In the US map the geojson structure is
+
+ json.objects.states
+
+but in the Canadian data it's
+
+ json.objects.canada
+
+
+Lastly, the projection that is used may be tailored to the region.
+The preferred projection for the US is "albers" and d3 provides a "albersUSA" which can be used to
+ project hawaii and alaska as well
+
+For Canada, apparantly a "Lambert" projection (called conicConformal in d3) is preferred
+
+see:
+ https://github.com/mbostock/d3/wiki/Geo-Projections
+ http://www.statcan.gc.ca/pub/92-195-x/2011001/other-autre/mapproj-projcarte/m-c-eng.htm
+
+
+Summary:
+- some additional work is required to fully generalize maps functionality.
+- it may be worthwhile for ON.LAB to provide the topo files for key regions since producing these
+ files is non-trivial
+
+
+
+
diff --git a/framework/src/onos/web/gui/src/main/webapp/data/map/continental_us.topojson b/framework/src/onos/web/gui/src/main/webapp/data/map/continental_us.topojson
new file mode 100644
index 00000000..978fbdf5
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/data/map/continental_us.topojson
@@ -0,0 +1,25782 @@
+{
+ "type": "Topology",
+ "objects": {
+ "states": {
+ "type": "GeometryCollection",
+ "geometries": [
+ {
+ "type": "MultiPolygon",
+ "arcs": [
+ [
+ [
+ 0
+ ]
+ ],
+ [
+ [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 12,
+ 13,
+ 14,
+ 15,
+ 16
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "arcs": [
+ [
+ [
+ 17
+ ]
+ ],
+ [
+ [
+ 18
+ ]
+ ],
+ [
+ [
+ 19
+ ]
+ ],
+ [
+ [
+ 20
+ ]
+ ],
+ [
+ [
+ 21
+ ]
+ ],
+ [
+ [
+ 22
+ ]
+ ],
+ [
+ [
+ 23,
+ 24,
+ -15,
+ 25
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 32,
+ 33,
+ 34,
+ 35
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 36,
+ 37
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 38,
+ 39,
+ 40
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "arcs": [
+ [
+ [
+ 41
+ ]
+ ],
+ [
+ [
+ 42
+ ]
+ ],
+ [
+ [
+ 43
+ ]
+ ],
+ [
+ [
+ 44
+ ]
+ ],
+ [
+ [
+ 45
+ ]
+ ],
+ [
+ [
+ 46
+ ]
+ ],
+ [
+ [
+ 47
+ ]
+ ],
+ [
+ [
+ 48
+ ]
+ ],
+ [
+ [
+ 49
+ ]
+ ],
+ [
+ [
+ 50
+ ]
+ ],
+ [
+ [
+ 51
+ ]
+ ],
+ [
+ [
+ 52,
+ -6,
+ 53
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "arcs": [
+ [
+ [
+ 54
+ ]
+ ],
+ [
+ [
+ 55,
+ -54,
+ -5,
+ 56,
+ 57,
+ 58
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 59,
+ 60,
+ 61,
+ 62,
+ 63,
+ 64
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 65,
+ 66,
+ 67,
+ 68,
+ 69,
+ 70,
+ 71
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 72,
+ 73,
+ 74,
+ 75,
+ -60,
+ 76
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 77,
+ 78,
+ -74,
+ 79,
+ 80
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 81,
+ -27,
+ 82,
+ 83
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "arcs": [
+ [
+ [
+ 84,
+ 85
+ ]
+ ],
+ [
+ [
+ 86,
+ 87,
+ 88,
+ 89,
+ -75,
+ -79,
+ 90
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "arcs": [
+ [
+ [
+ 91
+ ]
+ ],
+ [
+ [
+ 92
+ ]
+ ],
+ [
+ [
+ 93
+ ]
+ ],
+ [
+ [
+ 94
+ ]
+ ],
+ [
+ [
+ 95,
+ 96,
+ -9,
+ 97
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "arcs": [
+ [
+ [
+ 98
+ ]
+ ],
+ [
+ [
+ 99
+ ]
+ ],
+ [
+ [
+ 100,
+ -36,
+ 101,
+ 102,
+ 103,
+ 104
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "arcs": [
+ [
+ [
+ 105,
+ 106
+ ]
+ ],
+ [
+ [
+ -40,
+ 107,
+ 108,
+ 109,
+ -38,
+ 110,
+ 111,
+ 112
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "arcs": [
+ [
+ [
+ 113
+ ]
+ ],
+ [
+ [
+ 114
+ ]
+ ],
+ [
+ [
+ 115,
+ 116
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "arcs": [
+ [
+ [
+ 117
+ ]
+ ],
+ [
+ [
+ 118
+ ]
+ ],
+ [
+ [
+ 119,
+ -81,
+ 120
+ ]
+ ],
+ [
+ [
+ 121
+ ]
+ ],
+ [
+ [
+ 122
+ ]
+ ],
+ [
+ [
+ 123
+ ]
+ ],
+ [
+ [
+ 124
+ ]
+ ],
+ [
+ [
+ 125,
+ 126
+ ]
+ ],
+ [
+ [
+ 127
+ ]
+ ],
+ [
+ [
+ 128
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 129,
+ -64,
+ 130,
+ 131,
+ 132
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ -76,
+ -90,
+ 133,
+ -86,
+ 134,
+ -12,
+ 135,
+ -84,
+ 136,
+ -61
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "arcs": [
+ [
+ [
+ 137
+ ]
+ ],
+ [
+ [
+ 138,
+ -98,
+ -8,
+ 139,
+ -3
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 140,
+ 141,
+ -72,
+ 142,
+ 143
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "arcs": [
+ [
+ [
+ 144
+ ]
+ ],
+ [
+ [
+ 145
+ ]
+ ],
+ [
+ [
+ 146
+ ]
+ ],
+ [
+ [
+ 147
+ ]
+ ],
+ [
+ [
+ 148
+ ]
+ ],
+ [
+ [
+ 149,
+ 150
+ ]
+ ],
+ [
+ [
+ 151,
+ -58,
+ 152,
+ 153,
+ 154
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 155,
+ -144,
+ 156,
+ -132
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ -62,
+ -137,
+ -83,
+ -32,
+ 157,
+ 158
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 159,
+ -104,
+ 160,
+ 161,
+ -116
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "arcs": [
+ [
+ [
+ 162
+ ]
+ ],
+ [
+ [
+ 163,
+ 164,
+ 165
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 166,
+ 167,
+ -13,
+ -29,
+ 168
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ -16,
+ -25,
+ 169,
+ -68,
+ 170
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "arcs": [
+ [
+ [
+ 171
+ ]
+ ],
+ [
+ [
+ 172
+ ]
+ ],
+ [
+ [
+ 173
+ ]
+ ],
+ [
+ [
+ 174
+ ]
+ ],
+ [
+ [
+ 175
+ ]
+ ],
+ [
+ [
+ 176,
+ -102,
+ -35,
+ 177,
+ -165,
+ 178,
+ 179
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 180,
+ -91,
+ -78,
+ -120,
+ 181,
+ 182
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ -11,
+ 183,
+ -169,
+ -28,
+ -82,
+ -136
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 184,
+ -69,
+ -170,
+ -24,
+ 185
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ -164,
+ 186,
+ -41,
+ -113,
+ 187,
+ -183,
+ 188,
+ -179
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "arcs": [
+ [
+ [
+ 189
+ ]
+ ],
+ [
+ [
+ 190
+ ]
+ ],
+ [
+ [
+ 191,
+ -33,
+ -101
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 192,
+ -59,
+ -152
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ -131,
+ -63,
+ -159,
+ 193,
+ -141,
+ -156
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 194,
+ -153,
+ -57,
+ -4,
+ -140,
+ -7,
+ -135,
+ -85,
+ -134,
+ -89
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "arcs": [
+ [
+ [
+ 195
+ ]
+ ],
+ [
+ [
+ 196
+ ]
+ ],
+ [
+ [
+ 197
+ ]
+ ],
+ [
+ [
+ 198
+ ]
+ ],
+ [
+ [
+ 199
+ ]
+ ],
+ [
+ [
+ -10,
+ -97,
+ 200,
+ -167,
+ -184
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ 201,
+ -30,
+ -17,
+ -171,
+ -67
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "arcs": [
+ [
+ [
+ -109,
+ 202
+ ]
+ ],
+ [
+ [
+ -106,
+ 203
+ ]
+ ],
+ [
+ [
+ -111,
+ -37,
+ 204,
+ -150,
+ 205,
+ -154,
+ -195,
+ -88,
+ 206
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ -103,
+ -177,
+ 207,
+ -161
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "arcs": [
+ [
+ [
+ 208
+ ]
+ ],
+ [
+ [
+ 209
+ ]
+ ],
+ [
+ [
+ 210
+ ]
+ ],
+ [
+ [
+ 211
+ ]
+ ],
+ [
+ [
+ 212
+ ]
+ ],
+ [
+ [
+ 213
+ ]
+ ],
+ [
+ [
+ 214
+ ]
+ ],
+ [
+ [
+ 215
+ ]
+ ],
+ [
+ [
+ -185,
+ 216,
+ -70
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "arcs": [
+ [
+ [
+ 217
+ ]
+ ],
+ [
+ [
+ 218
+ ]
+ ],
+ [
+ [
+ 219
+ ]
+ ],
+ [
+ [
+ 220
+ ]
+ ],
+ [
+ [
+ -126,
+ 221,
+ -77,
+ -65,
+ -130,
+ 222
+ ]
+ ],
+ [
+ [
+ 223
+ ]
+ ],
+ [
+ [
+ 224
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ -112,
+ -207,
+ -87,
+ -181,
+ -188
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "arcs": [
+ [
+ -158,
+ -31,
+ -202,
+ -66,
+ -142,
+ -194
+ ]
+ ]
+ }
+ ]
+ }
+ },
+ "arcs": [
+ [
+ [
+ 6347,
+ 2300
+ ],
+ [
+ -16,
+ -9
+ ],
+ [
+ -22,
+ 1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 27,
+ 7
+ ],
+ [
+ 7,
+ -8
+ ]
+ ],
+ [
+ [
+ 6447,
+ 2350
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -19,
+ -41
+ ],
+ [
+ -66,
+ -14
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 14,
+ 2
+ ],
+ [
+ 19,
+ 14
+ ],
+ [
+ -4,
+ 22
+ ],
+ [
+ -7,
+ 24
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -5,
+ 14
+ ],
+ [
+ 0,
+ 45
+ ],
+ [
+ -4,
+ 27
+ ],
+ [
+ -11,
+ 27
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -8,
+ -46
+ ],
+ [
+ -6,
+ -61
+ ],
+ [
+ -3,
+ -19
+ ],
+ [
+ -20,
+ -2
+ ],
+ [
+ -18,
+ 4
+ ],
+ [
+ -8,
+ -1
+ ]
+ ],
+ [
+ [
+ 6290,
+ 2347
+ ],
+ [
+ -2,
+ 83
+ ],
+ [
+ -2,
+ 76
+ ],
+ [
+ -2,
+ 75
+ ],
+ [
+ -2,
+ 76
+ ],
+ [
+ -2,
+ 76
+ ],
+ [
+ -2,
+ 75
+ ],
+ [
+ -1,
+ 76
+ ],
+ [
+ -2,
+ 75
+ ],
+ [
+ 4,
+ 75
+ ],
+ [
+ 4,
+ 74
+ ],
+ [
+ 5,
+ 75
+ ],
+ [
+ 4,
+ 74
+ ],
+ [
+ 4,
+ 74
+ ],
+ [
+ 4,
+ 75
+ ],
+ [
+ 4,
+ 74
+ ],
+ [
+ 5,
+ 75
+ ],
+ [
+ 4,
+ 74
+ ],
+ [
+ 4,
+ 74
+ ],
+ [
+ 4,
+ 75
+ ],
+ [
+ 5,
+ 74
+ ],
+ [
+ 4,
+ 75
+ ],
+ [
+ 4,
+ 74
+ ],
+ [
+ 4,
+ 74
+ ],
+ [
+ 4,
+ 75
+ ],
+ [
+ 2,
+ 19
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ -15,
+ 26
+ ]
+ ],
+ [
+ [
+ 6329,
+ 4211
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 28,
+ -1
+ ],
+ [
+ 28,
+ 0
+ ],
+ [
+ 27,
+ -1
+ ],
+ [
+ 28,
+ -1
+ ],
+ [
+ 28,
+ 0
+ ],
+ [
+ 28,
+ -1
+ ],
+ [
+ 28,
+ 0
+ ],
+ [
+ 27,
+ -1
+ ],
+ [
+ 28,
+ -1
+ ],
+ [
+ 28,
+ 0
+ ],
+ [
+ 28,
+ -1
+ ],
+ [
+ 28,
+ 0
+ ],
+ [
+ 27,
+ -1
+ ],
+ [
+ 28,
+ -1
+ ],
+ [
+ 28,
+ 0
+ ],
+ [
+ 28,
+ -1
+ ]
+ ],
+ [
+ [
+ 6771,
+ 4212
+ ],
+ [
+ 4,
+ -51
+ ],
+ [
+ 5,
+ -52
+ ],
+ [
+ 4,
+ -51
+ ],
+ [
+ 5,
+ -52
+ ],
+ [
+ 5,
+ -51
+ ],
+ [
+ 4,
+ -52
+ ],
+ [
+ 5,
+ -51
+ ],
+ [
+ 4,
+ -52
+ ],
+ [
+ 5,
+ -51
+ ],
+ [
+ 4,
+ -52
+ ],
+ [
+ 5,
+ -51
+ ],
+ [
+ 5,
+ -52
+ ],
+ [
+ 4,
+ -51
+ ],
+ [
+ 5,
+ -51
+ ],
+ [
+ 4,
+ -52
+ ],
+ [
+ 5,
+ -51
+ ],
+ [
+ 4,
+ -24
+ ],
+ [
+ 4,
+ -38
+ ],
+ [
+ 24,
+ -112
+ ],
+ [
+ 7,
+ -47
+ ],
+ [
+ -2,
+ -19
+ ],
+ [
+ 3,
+ -17
+ ],
+ [
+ 8,
+ -13
+ ],
+ [
+ -1,
+ -16
+ ],
+ [
+ -11,
+ -18
+ ],
+ [
+ -7,
+ -22
+ ],
+ [
+ -5,
+ -39
+ ],
+ [
+ -11,
+ -69
+ ],
+ [
+ 0,
+ -41
+ ],
+ [
+ 10,
+ -57
+ ],
+ [
+ 2,
+ -26
+ ],
+ [
+ -6,
+ -111
+ ],
+ [
+ 4,
+ -72
+ ],
+ [
+ 10,
+ -47
+ ]
+ ],
+ [
+ [
+ 6877,
+ 2601
+ ],
+ [
+ -55,
+ 0
+ ],
+ [
+ -56,
+ 0
+ ],
+ [
+ -56,
+ 0
+ ],
+ [
+ -56,
+ 0
+ ],
+ [
+ -57,
+ 0
+ ],
+ [
+ -56,
+ 0
+ ],
+ [
+ -56,
+ 0
+ ],
+ [
+ -56,
+ 0
+ ],
+ [
+ -2,
+ -29
+ ],
+ [
+ 1,
+ -27
+ ],
+ [
+ 6,
+ -27
+ ],
+ [
+ 25,
+ -49
+ ],
+ [
+ 3,
+ -13
+ ],
+ [
+ -5,
+ -38
+ ],
+ [
+ 1,
+ -28
+ ],
+ [
+ -3,
+ -14
+ ],
+ [
+ -6,
+ -12
+ ],
+ [
+ -2,
+ -14
+ ]
+ ],
+ [
+ [
+ 6064,
+ 4615
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 3,
+ -16
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -20,
+ -22
+ ],
+ [
+ -9,
+ -29
+ ],
+ [
+ 3,
+ -35
+ ],
+ [
+ -7,
+ -36
+ ],
+ [
+ -17,
+ -35
+ ],
+ [
+ -7,
+ -41
+ ],
+ [
+ 3,
+ -44
+ ],
+ [
+ -9,
+ -36
+ ],
+ [
+ -20,
+ -28
+ ],
+ [
+ -6,
+ -16
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 5962,
+ 4212
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ -7,
+ -19
+ ],
+ [
+ -16,
+ -19
+ ],
+ [
+ -9,
+ -19
+ ],
+ [
+ -2,
+ -18
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -4,
+ -27
+ ],
+ [
+ -4,
+ -63
+ ],
+ [
+ -8,
+ -36
+ ],
+ [
+ -15,
+ -9
+ ],
+ [
+ -7,
+ -14
+ ],
+ [
+ -1,
+ -20
+ ],
+ [
+ -9,
+ -22
+ ],
+ [
+ -16,
+ -26
+ ],
+ [
+ -5,
+ -24
+ ],
+ [
+ 5,
+ -23
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -17,
+ -11
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 4,
+ -12
+ ],
+ [
+ 2,
+ -18
+ ],
+ [
+ -3,
+ -29
+ ],
+ [
+ -4,
+ -13
+ ],
+ [
+ -4,
+ -12
+ ],
+ [
+ -15,
+ -21
+ ],
+ [
+ -4,
+ -16
+ ],
+ [
+ 7,
+ -11
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ -7,
+ -14
+ ],
+ [
+ 2,
+ -14
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 7,
+ -9
+ ],
+ [
+ 2,
+ -25
+ ],
+ [
+ -5,
+ -32
+ ],
+ [
+ 1,
+ -26
+ ],
+ [
+ 8,
+ -22
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ -8,
+ -71
+ ],
+ [
+ 0,
+ -10
+ ]
+ ],
+ [
+ [
+ 5813,
+ 3413
+ ],
+ [
+ -34,
+ -1
+ ],
+ [
+ -31,
+ 0
+ ],
+ [
+ -31,
+ 0
+ ],
+ [
+ -31,
+ 0
+ ],
+ [
+ -31,
+ 0
+ ],
+ [
+ -31,
+ 0
+ ],
+ [
+ -31,
+ 0
+ ],
+ [
+ -31,
+ 0
+ ],
+ [
+ -32,
+ 0
+ ],
+ [
+ -31,
+ 0
+ ],
+ [
+ -31,
+ 0
+ ],
+ [
+ -31,
+ -1
+ ],
+ [
+ -31,
+ 0
+ ],
+ [
+ -31,
+ 0
+ ],
+ [
+ -31,
+ 0
+ ],
+ [
+ -31,
+ 0
+ ]
+ ],
+ [
+ [
+ 5313,
+ 3411
+ ],
+ [
+ -1,
+ 55
+ ],
+ [
+ 0,
+ 54
+ ],
+ [
+ 0,
+ 55
+ ],
+ [
+ 0,
+ 55
+ ],
+ [
+ -9,
+ 9
+ ],
+ [
+ -16,
+ 4
+ ],
+ [
+ -9,
+ -3
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -7,
+ -9
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -9,
+ 19
+ ]
+ ],
+ [
+ [
+ 5236,
+ 3667
+ ],
+ [
+ 0,
+ 44
+ ],
+ [
+ 1,
+ 44
+ ],
+ [
+ 0,
+ 44
+ ],
+ [
+ 1,
+ 43
+ ],
+ [
+ 0,
+ 44
+ ],
+ [
+ 1,
+ 44
+ ],
+ [
+ 0,
+ 44
+ ],
+ [
+ 1,
+ 44
+ ],
+ [
+ 0,
+ 43
+ ],
+ [
+ 1,
+ 44
+ ],
+ [
+ 0,
+ 44
+ ],
+ [
+ 1,
+ 44
+ ],
+ [
+ 0,
+ 43
+ ],
+ [
+ 1,
+ 44
+ ],
+ [
+ 0,
+ 44
+ ],
+ [
+ 1,
+ 44
+ ],
+ [
+ -4,
+ 56
+ ],
+ [
+ -4,
+ 56
+ ],
+ [
+ -4,
+ 56
+ ],
+ [
+ -4,
+ 56
+ ],
+ [
+ -4,
+ 56
+ ],
+ [
+ -4,
+ 56
+ ],
+ [
+ -4,
+ 56
+ ],
+ [
+ -3,
+ 56
+ ]
+ ],
+ [
+ [
+ 5213,
+ 4816
+ ],
+ [
+ 48,
+ 0
+ ],
+ [
+ 48,
+ 0
+ ],
+ [
+ 48,
+ 0
+ ],
+ [
+ 49,
+ 0
+ ],
+ [
+ 48,
+ 0
+ ],
+ [
+ 48,
+ 0
+ ],
+ [
+ 48,
+ 0
+ ],
+ [
+ 49,
+ 0
+ ],
+ [
+ 48,
+ 0
+ ],
+ [
+ 48,
+ 0
+ ],
+ [
+ 48,
+ 0
+ ],
+ [
+ 49,
+ 0
+ ],
+ [
+ 48,
+ 0
+ ],
+ [
+ 48,
+ 0
+ ],
+ [
+ 48,
+ 0
+ ],
+ [
+ 49,
+ 0
+ ],
+ [
+ 7,
+ -31
+ ],
+ [
+ 8,
+ -21
+ ],
+ [
+ 1,
+ -15
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ -12,
+ -33
+ ],
+ [
+ -12,
+ -15
+ ],
+ [
+ -6,
+ -16
+ ],
+ [
+ -9,
+ -15
+ ],
+ [
+ -13,
+ -43
+ ],
+ [
+ 28,
+ 0
+ ],
+ [
+ 29,
+ 1
+ ],
+ [
+ 28,
+ 1
+ ],
+ [
+ 32,
+ 1
+ ]
+ ],
+ [
+ [
+ 2713,
+ 5018
+ ],
+ [
+ 0,
+ -143
+ ],
+ [
+ 0,
+ -143
+ ],
+ [
+ 0,
+ -143
+ ],
+ [
+ 0,
+ -143
+ ],
+ [
+ 0,
+ -142
+ ],
+ [
+ 0,
+ -143
+ ],
+ [
+ 0,
+ -143
+ ],
+ [
+ 0,
+ -143
+ ],
+ [
+ 0,
+ -142
+ ],
+ [
+ 0,
+ -143
+ ],
+ [
+ 0,
+ -143
+ ],
+ [
+ 0,
+ -143
+ ],
+ [
+ 0,
+ -143
+ ],
+ [
+ 0,
+ -142
+ ],
+ [
+ 0,
+ -143
+ ],
+ [
+ 0,
+ -143
+ ]
+ ],
+ [
+ [
+ 2713,
+ 2733
+ ],
+ [
+ -39,
+ 0
+ ],
+ [
+ -61,
+ -1
+ ],
+ [
+ -62,
+ 0
+ ],
+ [
+ -61,
+ 0
+ ],
+ [
+ -61,
+ 0
+ ],
+ [
+ -61,
+ -1
+ ],
+ [
+ -83,
+ 60
+ ],
+ [
+ -82,
+ 60
+ ],
+ [
+ -82,
+ 59
+ ],
+ [
+ -82,
+ 60
+ ],
+ [
+ -82,
+ 59
+ ],
+ [
+ -82,
+ 60
+ ],
+ [
+ -82,
+ 60
+ ],
+ [
+ -83,
+ 59
+ ],
+ [
+ 9,
+ 23
+ ],
+ [
+ 11,
+ 61
+ ]
+ ],
+ [
+ [
+ 1730,
+ 3292
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 24,
+ 4
+ ],
+ [
+ 12,
+ 16
+ ],
+ [
+ 7,
+ 28
+ ],
+ [
+ 1,
+ 28
+ ],
+ [
+ -4,
+ 29
+ ],
+ [
+ -10,
+ 21
+ ],
+ [
+ -17,
+ 14
+ ],
+ [
+ -10,
+ 40
+ ],
+ [
+ -2,
+ 65
+ ],
+ [
+ 3,
+ 35
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 9,
+ 16
+ ],
+ [
+ 8,
+ 26
+ ],
+ [
+ 6,
+ 29
+ ],
+ [
+ 4,
+ 31
+ ],
+ [
+ 0,
+ 40
+ ],
+ [
+ -2,
+ 48
+ ],
+ [
+ 16,
+ 60
+ ],
+ [
+ 15,
+ 36
+ ],
+ [
+ 29,
+ 45
+ ],
+ [
+ 6,
+ 13
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -6,
+ 15
+ ],
+ [
+ -26,
+ 31
+ ],
+ [
+ -11,
+ 23
+ ],
+ [
+ -1,
+ 20
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 19
+ ],
+ [
+ -27,
+ 83
+ ],
+ [
+ -10,
+ 45
+ ],
+ [
+ 0,
+ 34
+ ]
+ ],
+ [
+ [
+ 1749,
+ 4208
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 4,
+ 143
+ ],
+ [
+ -10,
+ 49
+ ],
+ [
+ -2,
+ 28
+ ],
+ [
+ 2,
+ 35
+ ],
+ [
+ 0,
+ 21
+ ],
+ [
+ -5,
+ 19
+ ],
+ [
+ -1,
+ 33
+ ],
+ [
+ -1,
+ 42
+ ],
+ [
+ -8,
+ 27
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ 4,
+ 29
+ ],
+ [
+ 8,
+ 15
+ ],
+ [
+ 14,
+ 10
+ ],
+ [
+ 15,
+ 3
+ ],
+ [
+ 17,
+ -3
+ ],
+ [
+ 13,
+ -13
+ ],
+ [
+ 8,
+ -22
+ ],
+ [
+ 9,
+ -12
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 12,
+ 18
+ ],
+ [
+ 10,
+ 40
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 0,
+ 173
+ ],
+ [
+ 0,
+ 158
+ ]
+ ],
+ [
+ [
+ 1848,
+ 5019
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 55,
+ 0
+ ],
+ [
+ 54,
+ -1
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ]
+ ],
+ [
+ [
+ 1102,
+ 3337
+ ],
+ [
+ -10,
+ -4
+ ],
+ [
+ -12,
+ 8
+ ],
+ [
+ -9,
+ 39
+ ],
+ [
+ -11,
+ 31
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 8,
+ -29
+ ],
+ [
+ 22,
+ -44
+ ],
+ [
+ 6,
+ -9
+ ]
+ ],
+ [
+ [
+ 913,
+ 3494
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -11,
+ 4
+ ],
+ [
+ -6,
+ 21
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 7,
+ -17
+ ],
+ [
+ 0,
+ -6
+ ]
+ ],
+ [
+ [
+ 1102,
+ 3562
+ ],
+ [
+ 9,
+ -30
+ ],
+ [
+ -13,
+ 4
+ ],
+ [
+ -13,
+ -2
+ ],
+ [
+ -4,
+ 16
+ ],
+ [
+ -4,
+ 23
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 28,
+ -25
+ ],
+ [
+ 8,
+ -11
+ ]
+ ],
+ [
+ [
+ 808,
+ 3776
+ ],
+ [
+ -12,
+ -5
+ ],
+ [
+ -9,
+ 5
+ ],
+ [
+ -15,
+ 39
+ ],
+ [
+ 31,
+ 5
+ ],
+ [
+ 14,
+ -17
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -11,
+ -22
+ ]
+ ],
+ [
+ [
+ 763,
+ 3819
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -15,
+ 4
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 8,
+ -14
+ ]
+ ],
+ [
+ [
+ 836,
+ 3841
+ ],
+ [
+ 36,
+ -21
+ ],
+ [
+ 19,
+ 10
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -43,
+ -16
+ ],
+ [
+ -13,
+ 11
+ ],
+ [
+ -1,
+ 15
+ ],
+ [
+ -5,
+ 14
+ ],
+ [
+ 6,
+ 5
+ ]
+ ],
+ [
+ [
+ 83,
+ 7031
+ ],
+ [
+ 48,
+ 0
+ ],
+ [
+ 45,
+ 0
+ ],
+ [
+ 46,
+ 0
+ ],
+ [
+ 46,
+ 0
+ ],
+ [
+ 45,
+ 0
+ ],
+ [
+ 46,
+ 0
+ ],
+ [
+ 46,
+ 0
+ ],
+ [
+ 45,
+ 0
+ ],
+ [
+ 46,
+ 0
+ ],
+ [
+ 46,
+ 0
+ ],
+ [
+ 45,
+ 0
+ ],
+ [
+ 46,
+ 0
+ ],
+ [
+ 46,
+ 0
+ ],
+ [
+ 45,
+ 0
+ ],
+ [
+ 46,
+ 0
+ ],
+ [
+ 46,
+ 0
+ ]
+ ],
+ [
+ [
+ 816,
+ 7031
+ ],
+ [
+ 0,
+ -75
+ ],
+ [
+ 0,
+ -76
+ ],
+ [
+ 0,
+ -75
+ ],
+ [
+ 0,
+ -76
+ ],
+ [
+ 0,
+ -75
+ ],
+ [
+ 0,
+ -76
+ ],
+ [
+ 0,
+ -75
+ ],
+ [
+ 0,
+ -76
+ ],
+ [
+ 0,
+ -76
+ ],
+ [
+ 0,
+ -75
+ ],
+ [
+ 0,
+ -76
+ ],
+ [
+ 0,
+ -75
+ ],
+ [
+ 0,
+ -76
+ ],
+ [
+ 0,
+ -75
+ ],
+ [
+ 0,
+ -76
+ ],
+ [
+ 0,
+ -75
+ ],
+ [
+ 40,
+ -66
+ ],
+ [
+ 41,
+ -66
+ ],
+ [
+ 41,
+ -66
+ ],
+ [
+ 40,
+ -66
+ ],
+ [
+ 41,
+ -65
+ ],
+ [
+ 40,
+ -66
+ ],
+ [
+ 41,
+ -66
+ ],
+ [
+ 40,
+ -66
+ ],
+ [
+ 32,
+ -55
+ ],
+ [
+ 32,
+ -56
+ ],
+ [
+ 32,
+ -55
+ ],
+ [
+ 31,
+ -56
+ ],
+ [
+ 32,
+ -55
+ ],
+ [
+ 32,
+ -56
+ ],
+ [
+ 32,
+ -55
+ ],
+ [
+ 32,
+ -56
+ ],
+ [
+ 44,
+ -80
+ ],
+ [
+ 43,
+ -80
+ ],
+ [
+ 44,
+ -79
+ ],
+ [
+ 44,
+ -80
+ ],
+ [
+ 44,
+ -80
+ ],
+ [
+ 44,
+ -80
+ ],
+ [
+ 44,
+ -80
+ ],
+ [
+ 47,
+ -85
+ ]
+ ],
+ [
+ [
+ 1730,
+ 3292
+ ],
+ [
+ -20,
+ -5
+ ],
+ [
+ -50,
+ -8
+ ],
+ [
+ -49,
+ -9
+ ],
+ [
+ -50,
+ -9
+ ],
+ [
+ -49,
+ -8
+ ],
+ [
+ -50,
+ -9
+ ],
+ [
+ -50,
+ -8
+ ],
+ [
+ -49,
+ -9
+ ],
+ [
+ -50,
+ -9
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 44
+ ],
+ [
+ -8,
+ 16
+ ],
+ [
+ -11,
+ -10
+ ],
+ [
+ -4,
+ 57
+ ],
+ [
+ 2,
+ 27
+ ],
+ [
+ -1,
+ 27
+ ],
+ [
+ -10,
+ 65
+ ],
+ [
+ -25,
+ 78
+ ],
+ [
+ -56,
+ 98
+ ],
+ [
+ -28,
+ 33
+ ],
+ [
+ -23,
+ 41
+ ],
+ [
+ -14,
+ 12
+ ],
+ [
+ -17,
+ 3
+ ],
+ [
+ -6,
+ -19
+ ],
+ [
+ -20,
+ 13
+ ],
+ [
+ 3,
+ 46
+ ],
+ [
+ -19,
+ 64
+ ],
+ [
+ -16,
+ 7
+ ],
+ [
+ -41,
+ -4
+ ],
+ [
+ -54,
+ 35
+ ],
+ [
+ -16,
+ 21
+ ],
+ [
+ -5,
+ 38
+ ],
+ [
+ -26,
+ 32
+ ],
+ [
+ -33,
+ 32
+ ],
+ [
+ -18,
+ -7
+ ],
+ [
+ -25,
+ 5
+ ],
+ [
+ -34,
+ 23
+ ],
+ [
+ -20,
+ 3
+ ],
+ [
+ -40,
+ -7
+ ],
+ [
+ -14,
+ 5
+ ],
+ [
+ -14,
+ 29
+ ],
+ [
+ -15,
+ 15
+ ],
+ [
+ 3,
+ 35
+ ],
+ [
+ -2,
+ 33
+ ],
+ [
+ 3,
+ 25
+ ],
+ [
+ -7,
+ 55
+ ],
+ [
+ 5,
+ 52
+ ],
+ [
+ -4,
+ 18
+ ],
+ [
+ -9,
+ 14
+ ],
+ [
+ -26,
+ 21
+ ],
+ [
+ -4,
+ 26
+ ],
+ [
+ 4,
+ 37
+ ],
+ [
+ -7,
+ 24
+ ],
+ [
+ -21,
+ 22
+ ],
+ [
+ -20,
+ 51
+ ],
+ [
+ -26,
+ 28
+ ],
+ [
+ -10,
+ 47
+ ],
+ [
+ -15,
+ 29
+ ],
+ [
+ -6,
+ 25
+ ],
+ [
+ -34,
+ 92
+ ],
+ [
+ -37,
+ 71
+ ],
+ [
+ -6,
+ 41
+ ],
+ [
+ -1,
+ 56
+ ],
+ [
+ 14,
+ 34
+ ],
+ [
+ 8,
+ 30
+ ],
+ [
+ -1,
+ 28
+ ],
+ [
+ -2,
+ 20
+ ],
+ [
+ -13,
+ 36
+ ],
+ [
+ -49,
+ 21
+ ],
+ [
+ -40,
+ 87
+ ],
+ [
+ -2,
+ 67
+ ],
+ [
+ -16,
+ 68
+ ],
+ [
+ 0,
+ 44
+ ],
+ [
+ -3,
+ 48
+ ],
+ [
+ 12,
+ 11
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ -1,
+ -19
+ ],
+ [
+ 3,
+ -35
+ ],
+ [
+ 13,
+ -25
+ ],
+ [
+ 12,
+ -12
+ ],
+ [
+ 11,
+ -25
+ ],
+ [
+ 8,
+ -7
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ -4,
+ 16
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ -6,
+ 34
+ ],
+ [
+ -11,
+ 42
+ ],
+ [
+ -13,
+ 24
+ ],
+ [
+ -6,
+ 42
+ ],
+ [
+ -6,
+ 10
+ ],
+ [
+ -3,
+ 16
+ ],
+ [
+ 12,
+ 19
+ ],
+ [
+ 17,
+ 13
+ ],
+ [
+ 22,
+ 4
+ ],
+ [
+ 64,
+ -6
+ ],
+ [
+ 14,
+ 11
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ -18,
+ 12
+ ],
+ [
+ -10,
+ -4
+ ],
+ [
+ -11,
+ 2
+ ],
+ [
+ -23,
+ -2
+ ],
+ [
+ -9,
+ 5
+ ],
+ [
+ -10,
+ 13
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -21,
+ -24
+ ],
+ [
+ -10,
+ 3
+ ],
+ [
+ -22,
+ 26
+ ],
+ [
+ -10,
+ 3
+ ],
+ [
+ -15,
+ -14
+ ],
+ [
+ -2,
+ -63
+ ],
+ [
+ 5,
+ -46
+ ],
+ [
+ -10,
+ -5
+ ],
+ [
+ -11,
+ 19
+ ],
+ [
+ -16,
+ 12
+ ],
+ [
+ -14,
+ 17
+ ],
+ [
+ -20,
+ 32
+ ],
+ [
+ -10,
+ 12
+ ],
+ [
+ -12,
+ -27
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 6,
+ 31
+ ],
+ [
+ -2,
+ 53
+ ],
+ [
+ 18,
+ -42
+ ],
+ [
+ -6,
+ 29
+ ],
+ [
+ -13,
+ 33
+ ],
+ [
+ -11,
+ 11
+ ],
+ [
+ -13,
+ 58
+ ],
+ [
+ -29,
+ 35
+ ],
+ [
+ -23,
+ 56
+ ],
+ [
+ -48,
+ 93
+ ],
+ [
+ -3,
+ 82
+ ],
+ [
+ -18,
+ 104
+ ],
+ [
+ 7,
+ 59
+ ],
+ [
+ -1,
+ 42
+ ],
+ [
+ -8,
+ 63
+ ],
+ [
+ -9,
+ 34
+ ],
+ [
+ -39,
+ 95
+ ],
+ [
+ -37,
+ 63
+ ],
+ [
+ -6,
+ 48
+ ],
+ [
+ -2,
+ 48
+ ],
+ [
+ 8,
+ 43
+ ],
+ [
+ 7,
+ 46
+ ],
+ [
+ 5,
+ 12
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ 20
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 3,
+ 13
+ ],
+ [
+ 12,
+ 59
+ ],
+ [
+ -1,
+ 75
+ ],
+ [
+ 12,
+ 92
+ ],
+ [
+ 0,
+ 30
+ ],
+ [
+ -8,
+ 66
+ ],
+ [
+ -8,
+ 39
+ ],
+ [
+ -14,
+ 28
+ ],
+ [
+ 6,
+ 40
+ ],
+ [
+ -1,
+ 39
+ ],
+ [
+ -3,
+ 6
+ ]
+ ],
+ [
+ [
+ 3930,
+ 6226
+ ],
+ [
+ 0,
+ -76
+ ],
+ [
+ 0,
+ -75
+ ],
+ [
+ 0,
+ -76
+ ],
+ [
+ 0,
+ -75
+ ],
+ [
+ 0,
+ -76
+ ],
+ [
+ 0,
+ -75
+ ],
+ [
+ 1,
+ -76
+ ],
+ [
+ 0,
+ -75
+ ],
+ [
+ 0,
+ -76
+ ],
+ [
+ 0,
+ -75
+ ],
+ [
+ 0,
+ -76
+ ],
+ [
+ 0,
+ -75
+ ],
+ [
+ 0,
+ -76
+ ],
+ [
+ 0,
+ -75
+ ],
+ [
+ 1,
+ -76
+ ],
+ [
+ 0,
+ -75
+ ]
+ ],
+ [
+ [
+ 3932,
+ 5018
+ ],
+ [
+ -43,
+ 0
+ ],
+ [
+ -43,
+ 0
+ ],
+ [
+ -43,
+ 0
+ ],
+ [
+ -42,
+ 0
+ ]
+ ],
+ [
+ [
+ 3761,
+ 5018
+ ],
+ [
+ -66,
+ 0
+ ],
+ [
+ -65,
+ 0
+ ],
+ [
+ -66,
+ 0
+ ],
+ [
+ -65,
+ 0
+ ],
+ [
+ -66,
+ 0
+ ],
+ [
+ -65,
+ 0
+ ],
+ [
+ -66,
+ 0
+ ],
+ [
+ -65,
+ 0
+ ],
+ [
+ -66,
+ 0
+ ],
+ [
+ -65,
+ 0
+ ],
+ [
+ -65,
+ 0
+ ],
+ [
+ -66,
+ 0
+ ],
+ [
+ -65,
+ 0
+ ],
+ [
+ -66,
+ 0
+ ],
+ [
+ -65,
+ 0
+ ],
+ [
+ -66,
+ 0
+ ]
+ ],
+ [
+ [
+ 2713,
+ 5018
+ ],
+ [
+ 0,
+ 100
+ ],
+ [
+ 0,
+ 101
+ ],
+ [
+ 0,
+ 101
+ ],
+ [
+ 0,
+ 100
+ ],
+ [
+ 0,
+ 101
+ ],
+ [
+ 0,
+ 101
+ ],
+ [
+ 0,
+ 100
+ ],
+ [
+ 0,
+ 101
+ ],
+ [
+ 0,
+ 101
+ ],
+ [
+ 0,
+ 100
+ ],
+ [
+ 0,
+ 101
+ ],
+ [
+ 0,
+ 101
+ ],
+ [
+ 0,
+ 100
+ ],
+ [
+ 0,
+ 101
+ ],
+ [
+ 0,
+ 101
+ ],
+ [
+ 0,
+ 101
+ ]
+ ],
+ [
+ [
+ 2713,
+ 6629
+ ],
+ [
+ 55,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 55,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 55,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 55,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 55,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 55,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 54,
+ 0
+ ],
+ [
+ 55,
+ 0
+ ]
+ ],
+ [
+ [
+ 3584,
+ 6629
+ ],
+ [
+ 43,
+ 0
+ ],
+ [
+ 43,
+ 0
+ ],
+ [
+ 43,
+ 0
+ ],
+ [
+ 44,
+ -1
+ ],
+ [
+ 43,
+ 0
+ ],
+ [
+ 43,
+ 0
+ ],
+ [
+ 43,
+ 0
+ ],
+ [
+ 44,
+ 0
+ ],
+ [
+ 0,
+ -50
+ ],
+ [
+ 0,
+ -50
+ ],
+ [
+ 0,
+ -51
+ ],
+ [
+ 0,
+ -50
+ ],
+ [
+ 0,
+ -50
+ ],
+ [
+ 0,
+ -50
+ ],
+ [
+ 0,
+ -51
+ ],
+ [
+ 0,
+ -50
+ ]
+ ],
+ [
+ [
+ 9165,
+ 7036
+ ],
+ [
+ 0,
+ -22
+ ],
+ [
+ 0,
+ -30
+ ],
+ [
+ 0,
+ -22
+ ],
+ [
+ 1,
+ -31
+ ],
+ [
+ 0,
+ -34
+ ],
+ [
+ 0,
+ -32
+ ],
+ [
+ 0,
+ -27
+ ],
+ [
+ -1,
+ -17
+ ],
+ [
+ -1,
+ -25
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -2,
+ -23
+ ]
+ ],
+ [
+ [
+ 9158,
+ 6763
+ ],
+ [
+ -15,
+ 3
+ ],
+ [
+ -25,
+ -6
+ ],
+ [
+ -33,
+ -14
+ ],
+ [
+ -19,
+ 8
+ ],
+ [
+ -18,
+ -15
+ ],
+ [
+ -64,
+ -4
+ ],
+ [
+ -14,
+ 8
+ ],
+ [
+ -17,
+ -28
+ ],
+ [
+ -27,
+ -16
+ ],
+ [
+ -70,
+ -62
+ ],
+ [
+ -8,
+ -12
+ ]
+ ],
+ [
+ [
+ 8848,
+ 6625
+ ],
+ [
+ -9,
+ 25
+ ],
+ [
+ -7,
+ 20
+ ],
+ [
+ 14,
+ 16
+ ],
+ [
+ 11,
+ 12
+ ],
+ [
+ 10,
+ 11
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ -6,
+ 16
+ ],
+ [
+ -5,
+ 15
+ ],
+ [
+ 1,
+ 39
+ ],
+ [
+ 2,
+ 38
+ ],
+ [
+ 1,
+ 38
+ ],
+ [
+ 2,
+ 38
+ ],
+ [
+ 1,
+ 39
+ ],
+ [
+ 1,
+ 38
+ ],
+ [
+ 2,
+ 38
+ ],
+ [
+ 1,
+ 38
+ ]
+ ],
+ [
+ [
+ 8874,
+ 7053
+ ],
+ [
+ 15,
+ -1
+ ],
+ [
+ 14,
+ -1
+ ],
+ [
+ 15,
+ -1
+ ],
+ [
+ 14,
+ -1
+ ],
+ [
+ 15,
+ -1
+ ],
+ [
+ 15,
+ -1
+ ],
+ [
+ 14,
+ -1
+ ],
+ [
+ 15,
+ -1
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 21,
+ -1
+ ],
+ [
+ 21,
+ 0
+ ],
+ [
+ 20,
+ -1
+ ],
+ [
+ 21,
+ -1
+ ],
+ [
+ 21,
+ 0
+ ],
+ [
+ 21,
+ -1
+ ],
+ [
+ 20,
+ 0
+ ],
+ [
+ 21,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 8259,
+ 5778
+ ],
+ [
+ -4,
+ 11
+ ],
+ [
+ -8,
+ 8
+ ],
+ [
+ -4,
+ 3
+ ]
+ ],
+ [
+ [
+ 8243,
+ 5800
+ ],
+ [
+ 14,
+ 27
+ ],
+ [
+ 9,
+ -23
+ ],
+ [
+ 10,
+ -26
+ ],
+ [
+ -15,
+ -33
+ ],
+ [
+ -2,
+ 33
+ ]
+ ],
+ [
+ [
+ 8538,
+ 6151
+ ],
+ [
+ -7,
+ -14
+ ],
+ [
+ -7,
+ -25
+ ],
+ [
+ -15,
+ -31
+ ],
+ [
+ 1,
+ -21
+ ],
+ [
+ 3,
+ -15
+ ],
+ [
+ -1,
+ -30
+ ],
+ [
+ 9,
+ -30
+ ],
+ [
+ 18,
+ -49
+ ],
+ [
+ 4,
+ -76
+ ],
+ [
+ 14,
+ -51
+ ],
+ [
+ 22,
+ -59
+ ],
+ [
+ 17,
+ -17
+ ],
+ [
+ 0,
+ -22
+ ],
+ [
+ -7,
+ -36
+ ],
+ [
+ -10,
+ -17
+ ],
+ [
+ 13,
+ 3
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 7,
+ -30
+ ],
+ [
+ -1,
+ -20
+ ]
+ ],
+ [
+ [
+ 8604,
+ 5603
+ ],
+ [
+ -18,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -39,
+ 0
+ ],
+ [
+ -17,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 64
+ ],
+ [
+ -2,
+ 64
+ ],
+ [
+ -2,
+ 64
+ ],
+ [
+ -1,
+ 63
+ ],
+ [
+ -2,
+ 64
+ ],
+ [
+ -2,
+ 64
+ ],
+ [
+ -1,
+ 64
+ ],
+ [
+ -2,
+ 64
+ ]
+ ],
+ [
+ [
+ 8475,
+ 6114
+ ],
+ [
+ 13,
+ 32
+ ],
+ [
+ 6,
+ 10
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 22,
+ 1
+ ],
+ [
+ 15,
+ -11
+ ]
+ ],
+ [
+ [
+ 7436,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -7,
+ -4
+ ]
+ ],
+ [
+ [
+ 7473,
+ 23
+ ],
+ [
+ -11,
+ -4
+ ],
+ [
+ 9,
+ 16
+ ],
+ [
+ 3,
+ 24
+ ],
+ [
+ 6,
+ -19
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ -6,
+ -6
+ ]
+ ],
+ [
+ [
+ 7514,
+ 44
+ ],
+ [
+ -6,
+ -9
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ -7,
+ 27
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 17,
+ -27
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -2,
+ -6
+ ]
+ ],
+ [
+ [
+ 7564,
+ 70
+ ],
+ [
+ -8,
+ -9
+ ],
+ [
+ -8,
+ 7
+ ],
+ [
+ 9,
+ 9
+ ],
+ [
+ 27,
+ 10
+ ],
+ [
+ -10,
+ -12
+ ],
+ [
+ -10,
+ -5
+ ]
+ ],
+ [
+ [
+ 7601,
+ 105
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -8,
+ -7
+ ]
+ ],
+ [
+ [
+ 7634,
+ 145
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ 6,
+ 18
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -4,
+ -14
+ ]
+ ],
+ [
+ [
+ 7679,
+ 242
+ ],
+ [
+ -35,
+ -76
+ ],
+ [
+ 4,
+ 19
+ ],
+ [
+ 14,
+ 40
+ ],
+ [
+ 4,
+ 19
+ ],
+ [
+ 9,
+ 13
+ ],
+ [
+ 8,
+ 21
+ ],
+ [
+ 1,
+ 26
+ ],
+ [
+ 12,
+ 18
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ -21,
+ -82
+ ]
+ ],
+ [
+ [
+ 7392,
+ 770
+ ],
+ [
+ -6,
+ -11
+ ],
+ [
+ -13,
+ 8
+ ],
+ [
+ -7,
+ 14
+ ],
+ [
+ -2,
+ 27
+ ],
+ [
+ 10,
+ -29
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 14,
+ -3
+ ]
+ ],
+ [
+ [
+ 7384,
+ 810
+ ],
+ [
+ 0,
+ -24
+ ],
+ [
+ -9,
+ 39
+ ],
+ [
+ -6,
+ 44
+ ],
+ [
+ 8,
+ -14
+ ],
+ [
+ 7,
+ -45
+ ]
+ ],
+ [
+ [
+ 7712,
+ 1102
+ ],
+ [
+ 3,
+ -30
+ ],
+ [
+ -16,
+ 69
+ ],
+ [
+ -19,
+ 108
+ ],
+ [
+ -11,
+ 83
+ ],
+ [
+ 7,
+ -22
+ ],
+ [
+ 7,
+ -47
+ ],
+ [
+ 29,
+ -161
+ ]
+ ],
+ [
+ [
+ 6895,
+ 2054
+ ],
+ [
+ -18,
+ -14
+ ],
+ [
+ -18,
+ 10
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 9,
+ -4
+ ],
+ [
+ 21,
+ 21
+ ],
+ [
+ 11,
+ 15
+ ],
+ [
+ 13,
+ 6
+ ],
+ [
+ -29,
+ -36
+ ]
+ ],
+ [
+ [
+ 7484,
+ 2493
+ ],
+ [
+ 8,
+ -37
+ ],
+ [
+ 13,
+ -149
+ ],
+ [
+ 8,
+ -52
+ ],
+ [
+ 15,
+ -140
+ ],
+ [
+ 26,
+ -136
+ ],
+ [
+ 35,
+ -164
+ ],
+ [
+ 58,
+ -198
+ ],
+ [
+ 7,
+ -29
+ ],
+ [
+ -8,
+ -24
+ ],
+ [
+ -2,
+ -25
+ ],
+ [
+ 0,
+ -37
+ ],
+ [
+ 2,
+ -37
+ ],
+ [
+ 6,
+ -44
+ ],
+ [
+ 14,
+ -68
+ ],
+ [
+ -8,
+ 13
+ ],
+ [
+ -19,
+ 98
+ ],
+ [
+ -2,
+ 58
+ ],
+ [
+ 3,
+ 81
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ -26
+ ],
+ [
+ -2,
+ -31
+ ],
+ [
+ -5,
+ -13
+ ],
+ [
+ -7,
+ 48
+ ],
+ [
+ 1,
+ 21
+ ],
+ [
+ 7,
+ 26
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -12,
+ 12
+ ],
+ [
+ -2,
+ 21
+ ],
+ [
+ 1,
+ 20
+ ],
+ [
+ -6,
+ 10
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ 3,
+ -49
+ ],
+ [
+ 5,
+ -31
+ ],
+ [
+ 7,
+ -72
+ ],
+ [
+ 11,
+ -44
+ ],
+ [
+ 6,
+ -37
+ ],
+ [
+ 74,
+ -392
+ ],
+ [
+ 17,
+ -50
+ ],
+ [
+ 6,
+ -36
+ ],
+ [
+ 7,
+ -75
+ ],
+ [
+ 2,
+ -96
+ ],
+ [
+ -12,
+ -176
+ ],
+ [
+ -3,
+ -120
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -10,
+ -55
+ ],
+ [
+ -14,
+ -50
+ ],
+ [
+ -5,
+ -77
+ ],
+ [
+ -7,
+ -38
+ ],
+ [
+ -20,
+ -41
+ ],
+ [
+ -13,
+ 1
+ ],
+ [
+ -31,
+ -31
+ ],
+ [
+ -22,
+ 8
+ ],
+ [
+ -25,
+ -17
+ ],
+ [
+ -18,
+ 2
+ ],
+ [
+ -9,
+ 36
+ ],
+ [
+ 1,
+ 17
+ ],
+ [
+ 4,
+ 16
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 23,
+ -38
+ ],
+ [
+ 4,
+ 16
+ ],
+ [
+ -7,
+ 19
+ ],
+ [
+ -13,
+ 11
+ ],
+ [
+ -10,
+ 11
+ ],
+ [
+ -20,
+ 87
+ ],
+ [
+ -20,
+ 60
+ ],
+ [
+ -4,
+ 40
+ ],
+ [
+ -35,
+ 24
+ ],
+ [
+ -25,
+ 37
+ ],
+ [
+ -17,
+ 66
+ ],
+ [
+ -9,
+ 116
+ ],
+ [
+ -12,
+ 13
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ 10,
+ 44
+ ],
+ [
+ 12,
+ 36
+ ],
+ [
+ -9,
+ -9
+ ],
+ [
+ -7,
+ -14
+ ],
+ [
+ -8,
+ -32
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -7,
+ 62
+ ],
+ [
+ 2,
+ 75
+ ],
+ [
+ 9,
+ 28
+ ],
+ [
+ -14,
+ 1
+ ],
+ [
+ -15,
+ -11
+ ],
+ [
+ 2,
+ -25
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -11,
+ 4
+ ],
+ [
+ -8,
+ 9
+ ],
+ [
+ -11,
+ 26
+ ],
+ [
+ -15,
+ 50
+ ],
+ [
+ -31,
+ 137
+ ],
+ [
+ -6,
+ 20
+ ],
+ [
+ -10,
+ 20
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 20,
+ 62
+ ],
+ [
+ 16,
+ 37
+ ],
+ [
+ 5,
+ 26
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -7,
+ 16
+ ],
+ [
+ -9,
+ -14
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -10,
+ 33
+ ],
+ [
+ -10,
+ 9
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ 8,
+ -27
+ ],
+ [
+ 6,
+ -10
+ ],
+ [
+ -2,
+ -38
+ ],
+ [
+ -3,
+ -13
+ ],
+ [
+ -6,
+ -11
+ ],
+ [
+ -10,
+ 6
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -6,
+ 11
+ ],
+ [
+ -5,
+ 17
+ ],
+ [
+ -7,
+ 28
+ ],
+ [
+ 17,
+ 157
+ ],
+ [
+ 15,
+ 100
+ ],
+ [
+ 2,
+ 115
+ ],
+ [
+ 1,
+ 17
+ ],
+ [
+ -1,
+ 30
+ ],
+ [
+ -21,
+ 66
+ ],
+ [
+ -90,
+ 161
+ ],
+ [
+ -70,
+ 191
+ ],
+ [
+ -61,
+ 72
+ ],
+ [
+ -46,
+ -16
+ ],
+ [
+ -8,
+ -14
+ ],
+ [
+ -3,
+ -19
+ ],
+ [
+ 3,
+ -21
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -13,
+ 1
+ ],
+ [
+ -16,
+ -5
+ ],
+ [
+ -44,
+ -50
+ ],
+ [
+ -15,
+ 1
+ ],
+ [
+ -14,
+ -13
+ ],
+ [
+ -10,
+ -9
+ ],
+ [
+ -28,
+ -6
+ ],
+ [
+ -23,
+ -11
+ ],
+ [
+ -9,
+ 6
+ ],
+ [
+ -7,
+ 29
+ ],
+ [
+ 0,
+ 31
+ ],
+ [
+ 5,
+ -24
+ ],
+ [
+ 8,
+ -18
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 2,
+ 16
+ ],
+ [
+ -9,
+ 31
+ ],
+ [
+ -26,
+ 40
+ ],
+ [
+ -29,
+ 59
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ -9,
+ 16
+ ],
+ [
+ 4,
+ 19
+ ],
+ [
+ 6,
+ 21
+ ],
+ [
+ -12,
+ -3
+ ],
+ [
+ -12,
+ -15
+ ],
+ [
+ 0,
+ -17
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -11,
+ 17
+ ],
+ [
+ -56,
+ 48
+ ],
+ [
+ -48,
+ 27
+ ],
+ [
+ 37,
+ 12
+ ],
+ [
+ 20,
+ -10
+ ],
+ [
+ -2,
+ 15
+ ],
+ [
+ -5,
+ 9
+ ],
+ [
+ -16,
+ 12
+ ],
+ [
+ -20,
+ -5
+ ],
+ [
+ -13,
+ 6
+ ],
+ [
+ -13,
+ -12
+ ],
+ [
+ -14,
+ -17
+ ],
+ [
+ -13,
+ -9
+ ],
+ [
+ -50,
+ -12
+ ],
+ [
+ -41,
+ -13
+ ],
+ [
+ 7,
+ 14
+ ],
+ [
+ 7,
+ 9
+ ],
+ [
+ 24,
+ 14
+ ],
+ [
+ 3,
+ 28
+ ],
+ [
+ -5,
+ 28
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ -6,
+ -21
+ ],
+ [
+ -8,
+ 15
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -3,
+ -34
+ ],
+ [
+ -11,
+ -23
+ ],
+ [
+ -5,
+ -23
+ ],
+ [
+ -34,
+ -18
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ 9,
+ 22
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ -8,
+ -7
+ ]
+ ],
+ [
+ [
+ 6877,
+ 2601
+ ],
+ [
+ 8,
+ -31
+ ],
+ [
+ 13,
+ -66
+ ],
+ [
+ 1,
+ -16
+ ],
+ [
+ 16,
+ -2
+ ],
+ [
+ 28,
+ -4
+ ],
+ [
+ 27,
+ -3
+ ],
+ [
+ 28,
+ -4
+ ],
+ [
+ 27,
+ -4
+ ],
+ [
+ 28,
+ -4
+ ],
+ [
+ 28,
+ -4
+ ],
+ [
+ 27,
+ -3
+ ],
+ [
+ 28,
+ -4
+ ],
+ [
+ 28,
+ -4
+ ],
+ [
+ 27,
+ -4
+ ],
+ [
+ 28,
+ -3
+ ],
+ [
+ 27,
+ -4
+ ],
+ [
+ 28,
+ -4
+ ],
+ [
+ 28,
+ -4
+ ],
+ [
+ 27,
+ -3
+ ],
+ [
+ 28,
+ -4
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 5,
+ -21
+ ],
+ [
+ 1,
+ -24
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 9,
+ 13
+ ],
+ [
+ 5,
+ 29
+ ],
+ [
+ 2,
+ 34
+ ],
+ [
+ -4,
+ 37
+ ],
+ [
+ 1,
+ 32
+ ],
+ [
+ 4,
+ 18
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 9,
+ -5
+ ],
+ [
+ 36,
+ -27
+ ],
+ [
+ 29,
+ -3
+ ]
+ ],
+ [
+ [
+ 7499,
+ 2589
+ ],
+ [
+ -8,
+ -98
+ ],
+ [
+ -3,
+ 35
+ ],
+ [
+ 0,
+ 34
+ ],
+ [
+ 6,
+ 20
+ ],
+ [
+ 5,
+ 9
+ ]
+ ],
+ [
+ [
+ 7594,
+ 3015
+ ],
+ [
+ -9,
+ -34
+ ],
+ [
+ -21,
+ -21
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ 3,
+ -16
+ ],
+ [
+ 5,
+ -11
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -5,
+ -14
+ ],
+ [
+ -11,
+ -4
+ ],
+ [
+ -7,
+ -16
+ ],
+ [
+ 2,
+ -15
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ -1,
+ -14
+ ],
+ [
+ -12,
+ -15
+ ],
+ [
+ -3,
+ -14
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -7,
+ -24
+ ],
+ [
+ -7,
+ -15
+ ],
+ [
+ -6,
+ -26
+ ],
+ [
+ -15,
+ -7
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 9,
+ -8
+ ],
+ [
+ 7,
+ -20
+ ],
+ [
+ -14,
+ -37
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -3,
+ -29
+ ],
+ [
+ 1,
+ -16
+ ],
+ [
+ -3,
+ -32
+ ],
+ [
+ -5,
+ -38
+ ],
+ [
+ -4,
+ -16
+ ],
+ [
+ 1,
+ -29
+ ],
+ [
+ 2,
+ -28
+ ]
+ ],
+ [
+ [
+ 6771,
+ 4212
+ ],
+ [
+ 56,
+ -1
+ ],
+ [
+ 56,
+ -1
+ ],
+ [
+ 56,
+ -2
+ ],
+ [
+ 57,
+ -1
+ ]
+ ],
+ [
+ [
+ 6996,
+ 4207
+ ],
+ [
+ 52,
+ 1
+ ],
+ [
+ 52,
+ 2
+ ],
+ [
+ 53,
+ 1
+ ],
+ [
+ 52,
+ 1
+ ]
+ ],
+ [
+ [
+ 7205,
+ 4212
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -8,
+ -27
+ ],
+ [
+ -26,
+ -52
+ ],
+ [
+ -6,
+ -39
+ ],
+ [
+ 32,
+ -44
+ ],
+ [
+ 20,
+ -35
+ ],
+ [
+ 13,
+ -14
+ ],
+ [
+ 14,
+ -4
+ ],
+ [
+ 9,
+ -12
+ ],
+ [
+ 5,
+ -29
+ ],
+ [
+ 39,
+ -140
+ ],
+ [
+ 41,
+ -72
+ ],
+ [
+ 17,
+ -36
+ ],
+ [
+ 8,
+ -34
+ ],
+ [
+ 35,
+ -57
+ ],
+ [
+ 12,
+ -31
+ ],
+ [
+ 1,
+ -23
+ ],
+ [
+ 4,
+ -16
+ ],
+ [
+ 8,
+ -10
+ ],
+ [
+ 7,
+ -20
+ ],
+ [
+ 7,
+ -32
+ ],
+ [
+ 14,
+ -28
+ ],
+ [
+ 21,
+ -23
+ ],
+ [
+ 16,
+ -54
+ ],
+ [
+ 9,
+ -83
+ ],
+ [
+ 10,
+ -49
+ ],
+ [
+ 15,
+ -20
+ ],
+ [
+ 21,
+ -71
+ ],
+ [
+ 7,
+ -43
+ ],
+ [
+ -1,
+ -37
+ ],
+ [
+ 11,
+ -29
+ ],
+ [
+ 35,
+ -33
+ ]
+ ],
+ [
+ [
+ 5900,
+ 7238
+ ],
+ [
+ 10,
+ -28
+ ],
+ [
+ 19,
+ -25
+ ],
+ [
+ 10,
+ -23
+ ],
+ [
+ 2,
+ -21
+ ],
+ [
+ 12,
+ -24
+ ],
+ [
+ 19,
+ -24
+ ],
+ [
+ 12,
+ -22
+ ],
+ [
+ 3,
+ -18
+ ],
+ [
+ -1,
+ -30
+ ],
+ [
+ -4,
+ -39
+ ],
+ [
+ -7,
+ -28
+ ],
+ [
+ -10,
+ -18
+ ],
+ [
+ -8,
+ -24
+ ],
+ [
+ -5,
+ -31
+ ],
+ [
+ -15,
+ -29
+ ],
+ [
+ -26,
+ -27
+ ],
+ [
+ -29,
+ -18
+ ],
+ [
+ -32,
+ -9
+ ],
+ [
+ -19,
+ -23
+ ],
+ [
+ -6,
+ -36
+ ],
+ [
+ 3,
+ -30
+ ],
+ [
+ 11,
+ -24
+ ],
+ [
+ 7,
+ -26
+ ],
+ [
+ 1,
+ -27
+ ],
+ [
+ -8,
+ -44
+ ],
+ [
+ -17,
+ -63
+ ],
+ [
+ -20,
+ -40
+ ],
+ [
+ -21,
+ -18
+ ],
+ [
+ -10,
+ -27
+ ],
+ [
+ 2,
+ -36
+ ],
+ [
+ -1,
+ -21
+ ],
+ [
+ -9,
+ -7
+ ]
+ ],
+ [
+ [
+ 5763,
+ 6378
+ ],
+ [
+ -15,
+ 22
+ ],
+ [
+ -3,
+ 14
+ ],
+ [
+ -12,
+ 16
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -10,
+ 9
+ ],
+ [
+ -8,
+ 29
+ ],
+ [
+ -44,
+ -1
+ ],
+ [
+ -44,
+ 0
+ ],
+ [
+ -43,
+ -1
+ ],
+ [
+ -44,
+ 0
+ ],
+ [
+ -44,
+ -1
+ ],
+ [
+ -44,
+ 0
+ ],
+ [
+ -43,
+ -1
+ ],
+ [
+ -44,
+ -1
+ ],
+ [
+ -44,
+ 0
+ ],
+ [
+ -43,
+ -1
+ ],
+ [
+ -44,
+ 0
+ ],
+ [
+ -44,
+ -1
+ ],
+ [
+ -43,
+ -1
+ ],
+ [
+ -44,
+ 0
+ ],
+ [
+ -44,
+ -1
+ ],
+ [
+ -43,
+ 0
+ ]
+ ],
+ [
+ [
+ 5014,
+ 6468
+ ],
+ [
+ -11,
+ 30
+ ],
+ [
+ -5,
+ 28
+ ],
+ [
+ 3,
+ 13
+ ],
+ [
+ 1,
+ 45
+ ],
+ [
+ -2,
+ 77
+ ],
+ [
+ -4,
+ 43
+ ],
+ [
+ -7,
+ 10
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 4,
+ 17
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ -2,
+ 15
+ ],
+ [
+ 3,
+ 24
+ ],
+ [
+ -2,
+ 14
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -3,
+ 26
+ ],
+ [
+ 1,
+ 50
+ ],
+ [
+ -3,
+ 35
+ ],
+ [
+ -7,
+ 21
+ ],
+ [
+ -4,
+ 19
+ ],
+ [
+ 0,
+ 18
+ ],
+ [
+ -9,
+ 28
+ ],
+ [
+ -16,
+ 39
+ ],
+ [
+ -10,
+ 52
+ ],
+ [
+ -5,
+ 63
+ ],
+ [
+ -12,
+ 36
+ ],
+ [
+ -5,
+ 2
+ ]
+ ],
+ [
+ [
+ 4890,
+ 7237
+ ],
+ [
+ -4,
+ 33
+ ],
+ [
+ -5,
+ 15
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -14,
+ 29
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ 2,
+ 14
+ ],
+ [
+ 9,
+ 27
+ ],
+ [
+ 8,
+ 44
+ ],
+ [
+ 2,
+ 30
+ ],
+ [
+ 7,
+ 23
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ -1,
+ 16
+ ],
+ [
+ -4,
+ 14
+ ],
+ [
+ -11,
+ 11
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 17
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ -2,
+ 14
+ ],
+ [
+ -6,
+ 25
+ ],
+ [
+ -3,
+ 25
+ ],
+ [
+ 25,
+ 2
+ ]
+ ],
+ [
+ [
+ 4895,
+ 7636
+ ],
+ [
+ 56,
+ 0
+ ],
+ [
+ 56,
+ 0
+ ],
+ [
+ 57,
+ 0
+ ],
+ [
+ 56,
+ 0
+ ],
+ [
+ 56,
+ 0
+ ],
+ [
+ 57,
+ 0
+ ],
+ [
+ 56,
+ 0
+ ],
+ [
+ 56,
+ 0
+ ],
+ [
+ 57,
+ 0
+ ],
+ [
+ 56,
+ 0
+ ],
+ [
+ 56,
+ 0
+ ],
+ [
+ 57,
+ 0
+ ],
+ [
+ 56,
+ 0
+ ],
+ [
+ 56,
+ 0
+ ],
+ [
+ 57,
+ 0
+ ],
+ [
+ 57,
+ 0
+ ]
+ ],
+ [
+ [
+ 5797,
+ 7636
+ ],
+ [
+ 1,
+ -25
+ ],
+ [
+ 3,
+ -18
+ ],
+ [
+ 7,
+ -15
+ ],
+ [
+ 11,
+ -11
+ ],
+ [
+ 2,
+ -21
+ ],
+ [
+ -7,
+ -32
+ ],
+ [
+ -3,
+ -39
+ ],
+ [
+ 3,
+ -47
+ ],
+ [
+ 5,
+ -42
+ ],
+ [
+ 8,
+ -37
+ ],
+ [
+ 19,
+ -28
+ ],
+ [
+ 30,
+ -17
+ ],
+ [
+ 17,
+ -27
+ ],
+ [
+ 6,
+ -36
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 2366,
+ 8037
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -62
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -62
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ]
+ ],
+ [
+ [
+ 2366,
+ 7031
+ ],
+ [
+ -32,
+ 0
+ ],
+ [
+ -33,
+ 0
+ ],
+ [
+ -32,
+ 0
+ ],
+ [
+ -32,
+ 0
+ ],
+ [
+ -33,
+ 0
+ ],
+ [
+ -32,
+ 0
+ ],
+ [
+ -33,
+ 0
+ ],
+ [
+ -32,
+ 0
+ ],
+ [
+ -32,
+ 0
+ ],
+ [
+ -33,
+ 0
+ ],
+ [
+ -32,
+ 0
+ ],
+ [
+ -33,
+ 0
+ ],
+ [
+ -32,
+ 0
+ ],
+ [
+ -32,
+ 0
+ ],
+ [
+ -33,
+ 0
+ ],
+ [
+ -32,
+ 0
+ ]
+ ],
+ [
+ [
+ 1848,
+ 7031
+ ],
+ [
+ -65,
+ 0
+ ],
+ [
+ -64,
+ 0
+ ],
+ [
+ -64,
+ 0
+ ],
+ [
+ -65,
+ 0
+ ],
+ [
+ -64,
+ 0
+ ],
+ [
+ -65,
+ 0
+ ],
+ [
+ -64,
+ 0
+ ],
+ [
+ -64,
+ 0
+ ]
+ ],
+ [
+ [
+ 1333,
+ 7031
+ ],
+ [
+ 0,
+ 90
+ ],
+ [
+ 0,
+ 90
+ ],
+ [
+ -1,
+ 90
+ ],
+ [
+ 0,
+ 90
+ ],
+ [
+ 0,
+ 90
+ ],
+ [
+ 0,
+ 89
+ ],
+ [
+ 0,
+ 90
+ ],
+ [
+ 0,
+ 99
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 11,
+ 61
+ ],
+ [
+ 2,
+ 30
+ ],
+ [
+ -3,
+ 16
+ ],
+ [
+ 2,
+ 16
+ ],
+ [
+ 7,
+ 16
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ -7,
+ 18
+ ],
+ [
+ -13,
+ 12
+ ],
+ [
+ -20,
+ 6
+ ],
+ [
+ -10,
+ 22
+ ],
+ [
+ 0,
+ 37
+ ],
+ [
+ 14,
+ 57
+ ],
+ [
+ 29,
+ 78
+ ],
+ [
+ 17,
+ 54
+ ],
+ [
+ 2,
+ 32
+ ],
+ [
+ 18,
+ 74
+ ],
+ [
+ 33,
+ 116
+ ],
+ [
+ 12,
+ 74
+ ],
+ [
+ -7,
+ 33
+ ],
+ [
+ -17,
+ 31
+ ],
+ [
+ -26,
+ 30
+ ],
+ [
+ -18,
+ 34
+ ],
+ [
+ -5,
+ 18
+ ]
+ ],
+ [
+ [
+ 1353,
+ 8643
+ ],
+ [
+ -5,
+ 21
+ ],
+ [
+ -3,
+ 28
+ ],
+ [
+ 4,
+ 16
+ ],
+ [
+ -4,
+ 27
+ ],
+ [
+ -11,
+ 40
+ ],
+ [
+ -5,
+ 27
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 64
+ ],
+ [
+ 0,
+ 65
+ ],
+ [
+ 0,
+ 64
+ ],
+ [
+ 0,
+ 65
+ ],
+ [
+ 0,
+ 65
+ ],
+ [
+ -1,
+ 64
+ ],
+ [
+ 0,
+ 65
+ ],
+ [
+ 0,
+ 64
+ ],
+ [
+ 0,
+ 65
+ ],
+ [
+ 0,
+ 64
+ ],
+ [
+ 0,
+ 65
+ ],
+ [
+ 0,
+ 64
+ ],
+ [
+ -1,
+ 65
+ ],
+ [
+ 0,
+ 65
+ ],
+ [
+ 0,
+ 64
+ ],
+ [
+ 0,
+ 64
+ ]
+ ],
+ [
+ [
+ 1329,
+ 9847
+ ],
+ [
+ 56,
+ 0
+ ],
+ [
+ 73,
+ 0
+ ],
+ [
+ 42,
+ 0
+ ]
+ ],
+ [
+ [
+ 1500,
+ 9847
+ ],
+ [
+ 0,
+ -99
+ ],
+ [
+ 0,
+ -100
+ ],
+ [
+ 0,
+ -99
+ ],
+ [
+ 0,
+ -100
+ ],
+ [
+ 19,
+ -40
+ ],
+ [
+ 14,
+ -25
+ ],
+ [
+ 8,
+ -27
+ ],
+ [
+ 14,
+ -28
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 4,
+ -30
+ ],
+ [
+ -3,
+ -22
+ ],
+ [
+ 7,
+ -22
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 19,
+ -21
+ ],
+ [
+ 19,
+ -30
+ ],
+ [
+ 23,
+ -20
+ ],
+ [
+ 8,
+ -12
+ ],
+ [
+ 31,
+ -59
+ ],
+ [
+ 16,
+ -38
+ ],
+ [
+ 17,
+ -27
+ ],
+ [
+ 9,
+ -32
+ ],
+ [
+ 17,
+ -27
+ ],
+ [
+ 4,
+ -14
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 11,
+ 7
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -11
+ ],
+ [
+ 1,
+ -16
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 24,
+ 8
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -15
+ ],
+ [
+ -3,
+ -20
+ ],
+ [
+ -7,
+ -21
+ ],
+ [
+ 1,
+ -19
+ ],
+ [
+ -5,
+ -44
+ ],
+ [
+ -6,
+ -29
+ ],
+ [
+ 0,
+ -29
+ ],
+ [
+ -7,
+ -16
+ ],
+ [
+ 4,
+ -20
+ ],
+ [
+ -3,
+ -30
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 8,
+ -14
+ ],
+ [
+ 3,
+ -37
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -15,
+ -14
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -2,
+ -13
+ ],
+ [
+ 6,
+ -39
+ ],
+ [
+ -6,
+ -21
+ ],
+ [
+ -1,
+ -18
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 14,
+ -10
+ ],
+ [
+ 17,
+ -22
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ 8,
+ 15
+ ],
+ [
+ 16,
+ 14
+ ],
+ [
+ 19,
+ 32
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 12,
+ -20
+ ],
+ [
+ 11,
+ -10
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -19
+ ],
+ [
+ 6,
+ -15
+ ],
+ [
+ 1,
+ -25
+ ],
+ [
+ 6,
+ -25
+ ],
+ [
+ 5,
+ -30
+ ],
+ [
+ 15,
+ -39
+ ],
+ [
+ 9,
+ -27
+ ],
+ [
+ 9,
+ -13
+ ],
+ [
+ 6,
+ -15
+ ],
+ [
+ 4,
+ -17
+ ],
+ [
+ 2,
+ -14
+ ],
+ [
+ -6,
+ -26
+ ],
+ [
+ 2,
+ -11
+ ],
+ [
+ 5,
+ -12
+ ],
+ [
+ 16,
+ -26
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 15,
+ 3
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 8,
+ -13
+ ],
+ [
+ 8,
+ -20
+ ],
+ [
+ 6,
+ -21
+ ],
+ [
+ 1,
+ -24
+ ],
+ [
+ 8,
+ -26
+ ],
+ [
+ 2,
+ -24
+ ],
+ [
+ 5,
+ -11
+ ],
+ [
+ 10,
+ -14
+ ],
+ [
+ 10,
+ -8
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 13,
+ 14
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 45,
+ -12
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 7,
+ 21
+ ],
+ [
+ 6,
+ 9
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 27,
+ -5
+ ],
+ [
+ 31,
+ 3
+ ],
+ [
+ 17,
+ -6
+ ],
+ [
+ 24,
+ 8
+ ],
+ [
+ 27,
+ -6
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ 5,
+ 19
+ ],
+ [
+ 2,
+ 16
+ ],
+ [
+ 6,
+ 9
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 7,
+ -15
+ ],
+ [
+ 12,
+ -39
+ ],
+ [
+ 6,
+ -14
+ ],
+ [
+ 8,
+ -12
+ ],
+ [
+ 11,
+ -11
+ ]
+ ],
+ [
+ [
+ 6392,
+ 7231
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 2,
+ -52
+ ],
+ [
+ 5,
+ -23
+ ],
+ [
+ 6,
+ -17
+ ],
+ [
+ 7,
+ -11
+ ],
+ [
+ 7,
+ -34
+ ],
+ [
+ 9,
+ -57
+ ],
+ [
+ 8,
+ -37
+ ],
+ [
+ 6,
+ -16
+ ]
+ ],
+ [
+ [
+ 6442,
+ 6921
+ ],
+ [
+ 0,
+ -107
+ ],
+ [
+ 0,
+ -121
+ ],
+ [
+ -1,
+ -121
+ ],
+ [
+ 0,
+ -120
+ ],
+ [
+ 0,
+ -121
+ ],
+ [
+ -1,
+ -121
+ ],
+ [
+ 0,
+ -121
+ ],
+ [
+ 0,
+ -114
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -8,
+ -13
+ ],
+ [
+ -6,
+ -21
+ ],
+ [
+ 2,
+ -23
+ ],
+ [
+ -2,
+ -16
+ ],
+ [
+ -6,
+ -10
+ ],
+ [
+ 3,
+ -25
+ ],
+ [
+ 11,
+ -40
+ ],
+ [
+ 6,
+ -40
+ ],
+ [
+ 3,
+ -39
+ ],
+ [
+ -2,
+ -28
+ ],
+ [
+ -10,
+ -25
+ ],
+ [
+ -9,
+ -56
+ ],
+ [
+ -8,
+ -22
+ ],
+ [
+ -9,
+ -7
+ ],
+ [
+ -9,
+ -20
+ ],
+ [
+ -7,
+ -34
+ ],
+ [
+ -8,
+ -16
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -4,
+ -14
+ ],
+ [
+ 1,
+ -14
+ ],
+ [
+ 5,
+ -14
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -8,
+ -12
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -4,
+ -19
+ ],
+ [
+ 1,
+ -31
+ ],
+ [
+ -3,
+ -15
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 9,
+ -35
+ ]
+ ],
+ [
+ [
+ 6352,
+ 5335
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -9,
+ -29
+ ],
+ [
+ -2,
+ -32
+ ],
+ [
+ 5,
+ -35
+ ],
+ [
+ -14,
+ -28
+ ],
+ [
+ -34,
+ -21
+ ],
+ [
+ -19,
+ -19
+ ],
+ [
+ -2,
+ -16
+ ],
+ [
+ 3,
+ -25
+ ],
+ [
+ 7,
+ -34
+ ],
+ [
+ 1,
+ -23
+ ],
+ [
+ -5,
+ -13
+ ],
+ [
+ -24,
+ 9
+ ],
+ [
+ -45,
+ 30
+ ],
+ [
+ -30,
+ -1
+ ],
+ [
+ -15,
+ -33
+ ],
+ [
+ -6,
+ -24
+ ],
+ [
+ 2,
+ -20
+ ]
+ ],
+ [
+ [
+ 6159,
+ 5014
+ ],
+ [
+ -12,
+ 24
+ ],
+ [
+ -8,
+ 11
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -9,
+ 10
+ ],
+ [
+ -11,
+ 26
+ ],
+ [
+ -13,
+ 45
+ ],
+ [
+ -2,
+ 35
+ ],
+ [
+ 7,
+ 26
+ ],
+ [
+ 0,
+ 28
+ ],
+ [
+ -7,
+ 29
+ ],
+ [
+ -4,
+ 28
+ ],
+ [
+ 0,
+ 28
+ ],
+ [
+ -17,
+ 41
+ ],
+ [
+ -35,
+ 55
+ ],
+ [
+ -25,
+ 34
+ ],
+ [
+ -16,
+ 13
+ ],
+ [
+ -19,
+ 28
+ ],
+ [
+ -22,
+ 42
+ ],
+ [
+ -12,
+ 32
+ ],
+ [
+ -1,
+ 23
+ ],
+ [
+ 10,
+ 59
+ ],
+ [
+ 28,
+ 130
+ ],
+ [
+ 4,
+ 16
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -13,
+ 15
+ ],
+ [
+ -23,
+ 14
+ ],
+ [
+ -21,
+ 7
+ ],
+ [
+ -17,
+ -16
+ ],
+ [
+ -15,
+ 32
+ ],
+ [
+ -13,
+ 78
+ ],
+ [
+ -32,
+ 83
+ ],
+ [
+ -50,
+ 86
+ ],
+ [
+ -29,
+ 60
+ ],
+ [
+ -8,
+ 31
+ ],
+ [
+ -7,
+ 46
+ ],
+ [
+ -7,
+ 63
+ ],
+ [
+ 1,
+ 51
+ ],
+ [
+ 10,
+ 62
+ ]
+ ],
+ [
+ [
+ 5900,
+ 7238
+ ],
+ [
+ 80,
+ -2
+ ],
+ [
+ 78,
+ -1
+ ],
+ [
+ 78,
+ -1
+ ],
+ [
+ 78,
+ -1
+ ],
+ [
+ 78,
+ -1
+ ],
+ [
+ 78,
+ -1
+ ],
+ [
+ 22,
+ 0
+ ]
+ ],
+ [
+ [
+ 6914,
+ 6911
+ ],
+ [
+ -1,
+ -131
+ ],
+ [
+ 0,
+ -131
+ ],
+ [
+ -1,
+ -131
+ ],
+ [
+ 0,
+ -131
+ ],
+ [
+ -1,
+ -132
+ ],
+ [
+ -1,
+ -131
+ ],
+ [
+ 0,
+ -131
+ ],
+ [
+ 0,
+ -133
+ ]
+ ],
+ [
+ [
+ 6910,
+ 5860
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -4,
+ -17
+ ],
+ [
+ 4,
+ -18
+ ],
+ [
+ 0,
+ -14
+ ],
+ [
+ -5,
+ -11
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 8,
+ -6
+ ],
+ [
+ 3,
+ -12
+ ],
+ [
+ -2,
+ -20
+ ],
+ [
+ -17,
+ -20
+ ],
+ [
+ -34,
+ -23
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ -10,
+ 4
+ ],
+ [
+ -18,
+ -3
+ ],
+ [
+ -6,
+ -19
+ ],
+ [
+ 3,
+ -35
+ ],
+ [
+ -6,
+ -26
+ ],
+ [
+ -15,
+ -19
+ ],
+ [
+ -11,
+ -25
+ ],
+ [
+ -6,
+ -30
+ ],
+ [
+ -11,
+ -19
+ ],
+ [
+ -14,
+ -6
+ ],
+ [
+ -11,
+ -28
+ ],
+ [
+ -9,
+ -50
+ ],
+ [
+ -10,
+ -31
+ ],
+ [
+ -10,
+ -12
+ ],
+ [
+ -14,
+ 3
+ ],
+ [
+ -18,
+ 18
+ ],
+ [
+ -11,
+ 18
+ ],
+ [
+ -3,
+ 19
+ ],
+ [
+ -5,
+ 14
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -11,
+ -2
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -4,
+ -13
+ ],
+ [
+ 0,
+ -21
+ ],
+ [
+ -5,
+ -18
+ ],
+ [
+ -8,
+ -17
+ ],
+ [
+ -13,
+ 5
+ ],
+ [
+ -17,
+ 29
+ ],
+ [
+ -17,
+ 6
+ ],
+ [
+ -17,
+ -15
+ ],
+ [
+ -13,
+ -21
+ ],
+ [
+ -9,
+ -26
+ ],
+ [
+ -8,
+ -6
+ ],
+ [
+ -12,
+ 20
+ ],
+ [
+ -28,
+ 27
+ ],
+ [
+ -15,
+ 6
+ ],
+ [
+ -11,
+ -7
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -24
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 16
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -10,
+ -6
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -8,
+ 10
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 1,
+ -18
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ -3,
+ -5
+ ]
+ ],
+ [
+ [
+ 6442,
+ 6921
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 7,
+ -10
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 10,
+ -6
+ ],
+ [
+ 17,
+ -2
+ ],
+ [
+ 17,
+ 4
+ ],
+ [
+ 15,
+ 9
+ ],
+ [
+ 36,
+ 37
+ ]
+ ],
+ [
+ [
+ 6556,
+ 6935
+ ],
+ [
+ 43,
+ -1
+ ],
+ [
+ 52,
+ 0
+ ],
+ [
+ 53,
+ 0
+ ],
+ [
+ 52,
+ 0
+ ],
+ [
+ 53,
+ 0
+ ],
+ [
+ 52,
+ 0
+ ],
+ [
+ 53,
+ 0
+ ],
+ [
+ 0,
+ -23
+ ]
+ ],
+ [
+ [
+ 5213,
+ 5018
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -41,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ]
+ ],
+ [
+ [
+ 3930,
+ 6226
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 37,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 37,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 37,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 37,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 37,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 37,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 37,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 37,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 37,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 36,
+ 0
+ ],
+ [
+ 31,
+ 0
+ ]
+ ],
+ [
+ [
+ 5086,
+ 6226
+ ],
+ [
+ 40,
+ -52
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 12,
+ 9
+ ],
+ [
+ 10,
+ -12
+ ],
+ [
+ 6,
+ -32
+ ],
+ [
+ -1,
+ -17
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -10,
+ -20
+ ],
+ [
+ -13,
+ -38
+ ],
+ [
+ 3,
+ -35
+ ],
+ [
+ 19,
+ -34
+ ],
+ [
+ 12,
+ -33
+ ],
+ [
+ 6,
+ -34
+ ],
+ [
+ 12,
+ -26
+ ],
+ [
+ 27,
+ -28
+ ],
+ [
+ 0,
+ -16
+ ],
+ [
+ 0,
+ -52
+ ],
+ [
+ 0,
+ -53
+ ],
+ [
+ 0,
+ -52
+ ],
+ [
+ 0,
+ -53
+ ],
+ [
+ 0,
+ -52
+ ],
+ [
+ 0,
+ -53
+ ],
+ [
+ 0,
+ -52
+ ],
+ [
+ 0,
+ -53
+ ],
+ [
+ 0,
+ -52
+ ],
+ [
+ 0,
+ -53
+ ],
+ [
+ 0,
+ -52
+ ],
+ [
+ 0,
+ -52
+ ],
+ [
+ 0,
+ -53
+ ],
+ [
+ 1,
+ -52
+ ],
+ [
+ 0,
+ -53
+ ],
+ [
+ 0,
+ -52
+ ]
+ ],
+ [
+ [
+ 6101,
+ 4817
+ ],
+ [
+ -12,
+ -1
+ ]
+ ],
+ [
+ [
+ 6089,
+ 4816
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 1,
+ -10
+ ]
+ ],
+ [
+ [
+ 7292,
+ 5600
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 2,
+ -59
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ -6,
+ -25
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 5,
+ -20
+ ],
+ [
+ 19,
+ -47
+ ],
+ [
+ 2,
+ -18
+ ],
+ [
+ 7,
+ -18
+ ],
+ [
+ 6,
+ -26
+ ],
+ [
+ 20,
+ -57
+ ],
+ [
+ 30,
+ -47
+ ],
+ [
+ 24,
+ -12
+ ]
+ ],
+ [
+ [
+ 7404,
+ 5235
+ ],
+ [
+ -65,
+ -98
+ ],
+ [
+ -30,
+ -36
+ ],
+ [
+ -29,
+ -28
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -6,
+ -31
+ ],
+ [
+ -18,
+ -28
+ ],
+ [
+ -11,
+ -29
+ ],
+ [
+ -25,
+ -25
+ ],
+ [
+ -19,
+ -33
+ ],
+ [
+ -46,
+ -33
+ ],
+ [
+ -26,
+ -12
+ ],
+ [
+ -17,
+ -19
+ ]
+ ],
+ [
+ [
+ 7110,
+ 4858
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -60,
+ 4
+ ],
+ [
+ -61,
+ 4
+ ],
+ [
+ -60,
+ 4
+ ],
+ [
+ -60,
+ 4
+ ],
+ [
+ -60,
+ 3
+ ],
+ [
+ -60,
+ 4
+ ],
+ [
+ -60,
+ 4
+ ],
+ [
+ -60,
+ 4
+ ],
+ [
+ -58,
+ -2
+ ],
+ [
+ -58,
+ -2
+ ],
+ [
+ -57,
+ -2
+ ],
+ [
+ -58,
+ -2
+ ],
+ [
+ -5,
+ 12
+ ],
+ [
+ -15,
+ 3
+ ],
+ [
+ -24,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 7,
+ -42
+ ],
+ [
+ 0,
+ -36
+ ],
+ [
+ -27,
+ 0
+ ],
+ [
+ -30,
+ 0
+ ],
+ [
+ -30,
+ 0
+ ],
+ [
+ -30,
+ 0
+ ],
+ [
+ -30,
+ 0
+ ],
+ [
+ -30,
+ 0
+ ],
+ [
+ -30,
+ 0
+ ],
+ [
+ -34,
+ 0
+ ]
+ ],
+ [
+ [
+ 6108,
+ 4816
+ ],
+ [
+ 9,
+ 35
+ ],
+ [
+ 8,
+ 10
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 8,
+ -7
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 10,
+ 12
+ ],
+ [
+ 8,
+ 37
+ ],
+ [
+ 4,
+ 38
+ ],
+ [
+ 2,
+ 41
+ ],
+ [
+ -6,
+ 32
+ ]
+ ],
+ [
+ [
+ 6910,
+ 5860
+ ],
+ [
+ 9,
+ 13
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 9,
+ -14
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 15,
+ 7
+ ],
+ [
+ 13,
+ -5
+ ],
+ [
+ 13,
+ -16
+ ],
+ [
+ 12,
+ -30
+ ],
+ [
+ 11,
+ -45
+ ],
+ [
+ 19,
+ -26
+ ],
+ [
+ 29,
+ -10
+ ],
+ [
+ 21,
+ -18
+ ],
+ [
+ 13,
+ -24
+ ],
+ [
+ 11,
+ -8
+ ],
+ [
+ 12,
+ 13
+ ],
+ [
+ 14,
+ 7
+ ],
+ [
+ 13,
+ -8
+ ],
+ [
+ 18,
+ -21
+ ],
+ [
+ 27,
+ 4
+ ],
+ [
+ 35,
+ 31
+ ],
+ [
+ 21,
+ -2
+ ],
+ [
+ 6,
+ -33
+ ],
+ [
+ 15,
+ -35
+ ],
+ [
+ 24,
+ -37
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5702,
+ 1997
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -28,
+ 35
+ ],
+ [
+ -2,
+ 15
+ ],
+ [
+ 14,
+ 14
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 13,
+ -17
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ -2,
+ -12
+ ],
+ [
+ -5,
+ -15
+ ]
+ ],
+ [
+ [
+ 6205,
+ 2082
+ ],
+ [
+ -9,
+ -21
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 7,
+ 21
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ -3,
+ -17
+ ]
+ ],
+ [
+ [
+ 6216,
+ 2121
+ ],
+ [
+ -5,
+ -13
+ ],
+ [
+ 5,
+ 61
+ ],
+ [
+ -7,
+ 52
+ ],
+ [
+ 7,
+ -23
+ ],
+ [
+ 2,
+ -27
+ ],
+ [
+ -2,
+ -50
+ ]
+ ],
+ [
+ [
+ 6147,
+ 2232
+ ],
+ [
+ 1,
+ -19
+ ],
+ [
+ -9,
+ 9
+ ],
+ [
+ -12,
+ 1
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 16,
+ 23
+ ],
+ [
+ -5,
+ -17
+ ],
+ [
+ -2,
+ -17
+ ]
+ ],
+ [
+ [
+ 6096,
+ 2276
+ ],
+ [
+ -12,
+ -11
+ ],
+ [
+ -63,
+ 41
+ ],
+ [
+ -16,
+ 34
+ ],
+ [
+ -14,
+ 7
+ ],
+ [
+ -17,
+ 4
+ ],
+ [
+ -19,
+ -41
+ ],
+ [
+ -14,
+ -55
+ ],
+ [
+ 22,
+ -31
+ ],
+ [
+ 19,
+ -14
+ ],
+ [
+ 32,
+ 12
+ ],
+ [
+ 17,
+ 27
+ ],
+ [
+ 14,
+ -1
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 6,
+ 14
+ ],
+ [
+ 12,
+ -11
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ -9,
+ -15
+ ],
+ [
+ -11,
+ -14
+ ],
+ [
+ -6,
+ -15
+ ],
+ [
+ 12,
+ -31
+ ],
+ [
+ 19,
+ -11
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 4,
+ 35
+ ],
+ [
+ 12,
+ 22
+ ],
+ [
+ 16,
+ -4
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 8,
+ -23
+ ],
+ [
+ -1,
+ -32
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -17,
+ -15
+ ],
+ [
+ -13,
+ -5
+ ],
+ [
+ -11,
+ -19
+ ],
+ [
+ 6,
+ -11
+ ],
+ [
+ -11,
+ -9
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -12
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ 8,
+ -33
+ ],
+ [
+ 16,
+ -21
+ ],
+ [
+ 12,
+ -27
+ ],
+ [
+ 46,
+ -35
+ ],
+ [
+ 12,
+ 1
+ ],
+ [
+ 11,
+ -35
+ ],
+ [
+ 9,
+ -12
+ ],
+ [
+ 8,
+ -6
+ ],
+ [
+ -1,
+ -24
+ ],
+ [
+ -15,
+ -18
+ ],
+ [
+ -4,
+ -21
+ ],
+ [
+ -4,
+ -12
+ ],
+ [
+ -7,
+ 15
+ ],
+ [
+ -7,
+ 11
+ ],
+ [
+ -16,
+ -33
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ 4,
+ 36
+ ],
+ [
+ -7,
+ 14
+ ],
+ [
+ -9,
+ 35
+ ],
+ [
+ -14,
+ 23
+ ],
+ [
+ -9,
+ 7
+ ],
+ [
+ -8,
+ 14
+ ],
+ [
+ -9,
+ 6
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -13,
+ 8
+ ],
+ [
+ -1,
+ 20
+ ],
+ [
+ -4,
+ 14
+ ],
+ [
+ -10,
+ 17
+ ],
+ [
+ -49,
+ 32
+ ],
+ [
+ 0,
+ -14
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 9,
+ -13
+ ],
+ [
+ -1,
+ -38
+ ],
+ [
+ -3,
+ -16
+ ],
+ [
+ -2,
+ -23
+ ],
+ [
+ -3,
+ -23
+ ],
+ [
+ -6,
+ -19
+ ],
+ [
+ -13,
+ -12
+ ],
+ [
+ -6,
+ 10
+ ],
+ [
+ -10,
+ 50
+ ],
+ [
+ -13,
+ 16
+ ],
+ [
+ -21,
+ 2
+ ],
+ [
+ -15,
+ -11
+ ],
+ [
+ -16,
+ -49
+ ],
+ [
+ -12,
+ -8
+ ],
+ [
+ -44,
+ 25
+ ],
+ [
+ -50,
+ 39
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 15,
+ -6
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ -15,
+ 42
+ ],
+ [
+ -3,
+ 20
+ ],
+ [
+ 2,
+ 24
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -9,
+ -20
+ ],
+ [
+ -32,
+ 17
+ ],
+ [
+ -8,
+ 20
+ ],
+ [
+ -19,
+ 57
+ ],
+ [
+ -26,
+ 2
+ ],
+ [
+ -12,
+ 34
+ ],
+ [
+ -22,
+ -14
+ ],
+ [
+ -11,
+ -16
+ ],
+ [
+ -9,
+ -25
+ ],
+ [
+ 3,
+ -13
+ ],
+ [
+ 10,
+ -20
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -31,
+ -14
+ ],
+ [
+ -71,
+ 16
+ ],
+ [
+ -21,
+ 15
+ ],
+ [
+ -28,
+ 32
+ ],
+ [
+ -39,
+ 26
+ ],
+ [
+ -18,
+ 4
+ ],
+ [
+ -18,
+ -5
+ ],
+ [
+ -53,
+ -3
+ ],
+ [
+ -13,
+ -7
+ ],
+ [
+ -10,
+ -11
+ ],
+ [
+ -7,
+ 13
+ ],
+ [
+ -3,
+ 22
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 7,
+ 13
+ ],
+ [
+ 6,
+ 25
+ ],
+ [
+ 1,
+ 16
+ ],
+ [
+ -5,
+ 10
+ ]
+ ],
+ [
+ [
+ 5355,
+ 2189
+ ],
+ [
+ 12,
+ 40
+ ],
+ [
+ 3,
+ 14
+ ],
+ [
+ -2,
+ 69
+ ],
+ [
+ -5,
+ 25
+ ],
+ [
+ 1,
+ 14
+ ],
+ [
+ 5,
+ 38
+ ],
+ [
+ -1,
+ 34
+ ],
+ [
+ 10,
+ 41
+ ],
+ [
+ 7,
+ 22
+ ],
+ [
+ 8,
+ 44
+ ],
+ [
+ 1,
+ 28
+ ],
+ [
+ 4,
+ 22
+ ],
+ [
+ -3,
+ 23
+ ],
+ [
+ 6,
+ 16
+ ],
+ [
+ -4,
+ 24
+ ],
+ [
+ -1,
+ 30
+ ],
+ [
+ -6,
+ 12
+ ],
+ [
+ -12,
+ 46
+ ],
+ [
+ 0,
+ 20
+ ],
+ [
+ -13,
+ 42
+ ],
+ [
+ 0,
+ 15
+ ],
+ [
+ -12,
+ 22
+ ],
+ [
+ -2,
+ 14
+ ],
+ [
+ -1,
+ 59
+ ],
+ [
+ -4,
+ 17
+ ],
+ [
+ -10,
+ 34
+ ],
+ [
+ -24,
+ 49
+ ],
+ [
+ 0,
+ 51
+ ],
+ [
+ 0,
+ 51
+ ],
+ [
+ 0,
+ 51
+ ],
+ [
+ 0,
+ 51
+ ],
+ [
+ 0,
+ 51
+ ],
+ [
+ 0,
+ 51
+ ],
+ [
+ 1,
+ 51
+ ],
+ [
+ 0,
+ 51
+ ]
+ ],
+ [
+ [
+ 5813,
+ 3413
+ ],
+ [
+ 1,
+ -20
+ ],
+ [
+ 9,
+ -12
+ ],
+ [
+ 0,
+ -21
+ ],
+ [
+ -7,
+ -31
+ ],
+ [
+ 0,
+ -21
+ ],
+ [
+ 7,
+ -12
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ -8,
+ -13
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ 6,
+ -15
+ ],
+ [
+ 3,
+ -18
+ ],
+ [
+ -1,
+ -21
+ ],
+ [
+ 8,
+ -27
+ ],
+ [
+ 12,
+ -17
+ ],
+ [
+ 8,
+ -20
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ -9,
+ -22
+ ],
+ [
+ -8,
+ -16
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ -1,
+ -23
+ ],
+ [
+ -11,
+ -30
+ ],
+ [
+ -22,
+ -35
+ ],
+ [
+ -15,
+ -45
+ ],
+ [
+ -7,
+ -53
+ ],
+ [
+ -8,
+ -35
+ ],
+ [
+ -8,
+ -14
+ ],
+ [
+ -4,
+ -28
+ ],
+ [
+ 0,
+ -42
+ ],
+ [
+ -5,
+ -23
+ ],
+ [
+ -11,
+ -5
+ ],
+ [
+ -2,
+ -24
+ ],
+ [
+ 6,
+ -43
+ ],
+ [
+ -2,
+ -18
+ ],
+ [
+ -8,
+ -14
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 41,
+ 0
+ ],
+ [
+ 42,
+ 0
+ ],
+ [
+ 41,
+ 0
+ ],
+ [
+ 42,
+ 0
+ ],
+ [
+ 42,
+ 0
+ ],
+ [
+ 41,
+ 0
+ ],
+ [
+ 42,
+ 0
+ ],
+ [
+ 41,
+ 0
+ ],
+ [
+ -5,
+ -46
+ ],
+ [
+ -12,
+ -63
+ ],
+ [
+ 0,
+ -16
+ ],
+ [
+ 3,
+ -20
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 4,
+ -17
+ ],
+ [
+ 10,
+ -17
+ ],
+ [
+ 9,
+ -26
+ ],
+ [
+ 8,
+ -45
+ ],
+ [
+ 2,
+ -22
+ ],
+ [
+ 6,
+ -29
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 5,
+ -3
+ ]
+ ],
+ [
+ [
+ 9481,
+ 6735
+ ],
+ [
+ -13,
+ -6
+ ],
+ [
+ -31,
+ 15
+ ],
+ [
+ 25,
+ 12
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 4,
+ 19
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 10,
+ -40
+ ],
+ [
+ 1,
+ -13
+ ]
+ ],
+ [
+ [
+ 9389,
+ 6780
+ ],
+ [
+ -48,
+ -20
+ ],
+ [
+ -8,
+ 13
+ ],
+ [
+ 12,
+ 6
+ ],
+ [
+ 15,
+ 30
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 16,
+ -17
+ ],
+ [
+ 3,
+ -15
+ ]
+ ],
+ [
+ [
+ 9263,
+ 6913
+ ],
+ [
+ -6,
+ 18
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ -6,
+ 10
+ ],
+ [
+ 0,
+ 15
+ ],
+ [
+ 0,
+ 22
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -1,
+ 28
+ ],
+ [
+ 0,
+ 18
+ ],
+ [
+ -13,
+ -1
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -17,
+ 0
+ ],
+ [
+ -18,
+ -1
+ ],
+ [
+ -13,
+ 0
+ ]
+ ],
+ [
+ [
+ 8874,
+ 7053
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ 5,
+ 34
+ ],
+ [
+ 6,
+ 34
+ ],
+ [
+ 5,
+ 34
+ ],
+ [
+ 6,
+ 34
+ ],
+ [
+ 5,
+ 33
+ ],
+ [
+ 6,
+ 34
+ ],
+ [
+ 5,
+ 34
+ ],
+ [
+ 6,
+ 34
+ ]
+ ],
+ [
+ [
+ 8914,
+ 7334
+ ],
+ [
+ 17,
+ -1
+ ],
+ [
+ 17,
+ -1
+ ],
+ [
+ 17,
+ -1
+ ],
+ [
+ 17,
+ -2
+ ],
+ [
+ 17,
+ -1
+ ],
+ [
+ 17,
+ -1
+ ],
+ [
+ 17,
+ -1
+ ],
+ [
+ 17,
+ -1
+ ]
+ ],
+ [
+ [
+ 9050,
+ 7325
+ ],
+ [
+ 24,
+ -1
+ ],
+ [
+ 25,
+ -2
+ ],
+ [
+ 25,
+ -1
+ ],
+ [
+ 24,
+ -2
+ ],
+ [
+ 25,
+ -1
+ ],
+ [
+ 25,
+ -1
+ ],
+ [
+ 24,
+ -2
+ ],
+ [
+ 25,
+ -1
+ ],
+ [
+ 15,
+ 11
+ ],
+ [
+ 18,
+ 31
+ ],
+ [
+ 11,
+ 7
+ ],
+ [
+ 17,
+ 19
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 20,
+ -2
+ ]
+ ],
+ [
+ [
+ 9337,
+ 7384
+ ],
+ [
+ -4,
+ -21
+ ],
+ [
+ 5,
+ -20
+ ],
+ [
+ 4,
+ -22
+ ],
+ [
+ 8,
+ -21
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -16,
+ -18
+ ],
+ [
+ -14,
+ -8
+ ],
+ [
+ -7,
+ -22
+ ],
+ [
+ -10,
+ -26
+ ],
+ [
+ -20,
+ -41
+ ],
+ [
+ 8,
+ -12
+ ],
+ [
+ 31,
+ -14
+ ],
+ [
+ 14,
+ -15
+ ],
+ [
+ 21,
+ -76
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ 19,
+ -20
+ ],
+ [
+ 6,
+ -54
+ ],
+ [
+ 15,
+ -19
+ ],
+ [
+ 23,
+ -11
+ ],
+ [
+ 28,
+ 16
+ ],
+ [
+ 23,
+ 23
+ ],
+ [
+ -1,
+ 19
+ ],
+ [
+ -15,
+ 43
+ ],
+ [
+ -3,
+ 20
+ ],
+ [
+ -11,
+ 13
+ ],
+ [
+ -4,
+ -11
+ ],
+ [
+ -7,
+ 15
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 9,
+ -8
+ ],
+ [
+ 23,
+ -47
+ ],
+ [
+ 6,
+ -61
+ ],
+ [
+ 2,
+ -40
+ ],
+ [
+ -3,
+ -13
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -12,
+ -3
+ ],
+ [
+ -60,
+ -20
+ ],
+ [
+ -13,
+ -18
+ ],
+ [
+ -31,
+ -20
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ 3,
+ 20
+ ],
+ [
+ -2,
+ 41
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -48,
+ -67
+ ],
+ [
+ -18,
+ -4
+ ],
+ [
+ -15,
+ -20
+ ],
+ [
+ -4,
+ 11
+ ],
+ [
+ -3,
+ 50
+ ],
+ [
+ 10,
+ 43
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -10,
+ -15
+ ]
+ ],
+ [
+ [
+ 8572,
+ 5436
+ ],
+ [
+ -5,
+ -1
+ ]
+ ],
+ [
+ [
+ 8567,
+ 5435
+ ],
+ [
+ 5,
+ 14
+ ],
+ [
+ 15,
+ 68
+ ],
+ [
+ 7,
+ 23
+ ],
+ [
+ -7,
+ -47
+ ],
+ [
+ -11,
+ -44
+ ],
+ [
+ -4,
+ -13
+ ]
+ ],
+ [
+ [
+ 8604,
+ 5603
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ -2,
+ -18
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ 0,
+ 18
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -2,
+ -35
+ ],
+ [
+ -3,
+ -17
+ ],
+ [
+ -11,
+ -5
+ ],
+ [
+ -12,
+ -46
+ ],
+ [
+ -10,
+ -26
+ ],
+ [
+ -4,
+ -16
+ ]
+ ],
+ [
+ [
+ 8546,
+ 5430
+ ],
+ [
+ -16,
+ -4
+ ],
+ [
+ -26,
+ -6
+ ],
+ [
+ -7,
+ -19
+ ]
+ ],
+ [
+ [
+ 8497,
+ 5401
+ ],
+ [
+ -13,
+ 8
+ ],
+ [
+ -20,
+ 0
+ ],
+ [
+ 3,
+ 24
+ ],
+ [
+ 6,
+ 22
+ ],
+ [
+ -10,
+ 21
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -7,
+ 9
+ ],
+ [
+ 8,
+ 18
+ ],
+ [
+ 3,
+ 19
+ ],
+ [
+ -2,
+ 23
+ ],
+ [
+ 3,
+ 18
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -8,
+ -18
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -3,
+ 17
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -11,
+ 15
+ ],
+ [
+ -17,
+ 17
+ ],
+ [
+ -9,
+ 31
+ ],
+ [
+ -5,
+ 23
+ ],
+ [
+ 5,
+ 43
+ ],
+ [
+ 11,
+ 7
+ ],
+ [
+ 15,
+ -7
+ ],
+ [
+ 20,
+ 0
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -21,
+ 35
+ ],
+ [
+ -6,
+ 20
+ ],
+ [
+ -11,
+ 6
+ ],
+ [
+ -6,
+ -20
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ 7,
+ 43
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 14,
+ 12
+ ],
+ [
+ -4,
+ 26
+ ],
+ [
+ -9,
+ 11
+ ],
+ [
+ -16,
+ -14
+ ],
+ [
+ 1,
+ 18
+ ],
+ [
+ 3,
+ 22
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 11,
+ -7
+ ],
+ [
+ 8,
+ 37
+ ],
+ [
+ 1,
+ 16
+ ],
+ [
+ -15,
+ -24
+ ],
+ [
+ -3,
+ 52
+ ],
+ [
+ 14,
+ 50
+ ],
+ [
+ 14,
+ 21
+ ],
+ [
+ 17,
+ 0
+ ],
+ [
+ 17,
+ 3
+ ],
+ [
+ -11,
+ 9
+ ],
+ [
+ -11,
+ 5
+ ],
+ [
+ 9,
+ 20
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 7,
+ 17
+ ],
+ [
+ -17,
+ -2
+ ],
+ [
+ 2,
+ 32
+ ],
+ [
+ -8,
+ -6
+ ],
+ [
+ -10,
+ -3
+ ],
+ [
+ -4,
+ -14
+ ],
+ [
+ 1,
+ -23
+ ],
+ [
+ -3,
+ -15
+ ],
+ [
+ -8,
+ -12
+ ],
+ [
+ -13,
+ -9
+ ],
+ [
+ -1,
+ 16
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -2,
+ -34
+ ],
+ [
+ -3,
+ -12
+ ],
+ [
+ -10,
+ 32
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -2,
+ -17
+ ],
+ [
+ -9,
+ -8
+ ],
+ [
+ 1,
+ -20
+ ],
+ [
+ -3,
+ -12
+ ],
+ [
+ -26,
+ 18
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 15,
+ -38
+ ],
+ [
+ 11,
+ -14
+ ],
+ [
+ 1,
+ -21
+ ],
+ [
+ -9,
+ -17
+ ],
+ [
+ -13,
+ 15
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 7,
+ -26
+ ],
+ [
+ 4,
+ -22
+ ],
+ [
+ -4,
+ -19
+ ],
+ [
+ 0,
+ -23
+ ],
+ [
+ -1,
+ -22
+ ],
+ [
+ -2,
+ -18
+ ],
+ [
+ 6,
+ -85
+ ],
+ [
+ 7,
+ -23
+ ],
+ [
+ 8,
+ -22
+ ],
+ [
+ 3,
+ -20
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -13,
+ 17
+ ],
+ [
+ -10,
+ 12
+ ],
+ [
+ -13,
+ 42
+ ],
+ [
+ -2,
+ 16
+ ],
+ [
+ -4,
+ 13
+ ],
+ [
+ 2,
+ -30
+ ],
+ [
+ 5,
+ -33
+ ],
+ [
+ 40,
+ -75
+ ],
+ [
+ 7,
+ -29
+ ],
+ [
+ 6,
+ -22
+ ],
+ [
+ -1,
+ -22
+ ],
+ [
+ -11,
+ 15
+ ],
+ [
+ -9,
+ 20
+ ],
+ [
+ -24,
+ 22
+ ],
+ [
+ -30,
+ 14
+ ],
+ [
+ -18,
+ 51
+ ],
+ [
+ 0,
+ -21
+ ],
+ [
+ -3,
+ -18
+ ],
+ [
+ -11,
+ 22
+ ],
+ [
+ -6,
+ 19
+ ],
+ [
+ -3,
+ 20
+ ],
+ [
+ -13,
+ -1
+ ],
+ [
+ -13,
+ -18
+ ],
+ [
+ -14,
+ 4
+ ],
+ [
+ -1,
+ 35
+ ],
+ [
+ 3,
+ 19
+ ],
+ [
+ 15,
+ 44
+ ],
+ [
+ 14,
+ 22
+ ],
+ [
+ 6,
+ 29
+ ],
+ [
+ -2,
+ 45
+ ]
+ ],
+ [
+ [
+ 8243,
+ 5800
+ ],
+ [
+ -11,
+ 10
+ ],
+ [
+ -20,
+ 34
+ ],
+ [
+ -31,
+ 24
+ ],
+ [
+ -4,
+ 12
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 5,
+ 19
+ ],
+ [
+ -10,
+ 18
+ ],
+ [
+ -23,
+ 17
+ ],
+ [
+ -10,
+ 15
+ ]
+ ],
+ [
+ [
+ 8139,
+ 5962
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 19
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ -9,
+ 13
+ ],
+ [
+ -4,
+ 11
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -13,
+ -1
+ ],
+ [
+ -12,
+ 9
+ ],
+ [
+ -13,
+ 19
+ ],
+ [
+ -14,
+ 3
+ ],
+ [
+ -25,
+ -19
+ ],
+ [
+ -14,
+ -4
+ ],
+ [
+ -6,
+ -11
+ ],
+ [
+ -3,
+ -18
+ ],
+ [
+ -7,
+ -9
+ ],
+ [
+ -13,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -16,
+ 6
+ ],
+ [
+ -11,
+ 11
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -3,
+ -17
+ ],
+ [
+ -27,
+ -47
+ ],
+ [
+ -13,
+ 10
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -38,
+ -66
+ ],
+ [
+ -11,
+ -10
+ ],
+ [
+ -22,
+ -30
+ ],
+ [
+ 0,
+ 51
+ ],
+ [
+ 0,
+ 52
+ ],
+ [
+ 1,
+ 51
+ ],
+ [
+ 0,
+ 52
+ ]
+ ],
+ [
+ [
+ 7835,
+ 6114
+ ],
+ [
+ 40,
+ 0
+ ],
+ [
+ 40,
+ 0
+ ],
+ [
+ 40,
+ 0
+ ],
+ [
+ 40,
+ 0
+ ],
+ [
+ 40,
+ 0
+ ],
+ [
+ 40,
+ 0
+ ],
+ [
+ 40,
+ 0
+ ],
+ [
+ 40,
+ 0
+ ],
+ [
+ 40,
+ 0
+ ],
+ [
+ 40,
+ 0
+ ],
+ [
+ 40,
+ 0
+ ],
+ [
+ 40,
+ 0
+ ],
+ [
+ 40,
+ 0
+ ],
+ [
+ 40,
+ 0
+ ],
+ [
+ 40,
+ 0
+ ],
+ [
+ 40,
+ 0
+ ]
+ ],
+ [
+ [
+ 9716,
+ 7915
+ ],
+ [
+ -7,
+ -8
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ 0,
+ 20
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 6,
+ -19
+ ]
+ ],
+ [
+ [
+ 9791,
+ 7970
+ ],
+ [
+ -10,
+ -8
+ ],
+ [
+ -11,
+ 4
+ ],
+ [
+ 0,
+ -21
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -12,
+ 11
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ 1,
+ 28
+ ],
+ [
+ 10,
+ 27
+ ],
+ [
+ 9,
+ 10
+ ],
+ [
+ 10,
+ -7
+ ],
+ [
+ 8,
+ -30
+ ],
+ [
+ 1,
+ -13
+ ]
+ ],
+ [
+ [
+ 9350,
+ 7462
+ ],
+ [
+ -14,
+ 38
+ ],
+ [
+ -3,
+ 30
+ ],
+ [
+ -15,
+ 36
+ ],
+ [
+ -6,
+ 24
+ ],
+ [
+ -3,
+ 28
+ ],
+ [
+ 1,
+ 30
+ ],
+ [
+ -1,
+ 45
+ ],
+ [
+ -1,
+ 44
+ ],
+ [
+ -2,
+ 45
+ ],
+ [
+ -1,
+ 45
+ ],
+ [
+ -1,
+ 44
+ ],
+ [
+ -2,
+ 45
+ ],
+ [
+ -1,
+ 44
+ ],
+ [
+ -1,
+ 45
+ ],
+ [
+ -2,
+ 45
+ ],
+ [
+ -1,
+ 44
+ ],
+ [
+ -1,
+ 45
+ ],
+ [
+ -2,
+ 45
+ ],
+ [
+ -1,
+ 44
+ ],
+ [
+ -1,
+ 45
+ ],
+ [
+ -2,
+ 45
+ ],
+ [
+ -1,
+ 40
+ ]
+ ],
+ [
+ [
+ 9289,
+ 8358
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 11,
+ 11
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 6,
+ -17
+ ],
+ [
+ 5,
+ -11
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 5,
+ 16
+ ],
+ [
+ 0,
+ 23
+ ],
+ [
+ 7,
+ 15
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -2,
+ 17
+ ],
+ [
+ 0,
+ 21
+ ],
+ [
+ 19,
+ 38
+ ],
+ [
+ 22,
+ 25
+ ],
+ [
+ 8,
+ 12
+ ],
+ [
+ 2,
+ 26
+ ],
+ [
+ 13,
+ 27
+ ],
+ [
+ 7,
+ 15
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ -3,
+ 17
+ ],
+ [
+ 0,
+ 31
+ ],
+ [
+ 5,
+ 37
+ ],
+ [
+ 5,
+ 41
+ ],
+ [
+ 12,
+ 37
+ ],
+ [
+ 19,
+ 40
+ ],
+ [
+ 5,
+ 52
+ ],
+ [
+ 6,
+ 55
+ ],
+ [
+ 23,
+ 54
+ ],
+ [
+ 27,
+ 62
+ ],
+ [
+ 15,
+ 34
+ ],
+ [
+ 28,
+ 64
+ ],
+ [
+ 19,
+ 45
+ ],
+ [
+ 10,
+ 21
+ ],
+ [
+ 10,
+ 24
+ ],
+ [
+ 17,
+ -7
+ ],
+ [
+ 17,
+ -8
+ ],
+ [
+ -3,
+ -35
+ ],
+ [
+ 2,
+ -18
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 8,
+ -15
+ ],
+ [
+ 11,
+ -10
+ ],
+ [
+ 9,
+ -4
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 28,
+ 20
+ ],
+ [
+ 32,
+ 13
+ ],
+ [
+ 18,
+ 12
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 13,
+ -3
+ ],
+ [
+ 24,
+ -29
+ ],
+ [
+ 28,
+ -43
+ ],
+ [
+ 22,
+ -34
+ ],
+ [
+ 1,
+ -59
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 1,
+ -66
+ ],
+ [
+ 0,
+ -47
+ ],
+ [
+ 0,
+ -65
+ ],
+ [
+ 1,
+ -52
+ ],
+ [
+ 1,
+ -67
+ ],
+ [
+ 0,
+ -36
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -11,
+ -6
+ ],
+ [
+ 15,
+ -28
+ ],
+ [
+ 26,
+ -27
+ ],
+ [
+ 20,
+ -5
+ ],
+ [
+ 11,
+ 7
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -15
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 5,
+ -18
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ -4,
+ -13
+ ],
+ [
+ -2,
+ -13
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 10,
+ -15
+ ],
+ [
+ 5,
+ -15
+ ],
+ [
+ 9,
+ -8
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ 5,
+ -21
+ ],
+ [
+ 4,
+ -39
+ ],
+ [
+ -6,
+ -18
+ ],
+ [
+ 1,
+ -24
+ ],
+ [
+ 16,
+ -7
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ -35,
+ -62
+ ],
+ [
+ -30,
+ 9
+ ],
+ [
+ -17,
+ -16
+ ],
+ [
+ -17,
+ -5
+ ],
+ [
+ -7,
+ -27
+ ],
+ [
+ -9,
+ -6
+ ],
+ [
+ -13,
+ 2
+ ],
+ [
+ -11,
+ 7
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -11,
+ -49
+ ],
+ [
+ -10,
+ 4
+ ],
+ [
+ -4,
+ -17
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ -7,
+ 22
+ ],
+ [
+ -4,
+ 21
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -6,
+ -14
+ ],
+ [
+ -10,
+ -11
+ ],
+ [
+ -8,
+ 9
+ ],
+ [
+ -6,
+ 16
+ ],
+ [
+ -5,
+ -25
+ ],
+ [
+ -7,
+ -26
+ ],
+ [
+ 1,
+ -31
+ ],
+ [
+ -3,
+ -18
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -6,
+ 16
+ ],
+ [
+ -20,
+ 13
+ ],
+ [
+ -15,
+ -1
+ ],
+ [
+ 3,
+ 17
+ ],
+ [
+ 15,
+ 25
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 5,
+ 23
+ ],
+ [
+ 0,
+ 24
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -8,
+ -26
+ ],
+ [
+ -20,
+ -21
+ ],
+ [
+ 1,
+ -34
+ ],
+ [
+ -19,
+ -71
+ ],
+ [
+ -1,
+ -30
+ ],
+ [
+ -11,
+ -24
+ ],
+ [
+ -16,
+ -21
+ ],
+ [
+ -20,
+ 6
+ ],
+ [
+ -16,
+ -18
+ ],
+ [
+ -8,
+ -21
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -3,
+ 26
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -6,
+ -38
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -2,
+ 28
+ ],
+ [
+ -3,
+ 18
+ ],
+ [
+ -8,
+ -16
+ ],
+ [
+ -5,
+ -41
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -1,
+ 16
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ -17
+ ],
+ [
+ 2,
+ -25
+ ],
+ [
+ -3,
+ -13
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -6,
+ 12
+ ],
+ [
+ -9,
+ -9
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ 2,
+ 15
+ ],
+ [
+ -17,
+ -8
+ ],
+ [
+ -20,
+ -28
+ ],
+ [
+ -16,
+ -38
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 6,
+ -12
+ ],
+ [
+ -27,
+ -59
+ ],
+ [
+ -28,
+ -53
+ ],
+ [
+ -21,
+ -86
+ ],
+ [
+ -9,
+ -10
+ ],
+ [
+ -7,
+ -16
+ ]
+ ],
+ [
+ [
+ 6710,
+ 8280
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -4,
+ 17
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 1,
+ -12
+ ]
+ ],
+ [
+ [
+ 6783,
+ 8482
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ 0,
+ 18
+ ],
+ [
+ 6,
+ 33
+ ],
+ [
+ 6,
+ 15
+ ],
+ [
+ 8,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -35
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ -8,
+ -9
+ ]
+ ],
+ [
+ [
+ 7146,
+ 6928
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -58,
+ -4
+ ],
+ [
+ -58,
+ -4
+ ],
+ [
+ -57,
+ -3
+ ],
+ [
+ -58,
+ -4
+ ]
+ ],
+ [
+ [
+ 6556,
+ 6935
+ ],
+ [
+ 11,
+ 11
+ ],
+ [
+ 19,
+ 26
+ ],
+ [
+ 10,
+ 23
+ ],
+ [
+ 10,
+ 31
+ ],
+ [
+ 9,
+ 38
+ ],
+ [
+ 20,
+ 57
+ ],
+ [
+ 9,
+ 35
+ ],
+ [
+ 10,
+ 43
+ ],
+ [
+ 7,
+ 46
+ ],
+ [
+ 4,
+ 48
+ ],
+ [
+ 2,
+ 49
+ ],
+ [
+ 0,
+ 52
+ ],
+ [
+ -5,
+ 51
+ ],
+ [
+ -9,
+ 52
+ ],
+ [
+ -5,
+ 27
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -17,
+ 67
+ ],
+ [
+ -18,
+ 92
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 17,
+ 56
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -2,
+ 45
+ ],
+ [
+ -4,
+ 22
+ ],
+ [
+ -9,
+ 30
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 18,
+ 39
+ ],
+ [
+ 10,
+ 29
+ ],
+ [
+ 10,
+ 36
+ ],
+ [
+ 7,
+ 41
+ ],
+ [
+ 3,
+ 47
+ ],
+ [
+ -1,
+ 32
+ ],
+ [
+ -3,
+ 16
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 20,
+ 12
+ ],
+ [
+ 6,
+ 18
+ ],
+ [
+ 2,
+ 33
+ ],
+ [
+ 4,
+ 16
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 6,
+ 14
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 9,
+ -6
+ ],
+ [
+ 13,
+ 20
+ ],
+ [
+ 16,
+ 47
+ ],
+ [
+ 13,
+ 26
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -5,
+ -14
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ 2,
+ -17
+ ],
+ [
+ -1,
+ -16
+ ],
+ [
+ -5,
+ -22
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ -7,
+ -36
+ ],
+ [
+ 0,
+ -17
+ ],
+ [
+ 4,
+ -14
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 6,
+ 23
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 4,
+ 18
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ -1,
+ -19
+ ],
+ [
+ -10,
+ -43
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 11,
+ 28
+ ],
+ [
+ 9,
+ 44
+ ],
+ [
+ 7,
+ 33
+ ],
+ [
+ 2,
+ 19
+ ],
+ [
+ -3,
+ 47
+ ],
+ [
+ 1,
+ 19
+ ],
+ [
+ 3,
+ 14
+ ],
+ [
+ 9,
+ 15
+ ],
+ [
+ 17,
+ 17
+ ],
+ [
+ 17,
+ 9
+ ],
+ [
+ 16,
+ 1
+ ],
+ [
+ 11,
+ 4
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -11,
+ 5
+ ],
+ [
+ -9,
+ 10
+ ],
+ [
+ -5,
+ 16
+ ],
+ [
+ -2,
+ 19
+ ],
+ [
+ 2,
+ 21
+ ],
+ [
+ 7,
+ 21
+ ],
+ [
+ 12,
+ 20
+ ],
+ [
+ 3,
+ 15
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 15,
+ -2
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 14,
+ -8
+ ],
+ [
+ 22,
+ -25
+ ],
+ [
+ 21,
+ -14
+ ],
+ [
+ 20,
+ -5
+ ],
+ [
+ 15,
+ -8
+ ],
+ [
+ 9,
+ -14
+ ],
+ [
+ 7,
+ -15
+ ],
+ [
+ 4,
+ -16
+ ],
+ [
+ 9,
+ -10
+ ],
+ [
+ 15,
+ -2
+ ],
+ [
+ 12,
+ -7
+ ],
+ [
+ 9,
+ -12
+ ],
+ [
+ 47,
+ -31
+ ],
+ [
+ 20,
+ -16
+ ],
+ [
+ 11,
+ -16
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 2,
+ -11
+ ],
+ [
+ 8,
+ -21
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 0,
+ -18
+ ],
+ [
+ 3,
+ -13
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -14,
+ 11
+ ],
+ [
+ -9,
+ -3
+ ],
+ [
+ -3,
+ -14
+ ],
+ [
+ -1,
+ -13
+ ],
+ [
+ 3,
+ -12
+ ],
+ [
+ 18,
+ -38
+ ],
+ [
+ 5,
+ -33
+ ],
+ [
+ 1,
+ -41
+ ],
+ [
+ -2,
+ -16
+ ],
+ [
+ -2,
+ -35
+ ],
+ [
+ -2,
+ -55
+ ],
+ [
+ 0,
+ -19
+ ],
+ [
+ -6,
+ -18
+ ],
+ [
+ -17,
+ -26
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -6,
+ -22
+ ],
+ [
+ -5,
+ -41
+ ],
+ [
+ -6,
+ -22
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -14,
+ -3
+ ],
+ [
+ -10,
+ -13
+ ],
+ [
+ -7,
+ -35
+ ],
+ [
+ 0,
+ -16
+ ],
+ [
+ -4,
+ -21
+ ],
+ [
+ 1,
+ -18
+ ],
+ [
+ 4,
+ -15
+ ],
+ [
+ 11,
+ -15
+ ],
+ [
+ 20,
+ -15
+ ],
+ [
+ 11,
+ -2
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 8,
+ 24
+ ],
+ [
+ 8,
+ 10
+ ],
+ [
+ 10,
+ 4
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 16,
+ 49
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ 10,
+ 9
+ ],
+ [
+ 24,
+ 13
+ ],
+ [
+ 13,
+ 14
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 12,
+ -7
+ ],
+ [
+ 16,
+ -18
+ ],
+ [
+ 12,
+ -26
+ ],
+ [
+ 9,
+ -34
+ ],
+ [
+ 12,
+ -89
+ ],
+ [
+ 14,
+ -143
+ ],
+ [
+ 9,
+ -80
+ ],
+ [
+ 6,
+ -17
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ -12,
+ -112
+ ],
+ [
+ -10,
+ -46
+ ],
+ [
+ -17,
+ -27
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 0,
+ 27
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -9,
+ -10
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -8,
+ -8
+ ],
+ [
+ -5,
+ -20
+ ],
+ [
+ -3,
+ -31
+ ],
+ [
+ -3,
+ -19
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -16,
+ -11
+ ],
+ [
+ -8,
+ -10
+ ],
+ [
+ -7,
+ -15
+ ],
+ [
+ -6,
+ -23
+ ],
+ [
+ -6,
+ -33
+ ],
+ [
+ -2,
+ -25
+ ],
+ [
+ 2,
+ -14
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ -9,
+ -17
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -8,
+ -17
+ ],
+ [
+ -13,
+ -46
+ ],
+ [
+ -3,
+ -9
+ ]
+ ],
+ [
+ [
+ 6955,
+ 8570
+ ],
+ [
+ 23,
+ -6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 6,
+ -11
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -8,
+ 8
+ ],
+ [
+ -14,
+ 20
+ ],
+ [
+ 1,
+ 7
+ ]
+ ],
+ [
+ [
+ 7138,
+ 8647
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ -5,
+ -13
+ ],
+ [
+ -12,
+ -7
+ ],
+ [
+ -24,
+ 1
+ ],
+ [
+ -16,
+ 5
+ ],
+ [
+ -8,
+ 9
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 10,
+ 11
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 13,
+ -4
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 9,
+ -23
+ ],
+ [
+ 4,
+ -4
+ ]
+ ],
+ [
+ [
+ 7031,
+ 8741
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -9,
+ 15
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ -1,
+ -6
+ ]
+ ],
+ [
+ [
+ 7029,
+ 8788
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -5,
+ 24
+ ],
+ [
+ -7,
+ 17
+ ],
+ [
+ 11,
+ 20
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 1,
+ -12
+ ],
+ [
+ -5,
+ -18
+ ],
+ [
+ 1,
+ -19
+ ],
+ [
+ 5,
+ -19
+ ]
+ ],
+ [
+ [
+ 6427,
+ 8283
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ -7,
+ 16
+ ],
+ [
+ -4,
+ 16
+ ],
+ [
+ -1,
+ 17
+ ],
+ [
+ 10,
+ 41
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -13,
+ -7
+ ],
+ [
+ -13,
+ -2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 2,
+ 14
+ ],
+ [
+ 8,
+ 24
+ ],
+ [
+ 0,
+ 23
+ ],
+ [
+ 4,
+ 13
+ ],
+ [
+ -4,
+ 25
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ -5,
+ 13
+ ],
+ [
+ -15,
+ 17
+ ],
+ [
+ -33,
+ 23
+ ],
+ [
+ 3,
+ 25
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -8,
+ 16
+ ],
+ [
+ -35,
+ 19
+ ],
+ [
+ -24,
+ 8
+ ],
+ [
+ -24,
+ 1
+ ],
+ [
+ -17,
+ 6
+ ],
+ [
+ -19,
+ 3
+ ],
+ [
+ -12,
+ 11
+ ],
+ [
+ -12,
+ 11
+ ],
+ [
+ -13,
+ 12
+ ],
+ [
+ -12,
+ 11
+ ],
+ [
+ -21,
+ 10
+ ],
+ [
+ -22,
+ 9
+ ],
+ [
+ -22,
+ 10
+ ],
+ [
+ -21,
+ 10
+ ],
+ [
+ -22,
+ 9
+ ],
+ [
+ -22,
+ 10
+ ],
+ [
+ -21,
+ 10
+ ],
+ [
+ -22,
+ 9
+ ],
+ [
+ -5,
+ 17
+ ],
+ [
+ -5,
+ 17
+ ],
+ [
+ -4,
+ 17
+ ],
+ [
+ -5,
+ 17
+ ],
+ [
+ -10,
+ 7
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -4,
+ 15
+ ],
+ [
+ 1,
+ 3
+ ]
+ ],
+ [
+ [
+ 5942,
+ 8881
+ ],
+ [
+ 11,
+ 4
+ ],
+ [
+ 33,
+ 20
+ ],
+ [
+ 28,
+ 26
+ ],
+ [
+ 23,
+ 30
+ ],
+ [
+ 28,
+ 19
+ ],
+ [
+ 35,
+ 6
+ ],
+ [
+ 24,
+ 11
+ ],
+ [
+ 15,
+ 15
+ ],
+ [
+ 20,
+ 28
+ ],
+ [
+ 11,
+ 8
+ ],
+ [
+ 14,
+ 3
+ ],
+ [
+ 11,
+ 11
+ ],
+ [
+ 7,
+ 19
+ ],
+ [
+ 13,
+ 22
+ ],
+ [
+ 20,
+ 25
+ ],
+ [
+ 11,
+ 10
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -1,
+ -13
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ 11,
+ -8
+ ],
+ [
+ 5,
+ -11
+ ],
+ [
+ -1,
+ -13
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 6,
+ -9
+ ],
+ [
+ 2,
+ -20
+ ],
+ [
+ -3,
+ -31
+ ],
+ [
+ 0,
+ -20
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 5,
+ 11
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 29,
+ 31
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 10,
+ -8
+ ],
+ [
+ 43,
+ -12
+ ],
+ [
+ 18,
+ -8
+ ],
+ [
+ 18,
+ -17
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 22,
+ -58
+ ],
+ [
+ 10,
+ -22
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 3,
+ -21
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 33,
+ -4
+ ],
+ [
+ 14,
+ 3
+ ],
+ [
+ 9,
+ 9
+ ],
+ [
+ 10,
+ -6
+ ],
+ [
+ 11,
+ -18
+ ],
+ [
+ 11,
+ -6
+ ],
+ [
+ 11,
+ 9
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 9,
+ -9
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 19,
+ 29
+ ],
+ [
+ 22,
+ 26
+ ],
+ [
+ 29,
+ 27
+ ],
+ [
+ 18,
+ 13
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 28,
+ 10
+ ],
+ [
+ 24,
+ 1
+ ],
+ [
+ 33,
+ -6
+ ],
+ [
+ 30,
+ 6
+ ],
+ [
+ 28,
+ 19
+ ],
+ [
+ 25,
+ 10
+ ],
+ [
+ 21,
+ 2
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ -5,
+ -12
+ ],
+ [
+ -3,
+ -22
+ ],
+ [
+ 0,
+ -30
+ ],
+ [
+ -2,
+ -19
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 21,
+ -5
+ ],
+ [
+ 11,
+ -10
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 14,
+ 9
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 7,
+ -16
+ ],
+ [
+ 11,
+ -2
+ ],
+ [
+ 11,
+ 11
+ ],
+ [
+ 7,
+ 11
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 9,
+ -25
+ ],
+ [
+ 4,
+ -17
+ ],
+ [
+ 3,
+ -25
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 0,
+ -15
+ ],
+ [
+ -6,
+ -10
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 20,
+ -2
+ ],
+ [
+ 9,
+ -8
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ 16,
+ -17
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -63,
+ 16
+ ],
+ [
+ -19,
+ 2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -8,
+ -8
+ ],
+ [
+ -9,
+ -30
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -2,
+ -19
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -29,
+ 46
+ ],
+ [
+ -23,
+ 24
+ ],
+ [
+ -27,
+ 16
+ ],
+ [
+ -22,
+ 9
+ ],
+ [
+ -16,
+ -1
+ ],
+ [
+ -13,
+ -12
+ ],
+ [
+ -11,
+ -23
+ ],
+ [
+ -16,
+ -13
+ ],
+ [
+ -22,
+ -3
+ ],
+ [
+ -12,
+ -7
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -14,
+ 9
+ ],
+ [
+ -15,
+ 2
+ ],
+ [
+ -15,
+ -3
+ ],
+ [
+ -11,
+ -10
+ ],
+ [
+ -11,
+ -28
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -9,
+ -12
+ ],
+ [
+ -22,
+ -20
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -12,
+ -21
+ ],
+ [
+ -3,
+ -12
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -8,
+ 13
+ ],
+ [
+ 0,
+ 18
+ ],
+ [
+ 7,
+ 22
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 1,
+ 20
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -11,
+ -4
+ ],
+ [
+ -6,
+ -9
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -8,
+ -11
+ ],
+ [
+ -7,
+ -27
+ ],
+ [
+ -8,
+ -17
+ ],
+ [
+ -9,
+ -9
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ -3,
+ 27
+ ],
+ [
+ 0,
+ 21
+ ],
+ [
+ 3,
+ 26
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -6,
+ -21
+ ],
+ [
+ -7,
+ -46
+ ],
+ [
+ -5,
+ -15
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -11,
+ -28
+ ],
+ [
+ -15,
+ -50
+ ],
+ [
+ -17,
+ -48
+ ],
+ [
+ -18,
+ -47
+ ],
+ [
+ -12,
+ -25
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -1,
+ -19
+ ]
+ ],
+ [
+ [
+ 6321,
+ 9129
+ ],
+ [
+ -4,
+ -13
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -21,
+ -35
+ ],
+ [
+ -8,
+ -22
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -5,
+ 15
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 5,
+ 13
+ ],
+ [
+ 1,
+ 17
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -7,
+ -16
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -24,
+ 8
+ ],
+ [
+ -8,
+ 13
+ ],
+ [
+ 2,
+ 17
+ ],
+ [
+ 8,
+ 22
+ ],
+ [
+ 29,
+ 47
+ ],
+ [
+ 13,
+ 13
+ ],
+ [
+ 36,
+ 21
+ ],
+ [
+ 20,
+ 5
+ ],
+ [
+ 20,
+ 0
+ ],
+ [
+ 15,
+ -7
+ ],
+ [
+ 9,
+ -14
+ ],
+ [
+ -9,
+ -9
+ ],
+ [
+ -40,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 8,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -7,
+ -14
+ ],
+ [
+ -35,
+ -45
+ ]
+ ],
+ [
+ [
+ 6194,
+ 9418
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -19,
+ -13
+ ],
+ [
+ -13,
+ -4
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 6,
+ 12
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 8,
+ 9
+ ],
+ [
+ 68,
+ 61
+ ],
+ [
+ 29,
+ 22
+ ],
+ [
+ 16,
+ 7
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -17,
+ -23
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -5,
+ -12
+ ],
+ [
+ -50,
+ -42
+ ],
+ [
+ -7,
+ -4
+ ]
+ ],
+ [
+ [
+ 5648,
+ 8949
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -12,
+ -22
+ ],
+ [
+ -5,
+ -15
+ ],
+ [
+ -11,
+ -4
+ ],
+ [
+ 0,
+ -58
+ ],
+ [
+ 0,
+ -58
+ ],
+ [
+ 0,
+ -58
+ ],
+ [
+ -1,
+ -58
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -7,
+ -14
+ ],
+ [
+ -10,
+ -3
+ ],
+ [
+ -47,
+ -48
+ ],
+ [
+ -8,
+ -14
+ ],
+ [
+ -8,
+ -31
+ ],
+ [
+ -15,
+ -36
+ ],
+ [
+ -4,
+ -20
+ ],
+ [
+ 1,
+ -25
+ ],
+ [
+ 23,
+ -21
+ ],
+ [
+ 9,
+ -20
+ ],
+ [
+ 4,
+ -24
+ ],
+ [
+ -1,
+ -22
+ ],
+ [
+ -11,
+ -41
+ ],
+ [
+ -3,
+ -17
+ ],
+ [
+ 2,
+ -50
+ ],
+ [
+ -6,
+ -16
+ ],
+ [
+ 5,
+ -41
+ ],
+ [
+ 0,
+ -14
+ ],
+ [
+ -4,
+ -45
+ ],
+ [
+ -2,
+ -13
+ ],
+ [
+ 4,
+ -24
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 22,
+ -33
+ ],
+ [
+ 18,
+ -18
+ ],
+ [
+ 17,
+ -5
+ ],
+ [
+ 13,
+ -14
+ ],
+ [
+ 9,
+ -22
+ ],
+ [
+ 13,
+ -14
+ ],
+ [
+ 15,
+ -7
+ ],
+ [
+ 17,
+ -19
+ ],
+ [
+ 24,
+ -44
+ ],
+ [
+ 13,
+ -38
+ ],
+ [
+ 21,
+ -28
+ ],
+ [
+ 35,
+ -29
+ ],
+ [
+ 23,
+ -25
+ ],
+ [
+ 11,
+ -22
+ ],
+ [
+ 7,
+ -56
+ ],
+ [
+ 6,
+ -119
+ ]
+ ],
+ [
+ [
+ 4895,
+ 7636
+ ],
+ [
+ 0,
+ 90
+ ],
+ [
+ 0,
+ 90
+ ],
+ [
+ 0,
+ 91
+ ],
+ [
+ 0,
+ 90
+ ],
+ [
+ 0,
+ 91
+ ],
+ [
+ 0,
+ 90
+ ],
+ [
+ 0,
+ 90
+ ],
+ [
+ 0,
+ 91
+ ],
+ [
+ -14,
+ 30
+ ],
+ [
+ -28,
+ 24
+ ],
+ [
+ -7,
+ 15
+ ],
+ [
+ -14,
+ 36
+ ],
+ [
+ -5,
+ 15
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ 6,
+ 14
+ ],
+ [
+ 26,
+ 38
+ ],
+ [
+ 9,
+ 18
+ ],
+ [
+ 4,
+ 18
+ ],
+ [
+ 6,
+ 40
+ ]
+ ],
+ [
+ [
+ 4877,
+ 8619
+ ],
+ [
+ -3,
+ 31
+ ],
+ [
+ 2,
+ 48
+ ],
+ [
+ -5,
+ 36
+ ],
+ [
+ -1,
+ 17
+ ],
+ [
+ -4,
+ 23
+ ],
+ [
+ -19,
+ 58
+ ],
+ [
+ -5,
+ 48
+ ],
+ [
+ -5,
+ 23
+ ],
+ [
+ -2,
+ 60
+ ],
+ [
+ 1,
+ 17
+ ],
+ [
+ 4,
+ 32
+ ],
+ [
+ -8,
+ 22
+ ],
+ [
+ -2,
+ 18
+ ],
+ [
+ -4,
+ 143
+ ],
+ [
+ -2,
+ 20
+ ],
+ [
+ 1,
+ 67
+ ],
+ [
+ -16,
+ 69
+ ],
+ [
+ -7,
+ 24
+ ],
+ [
+ -4,
+ 29
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ -13,
+ 48
+ ],
+ [
+ -8,
+ 52
+ ],
+ [
+ 1,
+ 46
+ ],
+ [
+ -3,
+ 34
+ ],
+ [
+ 1,
+ 27
+ ],
+ [
+ -2,
+ 40
+ ],
+ [
+ 3,
+ 22
+ ],
+ [
+ 0,
+ 36
+ ],
+ [
+ -17,
+ 125
+ ]
+ ],
+ [
+ [
+ 4761,
+ 9847
+ ],
+ [
+ 21,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 40,
+ 0
+ ],
+ [
+ 1,
+ 85
+ ],
+ [
+ 1,
+ 67
+ ],
+ [
+ 37,
+ -8
+ ],
+ [
+ 11,
+ -12
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ -1,
+ -19
+ ],
+ [
+ 3,
+ -56
+ ],
+ [
+ 7,
+ -47
+ ],
+ [
+ 15,
+ -56
+ ],
+ [
+ 2,
+ -22
+ ],
+ [
+ 5,
+ -14
+ ],
+ [
+ 9,
+ -13
+ ],
+ [
+ 36,
+ -15
+ ],
+ [
+ 62,
+ -18
+ ],
+ [
+ 35,
+ -21
+ ],
+ [
+ 9,
+ -24
+ ],
+ [
+ 16,
+ -9
+ ],
+ [
+ 25,
+ 5
+ ],
+ [
+ 18,
+ 9
+ ],
+ [
+ 14,
+ 23
+ ],
+ [
+ 21,
+ 5
+ ],
+ [
+ 18,
+ -2
+ ],
+ [
+ 18,
+ -2
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 27,
+ -18
+ ],
+ [
+ 18,
+ -14
+ ],
+ [
+ 26,
+ -27
+ ],
+ [
+ 14,
+ -12
+ ],
+ [
+ 7,
+ -28
+ ],
+ [
+ 8,
+ -36
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 8,
+ 21
+ ],
+ [
+ 22,
+ 4
+ ],
+ [
+ 29,
+ -15
+ ],
+ [
+ 26,
+ -42
+ ],
+ [
+ 36,
+ -37
+ ],
+ [
+ 23,
+ -19
+ ],
+ [
+ 22,
+ 0
+ ],
+ [
+ 29,
+ 19
+ ],
+ [
+ 31,
+ 35
+ ],
+ [
+ 22,
+ 7
+ ],
+ [
+ 13,
+ -4
+ ],
+ [
+ 7,
+ -28
+ ],
+ [
+ 10,
+ -10
+ ],
+ [
+ 23,
+ 3
+ ],
+ [
+ 50,
+ -6
+ ],
+ [
+ 40,
+ 8
+ ],
+ [
+ 9,
+ -16
+ ],
+ [
+ 8,
+ -25
+ ],
+ [
+ 16,
+ -8
+ ],
+ [
+ 22,
+ 8
+ ],
+ [
+ 34,
+ -6
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -8,
+ -13
+ ],
+ [
+ -19,
+ -19
+ ],
+ [
+ -29,
+ -24
+ ],
+ [
+ -35,
+ -22
+ ],
+ [
+ -69,
+ -39
+ ],
+ [
+ -43,
+ -42
+ ],
+ [
+ -19,
+ -24
+ ],
+ [
+ -75,
+ -125
+ ],
+ [
+ -44,
+ -66
+ ],
+ [
+ -73,
+ -93
+ ],
+ [
+ -7,
+ -12
+ ],
+ [
+ 0,
+ -11
+ ]
+ ],
+ [
+ [
+ 6108,
+ 4816
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ]
+ ],
+ [
+ [
+ 6089,
+ 4816
+ ],
+ [
+ 3,
+ -30
+ ],
+ [
+ -2,
+ -21
+ ],
+ [
+ -9,
+ -9
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ 5,
+ -14
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -11
+ ],
+ [
+ 7,
+ -21
+ ],
+ [
+ -1,
+ -25
+ ],
+ [
+ -10,
+ -30
+ ],
+ [
+ -1,
+ -12
+ ]
+ ],
+ [
+ [
+ 5213,
+ 4816
+ ],
+ [
+ 0,
+ 51
+ ],
+ [
+ 0,
+ 50
+ ],
+ [
+ 0,
+ 50
+ ],
+ [
+ 0,
+ 51
+ ]
+ ],
+ [
+ [
+ 5086,
+ 6226
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -13,
+ 34
+ ],
+ [
+ -5,
+ 41
+ ],
+ [
+ -10,
+ 27
+ ],
+ [
+ -15,
+ 12
+ ],
+ [
+ -9,
+ 28
+ ],
+ [
+ -4,
+ 41
+ ],
+ [
+ -10,
+ 42
+ ],
+ [
+ -4,
+ 13
+ ]
+ ],
+ [
+ [
+ 6262,
+ 2285
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -15,
+ 8
+ ],
+ [
+ -9,
+ 8
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 26,
+ -14
+ ],
+ [
+ 2,
+ -5
+ ]
+ ],
+ [
+ [
+ 6290,
+ 2347
+ ],
+ [
+ -51,
+ -6
+ ],
+ [
+ -22,
+ 21
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -26,
+ -19
+ ],
+ [
+ -29,
+ -14
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -21,
+ -49
+ ],
+ [
+ -13,
+ -12
+ ]
+ ],
+ [
+ [
+ 5962,
+ 4212
+ ],
+ [
+ 44,
+ 0
+ ],
+ [
+ 46,
+ 0
+ ],
+ [
+ 46,
+ 0
+ ],
+ [
+ 46,
+ 0
+ ],
+ [
+ 46,
+ 0
+ ],
+ [
+ 46,
+ 0
+ ],
+ [
+ 46,
+ -1
+ ],
+ [
+ 47,
+ 0
+ ]
+ ],
+ [
+ [
+ 3586,
+ 8619
+ ],
+ [
+ 0,
+ -94
+ ],
+ [
+ 0,
+ -93
+ ],
+ [
+ 0,
+ -94
+ ],
+ [
+ 1,
+ -93
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 3581,
+ 8240
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -37,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ 0,
+ -51
+ ],
+ [
+ 0,
+ -51
+ ],
+ [
+ 0,
+ -50
+ ],
+ [
+ 0,
+ -51
+ ]
+ ],
+ [
+ [
+ 1500,
+ 9847
+ ],
+ [
+ 32,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 16,
+ 0
+ ],
+ [
+ 58,
+ 0
+ ],
+ [
+ 73,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 73,
+ 0
+ ],
+ [
+ 56,
+ 0
+ ],
+ [
+ 18,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 73,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 55,
+ 0
+ ]
+ ],
+ [
+ [
+ 3582,
+ 9847
+ ],
+ [
+ 0,
+ -76
+ ],
+ [
+ 0,
+ -77
+ ],
+ [
+ 0,
+ -77
+ ],
+ [
+ 1,
+ -76
+ ],
+ [
+ 0,
+ -77
+ ],
+ [
+ 0,
+ -77
+ ],
+ [
+ 0,
+ -77
+ ],
+ [
+ 1,
+ -77
+ ],
+ [
+ 0,
+ -76
+ ],
+ [
+ 0,
+ -77
+ ],
+ [
+ 0,
+ -77
+ ],
+ [
+ 1,
+ -77
+ ],
+ [
+ 0,
+ -77
+ ],
+ [
+ 0,
+ -76
+ ],
+ [
+ 0,
+ -77
+ ],
+ [
+ 1,
+ -77
+ ]
+ ],
+ [
+ [
+ 8343,
+ 4073
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -9,
+ 9
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 13,
+ -16
+ ]
+ ],
+ [
+ [
+ 8350,
+ 4068
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ 16,
+ 51
+ ],
+ [
+ 31,
+ 63
+ ],
+ [
+ 9,
+ 10
+ ],
+ [
+ -26,
+ -54
+ ],
+ [
+ -26,
+ -65
+ ]
+ ],
+ [
+ [
+ 8476,
+ 4288
+ ],
+ [
+ -32,
+ -28
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 21,
+ 21
+ ],
+ [
+ 15,
+ 6
+ ]
+ ],
+ [
+ [
+ 8517,
+ 4308
+ ],
+ [
+ -24,
+ -11
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 27,
+ 23
+ ],
+ [
+ 8,
+ 81
+ ],
+ [
+ 2,
+ 37
+ ],
+ [
+ -4,
+ 66
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ 4,
+ -22
+ ],
+ [
+ 4,
+ -61
+ ],
+ [
+ -2,
+ -47
+ ],
+ [
+ -7,
+ -67
+ ],
+ [
+ -6,
+ -17
+ ]
+ ],
+ [
+ [
+ 8501,
+ 4556
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -11,
+ 45
+ ],
+ [
+ 12,
+ -15
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ 0,
+ -10
+ ]
+ ],
+ [
+ [
+ 8457,
+ 4836
+ ],
+ [
+ 5,
+ 0
+ ]
+ ],
+ [
+ [
+ 8462,
+ 4836
+ ],
+ [
+ 18,
+ -129
+ ],
+ [
+ 34,
+ -141
+ ],
+ [
+ 4,
+ -24
+ ],
+ [
+ -8,
+ 21
+ ],
+ [
+ -25,
+ 93
+ ],
+ [
+ -14,
+ 68
+ ],
+ [
+ -14,
+ 112
+ ]
+ ],
+ [
+ [
+ 7994,
+ 3759
+ ],
+ [
+ -25,
+ 49
+ ],
+ [
+ -24,
+ 46
+ ],
+ [
+ -23,
+ 46
+ ],
+ [
+ -24,
+ 46
+ ],
+ [
+ -23,
+ 46
+ ],
+ [
+ -23,
+ 46
+ ],
+ [
+ -24,
+ 46
+ ],
+ [
+ -23,
+ 46
+ ],
+ [
+ -25,
+ 1
+ ],
+ [
+ -24,
+ 2
+ ],
+ [
+ -25,
+ 2
+ ],
+ [
+ -24,
+ 1
+ ],
+ [
+ -25,
+ 2
+ ],
+ [
+ -24,
+ 2
+ ],
+ [
+ -24,
+ 1
+ ],
+ [
+ -25,
+ 2
+ ],
+ [
+ -1,
+ 31
+ ],
+ [
+ -1,
+ 23
+ ],
+ [
+ -15,
+ 38
+ ],
+ [
+ -9,
+ 23
+ ],
+ [
+ -19,
+ -20
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 1,
+ 17
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -27,
+ 3
+ ],
+ [
+ -27,
+ 2
+ ],
+ [
+ -28,
+ 2
+ ],
+ [
+ -27,
+ 3
+ ],
+ [
+ -28,
+ 2
+ ],
+ [
+ -27,
+ 2
+ ],
+ [
+ -28,
+ 3
+ ],
+ [
+ -27,
+ 2
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -12,
+ -14
+ ],
+ [
+ -32,
+ -20
+ ],
+ [
+ -16,
+ -17
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -28,
+ -17
+ ],
+ [
+ -28,
+ -18
+ ],
+ [
+ -3,
+ 0
+ ]
+ ],
+ [
+ [
+ 6996,
+ 4207
+ ],
+ [
+ 6,
+ 86
+ ],
+ [
+ 5,
+ 19
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 18,
+ 0
+ ],
+ [
+ 11,
+ 10
+ ],
+ [
+ 10,
+ 52
+ ],
+ [
+ 23,
+ 40
+ ],
+ [
+ 11,
+ 10
+ ],
+ [
+ 15,
+ 8
+ ],
+ [
+ 37,
+ 10
+ ],
+ [
+ 39,
+ 39
+ ],
+ [
+ 28,
+ 38
+ ],
+ [
+ 23,
+ 10
+ ],
+ [
+ 7,
+ 14
+ ],
+ [
+ 5,
+ 18
+ ],
+ [
+ 3,
+ 24
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 13,
+ -2
+ ],
+ [
+ 10,
+ 21
+ ],
+ [
+ 9,
+ 12
+ ],
+ [
+ 10,
+ 7
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -18
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 8,
+ 12
+ ],
+ [
+ 19,
+ 36
+ ],
+ [
+ 12,
+ 13
+ ],
+ [
+ 20,
+ 8
+ ],
+ [
+ 14,
+ -19
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 25,
+ 74
+ ],
+ [
+ 10,
+ 13
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 12,
+ 1
+ ],
+ [
+ 1,
+ 20
+ ],
+ [
+ 4,
+ 31
+ ],
+ [
+ 1,
+ 21
+ ],
+ [
+ 7,
+ 30
+ ]
+ ],
+ [
+ [
+ 7457,
+ 4860
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 63,
+ -1
+ ],
+ [
+ 63,
+ -1
+ ],
+ [
+ 62,
+ -1
+ ],
+ [
+ 63,
+ -1
+ ],
+ [
+ 63,
+ -2
+ ],
+ [
+ 62,
+ -1
+ ],
+ [
+ 63,
+ -1
+ ],
+ [
+ 63,
+ -1
+ ],
+ [
+ 63,
+ -1
+ ],
+ [
+ 62,
+ -1
+ ],
+ [
+ 63,
+ -1
+ ],
+ [
+ 63,
+ -1
+ ],
+ [
+ 62,
+ -2
+ ],
+ [
+ 63,
+ -1
+ ],
+ [
+ 63,
+ -1
+ ],
+ [
+ 43,
+ 0
+ ]
+ ],
+ [
+ [
+ 8444,
+ 4837
+ ],
+ [
+ -5,
+ -32
+ ],
+ [
+ 2,
+ -18
+ ],
+ [
+ 10,
+ -18
+ ],
+ [
+ 10,
+ -47
+ ],
+ [
+ 8,
+ -62
+ ],
+ [
+ -11,
+ 25
+ ],
+ [
+ -12,
+ 14
+ ],
+ [
+ -18,
+ 10
+ ],
+ [
+ -16,
+ 18
+ ],
+ [
+ 1,
+ -26
+ ],
+ [
+ -1,
+ -28
+ ],
+ [
+ -13,
+ 9
+ ],
+ [
+ -8,
+ 9
+ ],
+ [
+ 7,
+ -30
+ ],
+ [
+ -16,
+ 9
+ ],
+ [
+ -11,
+ -2
+ ],
+ [
+ -7,
+ -26
+ ],
+ [
+ -9,
+ -16
+ ],
+ [
+ -14,
+ -5
+ ],
+ [
+ -21,
+ 24
+ ],
+ [
+ -7,
+ 29
+ ],
+ [
+ -2,
+ 33
+ ],
+ [
+ -1,
+ -39
+ ],
+ [
+ 3,
+ -40
+ ],
+ [
+ -1,
+ -31
+ ],
+ [
+ 20,
+ -5
+ ],
+ [
+ 19,
+ 5
+ ],
+ [
+ 25,
+ -1
+ ],
+ [
+ 16,
+ 5
+ ],
+ [
+ 10,
+ 10
+ ],
+ [
+ 24,
+ -8
+ ],
+ [
+ 1,
+ -37
+ ],
+ [
+ -2,
+ -37
+ ],
+ [
+ -2,
+ -39
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 8,
+ 13
+ ],
+ [
+ 3,
+ 70
+ ],
+ [
+ 22,
+ 25
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 7,
+ -23
+ ],
+ [
+ 3,
+ -23
+ ],
+ [
+ 2,
+ -31
+ ],
+ [
+ -5,
+ -48
+ ],
+ [
+ -33,
+ -56
+ ],
+ [
+ -24,
+ -51
+ ],
+ [
+ -12,
+ -11
+ ],
+ [
+ -18,
+ 6
+ ],
+ [
+ -20,
+ 13
+ ],
+ [
+ -10,
+ 3
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -5,
+ 16
+ ],
+ [
+ -2,
+ 29
+ ],
+ [
+ -8,
+ 9
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -4,
+ -31
+ ],
+ [
+ -19,
+ -8
+ ],
+ [
+ -25,
+ 12
+ ],
+ [
+ -26,
+ 26
+ ],
+ [
+ 11,
+ -28
+ ],
+ [
+ 66,
+ -51
+ ],
+ [
+ 7,
+ -10
+ ],
+ [
+ 7,
+ -14
+ ],
+ [
+ -9,
+ -23
+ ],
+ [
+ -7,
+ -25
+ ],
+ [
+ -2,
+ -19
+ ],
+ [
+ -2,
+ -13
+ ],
+ [
+ -26,
+ -33
+ ],
+ [
+ -14,
+ 6
+ ],
+ [
+ -37,
+ 60
+ ],
+ [
+ 17,
+ -52
+ ],
+ [
+ 13,
+ -22
+ ],
+ [
+ 27,
+ -12
+ ],
+ [
+ 50,
+ 19
+ ],
+ [
+ 16,
+ -21
+ ],
+ [
+ -13,
+ -38
+ ],
+ [
+ -14,
+ -26
+ ],
+ [
+ -17,
+ -3
+ ],
+ [
+ -16,
+ -7
+ ],
+ [
+ -4,
+ -18
+ ],
+ [
+ -11,
+ -1
+ ],
+ [
+ -17,
+ -1
+ ],
+ [
+ -27,
+ -2
+ ],
+ [
+ -15,
+ 4
+ ],
+ [
+ -20,
+ -37
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -11,
+ 7
+ ],
+ [
+ -4,
+ 30
+ ],
+ [
+ -5,
+ 14
+ ],
+ [
+ 0,
+ -56
+ ],
+ [
+ 2,
+ -15
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ -24,
+ -30
+ ],
+ [
+ -23,
+ -38
+ ],
+ [
+ -8,
+ -10
+ ],
+ [
+ -10,
+ -19
+ ],
+ [
+ -19,
+ -55
+ ],
+ [
+ -4,
+ -40
+ ],
+ [
+ -7,
+ -44
+ ],
+ [
+ -1,
+ 20
+ ],
+ [
+ 1,
+ 33
+ ],
+ [
+ -5,
+ 39
+ ],
+ [
+ -3,
+ -71
+ ],
+ [
+ -7,
+ -33
+ ],
+ [
+ -68,
+ 3
+ ],
+ [
+ -27,
+ -17
+ ]
+ ],
+ [
+ [
+ 4877,
+ 8619
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -41,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -41,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -41,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -41,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -41,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -41,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -41,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -41,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -41,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -41,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -41,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ],
+ [
+ -40,
+ 0
+ ]
+ ],
+ [
+ [
+ 3582,
+ 9847
+ ],
+ [
+ 18,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 73,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 73,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 53,
+ 0
+ ]
+ ],
+ [
+ [
+ 3584,
+ 6629
+ ],
+ [
+ 0,
+ 100
+ ],
+ [
+ -1,
+ 101
+ ],
+ [
+ 0,
+ 101
+ ],
+ [
+ 0,
+ 100
+ ],
+ [
+ 0,
+ 101
+ ],
+ [
+ 0,
+ 101
+ ],
+ [
+ 0,
+ 101
+ ],
+ [
+ -1,
+ 100
+ ]
+ ],
+ [
+ [
+ 3582,
+ 7434
+ ],
+ [
+ 60,
+ 0
+ ],
+ [
+ 60,
+ 0
+ ],
+ [
+ 60,
+ 0
+ ],
+ [
+ 60,
+ 0
+ ],
+ [
+ 60,
+ 0
+ ],
+ [
+ 60,
+ 0
+ ],
+ [
+ 60,
+ 0
+ ],
+ [
+ 60,
+ 0
+ ],
+ [
+ 60,
+ 0
+ ],
+ [
+ 60,
+ 0
+ ],
+ [
+ 60,
+ 0
+ ],
+ [
+ 60,
+ 0
+ ],
+ [
+ 60,
+ 0
+ ],
+ [
+ 60,
+ 0
+ ],
+ [
+ 60,
+ 0
+ ],
+ [
+ 68,
+ 0
+ ],
+ [
+ 52,
+ -60
+ ],
+ [
+ 31,
+ -19
+ ],
+ [
+ 14,
+ 18
+ ],
+ [
+ 32,
+ 10
+ ],
+ [
+ 49,
+ 3
+ ],
+ [
+ 31,
+ -8
+ ],
+ [
+ 13,
+ -20
+ ],
+ [
+ 25,
+ -21
+ ],
+ [
+ 37,
+ -24
+ ],
+ [
+ 22,
+ -25
+ ],
+ [
+ 8,
+ -28
+ ],
+ [
+ 13,
+ -18
+ ],
+ [
+ 13,
+ -5
+ ]
+ ],
+ [
+ [
+ 9350,
+ 7462
+ ],
+ [
+ -8,
+ -52
+ ],
+ [
+ -5,
+ -26
+ ]
+ ],
+ [
+ [
+ 9050,
+ 7325
+ ],
+ [
+ -3,
+ 15
+ ],
+ [
+ -10,
+ 25
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 6,
+ 32
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 4,
+ 19
+ ],
+ [
+ 6,
+ 75
+ ],
+ [
+ 5,
+ 43
+ ],
+ [
+ 4,
+ 80
+ ],
+ [
+ 4,
+ 23
+ ],
+ [
+ 4,
+ 14
+ ],
+ [
+ 7,
+ 38
+ ],
+ [
+ 13,
+ 30
+ ],
+ [
+ 9,
+ 38
+ ],
+ [
+ 10,
+ 32
+ ],
+ [
+ 1,
+ 20
+ ],
+ [
+ 8,
+ 41
+ ],
+ [
+ 5,
+ 75
+ ],
+ [
+ 5,
+ 11
+ ],
+ [
+ 24,
+ 10
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 25,
+ 31
+ ],
+ [
+ 7,
+ 12
+ ],
+ [
+ 5,
+ 13
+ ],
+ [
+ 4,
+ 21
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ -8,
+ 49
+ ],
+ [
+ -1,
+ 17
+ ],
+ [
+ 19,
+ 55
+ ],
+ [
+ -4,
+ 32
+ ],
+ [
+ 3,
+ 8
+ ]
+ ],
+ [
+ [
+ 9214,
+ 8242
+ ],
+ [
+ 17,
+ 78
+ ],
+ [
+ 16,
+ 36
+ ],
+ [
+ 22,
+ -12
+ ],
+ [
+ 12,
+ 1
+ ],
+ [
+ 8,
+ 13
+ ]
+ ],
+ [
+ [
+ 8761,
+ 6097
+ ],
+ [
+ -20,
+ -61
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ 26,
+ 75
+ ],
+ [
+ -5,
+ -26
+ ]
+ ],
+ [
+ [
+ 8598,
+ 6219
+ ],
+ [
+ 9,
+ 13
+ ],
+ [
+ 20,
+ 25
+ ],
+ [
+ 30,
+ 31
+ ],
+ [
+ -42,
+ 101
+ ],
+ [
+ -10,
+ 6
+ ],
+ [
+ -11,
+ 49
+ ],
+ [
+ -13,
+ 14
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 0,
+ 38
+ ],
+ [
+ 1,
+ 22
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 11,
+ 10
+ ],
+ [
+ 6,
+ 22
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ -8,
+ 35
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 16,
+ 21
+ ],
+ [
+ 20,
+ 42
+ ],
+ [
+ 12,
+ 45
+ ],
+ [
+ 5,
+ 14
+ ],
+ [
+ 6,
+ 9
+ ],
+ [
+ 14,
+ 13
+ ]
+ ],
+ [
+ [
+ 8663,
+ 6772
+ ],
+ [
+ 17,
+ -18
+ ],
+ [
+ 17,
+ -19
+ ],
+ [
+ 18,
+ -18
+ ],
+ [
+ 17,
+ -19
+ ],
+ [
+ 17,
+ -18
+ ],
+ [
+ 17,
+ -18
+ ],
+ [
+ 17,
+ -19
+ ],
+ [
+ 17,
+ -18
+ ]
+ ],
+ [
+ [
+ 8800,
+ 6625
+ ],
+ [
+ -3,
+ -31
+ ],
+ [
+ -17,
+ -64
+ ],
+ [
+ -7,
+ -15
+ ],
+ [
+ -9,
+ -13
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -6,
+ -11
+ ],
+ [
+ -7,
+ -16
+ ],
+ [
+ -7,
+ -32
+ ],
+ [
+ 4,
+ -29
+ ],
+ [
+ 34,
+ -10
+ ],
+ [
+ 8,
+ 9
+ ],
+ [
+ 5,
+ -21
+ ],
+ [
+ 3,
+ -29
+ ],
+ [
+ -3,
+ -32
+ ],
+ [
+ -6,
+ -32
+ ],
+ [
+ -4,
+ -39
+ ],
+ [
+ -3,
+ -61
+ ],
+ [
+ -6,
+ -54
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 3,
+ 66
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -4,
+ -15
+ ],
+ [
+ -10,
+ -86
+ ],
+ [
+ -14,
+ -45
+ ],
+ [
+ -13,
+ -31
+ ],
+ [
+ -13,
+ 5
+ ],
+ [
+ 3,
+ -25
+ ],
+ [
+ -4,
+ -13
+ ],
+ [
+ -3,
+ -27
+ ],
+ [
+ -8,
+ -18
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -11,
+ -12
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -1,
+ -19
+ ],
+ [
+ -7,
+ -16
+ ],
+ [
+ -25,
+ -83
+ ],
+ [
+ -23,
+ -24
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ 6,
+ 39
+ ],
+ [
+ 4,
+ 39
+ ],
+ [
+ -14,
+ 18
+ ],
+ [
+ -13,
+ 9
+ ],
+ [
+ -15,
+ -2
+ ],
+ [
+ -16,
+ 31
+ ],
+ [
+ -21,
+ 23
+ ],
+ [
+ -30,
+ 60
+ ],
+ [
+ 1,
+ 17
+ ],
+ [
+ -1,
+ 28
+ ],
+ [
+ 9,
+ 45
+ ],
+ [
+ 9,
+ 31
+ ],
+ [
+ 12,
+ 16
+ ],
+ [
+ 34,
+ 16
+ ],
+ [
+ 9,
+ 25
+ ],
+ [
+ 5,
+ 21
+ ]
+ ],
+ [
+ [
+ 3761,
+ 4816
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ 0,
+ -113
+ ],
+ [
+ 0,
+ -113
+ ],
+ [
+ 0,
+ -114
+ ],
+ [
+ -1,
+ -113
+ ],
+ [
+ 0,
+ -113
+ ],
+ [
+ 0,
+ -113
+ ],
+ [
+ 0,
+ -113
+ ],
+ [
+ -1,
+ -114
+ ],
+ [
+ 0,
+ -113
+ ],
+ [
+ 0,
+ -113
+ ],
+ [
+ 0,
+ -113
+ ],
+ [
+ -1,
+ -114
+ ],
+ [
+ 0,
+ -113
+ ],
+ [
+ 0,
+ -113
+ ],
+ [
+ 0,
+ -113
+ ],
+ [
+ -1,
+ -113
+ ],
+ [
+ -39,
+ 0
+ ],
+ [
+ -39,
+ 0
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -39,
+ -1
+ ],
+ [
+ -39,
+ 0
+ ],
+ [
+ -39,
+ 0
+ ],
+ [
+ -39,
+ 0
+ ],
+ [
+ -39,
+ 0
+ ],
+ [
+ -39,
+ 0
+ ],
+ [
+ -39,
+ 0
+ ],
+ [
+ -39,
+ 0
+ ],
+ [
+ -39,
+ 0
+ ],
+ [
+ -39,
+ 0
+ ],
+ [
+ -39,
+ 0
+ ],
+ [
+ -39,
+ 0
+ ],
+ [
+ -39,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 18,
+ -73
+ ],
+ [
+ 21,
+ -21
+ ]
+ ],
+ [
+ [
+ 3164,
+ 2910
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -39,
+ 0
+ ],
+ [
+ -38,
+ 1
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 1
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 1
+ ],
+ [
+ -38,
+ 0
+ ],
+ [
+ -38,
+ 1
+ ],
+ [
+ 0,
+ -46
+ ],
+ [
+ 0,
+ -45
+ ],
+ [
+ 0,
+ -45
+ ],
+ [
+ -1,
+ -46
+ ],
+ [
+ -61,
+ 0
+ ],
+ [
+ -61,
+ 0
+ ],
+ [
+ -22,
+ 0
+ ]
+ ],
+ [
+ [
+ 3761,
+ 5018
+ ],
+ [
+ 0,
+ -51
+ ],
+ [
+ 0,
+ -50
+ ],
+ [
+ 0,
+ -50
+ ],
+ [
+ 0,
+ -51
+ ]
+ ],
+ [
+ [
+ 816,
+ 7031
+ ],
+ [
+ 64,
+ 0
+ ],
+ [
+ 65,
+ 0
+ ],
+ [
+ 65,
+ 0
+ ],
+ [
+ 64,
+ 0
+ ],
+ [
+ 65,
+ 0
+ ],
+ [
+ 64,
+ 0
+ ],
+ [
+ 65,
+ 0
+ ],
+ [
+ 65,
+ 0
+ ]
+ ],
+ [
+ [
+ 1848,
+ 7031
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -62
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -62
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -62
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -62
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ],
+ [
+ 0,
+ -63
+ ]
+ ],
+ [
+ [
+ 8752,
+ 6436
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ 9,
+ 39
+ ],
+ [
+ 15,
+ 18
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 1,
+ -14
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ -10,
+ -18
+ ],
+ [
+ -8,
+ -8
+ ]
+ ],
+ [
+ [
+ 9042,
+ 6623
+ ],
+ [
+ -12,
+ -26
+ ],
+ [
+ 11,
+ -3
+ ],
+ [
+ 10,
+ 8
+ ],
+ [
+ 9,
+ 15
+ ],
+ [
+ 21,
+ 21
+ ],
+ [
+ 18,
+ 9
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 9,
+ -15
+ ],
+ [
+ 17,
+ 12
+ ],
+ [
+ 17,
+ 7
+ ],
+ [
+ -75,
+ -67
+ ],
+ [
+ -16,
+ -8
+ ],
+ [
+ -22,
+ -20
+ ],
+ [
+ -20,
+ -14
+ ],
+ [
+ -16,
+ -5
+ ],
+ [
+ -74,
+ -50
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -61,
+ -26
+ ],
+ [
+ -25,
+ -3
+ ],
+ [
+ -23,
+ -9
+ ],
+ [
+ 17,
+ 21
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -10,
+ -21
+ ],
+ [
+ -14,
+ -7
+ ],
+ [
+ -3,
+ 23
+ ],
+ [
+ 5,
+ 18
+ ],
+ [
+ 6,
+ 17
+ ],
+ [
+ 15,
+ 26
+ ],
+ [
+ 21,
+ 17
+ ],
+ [
+ 11,
+ 15
+ ],
+ [
+ 7,
+ -13
+ ],
+ [
+ 2,
+ 17
+ ],
+ [
+ 6,
+ 10
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 15,
+ 0
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 16,
+ -8
+ ],
+ [
+ 16,
+ 2
+ ],
+ [
+ 13,
+ 11
+ ],
+ [
+ 14,
+ 3
+ ],
+ [
+ 35,
+ 3
+ ],
+ [
+ 35,
+ 8
+ ],
+ [
+ 14,
+ 14
+ ],
+ [
+ 30,
+ 40
+ ],
+ [
+ 17,
+ 11
+ ],
+ [
+ -26,
+ -46
+ ],
+ [
+ -15,
+ -21
+ ]
+ ],
+ [
+ [
+ 7930,
+ 7443
+ ],
+ [
+ -5,
+ -14
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 13,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -8
+ ]
+ ],
+ [
+ [
+ 8392,
+ 7832
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -6,
+ -12
+ ]
+ ],
+ [
+ [
+ 8418,
+ 7948
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -6,
+ -7
+ ]
+ ],
+ [
+ [
+ 8896,
+ 8241
+ ],
+ [
+ 2,
+ -26
+ ],
+ [
+ -4,
+ -32
+ ],
+ [
+ 3,
+ -34
+ ],
+ [
+ -4,
+ -72
+ ],
+ [
+ 11,
+ -55
+ ],
+ [
+ -3,
+ -37
+ ],
+ [
+ 1,
+ -40
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -9,
+ -23
+ ],
+ [
+ -5,
+ -23
+ ],
+ [
+ -2,
+ -22
+ ],
+ [
+ 0,
+ -15
+ ],
+ [
+ 7,
+ -66
+ ],
+ [
+ 1,
+ -28
+ ],
+ [
+ 0,
+ -17
+ ],
+ [
+ -6,
+ -54
+ ],
+ [
+ -1,
+ -16
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ 17
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 11,
+ -26
+ ],
+ [
+ -1,
+ -45
+ ],
+ [
+ 0,
+ -33
+ ],
+ [
+ -1,
+ -37
+ ],
+ [
+ 0,
+ -56
+ ],
+ [
+ -1,
+ -40
+ ],
+ [
+ 0,
+ -37
+ ],
+ [
+ -1,
+ -29
+ ],
+ [
+ -2,
+ -21
+ ],
+ [
+ 5,
+ -24
+ ]
+ ],
+ [
+ [
+ 8848,
+ 6625
+ ],
+ [
+ -7,
+ -11
+ ],
+ [
+ -19,
+ -35
+ ],
+ [
+ -12,
+ -19
+ ],
+ [
+ -10,
+ -6
+ ],
+ [
+ -7,
+ -16
+ ],
+ [
+ -7,
+ -10
+ ],
+ [
+ 7,
+ 35
+ ],
+ [
+ 7,
+ 30
+ ],
+ [
+ 6,
+ 57
+ ],
+ [
+ -1,
+ 47
+ ],
+ [
+ -8,
+ 19
+ ],
+ [
+ -8,
+ 13
+ ],
+ [
+ 9,
+ -46
+ ],
+ [
+ 2,
+ -56
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 8663,
+ 6772
+ ],
+ [
+ -4,
+ 15
+ ],
+ [
+ -6,
+ 12
+ ],
+ [
+ -31,
+ 20
+ ],
+ [
+ -8,
+ 14
+ ],
+ [
+ -7,
+ 18
+ ],
+ [
+ -5,
+ 22
+ ],
+ [
+ -3,
+ 24
+ ],
+ [
+ 0,
+ 18
+ ],
+ [
+ 3,
+ 21
+ ],
+ [
+ -7,
+ 14
+ ],
+ [
+ -1,
+ 13
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ -20,
+ 16
+ ],
+ [
+ -6,
+ 21
+ ],
+ [
+ -14,
+ 21
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -23,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 1
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -23,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -23,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -23,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ 0,
+ 55
+ ],
+ [
+ 0,
+ 54
+ ],
+ [
+ 0,
+ 2
+ ]
+ ],
+ [
+ [
+ 7786,
+ 7142
+ ],
+ [
+ 10,
+ 10
+ ],
+ [
+ 33,
+ 36
+ ],
+ [
+ 17,
+ 27
+ ],
+ [
+ 17,
+ 22
+ ],
+ [
+ 19,
+ 18
+ ],
+ [
+ 14,
+ 22
+ ],
+ [
+ 11,
+ 28
+ ],
+ [
+ 12,
+ 20
+ ],
+ [
+ 13,
+ 14
+ ],
+ [
+ 7,
+ 14
+ ],
+ [
+ 1,
+ 15
+ ],
+ [
+ -2,
+ 20
+ ],
+ [
+ -6,
+ 25
+ ],
+ [
+ -1,
+ 20
+ ],
+ [
+ 4,
+ 14
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -27,
+ 14
+ ],
+ [
+ 1,
+ 70
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 63,
+ 31
+ ],
+ [
+ 40,
+ 11
+ ],
+ [
+ 49,
+ 3
+ ],
+ [
+ 58,
+ -16
+ ],
+ [
+ 23,
+ -13
+ ],
+ [
+ 14,
+ -18
+ ],
+ [
+ 17,
+ -5
+ ],
+ [
+ 19,
+ 9
+ ],
+ [
+ 26,
+ 2
+ ],
+ [
+ 33,
+ -2
+ ],
+ [
+ 18,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 9,
+ 10
+ ],
+ [
+ 25,
+ 15
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 7,
+ 18
+ ],
+ [
+ 12,
+ 19
+ ],
+ [
+ 19,
+ 22
+ ],
+ [
+ 17,
+ 11
+ ],
+ [
+ 15,
+ 1
+ ],
+ [
+ 10,
+ 5
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 35
+ ],
+ [
+ -3,
+ 16
+ ],
+ [
+ -4,
+ 13
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 9,
+ 10
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 10,
+ 21
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 5,
+ 13
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -13,
+ -4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 7,
+ 17
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -15,
+ -15
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -7,
+ 17
+ ],
+ [
+ 20,
+ 31
+ ],
+ [
+ 70,
+ 86
+ ],
+ [
+ 7,
+ 14
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 67,
+ 110
+ ],
+ [
+ 39,
+ 52
+ ],
+ [
+ 32,
+ 28
+ ],
+ [
+ 24,
+ 14
+ ],
+ [
+ 16,
+ -2
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 41,
+ 0
+ ],
+ [
+ 72,
+ 0
+ ],
+ [
+ 72,
+ 0
+ ],
+ [
+ 42,
+ 0
+ ]
+ ],
+ [
+ [
+ 7655,
+ 6486
+ ],
+ [
+ -21,
+ -18
+ ],
+ [
+ -3,
+ -16
+ ],
+ [
+ 6,
+ -21
+ ],
+ [
+ 3,
+ -26
+ ],
+ [
+ 1,
+ -33
+ ],
+ [
+ -12,
+ -72
+ ],
+ [
+ -23,
+ -111
+ ],
+ [
+ -12,
+ -70
+ ],
+ [
+ -1,
+ -29
+ ],
+ [
+ -15,
+ -37
+ ],
+ [
+ -30,
+ -47
+ ],
+ [
+ -22,
+ -28
+ ],
+ [
+ -12,
+ -9
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -9,
+ 11
+ ],
+ [
+ -9,
+ -8
+ ],
+ [
+ -10,
+ -26
+ ],
+ [
+ -9,
+ -14
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -8,
+ -17
+ ],
+ [
+ -6,
+ -33
+ ],
+ [
+ -6,
+ -19
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -1,
+ -17
+ ],
+ [
+ 5,
+ -28
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -6,
+ -16
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 21
+ ],
+ [
+ -6,
+ 14
+ ],
+ [
+ -9,
+ 9
+ ],
+ [
+ -12,
+ -19
+ ],
+ [
+ -16,
+ -48
+ ],
+ [
+ -7,
+ -31
+ ],
+ [
+ 3,
+ -21
+ ],
+ [
+ 1,
+ -31
+ ],
+ [
+ -4,
+ -13
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -7,
+ -17
+ ],
+ [
+ -5,
+ -29
+ ],
+ [
+ -12,
+ -18
+ ],
+ [
+ -19,
+ -8
+ ],
+ [
+ -20,
+ 13
+ ]
+ ],
+ [
+ [
+ 7146,
+ 6928
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 16,
+ -4
+ ],
+ [
+ 11,
+ -9
+ ],
+ [
+ 8,
+ -12
+ ],
+ [
+ 30,
+ -25
+ ],
+ [
+ 9,
+ -15
+ ],
+ [
+ 10,
+ -9
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ -10
+ ],
+ [
+ 17,
+ -11
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -47,
+ -18
+ ],
+ [
+ -10,
+ -9
+ ],
+ [
+ 12,
+ -6
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 12,
+ 9
+ ],
+ [
+ 14,
+ -1
+ ],
+ [
+ 12,
+ -4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 21,
+ -24
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 8,
+ 9
+ ],
+ [
+ 18,
+ 12
+ ],
+ [
+ 28,
+ 15
+ ],
+ [
+ 27,
+ 6
+ ],
+ [
+ 26,
+ -3
+ ],
+ [
+ 16,
+ 4
+ ],
+ [
+ 15,
+ 15
+ ],
+ [
+ 33,
+ 50
+ ],
+ [
+ 38,
+ 39
+ ],
+ [
+ 62,
+ 50
+ ],
+ [
+ 61,
+ 39
+ ]
+ ],
+ [
+ [
+ 7655,
+ 7027
+ ],
+ [
+ 0,
+ -34
+ ],
+ [
+ 0,
+ -42
+ ],
+ [
+ 0,
+ -42
+ ],
+ [
+ 0,
+ -43
+ ],
+ [
+ 0,
+ -42
+ ],
+ [
+ 0,
+ -42
+ ],
+ [
+ 0,
+ -42
+ ],
+ [
+ 0,
+ -43
+ ],
+ [
+ 0,
+ -42
+ ],
+ [
+ 0,
+ -42
+ ],
+ [
+ 0,
+ -42
+ ],
+ [
+ 0,
+ -42
+ ],
+ [
+ 0,
+ -43
+ ]
+ ],
+ [
+ [
+ 5236,
+ 3667
+ ],
+ [
+ -39,
+ 21
+ ],
+ [
+ -10,
+ 13
+ ],
+ [
+ -18,
+ 15
+ ],
+ [
+ -16,
+ 30
+ ],
+ [
+ -32,
+ 37
+ ],
+ [
+ -12,
+ 9
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -6,
+ -18
+ ],
+ [
+ -17,
+ -15
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -16,
+ 5
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -25,
+ -16
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ -14,
+ 0
+ ],
+ [
+ -14,
+ 8
+ ],
+ [
+ -34,
+ -25
+ ],
+ [
+ -12,
+ -19
+ ],
+ [
+ -12,
+ -7
+ ],
+ [
+ -6,
+ -18
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -13,
+ 23
+ ],
+ [
+ -13,
+ 7
+ ],
+ [
+ -18,
+ 23
+ ],
+ [
+ -1,
+ 20
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -8,
+ -17
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -18,
+ 12
+ ],
+ [
+ -7,
+ 21
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -4,
+ -23
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ -6,
+ -32
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ 3,
+ 25
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -9,
+ -12
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -10,
+ -11
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -9,
+ 19
+ ],
+ [
+ -16,
+ 12
+ ],
+ [
+ -6,
+ 23
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -18,
+ -30
+ ],
+ [
+ -8,
+ -9
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -1,
+ 29
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ -16,
+ 19
+ ],
+ [
+ -4,
+ 18
+ ],
+ [
+ -1,
+ 24
+ ],
+ [
+ -20,
+ -3
+ ],
+ [
+ -25,
+ 2
+ ],
+ [
+ -11,
+ -22
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -20,
+ 29
+ ],
+ [
+ -21,
+ -6
+ ],
+ [
+ -12,
+ 3
+ ],
+ [
+ -29,
+ 22
+ ],
+ [
+ -23,
+ 2
+ ],
+ [
+ -10,
+ 4
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -2,
+ 33
+ ],
+ [
+ -9,
+ 28
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -16,
+ 20
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ -22
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -18,
+ 6
+ ],
+ [
+ -17,
+ -7
+ ],
+ [
+ -9,
+ 11
+ ],
+ [
+ -32,
+ 52
+ ],
+ [
+ -12,
+ 13
+ ],
+ [
+ -11,
+ 4
+ ],
+ [
+ 0,
+ 48
+ ],
+ [
+ 0,
+ 49
+ ],
+ [
+ 0,
+ 48
+ ],
+ [
+ 0,
+ 48
+ ],
+ [
+ 0,
+ 48
+ ],
+ [
+ 0,
+ 48
+ ],
+ [
+ 0,
+ 49
+ ],
+ [
+ 0,
+ 48
+ ],
+ [
+ 0,
+ 48
+ ],
+ [
+ 0,
+ 48
+ ],
+ [
+ 0,
+ 48
+ ],
+ [
+ 0,
+ 48
+ ],
+ [
+ 0,
+ 49
+ ],
+ [
+ 0,
+ 48
+ ],
+ [
+ 0,
+ 48
+ ],
+ [
+ 0,
+ 48
+ ],
+ [
+ -33,
+ 0
+ ],
+ [
+ -32,
+ 0
+ ],
+ [
+ -32,
+ 0
+ ],
+ [
+ -33,
+ 0
+ ],
+ [
+ -32,
+ 0
+ ],
+ [
+ -33,
+ 0
+ ],
+ [
+ -32,
+ 0
+ ],
+ [
+ -33,
+ 0
+ ],
+ [
+ -32,
+ 0
+ ],
+ [
+ -33,
+ 0
+ ],
+ [
+ -32,
+ 0
+ ],
+ [
+ -33,
+ 0
+ ],
+ [
+ -32,
+ 0
+ ],
+ [
+ -32,
+ 0
+ ],
+ [
+ -33,
+ 0
+ ],
+ [
+ -32,
+ 0
+ ]
+ ],
+ [
+ [
+ 258,
+ 8704
+ ],
+ [
+ 17,
+ 10
+ ],
+ [
+ 14,
+ -8
+ ],
+ [
+ 17,
+ -18
+ ],
+ [
+ 17,
+ -55
+ ],
+ [
+ 17,
+ -92
+ ],
+ [
+ 4,
+ -30
+ ],
+ [
+ 13,
+ -19
+ ],
+ [
+ 15,
+ -1
+ ],
+ [
+ 62,
+ -14
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 12,
+ 4
+ ],
+ [
+ 35,
+ 35
+ ],
+ [
+ 38,
+ 11
+ ],
+ [
+ 45,
+ -2
+ ],
+ [
+ 28,
+ -10
+ ],
+ [
+ 10,
+ -18
+ ],
+ [
+ 24,
+ -1
+ ],
+ [
+ 57,
+ 20
+ ],
+ [
+ 63,
+ 14
+ ],
+ [
+ 34,
+ 15
+ ],
+ [
+ 38,
+ 31
+ ],
+ [
+ 88,
+ 38
+ ],
+ [
+ 43,
+ 5
+ ],
+ [
+ 22,
+ 14
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 46,
+ 0
+ ],
+ [
+ 46,
+ 0
+ ],
+ [
+ 46,
+ 0
+ ],
+ [
+ 46,
+ 1
+ ],
+ [
+ 46,
+ 0
+ ],
+ [
+ 46,
+ 0
+ ],
+ [
+ 46,
+ 0
+ ],
+ [
+ 42,
+ 0
+ ]
+ ],
+ [
+ [
+ 83,
+ 7031
+ ],
+ [
+ -22,
+ 49
+ ],
+ [
+ -9,
+ 74
+ ],
+ [
+ -2,
+ 30
+ ],
+ [
+ 3,
+ 82
+ ],
+ [
+ -7,
+ 35
+ ],
+ [
+ -16,
+ 57
+ ],
+ [
+ 7,
+ 50
+ ],
+ [
+ 7,
+ 31
+ ],
+ [
+ 19,
+ 132
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 14,
+ 22
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -10,
+ -10
+ ],
+ [
+ 9,
+ 52
+ ],
+ [
+ 9,
+ 45
+ ],
+ [
+ 6,
+ 16
+ ],
+ [
+ 3,
+ 147
+ ],
+ [
+ 6,
+ 112
+ ],
+ [
+ 9,
+ 37
+ ],
+ [
+ -3,
+ 38
+ ],
+ [
+ 3,
+ 51
+ ],
+ [
+ -2,
+ 53
+ ],
+ [
+ 19,
+ 251
+ ],
+ [
+ -3,
+ 30
+ ],
+ [
+ 6,
+ 41
+ ],
+ [
+ -5,
+ 107
+ ],
+ [
+ 2,
+ 120
+ ],
+ [
+ -5,
+ 15
+ ],
+ [
+ -2,
+ 16
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 9,
+ -18
+ ],
+ [
+ 42,
+ 0
+ ],
+ [
+ 26,
+ 17
+ ],
+ [
+ 9,
+ -6
+ ],
+ [
+ 12,
+ -22
+ ],
+ [
+ 14,
+ -4
+ ],
+ [
+ 17,
+ 4
+ ]
+ ],
+ [
+ [
+ 8598,
+ 6219
+ ],
+ [
+ -17,
+ -36
+ ],
+ [
+ -26,
+ -12
+ ],
+ [
+ -13,
+ -13
+ ],
+ [
+ -4,
+ -7
+ ]
+ ],
+ [
+ [
+ 7835,
+ 6114
+ ],
+ [
+ -22,
+ 0
+ ],
+ [
+ -23,
+ 0
+ ],
+ [
+ -22,
+ 0
+ ],
+ [
+ -23,
+ 0
+ ],
+ [
+ -22,
+ 0
+ ],
+ [
+ -23,
+ 0
+ ],
+ [
+ -23,
+ 0
+ ],
+ [
+ -22,
+ 0
+ ],
+ [
+ 0,
+ 46
+ ],
+ [
+ 0,
+ 47
+ ],
+ [
+ 0,
+ 46
+ ],
+ [
+ 0,
+ 47
+ ],
+ [
+ 0,
+ 47
+ ],
+ [
+ 0,
+ 46
+ ],
+ [
+ 0,
+ 47
+ ],
+ [
+ 0,
+ 46
+ ]
+ ],
+ [
+ [
+ 7655,
+ 7027
+ ],
+ [
+ 32,
+ 20
+ ],
+ [
+ 14,
+ 14
+ ],
+ [
+ 15,
+ 14
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 9,
+ 7
+ ],
+ [
+ 54,
+ 52
+ ]
+ ],
+ [
+ [
+ 9241,
+ 6824
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -2,
+ 20
+ ],
+ [
+ 3,
+ 22
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ -1,
+ -23
+ ]
+ ],
+ [
+ [
+ 9262,
+ 6826
+ ],
+ [
+ -9,
+ -11
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ 5,
+ 15
+ ],
+ [
+ 2,
+ 22
+ ],
+ [
+ 4,
+ 24
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ -2,
+ -66
+ ]
+ ],
+ [
+ [
+ 9263,
+ 6913
+ ],
+ [
+ -6,
+ -10
+ ],
+ [
+ -7,
+ 15
+ ],
+ [
+ -3,
+ 17
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ 5,
+ -38
+ ],
+ [
+ -11,
+ -28
+ ],
+ [
+ -3,
+ -72
+ ],
+ [
+ -14,
+ -30
+ ],
+ [
+ -42,
+ -20
+ ],
+ [
+ -13,
+ 2
+ ]
+ ],
+ [
+ [
+ 7994,
+ 3759
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -45,
+ -60
+ ],
+ [
+ -14,
+ -26
+ ],
+ [
+ -38,
+ -102
+ ],
+ [
+ -10,
+ -65
+ ],
+ [
+ -7,
+ 27
+ ],
+ [
+ 2,
+ 21
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ -10,
+ -36
+ ],
+ [
+ 9,
+ -52
+ ],
+ [
+ -8,
+ -20
+ ],
+ [
+ -25,
+ -38
+ ],
+ [
+ -13,
+ -6
+ ],
+ [
+ -16,
+ -10
+ ],
+ [
+ -4,
+ -37
+ ],
+ [
+ -21,
+ -34
+ ],
+ [
+ -12,
+ -15
+ ],
+ [
+ -23,
+ 9
+ ],
+ [
+ 7,
+ -33
+ ],
+ [
+ -8,
+ -25
+ ],
+ [
+ -14,
+ -19
+ ],
+ [
+ -17,
+ -12
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -9,
+ -6
+ ],
+ [
+ -7,
+ -16
+ ],
+ [
+ -16,
+ -15
+ ],
+ [
+ -17,
+ 8
+ ],
+ [
+ -19,
+ 5
+ ],
+ [
+ -11,
+ -8
+ ],
+ [
+ 18,
+ -15
+ ],
+ [
+ 10,
+ -21
+ ],
+ [
+ -2,
+ -29
+ ],
+ [
+ -5,
+ -11
+ ],
+ [
+ -12,
+ -15
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ 14
+ ],
+ [
+ -3,
+ 28
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -16,
+ 45
+ ],
+ [
+ 1,
+ -34
+ ],
+ [
+ 5,
+ -26
+ ],
+ [
+ 6,
+ -14
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ -11,
+ -29
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -10,
+ -5
+ ],
+ [
+ -6,
+ -18
+ ],
+ [
+ 2,
+ -16
+ ]
+ ],
+ [
+ [
+ 3582,
+ 7434
+ ],
+ [
+ 0,
+ 101
+ ],
+ [
+ 0,
+ 101
+ ],
+ [
+ 0,
+ 100
+ ],
+ [
+ 0,
+ 101
+ ],
+ [
+ 0,
+ 101
+ ],
+ [
+ -1,
+ 100
+ ],
+ [
+ 0,
+ 101
+ ],
+ [
+ 0,
+ 101
+ ]
+ ],
+ [
+ [
+ 7110,
+ 4858
+ ],
+ [
+ 39,
+ 0
+ ],
+ [
+ 84,
+ -1
+ ],
+ [
+ 59,
+ -1
+ ],
+ [
+ 49,
+ 0
+ ],
+ [
+ 29,
+ 0
+ ],
+ [
+ 37,
+ -1
+ ],
+ [
+ 8,
+ 9
+ ],
+ [
+ 18,
+ -2
+ ],
+ [
+ 24,
+ -2
+ ]
+ ],
+ [
+ [
+ 4770,
+ 651
+ ],
+ [
+ -2,
+ -18
+ ],
+ [
+ -14,
+ 87
+ ],
+ [
+ -24,
+ 198
+ ],
+ [
+ 0,
+ 112
+ ],
+ [
+ 3,
+ 39
+ ],
+ [
+ 6,
+ -159
+ ],
+ [
+ 26,
+ -202
+ ],
+ [
+ 5,
+ -57
+ ]
+ ],
+ [
+ [
+ 4739,
+ 1111
+ ],
+ [
+ -6,
+ -24
+ ],
+ [
+ 2,
+ 35
+ ],
+ [
+ 14,
+ 78
+ ],
+ [
+ 29,
+ 104
+ ],
+ [
+ 12,
+ 17
+ ],
+ [
+ -33,
+ -113
+ ],
+ [
+ -18,
+ -97
+ ]
+ ],
+ [
+ [
+ 4798,
+ 1353
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ 8,
+ 33
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 13,
+ 42
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 3,
+ -18
+ ],
+ [
+ -14,
+ -29
+ ],
+ [
+ -16,
+ -46
+ ]
+ ],
+ [
+ [
+ 4841,
+ 1454
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ 8,
+ 22
+ ],
+ [
+ 13,
+ 11
+ ],
+ [
+ 28,
+ 42
+ ],
+ [
+ 12,
+ 3
+ ],
+ [
+ 6,
+ 14
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ -17
+ ],
+ [
+ -23,
+ -25
+ ],
+ [
+ -38,
+ -50
+ ]
+ ],
+ [
+ [
+ 5140,
+ 1854
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ 38,
+ 62
+ ],
+ [
+ 8,
+ 21
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ -17,
+ -35
+ ],
+ [
+ -30,
+ -43
+ ]
+ ],
+ [
+ [
+ 5355,
+ 2189
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -18,
+ -66
+ ],
+ [
+ 10,
+ -38
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ -37,
+ -8
+ ],
+ [
+ -82,
+ -75
+ ],
+ [
+ -32,
+ -40
+ ],
+ [
+ 2,
+ 14
+ ],
+ [
+ 39,
+ 52
+ ],
+ [
+ -14,
+ 8
+ ],
+ [
+ -22,
+ -13
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ 9,
+ 43
+ ],
+ [
+ -3,
+ 38
+ ],
+ [
+ -15,
+ 1
+ ],
+ [
+ -10,
+ -30
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -9,
+ 13
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ 5,
+ -69
+ ],
+ [
+ 10,
+ -28
+ ],
+ [
+ 8,
+ -36
+ ],
+ [
+ -23,
+ -45
+ ],
+ [
+ -21,
+ -37
+ ],
+ [
+ -2,
+ -36
+ ],
+ [
+ -21,
+ -46
+ ],
+ [
+ -20,
+ -27
+ ],
+ [
+ -46,
+ -62
+ ],
+ [
+ -13,
+ -13
+ ],
+ [
+ -21,
+ -29
+ ],
+ [
+ -29,
+ -21
+ ],
+ [
+ -28,
+ -34
+ ],
+ [
+ -9,
+ -6
+ ],
+ [
+ 17,
+ 29
+ ],
+ [
+ 21,
+ 29
+ ],
+ [
+ -18,
+ -4
+ ],
+ [
+ -27,
+ 13
+ ],
+ [
+ -17,
+ 1
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -12,
+ -15
+ ],
+ [
+ -14,
+ 22
+ ],
+ [
+ -6,
+ 14
+ ],
+ [
+ -2,
+ 13
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ 20,
+ -89
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 9,
+ -9
+ ],
+ [
+ -11,
+ -21
+ ],
+ [
+ -13,
+ -16
+ ],
+ [
+ -20,
+ -10
+ ],
+ [
+ -17,
+ 32
+ ],
+ [
+ -3,
+ -40
+ ],
+ [
+ -3,
+ -41
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -9,
+ -15
+ ],
+ [
+ -5,
+ 11
+ ],
+ [
+ -2,
+ 16
+ ],
+ [
+ -6,
+ -14
+ ],
+ [
+ -9,
+ -11
+ ],
+ [
+ -14,
+ -2
+ ],
+ [
+ -10,
+ -5
+ ],
+ [
+ 0,
+ -17
+ ],
+ [
+ 3,
+ -17
+ ],
+ [
+ 18,
+ 13
+ ],
+ [
+ -7,
+ -43
+ ],
+ [
+ -17,
+ -43
+ ],
+ [
+ -14,
+ -10
+ ],
+ [
+ -21,
+ 6
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ 25,
+ -67
+ ],
+ [
+ -16,
+ -101
+ ],
+ [
+ -10,
+ -37
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -27,
+ 33
+ ],
+ [
+ -15,
+ 25
+ ],
+ [
+ 13,
+ -69
+ ],
+ [
+ 36,
+ -20
+ ],
+ [
+ 2,
+ -26
+ ],
+ [
+ 0,
+ -22
+ ],
+ [
+ -7,
+ -26
+ ],
+ [
+ -7,
+ -34
+ ],
+ [
+ 5,
+ -24
+ ],
+ [
+ 5,
+ -60
+ ],
+ [
+ 5,
+ -27
+ ],
+ [
+ 6,
+ -83
+ ],
+ [
+ 5,
+ -36
+ ],
+ [
+ 33,
+ -133
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 2,
+ -14
+ ],
+ [
+ -1,
+ -27
+ ],
+ [
+ -24,
+ -8
+ ],
+ [
+ -10,
+ -13
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -11,
+ 8
+ ],
+ [
+ -26,
+ 38
+ ],
+ [
+ -37,
+ 23
+ ],
+ [
+ -49,
+ 9
+ ],
+ [
+ -33,
+ 19
+ ],
+ [
+ -18,
+ 29
+ ],
+ [
+ -18,
+ 17
+ ],
+ [
+ -20,
+ 5
+ ],
+ [
+ -16,
+ 15
+ ],
+ [
+ -13,
+ 26
+ ],
+ [
+ -18,
+ 17
+ ],
+ [
+ -25,
+ 7
+ ],
+ [
+ -16,
+ 19
+ ],
+ [
+ -11,
+ 47
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -10,
+ 79
+ ],
+ [
+ -13,
+ 49
+ ],
+ [
+ -24,
+ 62
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 3,
+ 35
+ ],
+ [
+ -2,
+ 26
+ ],
+ [
+ -8,
+ 21
+ ],
+ [
+ -2,
+ 22
+ ],
+ [
+ 4,
+ 23
+ ],
+ [
+ 1,
+ 28
+ ],
+ [
+ -4,
+ 33
+ ],
+ [
+ -16,
+ 35
+ ],
+ [
+ -27,
+ 38
+ ],
+ [
+ -24,
+ 55
+ ],
+ [
+ -19,
+ 73
+ ],
+ [
+ -19,
+ 50
+ ],
+ [
+ -19,
+ 28
+ ],
+ [
+ -13,
+ 35
+ ],
+ [
+ -7,
+ 40
+ ],
+ [
+ -2,
+ 23
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ -12,
+ 45
+ ],
+ [
+ -26,
+ 83
+ ],
+ [
+ -15,
+ 61
+ ],
+ [
+ -4,
+ 39
+ ],
+ [
+ -16,
+ 46
+ ],
+ [
+ -30,
+ 53
+ ],
+ [
+ -16,
+ 35
+ ],
+ [
+ -4,
+ 24
+ ],
+ [
+ -45,
+ 70
+ ],
+ [
+ -14,
+ 43
+ ],
+ [
+ -10,
+ 14
+ ],
+ [
+ -12,
+ -1
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -8,
+ -9
+ ],
+ [
+ -24,
+ -2
+ ],
+ [
+ -42,
+ 6
+ ],
+ [
+ -29,
+ 12
+ ],
+ [
+ -19,
+ 18
+ ],
+ [
+ -13,
+ -2
+ ],
+ [
+ -7,
+ -24
+ ],
+ [
+ -16,
+ -15
+ ],
+ [
+ -24,
+ -7
+ ],
+ [
+ -20,
+ -43
+ ],
+ [
+ -18,
+ -81
+ ],
+ [
+ -7,
+ -52
+ ],
+ [
+ 2,
+ -23
+ ],
+ [
+ -5,
+ -17
+ ],
+ [
+ -11,
+ -10
+ ],
+ [
+ -11,
+ -23
+ ],
+ [
+ -12,
+ -37
+ ],
+ [
+ -13,
+ -17
+ ],
+ [
+ -16,
+ 1
+ ],
+ [
+ -29,
+ 28
+ ],
+ [
+ -41,
+ 55
+ ],
+ [
+ -33,
+ 34
+ ],
+ [
+ -24,
+ 12
+ ],
+ [
+ -21,
+ 26
+ ],
+ [
+ -18,
+ 38
+ ],
+ [
+ -17,
+ 25
+ ],
+ [
+ -15,
+ 12
+ ],
+ [
+ -18,
+ 42
+ ],
+ [
+ -20,
+ 71
+ ],
+ [
+ -11,
+ 55
+ ],
+ [
+ 0,
+ 58
+ ],
+ [
+ -26,
+ 126
+ ],
+ [
+ -15,
+ 55
+ ],
+ [
+ -10,
+ 25
+ ],
+ [
+ -21,
+ 30
+ ],
+ [
+ -31,
+ 35
+ ],
+ [
+ -41,
+ 70
+ ],
+ [
+ -52,
+ 105
+ ],
+ [
+ -36,
+ 63
+ ],
+ [
+ -22,
+ 21
+ ],
+ [
+ -18,
+ 38
+ ],
+ [
+ -16,
+ 54
+ ],
+ [
+ -16,
+ 35
+ ],
+ [
+ -1,
+ 1
+ ]
+ ],
+ [
+ [
+ 2366,
+ 7031
+ ],
+ [
+ 0,
+ -50
+ ],
+ [
+ 0,
+ -50
+ ],
+ [
+ 0,
+ -51
+ ],
+ [
+ 0,
+ -50
+ ],
+ [
+ 0,
+ -50
+ ],
+ [
+ 0,
+ -51
+ ],
+ [
+ 0,
+ -50
+ ],
+ [
+ 0,
+ -50
+ ],
+ [
+ 44,
+ 0
+ ],
+ [
+ 43,
+ 0
+ ],
+ [
+ 43,
+ 0
+ ],
+ [
+ 44,
+ 0
+ ],
+ [
+ 43,
+ 0
+ ],
+ [
+ 44,
+ 0
+ ],
+ [
+ 43,
+ 0
+ ],
+ [
+ 43,
+ 0
+ ]
+ ],
+ [
+ [
+ 8546,
+ 5430
+ ],
+ [
+ -38,
+ -159
+ ],
+ [
+ 1,
+ -29
+ ],
+ [
+ -7,
+ -9
+ ],
+ [
+ -12,
+ -8
+ ],
+ [
+ -12,
+ -17
+ ],
+ [
+ -8,
+ -20
+ ],
+ [
+ -7,
+ -51
+ ],
+ [
+ -14,
+ -59
+ ],
+ [
+ -9,
+ 25
+ ],
+ [
+ -2,
+ 20
+ ],
+ [
+ 4,
+ 55
+ ],
+ [
+ 15,
+ 89
+ ],
+ [
+ 17,
+ 55
+ ],
+ [
+ 12,
+ 26
+ ],
+ [
+ 11,
+ 53
+ ]
+ ],
+ [
+ [
+ 8572,
+ 5436
+ ],
+ [
+ -19,
+ -61
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ 22,
+ 67
+ ]
+ ],
+ [
+ [
+ 8259,
+ 5778
+ ],
+ [
+ -2,
+ -46
+ ],
+ [
+ -8,
+ -22
+ ],
+ [
+ -13,
+ -18
+ ],
+ [
+ -17,
+ -30
+ ],
+ [
+ -4,
+ -29
+ ],
+ [
+ -5,
+ -53
+ ],
+ [
+ 7,
+ -18
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 21,
+ 12
+ ],
+ [
+ 11,
+ -5
+ ],
+ [
+ 25,
+ -65
+ ],
+ [
+ 45,
+ -25
+ ],
+ [
+ 17,
+ -16
+ ],
+ [
+ 13,
+ -34
+ ],
+ [
+ 20,
+ -19
+ ],
+ [
+ 16,
+ -28
+ ],
+ [
+ 0,
+ -18
+ ],
+ [
+ -5,
+ -22
+ ],
+ [
+ -2,
+ -29
+ ],
+ [
+ -7,
+ -19
+ ],
+ [
+ -16,
+ -2
+ ],
+ [
+ -10,
+ 5
+ ],
+ [
+ -52,
+ 103
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ -19,
+ 54
+ ],
+ [
+ -23,
+ 29
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ 32,
+ -54
+ ],
+ [
+ 14,
+ -37
+ ],
+ [
+ 23,
+ -52
+ ],
+ [
+ 16,
+ -23
+ ],
+ [
+ 13,
+ -34
+ ],
+ [
+ 11,
+ -17
+ ],
+ [
+ 31,
+ -23
+ ],
+ [
+ -11,
+ -16
+ ],
+ [
+ 17,
+ -14
+ ],
+ [
+ 3,
+ -26
+ ],
+ [
+ -2,
+ -30
+ ],
+ [
+ -24,
+ 12
+ ],
+ [
+ 0,
+ -22
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ -11,
+ -11
+ ],
+ [
+ -15,
+ 15
+ ],
+ [
+ -38,
+ 79
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 3,
+ -12
+ ],
+ [
+ 22,
+ -51
+ ],
+ [
+ 20,
+ -30
+ ],
+ [
+ 16,
+ -14
+ ],
+ [
+ 13,
+ -26
+ ],
+ [
+ 5,
+ -15
+ ],
+ [
+ 3,
+ -24
+ ],
+ [
+ -10,
+ -15
+ ],
+ [
+ -11,
+ -9
+ ],
+ [
+ -10,
+ 16
+ ],
+ [
+ -8,
+ 16
+ ],
+ [
+ -17,
+ 29
+ ],
+ [
+ -5,
+ 32
+ ],
+ [
+ -12,
+ -2
+ ],
+ [
+ -53,
+ 40
+ ],
+ [
+ -42,
+ 5
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 33,
+ -10
+ ],
+ [
+ 13,
+ -18
+ ],
+ [
+ 28,
+ -17
+ ],
+ [
+ 16,
+ -4
+ ],
+ [
+ 7,
+ -51
+ ],
+ [
+ 22,
+ -34
+ ],
+ [
+ 3,
+ -26
+ ],
+ [
+ 16,
+ -3
+ ],
+ [
+ 26,
+ 25
+ ],
+ [
+ 18,
+ -9
+ ],
+ [
+ 25,
+ -7
+ ],
+ [
+ 6,
+ -20
+ ],
+ [
+ 4,
+ -39
+ ],
+ [
+ 9,
+ -44
+ ],
+ [
+ 5,
+ -43
+ ]
+ ],
+ [
+ [
+ 8457,
+ 4836
+ ],
+ [
+ -13,
+ 1
+ ]
+ ],
+ [
+ [
+ 7404,
+ 5235
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ -3,
+ -14
+ ],
+ [
+ 6,
+ -17
+ ],
+ [
+ 4,
+ -25
+ ],
+ [
+ 7,
+ -16
+ ],
+ [
+ 8,
+ -13
+ ],
+ [
+ 13,
+ -11
+ ],
+ [
+ 16,
+ -19
+ ],
+ [
+ 13,
+ -6
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 14,
+ 19
+ ],
+ [
+ 11,
+ 10
+ ],
+ [
+ 12,
+ 21
+ ],
+ [
+ 21,
+ -29
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 21,
+ 13
+ ],
+ [
+ 19,
+ 3
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 8,
+ 11
+ ],
+ [
+ 0,
+ 24
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 8,
+ -9
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 37,
+ 27
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -13
+ ],
+ [
+ 17,
+ 17
+ ],
+ [
+ 9,
+ 14
+ ],
+ [
+ 4,
+ 23
+ ],
+ [
+ 8,
+ 22
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -6,
+ 13
+ ],
+ [
+ 7,
+ 30
+ ],
+ [
+ 10,
+ 29
+ ],
+ [
+ 38,
+ 90
+ ],
+ [
+ 12,
+ 54
+ ],
+ [
+ 15,
+ 35
+ ],
+ [
+ 5,
+ 27
+ ],
+ [
+ 12,
+ 28
+ ],
+ [
+ 8,
+ 56
+ ],
+ [
+ 5,
+ 12
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ 4,
+ -17
+ ],
+ [
+ 18,
+ -15
+ ],
+ [
+ 16,
+ -2
+ ],
+ [
+ 11,
+ 11
+ ],
+ [
+ 7,
+ 20
+ ],
+ [
+ 9,
+ 37
+ ],
+ [
+ 8,
+ 22
+ ],
+ [
+ 5,
+ 28
+ ],
+ [
+ 6,
+ 19
+ ],
+ [
+ 8,
+ 12
+ ],
+ [
+ 22,
+ -1
+ ],
+ [
+ 11,
+ 17
+ ],
+ [
+ 8,
+ 20
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 20,
+ 31
+ ],
+ [
+ 25,
+ 65
+ ],
+ [
+ 5,
+ 41
+ ],
+ [
+ 7,
+ 30
+ ],
+ [
+ 2,
+ 30
+ ],
+ [
+ 5,
+ 17
+ ],
+ [
+ 23,
+ -33
+ ],
+ [
+ 13,
+ -19
+ ],
+ [
+ 29,
+ -43
+ ],
+ [
+ 20,
+ -29
+ ],
+ [
+ 7,
+ 33
+ ],
+ [
+ 12,
+ 48
+ ]
+ ],
+ [
+ [
+ 8896,
+ 8241
+ ],
+ [
+ 30,
+ 0
+ ],
+ [
+ 72,
+ 1
+ ],
+ [
+ 72,
+ 0
+ ],
+ [
+ 72,
+ 0
+ ],
+ [
+ 72,
+ 0
+ ]
+ ],
+ [
+ [
+ 322,
+ 9127
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -6,
+ 16
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 6,
+ -23
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 401,
+ 9204
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -7,
+ -13
+ ],
+ [
+ 1,
+ 25
+ ],
+ [
+ 3,
+ 27
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ -18
+ ],
+ [
+ 8,
+ -20
+ ]
+ ],
+ [
+ [
+ 383,
+ 9284
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -9,
+ 10
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ 0,
+ 19
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -36
+ ]
+ ],
+ [
+ [
+ 370,
+ 9510
+ ],
+ [
+ 9,
+ -52
+ ],
+ [
+ 3,
+ 22
+ ],
+ [
+ 24,
+ -38
+ ],
+ [
+ 0,
+ -19
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -5,
+ 13
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -11,
+ 4
+ ],
+ [
+ -6,
+ 15
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -1,
+ 29
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -9,
+ 21
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 4,
+ 17
+ ],
+ [
+ 10,
+ 28
+ ],
+ [
+ 7,
+ 13
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 7,
+ -15
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ -25,
+ -22
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 12,
+ -6
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 4,
+ -18
+ ]
+ ],
+ [
+ [
+ 327,
+ 9621
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -10,
+ 5
+ ],
+ [
+ -5,
+ 9
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ 3,
+ 21
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -19
+ ],
+ [
+ 8,
+ -19
+ ],
+ [
+ -1,
+ -9
+ ]
+ ],
+ [
+ [
+ 294,
+ 9649
+ ],
+ [
+ 5,
+ -13
+ ],
+ [
+ -19,
+ 8
+ ],
+ [
+ -8,
+ 8
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -3,
+ 25
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 16,
+ -30
+ ],
+ [
+ 2,
+ -15
+ ]
+ ],
+ [
+ [
+ 334,
+ 9718
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ -7,
+ -9
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -8,
+ 13
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 3,
+ -21
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -16,
+ 13
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 10,
+ 11
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 20,
+ -15
+ ]
+ ],
+ [
+ [
+ 288,
+ 9847
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 7,
+ 0
+ ]
+ ],
+ [
+ [
+ 258,
+ 8704
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -18,
+ 20
+ ],
+ [
+ -10,
+ 20
+ ],
+ [
+ -32,
+ -1
+ ],
+ [
+ -7,
+ 13
+ ],
+ [
+ -36,
+ -13
+ ],
+ [
+ -11,
+ 13
+ ],
+ [
+ -20,
+ -9
+ ],
+ [
+ 5,
+ 38
+ ],
+ [
+ -1,
+ 47
+ ],
+ [
+ 1,
+ 47
+ ],
+ [
+ 5,
+ -34
+ ],
+ [
+ 12,
+ -36
+ ],
+ [
+ 6,
+ 41
+ ],
+ [
+ 4,
+ 51
+ ],
+ [
+ -12,
+ 19
+ ],
+ [
+ -19,
+ 15
+ ],
+ [
+ -8,
+ 47
+ ],
+ [
+ 47,
+ 41
+ ],
+ [
+ -25,
+ 8
+ ],
+ [
+ -9,
+ 19
+ ],
+ [
+ -12,
+ 2
+ ],
+ [
+ -1,
+ -14
+ ],
+ [
+ -4,
+ -19
+ ],
+ [
+ -4,
+ 25
+ ],
+ [
+ -2,
+ 29
+ ],
+ [
+ -4,
+ 49
+ ],
+ [
+ -20,
+ 79
+ ],
+ [
+ -11,
+ 102
+ ],
+ [
+ -15,
+ 50
+ ],
+ [
+ -28,
+ 49
+ ],
+ [
+ -7,
+ 28
+ ],
+ [
+ -7,
+ 71
+ ],
+ [
+ 4,
+ 55
+ ],
+ [
+ -5,
+ 38
+ ],
+ [
+ 13,
+ -3
+ ],
+ [
+ 36,
+ -29
+ ],
+ [
+ 44,
+ -24
+ ],
+ [
+ 13,
+ -17
+ ],
+ [
+ 21,
+ -13
+ ],
+ [
+ 118,
+ -19
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 15,
+ 13
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 17,
+ -28
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 15,
+ 19
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -18
+ ],
+ [
+ 5,
+ -25
+ ],
+ [
+ 11,
+ -33
+ ],
+ [
+ 4,
+ -20
+ ],
+ [
+ -21,
+ -58
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 19
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -40,
+ -97
+ ],
+ [
+ -13,
+ -46
+ ],
+ [
+ -2,
+ -21
+ ],
+ [
+ 1,
+ -12
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 13,
+ 5
+ ],
+ [
+ 19,
+ 19
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -18,
+ -7
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ 1,
+ 21
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 11,
+ 32
+ ],
+ [
+ 12,
+ 19
+ ],
+ [
+ 17,
+ 21
+ ],
+ [
+ 10,
+ 17
+ ],
+ [
+ 7,
+ 25
+ ],
+ [
+ 19,
+ 29
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ -1,
+ 25
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 4,
+ -42
+ ],
+ [
+ -2,
+ -19
+ ],
+ [
+ -17,
+ -22
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ 3,
+ -31
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 16,
+ -34
+ ],
+ [
+ 5,
+ -26
+ ],
+ [
+ 1,
+ -23
+ ],
+ [
+ -5,
+ -45
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -10,
+ 14
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -9,
+ -35
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -5,
+ 41
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -16,
+ -19
+ ],
+ [
+ -6,
+ -18
+ ],
+ [
+ -6,
+ -29
+ ],
+ [
+ -7,
+ -13
+ ],
+ [
+ 20,
+ -3
+ ],
+ [
+ 18,
+ 5
+ ],
+ [
+ 14,
+ -13
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 13,
+ 14
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 11,
+ 44
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 11,
+ 24
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ -5,
+ 53
+ ],
+ [
+ 2,
+ 31
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 4,
+ 16
+ ],
+ [
+ 0,
+ 15
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ 1,
+ 15
+ ],
+ [
+ 11,
+ 32
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 14,
+ 32
+ ],
+ [
+ -4,
+ 12
+ ],
+ [
+ -10,
+ 16
+ ],
+ [
+ -6,
+ 13
+ ],
+ [
+ -6,
+ 21
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 6,
+ -34
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -17,
+ 19
+ ],
+ [
+ -4,
+ 12
+ ],
+ [
+ -2,
+ 16
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 10,
+ 11
+ ],
+ [
+ 11,
+ 5
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -14,
+ 32
+ ],
+ [
+ -9,
+ 15
+ ],
+ [
+ -7,
+ 7
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 14,
+ -4
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 1,
+ 46
+ ],
+ [
+ -6,
+ 37
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -5,
+ 12
+ ],
+ [
+ -7,
+ 24
+ ],
+ [
+ -11,
+ 56
+ ],
+ [
+ 18,
+ 0
+ ],
+ [
+ 73,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 73,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 74,
+ 0
+ ],
+ [
+ 18,
+ 0
+ ]
+ ],
+ [
+ [
+ 6534,
+ 8336
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 1,
+ -19
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ -11
+ ],
+ [
+ -7,
+ -24
+ ],
+ [
+ -2,
+ -13
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -16,
+ -35
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ -3,
+ 16
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 14,
+ 31
+ ],
+ [
+ 6,
+ 20
+ ],
+ [
+ 3,
+ 23
+ ],
+ [
+ 7,
+ 14
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 8,
+ 15
+ ],
+ [
+ 6,
+ 22
+ ],
+ [
+ 7,
+ 9
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ -1,
+ -14
+ ]
+ ],
+ [
+ [
+ 6556,
+ 8381
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ 5,
+ 24
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -17
+ ]
+ ],
+ [
+ [
+ 5890,
+ 8957
+ ],
+ [
+ -10,
+ -5
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 23,
+ 22
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -12,
+ -11
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -5,
+ -6
+ ]
+ ],
+ [
+ [
+ 5918,
+ 9012
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -12,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 13,
+ 8
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -14
+ ]
+ ],
+ [
+ [
+ 6427,
+ 8283
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ -3,
+ -20
+ ],
+ [
+ -10,
+ -16
+ ],
+ [
+ -26,
+ -20
+ ],
+ [
+ -4,
+ -14
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ -17,
+ -47
+ ],
+ [
+ -8,
+ -29
+ ],
+ [
+ -5,
+ -30
+ ],
+ [
+ 2,
+ -19
+ ],
+ [
+ 8,
+ -7
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 6,
+ 13
+ ],
+ [
+ 8,
+ 13
+ ],
+ [
+ 11,
+ 11
+ ],
+ [
+ 8,
+ 16
+ ],
+ [
+ 11,
+ 40
+ ],
+ [
+ 13,
+ 22
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 13,
+ 10
+ ],
+ [
+ 11,
+ -3
+ ],
+ [
+ 6,
+ -15
+ ],
+ [
+ 6,
+ -11
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ -3,
+ -22
+ ],
+ [
+ -6,
+ -24
+ ],
+ [
+ -9,
+ -25
+ ],
+ [
+ -8,
+ -37
+ ],
+ [
+ -7,
+ -49
+ ],
+ [
+ -2,
+ -38
+ ],
+ [
+ 5,
+ -25
+ ],
+ [
+ -4,
+ -22
+ ],
+ [
+ -12,
+ -20
+ ],
+ [
+ -10,
+ -27
+ ],
+ [
+ -7,
+ -33
+ ],
+ [
+ -4,
+ -28
+ ],
+ [
+ -1,
+ -23
+ ],
+ [
+ 1,
+ -16
+ ],
+ [
+ 4,
+ -23
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ -13,
+ -50
+ ],
+ [
+ -4,
+ -25
+ ],
+ [
+ -1,
+ -19
+ ],
+ [
+ -3,
+ -19
+ ],
+ [
+ -10,
+ -39
+ ],
+ [
+ -3,
+ -21
+ ],
+ [
+ -1,
+ -20
+ ],
+ [
+ 2,
+ -32
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 3,
+ -15
+ ],
+ [
+ 1,
+ -23
+ ],
+ [
+ 3,
+ -20
+ ],
+ [
+ 6,
+ -15
+ ],
+ [
+ 1,
+ -23
+ ],
+ [
+ -4,
+ -29
+ ],
+ [
+ -1,
+ -55
+ ],
+ [
+ 0,
+ -19
+ ]
+ ],
+ [
+ [
+ 5648,
+ 8949
+ ],
+ [
+ 6,
+ -11
+ ],
+ [
+ 14,
+ -15
+ ],
+ [
+ 12,
+ -1
+ ],
+ [
+ 15,
+ 3
+ ],
+ [
+ 58,
+ 25
+ ],
+ [
+ 25,
+ 18
+ ],
+ [
+ 24,
+ 31
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 10,
+ -6
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 32,
+ 35
+ ],
+ [
+ 10,
+ 4
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 10,
+ -14
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ -4,
+ -16
+ ],
+ [
+ -9,
+ -24
+ ],
+ [
+ -4,
+ -20
+ ],
+ [
+ 0,
+ -16
+ ],
+ [
+ -4,
+ -17
+ ],
+ [
+ -10,
+ -24
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 26,
+ 17
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 21,
+ -23
+ ],
+ [
+ 14,
+ -13
+ ],
+ [
+ 11,
+ -6
+ ],
+ [
+ 11,
+ 4
+ ]
+ ],
+ [
+ [
+ 5890,
+ 9015
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 1,
+ -6
+ ]
+ ],
+ [
+ [
+ 5939,
+ 9055
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -3,
+ -7
+ ]
+ ]
+ ],
+ "transform": {
+ "scale": [
+ 0.005772872856602365,
+ 0.0024829805705001468
+ ],
+ "translate": [
+ -124.70997774915153,
+ 24.542349340056283
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/data/map/countries.topojson b/framework/src/onos/web/gui/src/main/webapp/data/map/countries.topojson
new file mode 100644
index 00000000..8116a00d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/data/map/countries.topojson
@@ -0,0 +1 @@
+{"type":"Topology","objects":{"countries":{"type":"GeometryCollection","geometries":[{"type":"Polygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Netherlands","sov_a3":"NL1","adm0_dif":1,"level":2,"type":"Country","admin":"Aruba","adm0_a3":"ABW","geou_dif":0,"geounit":"Aruba","gu_a3":"ABW","su_dif":0,"subunit":"Aruba","su_a3":"ABW","brk_diff":0,"name":"Aruba","name_long":"Aruba","brk_a3":"ABW","brk_name":"Aruba","brk_group":null,"abbrev":"Aruba","postal":"AW","formal_en":"Aruba","formal_fr":null,"note_adm0":"Neth.","note_brk":null,"name_sort":"Aruba","name_alt":null,"mapcolor7":4,"mapcolor8":2,"mapcolor9":2,"mapcolor13":9,"pop_est":103065,"gdp_md_est":2258,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"AW","iso_a3":"ABW","iso_n3":"533","un_a3":"533","wb_a2":"AW","wb_a3":"ABW","woe_id":-99,"adm0_a3_is":"ABW","adm0_a3_us":"ABW","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":5,"long_len":5,"abbrev_len":5,"tiny":4,"homepart":-99},"arcs":[[0]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Afghanistan","sov_a3":"AFG","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Afghanistan","adm0_a3":"AFG","geou_dif":0,"geounit":"Afghanistan","gu_a3":"AFG","su_dif":0,"subunit":"Afghanistan","su_a3":"AFG","brk_diff":0,"name":"Afghanistan","name_long":"Afghanistan","brk_a3":"AFG","brk_name":"Afghanistan","brk_group":null,"abbrev":"Afg.","postal":"AF","formal_en":"Islamic State of Afghanistan","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Afghanistan","name_alt":null,"mapcolor7":5,"mapcolor8":6,"mapcolor9":8,"mapcolor13":7,"pop_est":28400000,"gdp_md_est":22270,"pop_year":-99,"lastcensus":1979,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"AF","iso_a3":"AFG","iso_n3":"004","un_a3":"004","wb_a2":"AF","wb_a3":"AFG","woe_id":-99,"adm0_a3_is":"AFG","adm0_a3_us":"AFG","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Southern Asia","region_wb":"South Asia","name_len":11,"long_len":11,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[1,2,3,4,5,6,7]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Angola","sov_a3":"AGO","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Angola","adm0_a3":"AGO","geou_dif":0,"geounit":"Angola","gu_a3":"AGO","su_dif":0,"subunit":"Angola","su_a3":"AGO","brk_diff":0,"name":"Angola","name_long":"Angola","brk_a3":"AGO","brk_name":"Angola","brk_group":null,"abbrev":"Ang.","postal":"AO","formal_en":"People's Republic of Angola","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Angola","name_alt":null,"mapcolor7":3,"mapcolor8":2,"mapcolor9":6,"mapcolor13":1,"pop_est":12799293,"gdp_md_est":110300,"pop_year":-99,"lastcensus":1970,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"AO","iso_a3":"AGO","iso_n3":"024","un_a3":"024","wb_a2":"AO","wb_a3":"AGO","woe_id":-99,"adm0_a3_is":"AGO","adm0_a3_us":"AGO","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Middle Africa","region_wb":"Sub-Saharan Africa","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[8,9,10,11]],[[12,13,14]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"United Kingdom","sov_a3":"GB1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Anguilla","adm0_a3":"AIA","geou_dif":0,"geounit":"Anguilla","gu_a3":"AIA","su_dif":0,"subunit":"Anguilla","su_a3":"AIA","brk_diff":0,"name":"Anguilla","name_long":"Anguilla","brk_a3":"AIA","brk_name":"Anguilla","brk_group":null,"abbrev":"Ang.","postal":"AI","formal_en":null,"formal_fr":null,"note_adm0":"U.K.","note_brk":null,"name_sort":"Anguilla","name_alt":null,"mapcolor7":6,"mapcolor8":6,"mapcolor9":6,"mapcolor13":3,"pop_est":14436,"gdp_md_est":108.9,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"AI","iso_a3":"AIA","iso_n3":"660","un_a3":"660","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"AIA","adm0_a3_us":"AIA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":8,"long_len":8,"abbrev_len":4,"tiny":-99,"homepart":-99},"arcs":[[15]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Albania","sov_a3":"ALB","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Albania","adm0_a3":"ALB","geou_dif":0,"geounit":"Albania","gu_a3":"ALB","su_dif":0,"subunit":"Albania","su_a3":"ALB","brk_diff":0,"name":"Albania","name_long":"Albania","brk_a3":"ALB","brk_name":"Albania","brk_group":null,"abbrev":"Alb.","postal":"AL","formal_en":"Republic of Albania","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Albania","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":1,"mapcolor13":6,"pop_est":3639453,"gdp_md_est":21810,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"AL","iso_a3":"ALB","iso_n3":"008","un_a3":"008","wb_a2":"AL","wb_a3":"ALB","woe_id":-99,"adm0_a3_is":"ALB","adm0_a3_us":"ALB","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[16,17,18,19,20]]},{"type":"MultiPolygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Finland","sov_a3":"FI1","adm0_dif":1,"level":2,"type":"Country","admin":"Aland","adm0_a3":"ALD","geou_dif":0,"geounit":"Aland","gu_a3":"ALD","su_dif":0,"subunit":"Aland","su_a3":"ALD","brk_diff":0,"name":"Aland","name_long":"Aland Islands","brk_a3":"ALD","brk_name":"Aland","brk_group":null,"abbrev":"Aland","postal":"AI","formal_en":"Åland Islands","formal_fr":null,"note_adm0":"Fin.","note_brk":null,"name_sort":"Aland","name_alt":null,"mapcolor7":4,"mapcolor8":1,"mapcolor9":4,"mapcolor13":6,"pop_est":27153,"gdp_md_est":1563,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"AX","iso_a3":"ALA","iso_n3":"248","un_a3":"248","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"ALA","adm0_a3_us":"ALD","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":5,"long_len":13,"abbrev_len":5,"tiny":5,"homepart":-99},"arcs":[[[21]],[[22]],[[23]]]},{"type":"Polygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Andorra","sov_a3":"AND","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Andorra","adm0_a3":"AND","geou_dif":0,"geounit":"Andorra","gu_a3":"AND","su_dif":0,"subunit":"Andorra","su_a3":"AND","brk_diff":0,"name":"Andorra","name_long":"Andorra","brk_a3":"AND","brk_name":"Andorra","brk_group":null,"abbrev":"And.","postal":"AND","formal_en":"Principality of Andorra","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Andorra","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":1,"mapcolor13":8,"pop_est":83888,"gdp_md_est":3660,"pop_year":-99,"lastcensus":1989,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"AD","iso_a3":"AND","iso_n3":"020","un_a3":"020","wb_a2":"AD","wb_a3":"ADO","woe_id":-99,"adm0_a3_is":"AND","adm0_a3_us":"AND","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":5,"homepart":1},"arcs":[[24,25]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"United Arab Emirates","sov_a3":"ARE","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"United Arab Emirates","adm0_a3":"ARE","geou_dif":0,"geounit":"United Arab Emirates","gu_a3":"ARE","su_dif":0,"subunit":"United Arab Emirates","su_a3":"ARE","brk_diff":0,"name":"United Arab Emirates","name_long":"United Arab Emirates","brk_a3":"ARE","brk_name":"United Arab Emirates","brk_group":null,"abbrev":"U.A.E.","postal":"AE","formal_en":"United Arab Emirates","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"United Arab Emirates","name_alt":null,"mapcolor7":2,"mapcolor8":1,"mapcolor9":3,"mapcolor13":3,"pop_est":4798491,"gdp_md_est":184300,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"AE","iso_a3":"ARE","iso_n3":"784","un_a3":"784","wb_a2":"AE","wb_a3":"ARE","woe_id":-99,"adm0_a3_is":"ARE","adm0_a3_us":"ARE","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Western Asia","region_wb":"Middle East & North Africa","name_len":20,"long_len":20,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[[26]],[[27]],[[28]],[[29]],[[30,31,32,33,34],[35]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Argentina","sov_a3":"ARG","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Argentina","adm0_a3":"ARG","geou_dif":0,"geounit":"Argentina","gu_a3":"ARG","su_dif":0,"subunit":"Argentina","su_a3":"ARG","brk_diff":0,"name":"Argentina","name_long":"Argentina","brk_a3":"ARG","brk_name":"Argentina","brk_group":null,"abbrev":"Arg.","postal":"AR","formal_en":"Argentine Republic","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Argentina","name_alt":null,"mapcolor7":3,"mapcolor8":1,"mapcolor9":3,"mapcolor13":13,"pop_est":40913584,"gdp_md_est":573900,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"5. Emerging region: G20","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"AR","iso_a3":"ARG","iso_n3":"032","un_a3":"032","wb_a2":"AR","wb_a3":"ARG","woe_id":-99,"adm0_a3_is":"ARG","adm0_a3_us":"ARG","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"South America","region_un":"Americas","subregion":"South America","region_wb":"Latin America & Caribbean","name_len":9,"long_len":9,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[36]],[[37,38]],[[39]],[[40,41,42,43,44,45]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Armenia","sov_a3":"ARM","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Armenia","adm0_a3":"ARM","geou_dif":0,"geounit":"Armenia","gu_a3":"ARM","su_dif":0,"subunit":"Armenia","su_a3":"ARM","brk_diff":0,"name":"Armenia","name_long":"Armenia","brk_a3":"ARM","brk_name":"Armenia","brk_group":null,"abbrev":"Arm.","postal":"ARM","formal_en":"Republic of Armenia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Armenia","name_alt":null,"mapcolor7":3,"mapcolor8":1,"mapcolor9":2,"mapcolor13":10,"pop_est":2967004,"gdp_md_est":18770,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"AM","iso_a3":"ARM","iso_n3":"051","un_a3":"051","wb_a2":"AM","wb_a3":"ARM","woe_id":-99,"adm0_a3_is":"ARM","adm0_a3_us":"ARM","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Western Asia","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[46]],[[47,48,49,50,51],[52]]]},{"type":"Polygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"United States of America","sov_a3":"US1","adm0_dif":1,"level":2,"type":"Dependency","admin":"American Samoa","adm0_a3":"ASM","geou_dif":0,"geounit":"American Samoa","gu_a3":"ASM","su_dif":0,"subunit":"American Samoa","su_a3":"ASM","brk_diff":0,"name":"American Samoa","name_long":"American Samoa","brk_a3":"ASM","brk_name":"American Samoa","brk_group":null,"abbrev":"Am. Samoa","postal":"AS","formal_en":"American Samoa","formal_fr":null,"note_adm0":"U.S.A.","note_brk":null,"name_sort":"American Samoa","name_alt":null,"mapcolor7":4,"mapcolor8":5,"mapcolor9":1,"mapcolor13":1,"pop_est":65628,"gdp_md_est":575.3,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"AS","iso_a3":"ASM","iso_n3":"016","un_a3":"016","wb_a2":"AS","wb_a3":"ASM","woe_id":-99,"adm0_a3_is":"ASM","adm0_a3_us":"ASM","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Polynesia","region_wb":"East Asia & Pacific","name_len":14,"long_len":14,"abbrev_len":9,"tiny":3,"homepart":-99},"arcs":[[53]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Antarctica","sov_a3":"ATA","adm0_dif":0,"level":2,"type":"Indeterminate","admin":"Antarctica","adm0_a3":"ATA","geou_dif":0,"geounit":"Antarctica","gu_a3":"ATA","su_dif":0,"subunit":"Antarctica","su_a3":"ATA","brk_diff":0,"name":"Antarctica","name_long":"Antarctica","brk_a3":"ATA","brk_name":"Antarctica","brk_group":null,"abbrev":"Ant.","postal":"AQ","formal_en":null,"formal_fr":null,"note_adm0":null,"note_brk":"Multiple claims held in abeyance","name_sort":"Antarctica","name_alt":null,"mapcolor7":4,"mapcolor8":5,"mapcolor9":1,"mapcolor13":-99,"pop_est":3802,"gdp_md_est":760.4,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"AQ","iso_a3":"ATA","iso_n3":"010","un_a3":"-099","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"ATA","adm0_a3_us":"ATA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Antarctica","region_un":"Antarctica","subregion":"Antarctica","region_wb":"Antarctica","name_len":10,"long_len":10,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[54]],[[55]],[[56]],[[57]],[[58]],[[59]],[[60]],[[61]],[[62]],[[63]],[[64]],[[65]],[[66]],[[67]],[[68]],[[69]],[[70]],[[71]],[[72]],[[73]],[[74]],[[75]],[[76]],[[77]],[[78]],[[79]],[[80]],[[81]],[[82]],[[83]],[[84]],[[85]],[[86]],[[87]],[[88]],[[89]],[[90]],[[91]],[[92]],[[93]],[[94]],[[95]],[[96]],[[97]],[[98]],[[99]],[[100]],[[101]],[[102]],[[103]],[[104]],[[105]],[[106]],[[107]],[[108]],[[109]],[[110]],[[111]],[[112]],[[113]],[[114]],[[115]],[[116]],[[117]],[[118]],[[119]],[[120]],[[121]],[[122]],[[123]],[[124]],[[125]],[[126]],[[127]],[[128]],[[129]],[[130]],[[131]],[[132]],[[133]],[[134]],[[135]],[[136]],[[137]],[[138]],[[139]],[[140]],[[141]],[[142]],[[143]],[[144]],[[145]],[[146]],[[147]],[[148]],[[149]],[[150]],[[151]],[[152]],[[153]],[[154]],[[155]],[[156]],[[157]],[[158]],[[159]],[[160]],[[161]]]},{"type":"MultiPolygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"France","sov_a3":"FR1","adm0_dif":1,"level":2,"type":"Dependency","admin":"French Southern and Antarctic Lands","adm0_a3":"ATF","geou_dif":0,"geounit":"French Southern and Antarctic Lands","gu_a3":"ATF","su_dif":0,"subunit":"French Southern and Antarctic Lands","su_a3":"ATF","brk_diff":0,"name":"Fr. S. Antarctic Lands","name_long":"French Southern and Antarctic Lands","brk_a3":"ATF","brk_name":"Fr. S. and Antarctic Lands","brk_group":null,"abbrev":"Fr. S.A.L.","postal":"TF","formal_en":"Territory of the French Southern and Antarctic Lands","formal_fr":null,"note_adm0":"Fr.","note_brk":null,"name_sort":"French Southern and Antarctic Lands","name_alt":null,"mapcolor7":7,"mapcolor8":5,"mapcolor9":9,"mapcolor13":11,"pop_est":140,"gdp_md_est":16,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"TF","iso_a3":"ATF","iso_n3":"260","un_a3":"-099","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"ATF","adm0_a3_us":"ATF","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Seven seas (open ocean)","region_un":"Seven seas (open ocean)","subregion":"Seven seas (open ocean)","region_wb":"Sub-Saharan Africa","name_len":22,"long_len":35,"abbrev_len":10,"tiny":2,"homepart":-99},"arcs":[[[162]],[[163]],[[164]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Antigua and Barbuda","sov_a3":"ATG","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Antigua and Barbuda","adm0_a3":"ATG","geou_dif":0,"geounit":"Antigua and Barbuda","gu_a3":"ATG","su_dif":0,"subunit":"Antigua and Barbuda","su_a3":"ATG","brk_diff":0,"name":"Antigua and Barb.","name_long":"Antigua and Barbuda","brk_a3":"ATG","brk_name":"Antigua and Barb.","brk_group":null,"abbrev":"Ant.B.","postal":"AG","formal_en":"Antigua and Barbuda","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Antigua and Barbuda","name_alt":null,"mapcolor7":2,"mapcolor8":2,"mapcolor9":5,"mapcolor13":5,"pop_est":85632,"gdp_md_est":1657,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"AG","iso_a3":"ATG","iso_n3":"028","un_a3":"028","wb_a2":"AG","wb_a3":"ATG","woe_id":-99,"adm0_a3_is":"ATG","adm0_a3_us":"ATG","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":17,"long_len":19,"abbrev_len":6,"tiny":4,"homepart":1},"arcs":[[[165]],[[166]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Australia","sov_a3":"AU1","adm0_dif":1,"level":2,"type":"Country","admin":"Australia","adm0_a3":"AUS","geou_dif":0,"geounit":"Australia","gu_a3":"AUS","su_dif":0,"subunit":"Australia","su_a3":"AUS","brk_diff":0,"name":"Australia","name_long":"Australia","brk_a3":"AUS","brk_name":"Australia","brk_group":null,"abbrev":"Auz.","postal":"AU","formal_en":"Commonwealth of Australia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Australia","name_alt":null,"mapcolor7":1,"mapcolor8":2,"mapcolor9":2,"mapcolor13":7,"pop_est":21262641,"gdp_md_est":800200,"pop_year":-99,"lastcensus":2006,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"AU","iso_a3":"AUS","iso_n3":"036","un_a3":"036","wb_a2":"AU","wb_a3":"AUS","woe_id":-99,"adm0_a3_is":"AUS","adm0_a3_us":"AUS","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Australia and New Zealand","region_wb":"East Asia & Pacific","name_len":9,"long_len":9,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[167]],[[168]],[[169]],[[170]],[[171]],[[172]],[[173]],[[174]],[[175]],[[176]],[[177]],[[178]],[[179]],[[180]],[[181]],[[182]],[[183]],[[184]],[[185]],[[186]],[[187]],[[188]],[[189]],[[190]],[[191]],[[192]],[[193]],[[194]],[[195]],[[196]],[[197]],[[198]],[[199]],[[200]],[[201]],[[202]],[[203]],[[204]],[[205]],[[206]],[[207]],[[208]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Austria","sov_a3":"AUT","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Austria","adm0_a3":"AUT","geou_dif":0,"geounit":"Austria","gu_a3":"AUT","su_dif":0,"subunit":"Austria","su_a3":"AUT","brk_diff":0,"name":"Austria","name_long":"Austria","brk_a3":"AUT","brk_name":"Austria","brk_group":null,"abbrev":"Aust.","postal":"A","formal_en":"Republic of Austria","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Austria","name_alt":null,"mapcolor7":3,"mapcolor8":1,"mapcolor9":3,"mapcolor13":4,"pop_est":8210281,"gdp_md_est":329500,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"AT","iso_a3":"AUT","iso_n3":"040","un_a3":"040","wb_a2":"AT","wb_a3":"AUT","woe_id":-99,"adm0_a3_is":"AUT","adm0_a3_us":"AUT","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Western Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[209,210,211,212,213,214,215,216,217]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Azerbaijan","sov_a3":"AZE","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Azerbaijan","adm0_a3":"AZE","geou_dif":0,"geounit":"Azerbaijan","gu_a3":"AZE","su_dif":0,"subunit":"Azerbaijan","su_a3":"AZE","brk_diff":0,"name":"Azerbaijan","name_long":"Azerbaijan","brk_a3":"AZE","brk_name":"Azerbaijan","brk_group":null,"abbrev":"Aze.","postal":"AZ","formal_en":"Republic of Azerbaijan","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Azerbaijan","name_alt":null,"mapcolor7":1,"mapcolor8":6,"mapcolor9":5,"mapcolor13":8,"pop_est":8238672,"gdp_md_est":77610,"pop_year":-99,"lastcensus":2009,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"AZ","iso_a3":"AZE","iso_n3":"031","un_a3":"031","wb_a2":"AZ","wb_a3":"AZE","woe_id":-99,"adm0_a3_is":"AZE","adm0_a3_us":"AZE","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Western Asia","region_wb":"Europe & Central Asia","name_len":10,"long_len":10,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[218,219,-49]],[[-53]],[[220,221,-52,222,223],[-47]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Burundi","sov_a3":"BDI","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Burundi","adm0_a3":"BDI","geou_dif":0,"geounit":"Burundi","gu_a3":"BDI","su_dif":0,"subunit":"Burundi","su_a3":"BDI","brk_diff":0,"name":"Burundi","name_long":"Burundi","brk_a3":"BDI","brk_name":"Burundi","brk_group":null,"abbrev":"Bur.","postal":"BI","formal_en":"Republic of Burundi","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Burundi","name_alt":null,"mapcolor7":2,"mapcolor8":2,"mapcolor9":5,"mapcolor13":8,"pop_est":8988091,"gdp_md_est":3102,"pop_year":-99,"lastcensus":2008,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"BI","iso_a3":"BDI","iso_n3":"108","un_a3":"108","wb_a2":"BI","wb_a3":"BDI","woe_id":-99,"adm0_a3_is":"BDI","adm0_a3_us":"BDI","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Eastern Africa","region_wb":"Sub-Saharan Africa","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[224,225,226]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Belgium","sov_a3":"BEL","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Belgium","adm0_a3":"BEL","geou_dif":0,"geounit":"Belgium","gu_a3":"BEL","su_dif":0,"subunit":"Belgium","su_a3":"BEL","brk_diff":0,"name":"Belgium","name_long":"Belgium","brk_a3":"BEL","brk_name":"Belgium","brk_group":null,"abbrev":"Belg.","postal":"B","formal_en":"Kingdom of Belgium","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Belgium","name_alt":null,"mapcolor7":3,"mapcolor8":2,"mapcolor9":1,"mapcolor13":8,"pop_est":10414336,"gdp_md_est":389300,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"BE","iso_a3":"BEL","iso_n3":"056","un_a3":"056","wb_a2":"BE","wb_a3":"BEL","woe_id":-99,"adm0_a3_is":"BEL","adm0_a3_us":"BEL","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Western Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[227,228,229,230,231,232,233]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Benin","sov_a3":"BEN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Benin","adm0_a3":"BEN","geou_dif":0,"geounit":"Benin","gu_a3":"BEN","su_dif":0,"subunit":"Benin","su_a3":"BEN","brk_diff":0,"name":"Benin","name_long":"Benin","brk_a3":"BEN","brk_name":"Benin","brk_group":null,"abbrev":"Benin","postal":"BJ","formal_en":"Republic of Benin","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Benin","name_alt":null,"mapcolor7":1,"mapcolor8":2,"mapcolor9":2,"mapcolor13":12,"pop_est":8791832,"gdp_md_est":12830,"pop_year":-99,"lastcensus":2002,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"BJ","iso_a3":"BEN","iso_n3":"204","un_a3":"204","wb_a2":"BJ","wb_a3":"BEN","woe_id":-99,"adm0_a3_is":"BEN","adm0_a3_us":"BEN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Western Africa","region_wb":"Sub-Saharan Africa","name_len":5,"long_len":5,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[234,235,236,237,238]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Burkina Faso","sov_a3":"BFA","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Burkina Faso","adm0_a3":"BFA","geou_dif":0,"geounit":"Burkina Faso","gu_a3":"BFA","su_dif":0,"subunit":"Burkina Faso","su_a3":"BFA","brk_diff":0,"name":"Burkina Faso","name_long":"Burkina Faso","brk_a3":"BFA","brk_name":"Burkina Faso","brk_group":null,"abbrev":"B.F.","postal":"BF","formal_en":"Burkina Faso","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Burkina Faso","name_alt":null,"mapcolor7":2,"mapcolor8":1,"mapcolor9":5,"mapcolor13":11,"pop_est":15746232,"gdp_md_est":17820,"pop_year":-99,"lastcensus":2006,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"BF","iso_a3":"BFA","iso_n3":"854","un_a3":"854","wb_a2":"BF","wb_a3":"BFA","woe_id":-99,"adm0_a3_is":"BFA","adm0_a3_us":"BFA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Western Africa","region_wb":"Sub-Saharan Africa","name_len":12,"long_len":12,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[239,-238,240,241,242,243]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Bangladesh","sov_a3":"BGD","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Bangladesh","adm0_a3":"BGD","geou_dif":0,"geounit":"Bangladesh","gu_a3":"BGD","su_dif":0,"subunit":"Bangladesh","su_a3":"BGD","brk_diff":0,"name":"Bangladesh","name_long":"Bangladesh","brk_a3":"BGD","brk_name":"Bangladesh","brk_group":null,"abbrev":"Bang.","postal":"BD","formal_en":"People's Republic of Bangladesh","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Bangladesh","name_alt":null,"mapcolor7":3,"mapcolor8":4,"mapcolor9":7,"mapcolor13":7,"pop_est":156050883,"gdp_md_est":224000,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"BD","iso_a3":"BGD","iso_n3":"050","un_a3":"050","wb_a2":"BD","wb_a3":"BGD","woe_id":-99,"adm0_a3_is":"BGD","adm0_a3_us":"BGD","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Southern Asia","region_wb":"South Asia","name_len":10,"long_len":10,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[244]],[[245]],[[246]],[[247]],[[248]],[[249]],[[250,251,252]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Bulgaria","sov_a3":"BGR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Bulgaria","adm0_a3":"BGR","geou_dif":0,"geounit":"Bulgaria","gu_a3":"BGR","su_dif":0,"subunit":"Bulgaria","su_a3":"BGR","brk_diff":0,"name":"Bulgaria","name_long":"Bulgaria","brk_a3":"BGR","brk_name":"Bulgaria","brk_group":null,"abbrev":"Bulg.","postal":"BG","formal_en":"Republic of Bulgaria","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Bulgaria","name_alt":null,"mapcolor7":4,"mapcolor8":5,"mapcolor9":1,"mapcolor13":8,"pop_est":7204687,"gdp_md_est":93750,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"BG","iso_a3":"BGR","iso_n3":"100","un_a3":"100","wb_a2":"BG","wb_a3":"BGR","woe_id":-99,"adm0_a3_is":"BGR","adm0_a3_us":"BGR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Eastern Europe","region_wb":"Europe & Central Asia","name_len":8,"long_len":8,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[253,254,255,256,257,258]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Bahrain","sov_a3":"BHR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Bahrain","adm0_a3":"BHR","geou_dif":0,"geounit":"Bahrain","gu_a3":"BHR","su_dif":0,"subunit":"Bahrain","su_a3":"BHR","brk_diff":0,"name":"Bahrain","name_long":"Bahrain","brk_a3":"BHR","brk_name":"Bahrain","brk_group":null,"abbrev":"Bahr.","postal":"BH","formal_en":"Kingdom of Bahrain","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Bahrain","name_alt":null,"mapcolor7":1,"mapcolor8":1,"mapcolor9":1,"mapcolor13":9,"pop_est":727785,"gdp_md_est":26820,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"BH","iso_a3":"BHR","iso_n3":"048","un_a3":"048","wb_a2":"BH","wb_a3":"BHR","woe_id":-99,"adm0_a3_is":"BHR","adm0_a3_us":"BHR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Western Asia","region_wb":"Middle East & North Africa","name_len":7,"long_len":7,"abbrev_len":5,"tiny":2,"homepart":1},"arcs":[[259]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"The Bahamas","sov_a3":"BHS","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"The Bahamas","adm0_a3":"BHS","geou_dif":0,"geounit":"The Bahamas","gu_a3":"BHS","su_dif":0,"subunit":"The Bahamas","su_a3":"BHS","brk_diff":0,"name":"Bahamas","name_long":"Bahamas","brk_a3":"BHS","brk_name":"Bahamas","brk_group":null,"abbrev":"Bhs.","postal":"BS","formal_en":"Commonwealth of the Bahamas","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Bahamas, The","name_alt":null,"mapcolor7":1,"mapcolor8":1,"mapcolor9":2,"mapcolor13":5,"pop_est":309156,"gdp_md_est":9093,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"BS","iso_a3":"BHS","iso_n3":"044","un_a3":"044","wb_a2":"BS","wb_a3":"BHS","woe_id":-99,"adm0_a3_is":"BHS","adm0_a3_us":"BHS","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[260]],[[261]],[[262]],[[263]],[[264]],[[265]],[[266]],[[267]],[[268]],[[269]],[[270]],[[271]],[[272]],[[273]],[[274]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Bosnia and Herzegovina","sov_a3":"BIH","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Bosnia and Herzegovina","adm0_a3":"BIH","geou_dif":0,"geounit":"Bosnia and Herzegovina","gu_a3":"BIH","su_dif":0,"subunit":"Bosnia and Herzegovina","su_a3":"BIH","brk_diff":0,"name":"Bosnia and Herz.","name_long":"Bosnia and Herzegovina","brk_a3":"BIH","brk_name":"Bosnia and Herz.","brk_group":null,"abbrev":"B.H.","postal":"BiH","formal_en":"Bosnia and Herzegovina","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Bosnia and Herzegovina","name_alt":null,"mapcolor7":1,"mapcolor8":1,"mapcolor9":1,"mapcolor13":2,"pop_est":4613414,"gdp_md_est":29700,"pop_year":-99,"lastcensus":1991,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"BA","iso_a3":"BIH","iso_n3":"070","un_a3":"070","wb_a2":"BA","wb_a3":"BIH","woe_id":-99,"adm0_a3_is":"BIH","adm0_a3_us":"BIH","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":16,"long_len":22,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[275,276,277,278,279]]},{"type":"Polygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"France","sov_a3":"FR1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Saint Barthelemy","adm0_a3":"BLM","geou_dif":0,"geounit":"Saint Barthelemy","gu_a3":"BLM","su_dif":0,"subunit":"Saint Barthelemy","su_a3":"BLM","brk_diff":0,"name":"St-Barthélemy","name_long":"Saint-Barthélemy","brk_a3":"BLM","brk_name":"St-Barthélemy","brk_group":null,"abbrev":"St. B.","postal":"BL","formal_en":"Saint-Barthélemy","formal_fr":null,"note_adm0":"Fr.","note_brk":null,"name_sort":"St-Barthélemy","name_alt":null,"mapcolor7":7,"mapcolor8":5,"mapcolor9":9,"mapcolor13":11,"pop_est":7448,"gdp_md_est":255,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"BL","iso_a3":"BLM","iso_n3":"652","un_a3":"652","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"BLM","adm0_a3_us":"BLM","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":13,"long_len":16,"abbrev_len":6,"tiny":4,"homepart":-99},"arcs":[[280]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Belarus","sov_a3":"BLR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Belarus","adm0_a3":"BLR","geou_dif":0,"geounit":"Belarus","gu_a3":"BLR","su_dif":0,"subunit":"Belarus","su_a3":"BLR","brk_diff":0,"name":"Belarus","name_long":"Belarus","brk_a3":"BLR","brk_name":"Belarus","brk_group":null,"abbrev":"Bela.","postal":"BY","formal_en":"Republic of Belarus","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Belarus","name_alt":null,"mapcolor7":1,"mapcolor8":1,"mapcolor9":5,"mapcolor13":11,"pop_est":9648533,"gdp_md_est":114100,"pop_year":-99,"lastcensus":2009,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"BY","iso_a3":"BLR","iso_n3":"112","un_a3":"112","wb_a2":"BY","wb_a3":"BLR","woe_id":-99,"adm0_a3_is":"BLR","adm0_a3_us":"BLR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Eastern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[281,282,283,284,285]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Belize","sov_a3":"BLZ","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Belize","adm0_a3":"BLZ","geou_dif":0,"geounit":"Belize","gu_a3":"BLZ","su_dif":0,"subunit":"Belize","su_a3":"BLZ","brk_diff":0,"name":"Belize","name_long":"Belize","brk_a3":"BLZ","brk_name":"Belize","brk_group":null,"abbrev":"Belize","postal":"BZ","formal_en":"Belize","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Belize","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":5,"mapcolor13":7,"pop_est":307899,"gdp_md_est":2536,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"BZ","iso_a3":"BLZ","iso_n3":"084","un_a3":"084","wb_a2":"BZ","wb_a3":"BLZ","woe_id":-99,"adm0_a3_is":"BLZ","adm0_a3_us":"BLZ","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Central America","region_wb":"Latin America & Caribbean","name_len":6,"long_len":6,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[[286]],[[287]],[[288,289,290]]]},{"type":"Polygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"United Kingdom","sov_a3":"GB1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Bermuda","adm0_a3":"BMU","geou_dif":0,"geounit":"Bermuda","gu_a3":"BMU","su_dif":0,"subunit":"Bermuda","su_a3":"BMU","brk_diff":0,"name":"Bermuda","name_long":"Bermuda","brk_a3":"BMU","brk_name":"Bermuda","brk_group":null,"abbrev":"Berm.","postal":"BM","formal_en":"The Bermudas or Somers Isles","formal_fr":null,"note_adm0":"U.K.","note_brk":null,"name_sort":"Bermuda","name_alt":null,"mapcolor7":6,"mapcolor8":6,"mapcolor9":6,"mapcolor13":3,"pop_est":67837,"gdp_md_est":4500,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"BM","iso_a3":"BMU","iso_n3":"060","un_a3":"060","wb_a2":"BM","wb_a3":"BMU","woe_id":-99,"adm0_a3_is":"BMU","adm0_a3_us":"BMU","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Northern America","region_wb":"North America","name_len":7,"long_len":7,"abbrev_len":5,"tiny":4,"homepart":-99},"arcs":[[291]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Bolivia","sov_a3":"BOL","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Bolivia","adm0_a3":"BOL","geou_dif":0,"geounit":"Bolivia","gu_a3":"BOL","su_dif":0,"subunit":"Bolivia","su_a3":"BOL","brk_diff":0,"name":"Bolivia","name_long":"Bolivia","brk_a3":"BOL","brk_name":"Bolivia","brk_group":null,"abbrev":"Bolivia","postal":"BO","formal_en":"Plurinational State of Bolivia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Bolivia","name_alt":null,"mapcolor7":1,"mapcolor8":5,"mapcolor9":2,"mapcolor13":3,"pop_est":9775246,"gdp_md_est":43270,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"5. Emerging region: G20","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"BO","iso_a3":"BOL","iso_n3":"068","un_a3":"068","wb_a2":"BO","wb_a3":"BOL","woe_id":-99,"adm0_a3_is":"BOL","adm0_a3_us":"BOL","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"South America","region_un":"Americas","subregion":"South America","region_wb":"Latin America & Caribbean","name_len":7,"long_len":7,"abbrev_len":7,"tiny":-99,"homepart":1},"arcs":[[292,-46,293,294,295]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Brazil","sov_a3":"BRA","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Brazil","adm0_a3":"BRA","geou_dif":0,"geounit":"Brazil","gu_a3":"BRA","su_dif":0,"subunit":"Brazil","su_a3":"BRA","brk_diff":0,"name":"Brazil","name_long":"Brazil","brk_a3":"BRA","brk_name":"Brazil","brk_group":null,"abbrev":"Brazil","postal":"BR","formal_en":"Federative Republic of Brazil","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Brazil","name_alt":null,"mapcolor7":5,"mapcolor8":6,"mapcolor9":5,"mapcolor13":7,"pop_est":198739269,"gdp_md_est":1993000,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"3. Emerging region: BRIC","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"BR","iso_a3":"BRA","iso_n3":"076","un_a3":"076","wb_a2":"BR","wb_a3":"BRA","woe_id":-99,"adm0_a3_is":"BRA","adm0_a3_us":"BRA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"South America","region_un":"Americas","subregion":"South America","region_wb":"Latin America & Caribbean","name_len":6,"long_len":6,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[[296]],[[297]],[[298]],[[299]],[[300]],[[301]],[[302]],[[303]],[[304]],[[305]],[[306]],[[307]],[[308]],[[309]],[[310]],[[311]],[[312,313,314,315,-42,316,-296,317,318,319,320]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Barbados","sov_a3":"BRB","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Barbados","adm0_a3":"BRB","geou_dif":0,"geounit":"Barbados","gu_a3":"BRB","su_dif":0,"subunit":"Barbados","su_a3":"BRB","brk_diff":0,"name":"Barbados","name_long":"Barbados","brk_a3":"BRB","brk_name":"Barbados","brk_group":null,"abbrev":"Barb.","postal":"BB","formal_en":"Barbados","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Barbados","name_alt":null,"mapcolor7":4,"mapcolor8":1,"mapcolor9":5,"mapcolor13":3,"pop_est":284589,"gdp_md_est":5425,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"BB","iso_a3":"BRB","iso_n3":"052","un_a3":"052","wb_a2":"BB","wb_a3":"BRB","woe_id":-99,"adm0_a3_is":"BRB","adm0_a3_us":"BRB","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":8,"long_len":8,"abbrev_len":5,"tiny":3,"homepart":1},"arcs":[[321]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Brunei","sov_a3":"BRN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Brunei","adm0_a3":"BRN","geou_dif":0,"geounit":"Brunei","gu_a3":"BRN","su_dif":0,"subunit":"Brunei","su_a3":"BRN","brk_diff":0,"name":"Brunei","name_long":"Brunei Darussalam","brk_a3":"BRN","brk_name":"Brunei","brk_group":null,"abbrev":"Brunei","postal":"BN","formal_en":"Negara Brunei Darussalam","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Brunei","name_alt":null,"mapcolor7":4,"mapcolor8":6,"mapcolor9":6,"mapcolor13":12,"pop_est":388190,"gdp_md_est":20250,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"BN","iso_a3":"BRN","iso_n3":"096","un_a3":"096","wb_a2":"BN","wb_a3":"BRN","woe_id":-99,"adm0_a3_is":"BRN","adm0_a3_us":"BRN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"South-Eastern Asia","region_wb":"East Asia & Pacific","name_len":6,"long_len":17,"abbrev_len":6,"tiny":2,"homepart":1},"arcs":[[[322,323]],[[324,325]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Bhutan","sov_a3":"BTN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Bhutan","adm0_a3":"BTN","geou_dif":0,"geounit":"Bhutan","gu_a3":"BTN","su_dif":0,"subunit":"Bhutan","su_a3":"BTN","brk_diff":0,"name":"Bhutan","name_long":"Bhutan","brk_a3":"BTN","brk_name":"Bhutan","brk_group":null,"abbrev":"Bhutan","postal":"BT","formal_en":"Kingdom of Bhutan","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Bhutan","name_alt":null,"mapcolor7":5,"mapcolor8":6,"mapcolor9":1,"mapcolor13":8,"pop_est":691141,"gdp_md_est":3524,"pop_year":-99,"lastcensus":2005,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"BT","iso_a3":"BTN","iso_n3":"064","un_a3":"064","wb_a2":"BT","wb_a3":"BTN","woe_id":-99,"adm0_a3_is":"BTN","adm0_a3_us":"BTN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Southern Asia","region_wb":"South Asia","name_len":6,"long_len":6,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[326,327]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Botswana","sov_a3":"BWA","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Botswana","adm0_a3":"BWA","geou_dif":0,"geounit":"Botswana","gu_a3":"BWA","su_dif":0,"subunit":"Botswana","su_a3":"BWA","brk_diff":0,"name":"Botswana","name_long":"Botswana","brk_a3":"BWA","brk_name":"Botswana","brk_group":null,"abbrev":"Bwa.","postal":"BW","formal_en":"Republic of Botswana","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Botswana","name_alt":null,"mapcolor7":6,"mapcolor8":5,"mapcolor9":7,"mapcolor13":3,"pop_est":1990876,"gdp_md_est":27060,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"BW","iso_a3":"BWA","iso_n3":"072","un_a3":"072","wb_a2":"BW","wb_a3":"BWA","woe_id":-99,"adm0_a3_is":"BWA","adm0_a3_us":"BWA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Southern Africa","region_wb":"Sub-Saharan Africa","name_len":8,"long_len":8,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[328,329,330]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Central African Republic","sov_a3":"CAF","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Central African Republic","adm0_a3":"CAF","geou_dif":0,"geounit":"Central African Republic","gu_a3":"CAF","su_dif":0,"subunit":"Central African Republic","su_a3":"CAF","brk_diff":0,"name":"Central African Rep.","name_long":"Central African Republic","brk_a3":"CAF","brk_name":"Central African Rep.","brk_group":null,"abbrev":"C.A.R.","postal":"CF","formal_en":"Central African Republic","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Central African Republic","name_alt":null,"mapcolor7":5,"mapcolor8":6,"mapcolor9":6,"mapcolor13":9,"pop_est":4511488,"gdp_md_est":3198,"pop_year":-99,"lastcensus":2003,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"CF","iso_a3":"CAF","iso_n3":"140","un_a3":"140","wb_a2":"CF","wb_a3":"CAF","woe_id":-99,"adm0_a3_is":"CAF","adm0_a3_us":"CAF","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Middle Africa","region_wb":"Sub-Saharan Africa","name_len":20,"long_len":24,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[331,332,333,334,335,336]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Canada","sov_a3":"CAN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Canada","adm0_a3":"CAN","geou_dif":0,"geounit":"Canada","gu_a3":"CAN","su_dif":0,"subunit":"Canada","su_a3":"CAN","brk_diff":0,"name":"Canada","name_long":"Canada","brk_a3":"CAN","brk_name":"Canada","brk_group":null,"abbrev":"Can.","postal":"CA","formal_en":"Canada","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Canada","name_alt":null,"mapcolor7":6,"mapcolor8":6,"mapcolor9":2,"mapcolor13":2,"pop_est":33487208,"gdp_md_est":1300000,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"1. Developed region: G7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"CA","iso_a3":"CAN","iso_n3":"124","un_a3":"124","wb_a2":"CA","wb_a3":"CAN","woe_id":-99,"adm0_a3_is":"CAN","adm0_a3_us":"CAN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Northern America","region_wb":"North America","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[337]],[[338]],[[339]],[[340]],[[341]],[[342]],[[343]],[[344]],[[345]],[[346]],[[347]],[[348]],[[349]],[[350]],[[351]],[[352,353]],[[354]],[[355]],[[356]],[[357]],[[358]],[[359]],[[360]],[[361]],[[362]],[[363]],[[364]],[[365]],[[366]],[[367]],[[368]],[[369]],[[370]],[[371]],[[372]],[[373]],[[374]],[[375]],[[376]],[[377]],[[378]],[[379]],[[380]],[[381,382]],[[383]],[[384]],[[385]],[[386]],[[387]],[[388]],[[389]],[[390]],[[391]],[[392]],[[393]],[[394]],[[395]],[[396]],[[397]],[[398]],[[399]],[[400]],[[401]],[[402]],[[403]],[[404]],[[405]],[[406]],[[407]],[[408]],[[409]],[[410]],[[411]],[[412]],[[413]],[[414]],[[415]],[[416]],[[417]],[[418]],[[419]],[[420]],[[421]],[[422]],[[423]],[[424]],[[425]],[[426]],[[427]],[[428]],[[429]],[[430]],[[431]],[[432]],[[433]],[[434]],[[435]],[[436]],[[437]],[[438]],[[439,440,441,442]],[[443]],[[444]],[[445]],[[446]],[[447]],[[448]],[[449]],[[450]],[[451]],[[452]],[[453]],[[454]],[[455]],[[456]],[[457]],[[458]],[[459]],[[460]],[[461]],[[462]],[[463]],[[464]],[[465]],[[466]],[[467]],[[468]],[[469]],[[470]],[[471]],[[472]],[[473]],[[474]],[[475]],[[476]],[[477]],[[478]],[[479]],[[480]],[[481]],[[482]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Switzerland","sov_a3":"CHE","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Switzerland","adm0_a3":"CHE","geou_dif":0,"geounit":"Switzerland","gu_a3":"CHE","su_dif":0,"subunit":"Switzerland","su_a3":"CHE","brk_diff":0,"name":"Switzerland","name_long":"Switzerland","brk_a3":"CHE","brk_name":"Switzerland","brk_group":null,"abbrev":"Switz.","postal":"CH","formal_en":"Swiss Confederation","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Switzerland","name_alt":null,"mapcolor7":5,"mapcolor8":2,"mapcolor9":7,"mapcolor13":3,"pop_est":7604467,"gdp_md_est":316700,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"CH","iso_a3":"CHE","iso_n3":"756","un_a3":"756","wb_a2":"CH","wb_a3":"CHE","woe_id":-99,"adm0_a3_is":"CHE","adm0_a3_us":"CHE","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Western Europe","region_wb":"Europe & Central Asia","name_len":11,"long_len":11,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[-216,483,-214,484,485,486]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Chile","sov_a3":"CHL","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Chile","adm0_a3":"CHL","geou_dif":0,"geounit":"Chile","gu_a3":"CHL","su_dif":0,"subunit":"Chile","su_a3":"CHL","brk_diff":0,"name":"Chile","name_long":"Chile","brk_a3":"CHL","brk_name":"Chile","brk_group":null,"abbrev":"Chile","postal":"CL","formal_en":"Republic of Chile","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Chile","name_alt":null,"mapcolor7":5,"mapcolor8":1,"mapcolor9":5,"mapcolor13":9,"pop_est":16601707,"gdp_md_est":244500,"pop_year":-99,"lastcensus":2002,"gdp_year":-99,"economy":"5. Emerging region: G20","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"CL","iso_a3":"CHL","iso_n3":"152","un_a3":"152","wb_a2":"CL","wb_a3":"CHL","woe_id":-99,"adm0_a3_is":"CHL","adm0_a3_us":"CHL","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"South America","region_un":"Americas","subregion":"South America","region_wb":"Latin America & Caribbean","name_len":5,"long_len":5,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[487]],[[488]],[[489]],[[490]],[[491]],[[492]],[[493]],[[494]],[[495]],[[-38,496]],[[497]],[[498]],[[499]],[[500]],[[501]],[[502]],[[503]],[[504]],[[505]],[[506]],[[507]],[[508]],[[509]],[[510]],[[511]],[[512]],[[513]],[[514]],[[515]],[[516]],[[-45,517,518,-294]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"China","sov_a3":"CH1","adm0_dif":1,"level":2,"type":"Country","admin":"China","adm0_a3":"CHN","geou_dif":0,"geounit":"China","gu_a3":"CHN","su_dif":0,"subunit":"China","su_a3":"CHN","brk_diff":0,"name":"China","name_long":"China","brk_a3":"CHN","brk_name":"China","brk_group":null,"abbrev":"China","postal":"CN","formal_en":"People's Republic of China","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"China","name_alt":null,"mapcolor7":4,"mapcolor8":4,"mapcolor9":4,"mapcolor13":3,"pop_est":1338612970,"gdp_md_est":7973000,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"3. Emerging region: BRIC","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"CN","iso_a3":"CHN","iso_n3":"156","un_a3":"156","wb_a2":"CN","wb_a3":"CHN","woe_id":-99,"adm0_a3_is":"CHN","adm0_a3_us":"CHN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Eastern Asia","region_wb":"East Asia & Pacific","name_len":5,"long_len":5,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[519]],[[520]],[[521]],[[522]],[[523]],[[524]],[[525]],[[526]],[[527]],[[528]],[[529]],[[530]],[[531,532,533,534,535,536,537,538,539,540,-328,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,-2,557,558,559,560,561,562]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Ivory Coast","sov_a3":"CIV","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Ivory Coast","adm0_a3":"CIV","geou_dif":0,"geounit":"Ivory Coast","gu_a3":"CIV","su_dif":0,"subunit":"Ivory Coast","su_a3":"CIV","brk_diff":0,"name":"Côte d'Ivoire","name_long":"Côte d'Ivoire","brk_a3":"CIV","brk_name":"Côte d'Ivoire","brk_group":null,"abbrev":"I.C.","postal":"CI","formal_en":"Republic of Ivory Coast","formal_fr":"Republic of Cote D'Ivoire","note_adm0":null,"note_brk":null,"name_sort":"Côte d'Ivoire","name_alt":null,"mapcolor7":4,"mapcolor8":6,"mapcolor9":3,"mapcolor13":3,"pop_est":20617068,"gdp_md_est":33850,"pop_year":-99,"lastcensus":1998,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"CI","iso_a3":"CIV","iso_n3":"384","un_a3":"384","wb_a2":"CI","wb_a3":"CIV","woe_id":-99,"adm0_a3_is":"CIV","adm0_a3_us":"CIV","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Western Africa","region_wb":"Sub-Saharan Africa","name_len":13,"long_len":13,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[563,564]],[[-243,565,566,567,568,569]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Cameroon","sov_a3":"CMR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Cameroon","adm0_a3":"CMR","geou_dif":0,"geounit":"Cameroon","gu_a3":"CMR","su_dif":0,"subunit":"Cameroon","su_a3":"CMR","brk_diff":0,"name":"Cameroon","name_long":"Cameroon","brk_a3":"CMR","brk_name":"Cameroon","brk_group":null,"abbrev":"Cam.","postal":"CM","formal_en":"Republic of Cameroon","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Cameroon","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":1,"mapcolor13":3,"pop_est":18879301,"gdp_md_est":42750,"pop_year":-99,"lastcensus":2005,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"CM","iso_a3":"CMR","iso_n3":"120","un_a3":"120","wb_a2":"CM","wb_a3":"CMR","woe_id":-99,"adm0_a3_is":"CMR","adm0_a3_us":"CMR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Middle Africa","region_wb":"Sub-Saharan Africa","name_len":8,"long_len":8,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-336,570,571,572,573,574,575]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Democratic Republic of the Congo","sov_a3":"COD","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Democratic Republic of the Congo","adm0_a3":"COD","geou_dif":0,"geounit":"Democratic Republic of the Congo","gu_a3":"COD","su_dif":0,"subunit":"Democratic Republic of the Congo","su_a3":"COD","brk_diff":0,"name":"Dem. Rep. Congo","name_long":"Democratic Republic of the Congo","brk_a3":"COD","brk_name":"Democratic Republic of the Congo","brk_group":null,"abbrev":"D.R.C.","postal":"DRC","formal_en":"Democratic Republic of the Congo","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Congo, Dem. Rep.","name_alt":null,"mapcolor7":4,"mapcolor8":4,"mapcolor9":4,"mapcolor13":7,"pop_est":68692542,"gdp_md_est":20640,"pop_year":-99,"lastcensus":1984,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"CD","iso_a3":"COD","iso_n3":"180","un_a3":"180","wb_a2":"ZR","wb_a3":"ZAR","woe_id":-99,"adm0_a3_is":"COD","adm0_a3_us":"COD","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Middle Africa","region_wb":"Sub-Saharan Africa","name_len":15,"long_len":32,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[576,577,578,-226,579,580,-12,581,-15,582,-334]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Republic of Congo","sov_a3":"COG","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Republic of Congo","adm0_a3":"COG","geou_dif":0,"geounit":"Republic of Congo","gu_a3":"COG","su_dif":0,"subunit":"Republic of Congo","su_a3":"COG","brk_diff":0,"name":"Congo","name_long":"Republic of Congo","brk_a3":"COG","brk_name":"Republic of Congo","brk_group":null,"abbrev":"Rep. Congo","postal":"CG","formal_en":"Republic of Congo","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Congo, Rep.","name_alt":null,"mapcolor7":2,"mapcolor8":1,"mapcolor9":3,"mapcolor13":10,"pop_est":4012809,"gdp_md_est":15350,"pop_year":-99,"lastcensus":2007,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"CG","iso_a3":"COG","iso_n3":"178","un_a3":"178","wb_a2":"CG","wb_a3":"COG","woe_id":-99,"adm0_a3_is":"COG","adm0_a3_us":"COG","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Middle Africa","region_wb":"Sub-Saharan Africa","name_len":5,"long_len":17,"abbrev_len":10,"tiny":-99,"homepart":1},"arcs":[[-583,-14,583,584,-571,-335]]},{"type":"Polygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"New Zealand","sov_a3":"NZ1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Cook Islands","adm0_a3":"COK","geou_dif":0,"geounit":"Cook Islands","gu_a3":"COK","su_dif":0,"subunit":"Cook Islands","su_a3":"COK","brk_diff":0,"name":"Cook Is.","name_long":"Cook Islands","brk_a3":"COK","brk_name":"Cook Is.","brk_group":null,"abbrev":"Cook Is.","postal":"CK","formal_en":null,"formal_fr":null,"note_adm0":"Assoc. with N.Z.","note_brk":null,"name_sort":"Cook Islands","name_alt":null,"mapcolor7":3,"mapcolor8":3,"mapcolor9":4,"mapcolor13":4,"pop_est":11870,"gdp_md_est":183.2,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"CK","iso_a3":"COK","iso_n3":"184","un_a3":"184","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"COK","adm0_a3_us":"COK","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Polynesia","region_wb":"East Asia & Pacific","name_len":8,"long_len":12,"abbrev_len":8,"tiny":3,"homepart":-99},"arcs":[[585]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Colombia","sov_a3":"COL","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Colombia","adm0_a3":"COL","geou_dif":0,"geounit":"Colombia","gu_a3":"COL","su_dif":0,"subunit":"Colombia","su_a3":"COL","brk_diff":0,"name":"Colombia","name_long":"Colombia","brk_a3":"COL","brk_name":"Colombia","brk_group":null,"abbrev":"Col.","postal":"CO","formal_en":"Republic of Colombia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Colombia","name_alt":null,"mapcolor7":2,"mapcolor8":1,"mapcolor9":3,"mapcolor13":1,"pop_est":45644023,"gdp_md_est":395400,"pop_year":-99,"lastcensus":2006,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"CO","iso_a3":"COL","iso_n3":"170","un_a3":"170","wb_a2":"CO","wb_a3":"COL","woe_id":-99,"adm0_a3_is":"COL","adm0_a3_us":"COL","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"South America","region_un":"Americas","subregion":"South America","region_wb":"Latin America & Caribbean","name_len":8,"long_len":8,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[586]],[[587,-319,588,589,590,591,592]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Comoros","sov_a3":"COM","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Comoros","adm0_a3":"COM","geou_dif":0,"geounit":"Comoros","gu_a3":"COM","su_dif":0,"subunit":"Comoros","su_a3":"COM","brk_diff":0,"name":"Comoros","name_long":"Comoros","brk_a3":"COM","brk_name":"Comoros","brk_group":null,"abbrev":"Com.","postal":"KM","formal_en":"Union of the Comoros","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Comoros","name_alt":null,"mapcolor7":2,"mapcolor8":1,"mapcolor9":4,"mapcolor13":10,"pop_est":752438,"gdp_md_est":751.2,"pop_year":-99,"lastcensus":2003,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"KM","iso_a3":"COM","iso_n3":"174","un_a3":"174","wb_a2":"KM","wb_a3":"COM","woe_id":-99,"adm0_a3_is":"COM","adm0_a3_us":"COM","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Eastern Africa","region_wb":"Sub-Saharan Africa","name_len":7,"long_len":7,"abbrev_len":4,"tiny":2,"homepart":1},"arcs":[[[593]],[[594]],[[595]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Cape Verde","sov_a3":"CPV","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Cape Verde","adm0_a3":"CPV","geou_dif":0,"geounit":"Cape Verde","gu_a3":"CPV","su_dif":0,"subunit":"Cape Verde","su_a3":"CPV","brk_diff":0,"name":"Cape Verde","name_long":"Cape Verde","brk_a3":"CPV","brk_name":"Cape Verde","brk_group":null,"abbrev":"C.Vd.","postal":"CV","formal_en":"Republic of Cape Verde","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Cape Verde","name_alt":null,"mapcolor7":1,"mapcolor8":1,"mapcolor9":4,"mapcolor13":11,"pop_est":429474,"gdp_md_est":1626,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"CV","iso_a3":"CPV","iso_n3":"132","un_a3":"132","wb_a2":"CV","wb_a3":"CPV","woe_id":-99,"adm0_a3_is":"CPV","adm0_a3_us":"CPV","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Western Africa","region_wb":"Sub-Saharan Africa","name_len":10,"long_len":10,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[596]],[[597]],[[598]],[[599]],[[600]],[[601]],[[602]],[[603]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Costa Rica","sov_a3":"CRI","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Costa Rica","adm0_a3":"CRI","geou_dif":0,"geounit":"Costa Rica","gu_a3":"CRI","su_dif":0,"subunit":"Costa Rica","su_a3":"CRI","brk_diff":0,"name":"Costa Rica","name_long":"Costa Rica","brk_a3":"CRI","brk_name":"Costa Rica","brk_group":null,"abbrev":"C.R.","postal":"CR","formal_en":"Republic of Costa Rica","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Costa Rica","name_alt":null,"mapcolor7":3,"mapcolor8":2,"mapcolor9":4,"mapcolor13":2,"pop_est":4253877,"gdp_md_est":48320,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"5. Emerging region: G20","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"CR","iso_a3":"CRI","iso_n3":"188","un_a3":"188","wb_a2":"CR","wb_a3":"CRI","woe_id":-99,"adm0_a3_is":"CRI","adm0_a3_us":"CRI","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Central America","region_wb":"Latin America & Caribbean","name_len":10,"long_len":10,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[604,605,606,607]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Cuba","sov_a3":"CUB","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Cuba","adm0_a3":"CUB","geou_dif":0,"geounit":"Cuba","gu_a3":"CUB","su_dif":0,"subunit":"Cuba","su_a3":"CUB","brk_diff":0,"name":"Cuba","name_long":"Cuba","brk_a3":"CUB","brk_name":"Cuba","brk_group":null,"abbrev":"Cuba","postal":"CU","formal_en":"Republic of Cuba","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Cuba","name_alt":null,"mapcolor7":3,"mapcolor8":5,"mapcolor9":3,"mapcolor13":4,"pop_est":11451652,"gdp_md_est":108200,"pop_year":-99,"lastcensus":2002,"gdp_year":-99,"economy":"5. Emerging region: G20","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"CU","iso_a3":"CUB","iso_n3":"192","un_a3":"192","wb_a2":"CU","wb_a3":"CUB","woe_id":-99,"adm0_a3_is":"CUB","adm0_a3_us":"CUB","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":4,"long_len":4,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[608]],[[609]],[[610]],[[611]],[[612]],[[613]],[[614]]]},{"type":"Polygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Netherlands","sov_a3":"NL1","adm0_dif":1,"level":2,"type":"Country","admin":"Curaçao","adm0_a3":"CUW","geou_dif":0,"geounit":"Curaçao","gu_a3":"CUW","su_dif":0,"subunit":"Curaçao","su_a3":"CUW","brk_diff":0,"name":"Curaçao","name_long":"Curaçao","brk_a3":"CUW","brk_name":"Curaçao","brk_group":null,"abbrev":"Cur.","postal":"CW","formal_en":"Curaçao","formal_fr":null,"note_adm0":"Neth.","note_brk":null,"name_sort":"Curaçao","name_alt":null,"mapcolor7":4,"mapcolor8":2,"mapcolor9":2,"mapcolor13":9,"pop_est":141766,"gdp_md_est":2838,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"CW","iso_a3":"CUW","iso_n3":"531","un_a3":"531","wb_a2":"CW","wb_a3":"CUW","woe_id":-99,"adm0_a3_is":"CUW","adm0_a3_us":"CUW","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":7,"long_len":7,"abbrev_len":4,"tiny":4,"homepart":-99},"arcs":[[615]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"United Kingdom","sov_a3":"GB1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Cayman Islands","adm0_a3":"CYM","geou_dif":0,"geounit":"Cayman Islands","gu_a3":"CYM","su_dif":0,"subunit":"Cayman Islands","su_a3":"CYM","brk_diff":0,"name":"Cayman Is.","name_long":"Cayman Islands","brk_a3":"CYM","brk_name":"Cayman Is.","brk_group":null,"abbrev":"Cym. Is.","postal":"KY","formal_en":"Cayman Islands","formal_fr":null,"note_adm0":"U.K.","note_brk":null,"name_sort":"Cayman Islands","name_alt":null,"mapcolor7":6,"mapcolor8":6,"mapcolor9":6,"mapcolor13":3,"pop_est":49035,"gdp_md_est":1939,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"5. Emerging region: G20","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"KY","iso_a3":"CYM","iso_n3":"136","un_a3":"136","wb_a2":"KY","wb_a3":"CYM","woe_id":-99,"adm0_a3_is":"CYM","adm0_a3_us":"CYM","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":10,"long_len":14,"abbrev_len":8,"tiny":2,"homepart":-99},"arcs":[[[616]],[[617]],[[618]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Northern Cyprus","sov_a3":"CYN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Northern Cyprus","adm0_a3":"CYN","geou_dif":0,"geounit":"Northern Cyprus","gu_a3":"CYN","su_dif":0,"subunit":"Northern Cyprus","su_a3":"CYN","brk_diff":1,"name":"N. Cyprus","name_long":"Northern Cyprus","brk_a3":"B20","brk_name":"N. Cyprus","brk_group":null,"abbrev":"N. Cy.","postal":"CN","formal_en":"Turkish Republic of Northern Cyprus","formal_fr":null,"note_adm0":"Self admin.","note_brk":"Self admin.; Claimed by Cyprus","name_sort":"Cyprus, Northern","name_alt":null,"mapcolor7":3,"mapcolor8":1,"mapcolor9":4,"mapcolor13":8,"pop_est":265100,"gdp_md_est":3600,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"-99","iso_a3":"-99","iso_n3":"-99","un_a3":"-099","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"CYP","adm0_a3_us":"CYP","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Western Asia","region_wb":"Europe & Central Asia","name_len":9,"long_len":15,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[619,620]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Cyprus","sov_a3":"CYP","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Cyprus","adm0_a3":"CYP","geou_dif":0,"geounit":"Cyprus","gu_a3":"CYP","su_dif":0,"subunit":"Cyprus","su_a3":"CYP","brk_diff":0,"name":"Cyprus","name_long":"Cyprus","brk_a3":"CYP","brk_name":"Cyprus","brk_group":null,"abbrev":"Cyp.","postal":"CY","formal_en":"Republic of Cyprus","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Cyprus","name_alt":null,"mapcolor7":1,"mapcolor8":2,"mapcolor9":3,"mapcolor13":7,"pop_est":531640,"gdp_md_est":22700,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"CY","iso_a3":"CYP","iso_n3":"196","un_a3":"196","wb_a2":"CY","wb_a3":"CYP","woe_id":-99,"adm0_a3_is":"CYP","adm0_a3_us":"CYP","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Western Asia","region_wb":"Europe & Central Asia","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-620,621]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Czech Republic","sov_a3":"CZE","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Czech Republic","adm0_a3":"CZE","geou_dif":0,"geounit":"Czech Republic","gu_a3":"CZE","su_dif":0,"subunit":"Czech Republic","su_a3":"CZE","brk_diff":0,"name":"Czech Rep.","name_long":"Czech Republic","brk_a3":"CZE","brk_name":"Czech Rep.","brk_group":null,"abbrev":"Cz. Rep.","postal":"CZ","formal_en":"Czech Republic","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Czech Republic","name_alt":null,"mapcolor7":1,"mapcolor8":1,"mapcolor9":2,"mapcolor13":6,"pop_est":10211904,"gdp_md_est":265200,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"CZ","iso_a3":"CZE","iso_n3":"203","un_a3":"203","wb_a2":"CZ","wb_a3":"CZE","woe_id":-99,"adm0_a3_is":"CZE","adm0_a3_us":"CZE","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Eastern Europe","region_wb":"Europe & Central Asia","name_len":10,"long_len":14,"abbrev_len":8,"tiny":-99,"homepart":1},"arcs":[[622,623,-218,624]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Germany","sov_a3":"DEU","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Germany","adm0_a3":"DEU","geou_dif":0,"geounit":"Germany","gu_a3":"DEU","su_dif":0,"subunit":"Germany","su_a3":"DEU","brk_diff":0,"name":"Germany","name_long":"Germany","brk_a3":"DEU","brk_name":"Germany","brk_group":null,"abbrev":"Ger.","postal":"D","formal_en":"Federal Republic of Germany","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Germany","name_alt":null,"mapcolor7":2,"mapcolor8":5,"mapcolor9":5,"mapcolor13":1,"pop_est":82329758,"gdp_md_est":2918000,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"1. Developed region: G7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"DE","iso_a3":"DEU","iso_n3":"276","un_a3":"276","wb_a2":"DE","wb_a3":"DEU","woe_id":-99,"adm0_a3_is":"DEU","adm0_a3_us":"DEU","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Western Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[625,626]],[[627]],[[628]],[[629]],[[630,631,-625,-217,-487,632,633,-229,634,635,636]],[[637]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Djibouti","sov_a3":"DJI","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Djibouti","adm0_a3":"DJI","geou_dif":0,"geounit":"Djibouti","gu_a3":"DJI","su_dif":0,"subunit":"Djibouti","su_a3":"DJI","brk_diff":0,"name":"Djibouti","name_long":"Djibouti","brk_a3":"DJI","brk_name":"Djibouti","brk_group":null,"abbrev":"Dji.","postal":"DJ","formal_en":"Republic of Djibouti","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Djibouti","name_alt":null,"mapcolor7":1,"mapcolor8":2,"mapcolor9":4,"mapcolor13":8,"pop_est":516055,"gdp_md_est":1885,"pop_year":-99,"lastcensus":2009,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"DJ","iso_a3":"DJI","iso_n3":"262","un_a3":"262","wb_a2":"DJ","wb_a3":"DJI","woe_id":-99,"adm0_a3_is":"DJI","adm0_a3_us":"DJI","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Eastern Africa","region_wb":"Middle East & North Africa","name_len":8,"long_len":8,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[638,639,640,641]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Dominica","sov_a3":"DMA","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Dominica","adm0_a3":"DMA","geou_dif":0,"geounit":"Dominica","gu_a3":"DMA","su_dif":0,"subunit":"Dominica","su_a3":"DMA","brk_diff":0,"name":"Dominica","name_long":"Dominica","brk_a3":"DMA","brk_name":"Dominica","brk_group":null,"abbrev":"D'inca","postal":"DM","formal_en":"Commonwealth of Dominica","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Dominica","name_alt":null,"mapcolor7":4,"mapcolor8":5,"mapcolor9":2,"mapcolor13":12,"pop_est":72660,"gdp_md_est":719.6,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"DM","iso_a3":"DMA","iso_n3":"212","un_a3":"212","wb_a2":"DM","wb_a3":"DMA","woe_id":-99,"adm0_a3_is":"DMA","adm0_a3_us":"DMA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":8,"long_len":8,"abbrev_len":6,"tiny":4,"homepart":1},"arcs":[[642]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Denmark","sov_a3":"DN1","adm0_dif":1,"level":2,"type":"Country","admin":"Denmark","adm0_a3":"DNK","geou_dif":0,"geounit":"Denmark","gu_a3":"DNK","su_dif":0,"subunit":"Denmark","su_a3":"DNK","brk_diff":0,"name":"Denmark","name_long":"Denmark","brk_a3":"DNK","brk_name":"Denmark","brk_group":null,"abbrev":"Den.","postal":"DK","formal_en":"Kingdom of Denmark","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Denmark","name_alt":null,"mapcolor7":4,"mapcolor8":1,"mapcolor9":3,"mapcolor13":12,"pop_est":5500510,"gdp_md_est":203600,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"DK","iso_a3":"DNK","iso_n3":"208","un_a3":"208","wb_a2":"DK","wb_a3":"DNK","woe_id":-99,"adm0_a3_is":"DNK","adm0_a3_us":"DNK","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[643]],[[644]],[[645]],[[646]],[[647]],[[648]],[[649]],[[650]],[[651]],[[652]],[[653]],[[-637,654]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Dominican Republic","sov_a3":"DOM","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Dominican Republic","adm0_a3":"DOM","geou_dif":0,"geounit":"Dominican Republic","gu_a3":"DOM","su_dif":0,"subunit":"Dominican Republic","su_a3":"DOM","brk_diff":0,"name":"Dominican Rep.","name_long":"Dominican Republic","brk_a3":"DOM","brk_name":"Dominican Rep.","brk_group":null,"abbrev":"Dom. Rep.","postal":"DO","formal_en":"Dominican Republic","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Dominican Republic","name_alt":null,"mapcolor7":5,"mapcolor8":2,"mapcolor9":5,"mapcolor13":7,"pop_est":9650054,"gdp_md_est":78000,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"DO","iso_a3":"DOM","iso_n3":"214","un_a3":"214","wb_a2":"DO","wb_a3":"DOM","woe_id":-99,"adm0_a3_is":"DOM","adm0_a3_us":"DOM","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":14,"long_len":18,"abbrev_len":9,"tiny":-99,"homepart":1},"arcs":[[655,656]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Algeria","sov_a3":"DZA","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Algeria","adm0_a3":"DZA","geou_dif":0,"geounit":"Algeria","gu_a3":"DZA","su_dif":0,"subunit":"Algeria","su_a3":"DZA","brk_diff":0,"name":"Algeria","name_long":"Algeria","brk_a3":"DZA","brk_name":"Algeria","brk_group":null,"abbrev":"Alg.","postal":"DZ","formal_en":"People's Democratic Republic of Algeria","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Algeria","name_alt":null,"mapcolor7":5,"mapcolor8":1,"mapcolor9":6,"mapcolor13":3,"pop_est":34178188,"gdp_md_est":232900,"pop_year":-99,"lastcensus":2008,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"DZ","iso_a3":"DZA","iso_n3":"012","un_a3":"012","wb_a2":"DZ","wb_a3":"DZA","woe_id":-99,"adm0_a3_is":"DZA","adm0_a3_us":"DZA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Northern Africa","region_wb":"Middle East & North Africa","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[657,658,659,660,661,662,663,664]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Ecuador","sov_a3":"ECU","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Ecuador","adm0_a3":"ECU","geou_dif":0,"geounit":"Ecuador","gu_a3":"ECU","su_dif":0,"subunit":"Ecuador","su_a3":"ECU","brk_diff":0,"name":"Ecuador","name_long":"Ecuador","brk_a3":"ECU","brk_name":"Ecuador","brk_group":null,"abbrev":"Ecu.","postal":"EC","formal_en":"Republic of Ecuador","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Ecuador","name_alt":null,"mapcolor7":1,"mapcolor8":5,"mapcolor9":2,"mapcolor13":12,"pop_est":14573101,"gdp_md_est":107700,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"EC","iso_a3":"ECU","iso_n3":"218","un_a3":"218","wb_a2":"EC","wb_a3":"ECU","woe_id":-99,"adm0_a3_is":"ECU","adm0_a3_us":"ECU","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"South America","region_un":"Americas","subregion":"South America","region_wb":"Latin America & Caribbean","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[665]],[[666]],[[667]],[[668]],[[669]],[[670]],[[671]],[[672]],[[673,674,-590]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Egypt","sov_a3":"EGY","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Egypt","adm0_a3":"EGY","geou_dif":0,"geounit":"Egypt","gu_a3":"EGY","su_dif":0,"subunit":"Egypt","su_a3":"EGY","brk_diff":0,"name":"Egypt","name_long":"Egypt","brk_a3":"EGY","brk_name":"Egypt","brk_group":null,"abbrev":"Egypt","postal":"EG","formal_en":"Arab Republic of Egypt","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Egypt, Arab Rep.","name_alt":null,"mapcolor7":4,"mapcolor8":6,"mapcolor9":7,"mapcolor13":2,"pop_est":83082869,"gdp_md_est":443700,"pop_year":-99,"lastcensus":2006,"gdp_year":-99,"economy":"5. Emerging region: G20","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"EG","iso_a3":"EGY","iso_n3":"818","un_a3":"818","wb_a2":"EG","wb_a3":"EGY","woe_id":-99,"adm0_a3_is":"EGY","adm0_a3_us":"EGY","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Northern Africa","region_wb":"Middle East & North Africa","name_len":5,"long_len":5,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[675,676,677,678,679,680]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Eritrea","sov_a3":"ERI","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Eritrea","adm0_a3":"ERI","geou_dif":0,"geounit":"Eritrea","gu_a3":"ERI","su_dif":0,"subunit":"Eritrea","su_a3":"ERI","brk_diff":0,"name":"Eritrea","name_long":"Eritrea","brk_a3":"ERI","brk_name":"Eritrea","brk_group":null,"abbrev":"Erit.","postal":"ER","formal_en":"State of Eritrea","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Eritrea","name_alt":null,"mapcolor7":3,"mapcolor8":1,"mapcolor9":2,"mapcolor13":12,"pop_est":5647168,"gdp_md_est":3945,"pop_year":-99,"lastcensus":1984,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"ER","iso_a3":"ERI","iso_n3":"232","un_a3":"232","wb_a2":"ER","wb_a3":"ERI","woe_id":-99,"adm0_a3_is":"ERI","adm0_a3_us":"ERI","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Eastern Africa","region_wb":"Sub-Saharan Africa","name_len":7,"long_len":7,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[681]],[[682]],[[683,-641,684,685]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Spain","sov_a3":"ESP","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Spain","adm0_a3":"ESP","geou_dif":0,"geounit":"Spain","gu_a3":"ESP","su_dif":0,"subunit":"Spain","su_a3":"ESP","brk_diff":0,"name":"Spain","name_long":"Spain","brk_a3":"ESP","brk_name":"Spain","brk_group":null,"abbrev":"Sp.","postal":"E","formal_en":"Kingdom of Spain","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Spain","name_alt":null,"mapcolor7":4,"mapcolor8":5,"mapcolor9":5,"mapcolor13":5,"pop_est":40525002,"gdp_md_est":1403000,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"ES","iso_a3":"ESP","iso_n3":"724","un_a3":"724","wb_a2":"ES","wb_a3":"ESP","woe_id":-99,"adm0_a3_is":"ESP","adm0_a3_us":"ESP","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":5,"long_len":5,"abbrev_len":3,"tiny":-99,"homepart":1},"arcs":[[[686]],[[687]],[[688]],[[689]],[[690]],[[691]],[[692]],[[693]],[[694]],[[695]],[[696]],[[697,-25,698,699,700,701]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Estonia","sov_a3":"EST","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Estonia","adm0_a3":"EST","geou_dif":0,"geounit":"Estonia","gu_a3":"EST","su_dif":0,"subunit":"Estonia","su_a3":"EST","brk_diff":0,"name":"Estonia","name_long":"Estonia","brk_a3":"EST","brk_name":"Estonia","brk_group":null,"abbrev":"Est.","postal":"EST","formal_en":"Republic of Estonia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Estonia","name_alt":null,"mapcolor7":3,"mapcolor8":2,"mapcolor9":1,"mapcolor13":10,"pop_est":1299371,"gdp_md_est":27410,"pop_year":-99,"lastcensus":2000,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"EE","iso_a3":"EST","iso_n3":"233","un_a3":"233","wb_a2":"EE","wb_a3":"EST","woe_id":-99,"adm0_a3_is":"EST","adm0_a3_us":"EST","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[702]],[[703]],[[704]],[[705,706,707]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Ethiopia","sov_a3":"ETH","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Ethiopia","adm0_a3":"ETH","geou_dif":0,"geounit":"Ethiopia","gu_a3":"ETH","su_dif":0,"subunit":"Ethiopia","su_a3":"ETH","brk_diff":0,"name":"Ethiopia","name_long":"Ethiopia","brk_a3":"ETH","brk_name":"Ethiopia","brk_group":null,"abbrev":"Eth.","postal":"ET","formal_en":"Federal Democratic Republic of Ethiopia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Ethiopia","name_alt":null,"mapcolor7":4,"mapcolor8":4,"mapcolor9":1,"mapcolor13":13,"pop_est":85237338,"gdp_md_est":68770,"pop_year":-99,"lastcensus":2007,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"ET","iso_a3":"ETH","iso_n3":"231","un_a3":"231","wb_a2":"ET","wb_a3":"ETH","woe_id":-99,"adm0_a3_is":"ETH","adm0_a3_us":"ETH","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Eastern Africa","region_wb":"Sub-Saharan Africa","name_len":8,"long_len":8,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-640,708,709,710,711,712,-685]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Finland","sov_a3":"FI1","adm0_dif":1,"level":2,"type":"Country","admin":"Finland","adm0_a3":"FIN","geou_dif":0,"geounit":"Finland","gu_a3":"FIN","su_dif":0,"subunit":"Finland","su_a3":"FIN","brk_diff":0,"name":"Finland","name_long":"Finland","brk_a3":"FIN","brk_name":"Finland","brk_group":null,"abbrev":"Fin.","postal":"FIN","formal_en":"Republic of Finland","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Finland","name_alt":null,"mapcolor7":4,"mapcolor8":1,"mapcolor9":4,"mapcolor13":6,"pop_est":5250275,"gdp_md_est":193500,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"FI","iso_a3":"FIN","iso_n3":"246","un_a3":"246","wb_a2":"FI","wb_a3":"FIN","woe_id":-99,"adm0_a3_is":"FIN","adm0_a3_us":"FIN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[713]],[[714]],[[715]],[[716]],[[717]],[[718]],[[719]],[[720,721,722,723]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Fiji","sov_a3":"FJI","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Fiji","adm0_a3":"FJI","geou_dif":0,"geounit":"Fiji","gu_a3":"FJI","su_dif":0,"subunit":"Fiji","su_a3":"FJI","brk_diff":0,"name":"Fiji","name_long":"Fiji","brk_a3":"FJI","brk_name":"Fiji","brk_group":null,"abbrev":"Fiji","postal":"FJ","formal_en":"Republic of Fiji","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Fiji","name_alt":null,"mapcolor7":5,"mapcolor8":1,"mapcolor9":2,"mapcolor13":2,"pop_est":944720,"gdp_md_est":3579,"pop_year":-99,"lastcensus":2007,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"FJ","iso_a3":"FJI","iso_n3":"242","un_a3":"242","wb_a2":"FJ","wb_a3":"FJI","woe_id":-99,"adm0_a3_is":"FJI","adm0_a3_us":"FJI","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Melanesia","region_wb":"East Asia & Pacific","name_len":4,"long_len":4,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[724]],[[725]],[[726]],[[727]],[[728]],[[729]],[[730]],[[731]],[[732]],[[733]],[[734]],[[735]],[[736]],[[737]],[[738]],[[739]],[[740]],[[741]],[[742]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"United Kingdom","sov_a3":"GB1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Falkland Islands","adm0_a3":"FLK","geou_dif":0,"geounit":"Falkland Islands","gu_a3":"FLK","su_dif":0,"subunit":"Falkland Islands","su_a3":"FLK","brk_diff":1,"name":"Falkland Is.","name_long":"Falkland Islands","brk_a3":"B12","brk_name":"Falkland Is.","brk_group":null,"abbrev":"Flk. Is.","postal":"FK","formal_en":"Falkland Islands","formal_fr":null,"note_adm0":"U.K.","note_brk":"Admin. by U.K.; Claimed by Argentina","name_sort":"Falkland Islands","name_alt":"Islas Malvinas","mapcolor7":6,"mapcolor8":6,"mapcolor9":6,"mapcolor13":3,"pop_est":3140,"gdp_md_est":105.1,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"FK","iso_a3":"FLK","iso_n3":"238","un_a3":"238","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"FLK","adm0_a3_us":"FLK","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"South America","region_un":"Americas","subregion":"South America","region_wb":"Latin America & Caribbean","name_len":12,"long_len":16,"abbrev_len":8,"tiny":-99,"homepart":-99},"arcs":[[[743]],[[744]],[[745]],[[746]],[[747]],[[748]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"France","sov_a3":"FR1","adm0_dif":1,"level":2,"type":"Country","admin":"France","adm0_a3":"FRA","geou_dif":0,"geounit":"France","gu_a3":"FRA","su_dif":0,"subunit":"France","su_a3":"FRA","brk_diff":0,"name":"France","name_long":"France","brk_a3":"FRA","brk_name":"France","brk_group":null,"abbrev":"Fr.","postal":"F","formal_en":"French Republic","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"France","name_alt":null,"mapcolor7":7,"mapcolor8":5,"mapcolor9":9,"mapcolor13":11,"pop_est":64057792,"gdp_md_est":2128000,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"1. Developed region: G7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"FR","iso_a3":"FRA","iso_n3":"250","un_a3":"250","wb_a2":"FR","wb_a3":"FRA","woe_id":-99,"adm0_a3_is":"FRA","adm0_a3_us":"FRA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Western Europe","region_wb":"Europe & Central Asia","name_len":6,"long_len":6,"abbrev_len":3,"tiny":-99,"homepart":1},"arcs":[[[749]],[[750]],[[-314,751,752]],[[753]],[[754]],[[755]],[[756]],[[757]],[[758]],[[759,-633,-486,760,761,762,763,-699,-26,-698,764,-231]]]},{"type":"MultiPolygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Denmark","sov_a3":"DN1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Faroe Islands","adm0_a3":"FRO","geou_dif":0,"geounit":"Faroe Islands","gu_a3":"FRO","su_dif":0,"subunit":"Faroe Islands","su_a3":"FRO","brk_diff":0,"name":"Faeroe Is.","name_long":"Faeroe Islands","brk_a3":"FRO","brk_name":"Faeroe Islands","brk_group":null,"abbrev":"Faeroe Is.","postal":"FO","formal_en":"Føroyar Is. (Faeroe Is.)","formal_fr":null,"note_adm0":"Den.","note_brk":null,"name_sort":"Faeroe Islands","name_alt":null,"mapcolor7":4,"mapcolor8":1,"mapcolor9":3,"mapcolor13":12,"pop_est":48856,"gdp_md_est":1000,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"FO","iso_a3":"FRO","iso_n3":"234","un_a3":"234","wb_a2":"FO","wb_a3":"FRO","woe_id":-99,"adm0_a3_is":"FRO","adm0_a3_us":"FRO","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":10,"long_len":14,"abbrev_len":10,"tiny":3,"homepart":-99},"arcs":[[[765]],[[766]],[[767]],[[768]],[[769]]]},{"type":"MultiPolygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Federated States of Micronesia","sov_a3":"FSM","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Federated States of Micronesia","adm0_a3":"FSM","geou_dif":0,"geounit":"Federated States of Micronesia","gu_a3":"FSM","su_dif":0,"subunit":"Federated States of Micronesia","su_a3":"FSM","brk_diff":0,"name":"Micronesia","name_long":"Federated States of Micronesia","brk_a3":"FSM","brk_name":"Micronesia","brk_group":null,"abbrev":"F.S.M.","postal":"FSM","formal_en":"Federated States of Micronesia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Micronesia, Federated States of","name_alt":null,"mapcolor7":5,"mapcolor8":2,"mapcolor9":4,"mapcolor13":13,"pop_est":107434,"gdp_md_est":238.1,"pop_year":-99,"lastcensus":2000,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"FM","iso_a3":"FSM","iso_n3":"583","un_a3":"583","wb_a2":"FM","wb_a3":"FSM","woe_id":-99,"adm0_a3_is":"FSM","adm0_a3_us":"FSM","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Micronesia","region_wb":"East Asia & Pacific","name_len":10,"long_len":30,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[[770]],[[771]],[[772]],[[773]],[[774]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Gabon","sov_a3":"GAB","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Gabon","adm0_a3":"GAB","geou_dif":0,"geounit":"Gabon","gu_a3":"GAB","su_dif":0,"subunit":"Gabon","su_a3":"GAB","brk_diff":0,"name":"Gabon","name_long":"Gabon","brk_a3":"GAB","brk_name":"Gabon","brk_group":null,"abbrev":"Gabon","postal":"GA","formal_en":"Gabonese Republic","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Gabon","name_alt":null,"mapcolor7":6,"mapcolor8":2,"mapcolor9":5,"mapcolor13":5,"pop_est":1514993,"gdp_md_est":21110,"pop_year":-99,"lastcensus":2003,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"GA","iso_a3":"GAB","iso_n3":"266","un_a3":"266","wb_a2":"GA","wb_a3":"GAB","woe_id":-99,"adm0_a3_is":"GAB","adm0_a3_us":"GAB","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Middle Africa","region_wb":"Sub-Saharan Africa","name_len":5,"long_len":5,"abbrev_len":5,"tiny":3,"homepart":1},"arcs":[[-585,775,776,-572]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"United Kingdom","sov_a3":"GB1","adm0_dif":1,"level":2,"type":"Country","admin":"United Kingdom","adm0_a3":"GBR","geou_dif":0,"geounit":"United Kingdom","gu_a3":"GBR","su_dif":0,"subunit":"United Kingdom","su_a3":"GBR","brk_diff":0,"name":"United Kingdom","name_long":"United Kingdom","brk_a3":"GBR","brk_name":"United Kingdom","brk_group":null,"abbrev":"U.K.","postal":"GB","formal_en":"United Kingdom of Great Britain and Northern Ireland","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"United Kingdom","name_alt":null,"mapcolor7":6,"mapcolor8":6,"mapcolor9":6,"mapcolor13":3,"pop_est":62262000,"gdp_md_est":1977704,"pop_year":0,"lastcensus":2011,"gdp_year":2009,"economy":"1. Developed region: G7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"GB","iso_a3":"GBR","iso_n3":"826","un_a3":"826","wb_a2":"GB","wb_a3":"GBR","woe_id":-99,"adm0_a3_is":"GBR","adm0_a3_us":"GBR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":14,"long_len":14,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[777]],[[778]],[[779,780]],[[781]],[[782]],[[783]],[[784]],[[785]],[[786]],[[787]],[[788]],[[789]],[[790]],[[791]],[[792]],[[793]],[[794]],[[795]],[[796]],[[797]],[[798]],[[799]],[[800]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Georgia","sov_a3":"GEO","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Georgia","adm0_a3":"GEO","geou_dif":0,"geounit":"Georgia","gu_a3":"GEO","su_dif":0,"subunit":"Georgia","su_a3":"GEO","brk_diff":0,"name":"Georgia","name_long":"Georgia","brk_a3":"GEO","brk_name":"Georgia","brk_group":null,"abbrev":"Geo.","postal":"GE","formal_en":"Georgia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Georgia","name_alt":null,"mapcolor7":5,"mapcolor8":1,"mapcolor9":3,"mapcolor13":2,"pop_est":4615807,"gdp_md_est":21510,"pop_year":-99,"lastcensus":2002,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"GE","iso_a3":"GEO","iso_n3":"268","un_a3":"268","wb_a2":"GE","wb_a3":"GEO","woe_id":-99,"adm0_a3_is":"GEO","adm0_a3_us":"GEO","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Western Asia","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-223,-51,801,802,803]]},{"type":"Polygon","properties":{"scalerank":4,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"United Kingdom","sov_a3":"GB1","adm0_dif":1,"level":2,"type":"Country","admin":"Guernsey","adm0_a3":"GGY","geou_dif":0,"geounit":"Guernsey","gu_a3":"GGY","su_dif":0,"subunit":"Guernsey","su_a3":"GGY","brk_diff":0,"name":"Guernsey","name_long":"Guernsey","brk_a3":"GGY","brk_name":"Guernsey","brk_group":"Channel Islands","abbrev":"Guern.","postal":"GG","formal_en":"Bailiwick of Guernsey","formal_fr":null,"note_adm0":"U.K. crown dependency","note_brk":null,"name_sort":"Guernsey","name_alt":null,"mapcolor7":6,"mapcolor8":6,"mapcolor9":6,"mapcolor13":3,"pop_est":68633,"gdp_md_est":2742,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"GG","iso_a3":"GGY","iso_n3":"831","un_a3":"831","wb_a2":"JG","wb_a3":"CHI","woe_id":-99,"adm0_a3_is":"GGY","adm0_a3_us":"GGY","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":8,"long_len":8,"abbrev_len":6,"tiny":-99,"homepart":-99},"arcs":[[804]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Ghana","sov_a3":"GHA","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Ghana","adm0_a3":"GHA","geou_dif":0,"geounit":"Ghana","gu_a3":"GHA","su_dif":0,"subunit":"Ghana","su_a3":"GHA","brk_diff":0,"name":"Ghana","name_long":"Ghana","brk_a3":"GHA","brk_name":"Ghana","brk_group":null,"abbrev":"Ghana","postal":"GH","formal_en":"Republic of Ghana","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Ghana","name_alt":null,"mapcolor7":5,"mapcolor8":3,"mapcolor9":1,"mapcolor13":4,"pop_est":23832495,"gdp_md_est":34200,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"GH","iso_a3":"GHA","iso_n3":"288","un_a3":"288","wb_a2":"GH","wb_a3":"GHA","woe_id":-99,"adm0_a3_is":"GHA","adm0_a3_us":"GHA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Western Africa","region_wb":"Sub-Saharan Africa","name_len":5,"long_len":5,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[805,806,-564,807,-566,-242]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Guinea","sov_a3":"GIN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Guinea","adm0_a3":"GIN","geou_dif":0,"geounit":"Guinea","gu_a3":"GIN","su_dif":0,"subunit":"Guinea","su_a3":"GIN","brk_diff":0,"name":"Guinea","name_long":"Guinea","brk_a3":"GIN","brk_name":"Guinea","brk_group":null,"abbrev":"Gin.","postal":"GN","formal_en":"Republic of Guinea","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Guinea","name_alt":null,"mapcolor7":6,"mapcolor8":3,"mapcolor9":7,"mapcolor13":2,"pop_est":10057975,"gdp_md_est":10600,"pop_year":-99,"lastcensus":1996,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"GN","iso_a3":"GIN","iso_n3":"324","un_a3":"324","wb_a2":"GN","wb_a3":"GIN","woe_id":-99,"adm0_a3_is":"GIN","adm0_a3_us":"GIN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Western Africa","region_wb":"Sub-Saharan Africa","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[808,-569,809,810,811,812,813]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Gambia","sov_a3":"GMB","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Gambia","adm0_a3":"GMB","geou_dif":0,"geounit":"Gambia","gu_a3":"GMB","su_dif":0,"subunit":"Gambia","su_a3":"GMB","brk_diff":0,"name":"Gambia","name_long":"The Gambia","brk_a3":"GMB","brk_name":"Gambia","brk_group":null,"abbrev":"Gambia","postal":"GM","formal_en":"Republic of the Gambia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Gambia, The","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":1,"mapcolor13":8,"pop_est":1782893,"gdp_md_est":2272,"pop_year":-99,"lastcensus":2003,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"GM","iso_a3":"GMB","iso_n3":"270","un_a3":"270","wb_a2":"GM","wb_a3":"GMB","woe_id":-99,"adm0_a3_is":"GMB","adm0_a3_us":"GMB","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Western Africa","region_wb":"Sub-Saharan Africa","name_len":6,"long_len":10,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[814,815]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Guinea Bissau","sov_a3":"GNB","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Guinea Bissau","adm0_a3":"GNB","geou_dif":0,"geounit":"Guinea Bissau","gu_a3":"GNB","su_dif":0,"subunit":"Guinea Bissau","su_a3":"GNB","brk_diff":0,"name":"Guinea-Bissau","name_long":"Guinea-Bissau","brk_a3":"GNB","brk_name":"Guinea-Bissau","brk_group":null,"abbrev":"GnB.","postal":"GW","formal_en":"Republic of Guinea-Bissau","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Guinea-Bissau","name_alt":null,"mapcolor7":3,"mapcolor8":5,"mapcolor9":3,"mapcolor13":4,"pop_est":1533964,"gdp_md_est":904.2,"pop_year":-99,"lastcensus":2009,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"GW","iso_a3":"GNB","iso_n3":"624","un_a3":"624","wb_a2":"GW","wb_a3":"GNB","woe_id":-99,"adm0_a3_is":"GNB","adm0_a3_us":"GNB","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Western Africa","region_wb":"Sub-Saharan Africa","name_len":13,"long_len":13,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[816]],[[817]],[[818]],[[819]],[[820]],[[821]],[[822,823,-813]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Equatorial Guinea","sov_a3":"GNQ","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Equatorial Guinea","adm0_a3":"GNQ","geou_dif":0,"geounit":"Equatorial Guinea","gu_a3":"GNQ","su_dif":0,"subunit":"Equatorial Guinea","su_a3":"GNQ","brk_diff":0,"name":"Eq. Guinea","name_long":"Equatorial Guinea","brk_a3":"GNQ","brk_name":"Eq. Guinea","brk_group":null,"abbrev":"Eq. G.","postal":"GQ","formal_en":"Republic of Equatorial Guinea","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Equatorial Guinea","name_alt":null,"mapcolor7":4,"mapcolor8":1,"mapcolor9":4,"mapcolor13":8,"pop_est":650702,"gdp_md_est":14060,"pop_year":0,"lastcensus":2002,"gdp_year":0,"economy":"7. Least developed region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"GQ","iso_a3":"GNQ","iso_n3":"226","un_a3":"226","wb_a2":"GQ","wb_a3":"GNQ","woe_id":-99,"adm0_a3_is":"GNQ","adm0_a3_us":"GNQ","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Middle Africa","region_wb":"Sub-Saharan Africa","name_len":10,"long_len":17,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[[824,-573,-777]],[[825]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Greece","sov_a3":"GRC","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Greece","adm0_a3":"GRC","geou_dif":0,"geounit":"Greece","gu_a3":"GRC","su_dif":0,"subunit":"Greece","su_a3":"GRC","brk_diff":0,"name":"Greece","name_long":"Greece","brk_a3":"GRC","brk_name":"Greece","brk_group":null,"abbrev":"Greece","postal":"GR","formal_en":"Hellenic Republic","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Greece","name_alt":null,"mapcolor7":2,"mapcolor8":2,"mapcolor9":2,"mapcolor13":9,"pop_est":10737428,"gdp_md_est":343000,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"GR","iso_a3":"GRC","iso_n3":"300","un_a3":"300","wb_a2":"GR","wb_a3":"GRC","woe_id":-99,"adm0_a3_is":"GRC","adm0_a3_us":"GRC","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":6,"long_len":6,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[[826]],[[827]],[[828]],[[829]],[[830]],[[831]],[[832]],[[833]],[[834]],[[835]],[[836]],[[837]],[[838]],[[839]],[[840]],[[841]],[[842]],[[843]],[[844]],[[845]],[[846]],[[847]],[[848]],[[849]],[[850]],[[851]],[[852]],[[853]],[[854]],[[855]],[[856]],[[857]],[[858]],[[859]],[[860]],[[861]],[[862]],[[863]],[[864]],[[865,-19,866,-256,867]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Grenada","sov_a3":"GRD","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Grenada","adm0_a3":"GRD","geou_dif":0,"geounit":"Grenada","gu_a3":"GRD","su_dif":0,"subunit":"Grenada","su_a3":"GRD","brk_diff":0,"name":"Grenada","name_long":"Grenada","brk_a3":"GRD","brk_name":"Grenada","brk_group":null,"abbrev":"Gren.","postal":"GD","formal_en":"Grenada","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Grenada","name_alt":null,"mapcolor7":2,"mapcolor8":4,"mapcolor9":3,"mapcolor13":6,"pop_est":90739,"gdp_md_est":1161,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"GD","iso_a3":"GRD","iso_n3":"308","un_a3":"308","wb_a2":"GD","wb_a3":"GRD","woe_id":-99,"adm0_a3_is":"GRD","adm0_a3_us":"GRD","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":7,"long_len":7,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[868]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Denmark","sov_a3":"DN1","adm0_dif":1,"level":2,"type":"Country","admin":"Greenland","adm0_a3":"GRL","geou_dif":0,"geounit":"Greenland","gu_a3":"GRL","su_dif":0,"subunit":"Greenland","su_a3":"GRL","brk_diff":0,"name":"Greenland","name_long":"Greenland","brk_a3":"GRL","brk_name":"Greenland","brk_group":null,"abbrev":"Grlnd.","postal":"GL","formal_en":"Greenland","formal_fr":null,"note_adm0":"Den.","note_brk":null,"name_sort":"Greenland","name_alt":null,"mapcolor7":4,"mapcolor8":1,"mapcolor9":3,"mapcolor13":12,"pop_est":57600,"gdp_md_est":1100,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"GL","iso_a3":"GRL","iso_n3":"304","un_a3":"304","wb_a2":"GL","wb_a3":"GRL","woe_id":-99,"adm0_a3_is":"GRL","adm0_a3_us":"GRL","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Northern America","region_wb":"Europe & Central Asia","name_len":9,"long_len":9,"abbrev_len":6,"tiny":-99,"homepart":-99},"arcs":[[[869]],[[870]],[[871]],[[872]],[[873]],[[874]],[[875]],[[876]],[[877]],[[878]],[[879]],[[880]],[[881]],[[882]],[[883]],[[884]],[[885]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Guatemala","sov_a3":"GTM","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Guatemala","adm0_a3":"GTM","geou_dif":0,"geounit":"Guatemala","gu_a3":"GTM","su_dif":0,"subunit":"Guatemala","su_a3":"GTM","brk_diff":0,"name":"Guatemala","name_long":"Guatemala","brk_a3":"GTM","brk_name":"Guatemala","brk_group":null,"abbrev":"Guat.","postal":"GT","formal_en":"Republic of Guatemala","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Guatemala","name_alt":null,"mapcolor7":3,"mapcolor8":3,"mapcolor9":3,"mapcolor13":6,"pop_est":13276517,"gdp_md_est":68580,"pop_year":-99,"lastcensus":2002,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"GT","iso_a3":"GTM","iso_n3":"320","un_a3":"320","wb_a2":"GT","wb_a3":"GTM","woe_id":-99,"adm0_a3_is":"GTM","adm0_a3_us":"GTM","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Central America","region_wb":"Latin America & Caribbean","name_len":9,"long_len":9,"abbrev_len":5,"tiny":4,"homepart":1},"arcs":[[-289,886,887,888,889,890]]},{"type":"Polygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"United States of America","sov_a3":"US1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Guam","adm0_a3":"GUM","geou_dif":0,"geounit":"Guam","gu_a3":"GUM","su_dif":0,"subunit":"Guam","su_a3":"GUM","brk_diff":0,"name":"Guam","name_long":"Guam","brk_a3":"GUM","brk_name":"Guam","brk_group":null,"abbrev":"Guam","postal":"GU","formal_en":"Territory of Guam","formal_fr":null,"note_adm0":"U.S.A.","note_brk":null,"name_sort":"Guam","name_alt":null,"mapcolor7":4,"mapcolor8":5,"mapcolor9":1,"mapcolor13":1,"pop_est":178430,"gdp_md_est":2500,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"GU","iso_a3":"GUM","iso_n3":"316","un_a3":"316","wb_a2":"GU","wb_a3":"GUM","woe_id":-99,"adm0_a3_is":"GUM","adm0_a3_us":"GUM","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Micronesia","region_wb":"East Asia & Pacific","name_len":4,"long_len":4,"abbrev_len":4,"tiny":2,"homepart":-99},"arcs":[[891]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Guyana","sov_a3":"GUY","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Guyana","adm0_a3":"GUY","geou_dif":0,"geounit":"Guyana","gu_a3":"GUY","su_dif":0,"subunit":"Guyana","su_a3":"GUY","brk_diff":0,"name":"Guyana","name_long":"Guyana","brk_a3":"GUY","brk_name":"Guyana","brk_group":null,"abbrev":"Guy.","postal":"GY","formal_en":"Co-operative Republic of Guyana","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Guyana","name_alt":null,"mapcolor7":3,"mapcolor8":1,"mapcolor9":4,"mapcolor13":8,"pop_est":772298,"gdp_md_est":2966,"pop_year":-99,"lastcensus":2002,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"GY","iso_a3":"GUY","iso_n3":"328","un_a3":"328","wb_a2":"GY","wb_a3":"GUY","woe_id":-99,"adm0_a3_is":"GUY","adm0_a3_us":"GUY","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"South America","region_un":"Americas","subregion":"South America","region_wb":"Latin America & Caribbean","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[892,-321,893,894]]},{"type":"MultiPolygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"China","sov_a3":"CH1","adm0_dif":1,"level":2,"type":"Country","admin":"Hong Kong S.A.R.","adm0_a3":"HKG","geou_dif":0,"geounit":"Hong Kong S.A.R.","gu_a3":"HKG","su_dif":0,"subunit":"Hong Kong S.A.R.","su_a3":"HKG","brk_diff":0,"name":"Hong Kong","name_long":"Hong Kong","brk_a3":"HKG","brk_name":"Hong Kong","brk_group":null,"abbrev":"H.K.","postal":"HK","formal_en":"Hong Kong Special Administrative Region, PRC","formal_fr":null,"note_adm0":"China","note_brk":null,"name_sort":"Hong Kong SAR, China","name_alt":null,"mapcolor7":4,"mapcolor8":4,"mapcolor9":4,"mapcolor13":3,"pop_est":7061200,"gdp_md_est":351119,"pop_year":2010,"lastcensus":2006,"gdp_year":2011,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":0,"fips_10":null,"iso_a2":"HK","iso_a3":"HKG","iso_n3":"344","un_a3":"344","wb_a2":"HK","wb_a3":"HKG","woe_id":-99,"adm0_a3_is":"HKG","adm0_a3_us":"HKG","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Eastern Asia","region_wb":"East Asia & Pacific","name_len":9,"long_len":9,"abbrev_len":4,"tiny":-99,"homepart":-99},"arcs":[[[895]],[[896]],[[-534,897]]]},{"type":"Polygon","properties":{"scalerank":5,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Australia","sov_a3":"AU1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Heard Island and McDonald Islands","adm0_a3":"HMD","geou_dif":0,"geounit":"Heard Island and McDonald Islands","gu_a3":"HMD","su_dif":0,"subunit":"Heard Island and McDonald Islands","su_a3":"HMD","brk_diff":0,"name":"Heard I. and McDonald Is.","name_long":"Heard I. and McDonald Islands","brk_a3":"HMD","brk_name":"Heard I. and McDonald Is.","brk_group":null,"abbrev":"H.M.Is.","postal":"HM","formal_en":"Territory of Heard Island and McDonald Islands","formal_fr":null,"note_adm0":"Auz.","note_brk":null,"name_sort":"Heard Island and McDonald Islands","name_alt":null,"mapcolor7":1,"mapcolor8":2,"mapcolor9":2,"mapcolor13":7,"pop_est":-99,"gdp_md_est":-99,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"HM","iso_a3":"HMD","iso_n3":"334","un_a3":"-099","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"HMD","adm0_a3_us":"HMD","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Seven seas (open ocean)","region_un":"Seven seas (open ocean)","subregion":"Seven seas (open ocean)","region_wb":"Sub-Saharan Africa","name_len":25,"long_len":29,"abbrev_len":7,"tiny":-99,"homepart":-99},"arcs":[[898]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Honduras","sov_a3":"HND","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Honduras","adm0_a3":"HND","geou_dif":0,"geounit":"Honduras","gu_a3":"HND","su_dif":0,"subunit":"Honduras","su_a3":"HND","brk_diff":0,"name":"Honduras","name_long":"Honduras","brk_a3":"HND","brk_name":"Honduras","brk_group":null,"abbrev":"Hond.","postal":"HN","formal_en":"Republic of Honduras","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Honduras","name_alt":null,"mapcolor7":2,"mapcolor8":5,"mapcolor9":2,"mapcolor13":5,"pop_est":7792854,"gdp_md_est":33720,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"HN","iso_a3":"HND","iso_n3":"340","un_a3":"340","wb_a2":"HN","wb_a3":"HND","woe_id":-99,"adm0_a3_is":"HND","adm0_a3_us":"HND","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Central America","region_wb":"Latin America & Caribbean","name_len":8,"long_len":8,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[899,900,901,-888,902]],[[903]],[[904]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Croatia","sov_a3":"HRV","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Croatia","adm0_a3":"HRV","geou_dif":0,"geounit":"Croatia","gu_a3":"HRV","su_dif":0,"subunit":"Croatia","su_a3":"HRV","brk_diff":0,"name":"Croatia","name_long":"Croatia","brk_a3":"HRV","brk_name":"Croatia","brk_group":null,"abbrev":"Cro.","postal":"HR","formal_en":"Republic of Croatia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Croatia","name_alt":null,"mapcolor7":5,"mapcolor8":4,"mapcolor9":5,"mapcolor13":1,"pop_est":4489409,"gdp_md_est":82390,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"HR","iso_a3":"HRV","iso_n3":"191","un_a3":"191","wb_a2":"HR","wb_a3":"HRV","woe_id":-99,"adm0_a3_is":"HRV","adm0_a3_us":"HRV","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[905]],[[906]],[[-278,907,908]],[[909]],[[910]],[[911]],[[912]],[[913]],[[914]],[[915]],[[916]],[[917]],[[918,-280,919,920,921]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Haiti","sov_a3":"HTI","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Haiti","adm0_a3":"HTI","geou_dif":0,"geounit":"Haiti","gu_a3":"HTI","su_dif":0,"subunit":"Haiti","su_a3":"HTI","brk_diff":0,"name":"Haiti","name_long":"Haiti","brk_a3":"HTI","brk_name":"Haiti","brk_group":null,"abbrev":"Haiti","postal":"HT","formal_en":"Republic of Haiti","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Haiti","name_alt":null,"mapcolor7":2,"mapcolor8":1,"mapcolor9":7,"mapcolor13":2,"pop_est":9035536,"gdp_md_est":11500,"pop_year":-99,"lastcensus":2003,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"HT","iso_a3":"HTI","iso_n3":"332","un_a3":"332","wb_a2":"HT","wb_a3":"HTI","woe_id":-99,"adm0_a3_is":"HTI","adm0_a3_us":"HTI","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":5,"long_len":5,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[922]],[[-656,923]],[[924]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Hungary","sov_a3":"HUN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Hungary","adm0_a3":"HUN","geou_dif":0,"geounit":"Hungary","gu_a3":"HUN","su_dif":0,"subunit":"Hungary","su_a3":"HUN","brk_diff":0,"name":"Hungary","name_long":"Hungary","brk_a3":"HUN","brk_name":"Hungary","brk_group":null,"abbrev":"Hun.","postal":"HU","formal_en":"Republic of Hungary","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Hungary","name_alt":null,"mapcolor7":4,"mapcolor8":6,"mapcolor9":1,"mapcolor13":5,"pop_est":9905596,"gdp_md_est":196600,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"HU","iso_a3":"HUN","iso_n3":"348","un_a3":"348","wb_a2":"HU","wb_a3":"HUN","woe_id":-99,"adm0_a3_is":"HUN","adm0_a3_us":"HUN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Eastern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[925,926,927,-922,928,-211,929]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Indonesia","sov_a3":"IDN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Indonesia","adm0_a3":"IDN","geou_dif":0,"geounit":"Indonesia","gu_a3":"IDN","su_dif":0,"subunit":"Indonesia","su_a3":"IDN","brk_diff":0,"name":"Indonesia","name_long":"Indonesia","brk_a3":"IDN","brk_name":"Indonesia","brk_group":null,"abbrev":"Indo.","postal":"INDO","formal_en":"Republic of Indonesia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Indonesia","name_alt":null,"mapcolor7":6,"mapcolor8":6,"mapcolor9":6,"mapcolor13":11,"pop_est":240271522,"gdp_md_est":914600,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"4. Emerging region: MIKT","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"ID","iso_a3":"IDN","iso_n3":"360","un_a3":"360","wb_a2":"ID","wb_a3":"IDN","woe_id":-99,"adm0_a3_is":"IDN","adm0_a3_us":"IDN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"South-Eastern Asia","region_wb":"East Asia & Pacific","name_len":9,"long_len":9,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[930]],[[931]],[[932]],[[933]],[[934,935,936,937]],[[938]],[[939]],[[940]],[[941]],[[942]],[[943]],[[944]],[[945]],[[946]],[[947]],[[948]],[[949]],[[950]],[[951]],[[952]],[[953]],[[954]],[[955]],[[956]],[[957]],[[958]],[[959]],[[960]],[[961]],[[962]],[[963]],[[964]],[[965]],[[966]],[[967]],[[968]],[[969]],[[970]],[[971]],[[972]],[[973]],[[974]],[[975]],[[976]],[[977]],[[978]],[[979]],[[980]],[[981]],[[982]],[[983]],[[984]],[[985]],[[986]],[[987]],[[988]],[[989]],[[990]],[[991]],[[992]],[[993]],[[994]],[[995]],[[996]],[[997]],[[998]],[[999]],[[1000]],[[1001]],[[1002]],[[1003]],[[1004]],[[1005]],[[1006]],[[1007]],[[1008]],[[1009]],[[1010]],[[1011]],[[1012]],[[1013]],[[1014]],[[1015]],[[1016]],[[1017]],[[1018]],[[1019]],[[1020]],[[1021,1022,1023]],[[1024]],[[1025]],[[1026]],[[1027]],[[1028]],[[1029]],[[1030]],[[1031]],[[1032]],[[1033]],[[1034]],[[1035]],[[1036]],[[1037]],[[1038]],[[1039]],[[1040]],[[1041]],[[1042]],[[1043]],[[1044]],[[1045]],[[1046]],[[1047]],[[1048]],[[1049]],[[1050]],[[1051]],[[1052]],[[1053]],[[1054]],[[1055]],[[1056]],[[1057]],[[1058]],[[1059]],[[1060]],[[1061]],[[1062,1063]],[[1064]],[[1065,1066]],[[1067]],[[1068]],[[1069]]]},{"type":"Polygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"United Kingdom","sov_a3":"GB1","adm0_dif":1,"level":2,"type":"Country","admin":"Isle of Man","adm0_a3":"IMN","geou_dif":0,"geounit":"Isle of Man","gu_a3":"IMN","su_dif":0,"subunit":"Isle of Man","su_a3":"IMN","brk_diff":0,"name":"Isle of Man","name_long":"Isle of Man","brk_a3":"IMN","brk_name":"Isle of Man","brk_group":null,"abbrev":"IoMan","postal":"IM","formal_en":null,"formal_fr":null,"note_adm0":"U.K. crown dependency","note_brk":null,"name_sort":"Isle of Man","name_alt":null,"mapcolor7":6,"mapcolor8":6,"mapcolor9":6,"mapcolor13":3,"pop_est":76512,"gdp_md_est":2719,"pop_year":-99,"lastcensus":2006,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"IM","iso_a3":"IMN","iso_n3":"833","un_a3":"833","wb_a2":"IM","wb_a3":"IMY","woe_id":-99,"adm0_a3_is":"IMN","adm0_a3_us":"IMN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":11,"long_len":11,"abbrev_len":5,"tiny":-99,"homepart":-99},"arcs":[[1070]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"India","sov_a3":"IND","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"India","adm0_a3":"IND","geou_dif":0,"geounit":"India","gu_a3":"IND","su_dif":0,"subunit":"India","su_a3":"IND","brk_diff":0,"name":"India","name_long":"India","brk_a3":"IND","brk_name":"India","brk_group":null,"abbrev":"India","postal":"IND","formal_en":"Republic of India","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"India","name_alt":null,"mapcolor7":1,"mapcolor8":3,"mapcolor9":2,"mapcolor13":2,"pop_est":1166079220,"gdp_md_est":3297000,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"3. Emerging region: BRIC","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"IN","iso_a3":"IND","iso_n3":"356","un_a3":"356","wb_a2":"IN","wb_a3":"IND","woe_id":-99,"adm0_a3_is":"IND","adm0_a3_us":"IND","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Southern Asia","region_wb":"South Asia","name_len":5,"long_len":5,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[1071]],[[1072]],[[1073]],[[1074]],[[1075]],[[1076]],[[1077]],[[1078]],[[1079]],[[1080]],[[1081]],[[1082]],[[1083,-549,1084,-547,1085,1086,-544,1087,-542,-327,-541,1088,-253,1089,1090,1091,1092,-554,1093,-552,1094,-550]]]},{"type":"MultiPolygon","properties":{"scalerank":5,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Australia","sov_a3":"AU1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Indian Ocean Territories","adm0_a3":"IOA","geou_dif":0,"geounit":"Indian Ocean Territories","gu_a3":"IOA","su_dif":0,"subunit":"Indian Ocean Territories","su_a3":"IOA","brk_diff":0,"name":"Indian Ocean Ter.","name_long":"Indian Ocean Territories","brk_a3":"IOA","brk_name":"Indian Ocean Ter.","brk_group":null,"abbrev":"Ind. Oc. Ter.","postal":"IOT","formal_en":null,"formal_fr":null,"note_adm0":"Auz.","note_brk":null,"name_sort":"Indian Ocean Territories","name_alt":null,"mapcolor7":1,"mapcolor8":2,"mapcolor9":2,"mapcolor13":7,"pop_est":2069,"gdp_md_est":31.035,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"-99","iso_a3":"-99","iso_n3":"-99","un_a3":"-099","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"AUS","adm0_a3_us":"AUS","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Seven seas (open ocean)","subregion":"Seven seas (open ocean)","region_wb":"East Asia & Pacific","name_len":17,"long_len":24,"abbrev_len":13,"tiny":-99,"homepart":-99},"arcs":[[[1095]],[[1096]],[[1097]]]},{"type":"Polygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"United Kingdom","sov_a3":"GB1","adm0_dif":1,"level":2,"type":"Dependency","admin":"British Indian Ocean Territory","adm0_a3":"IOT","geou_dif":0,"geounit":"British Indian Ocean Territory","gu_a3":"IOT","su_dif":0,"subunit":"British Indian Ocean Territory","su_a3":"IOT","brk_diff":1,"name":"Br. Indian Ocean Ter.","name_long":"British Indian Ocean Territory","brk_a3":"B69","brk_name":"Br. Indian Ocean Ter.","brk_group":null,"abbrev":"I.O.T.","postal":"IO","formal_en":null,"formal_fr":null,"note_adm0":"U.K.","note_brk":"Admin. by U.K.; Claimed by Mauritius and Seychelles","name_sort":"British Indian Ocean Territory","name_alt":null,"mapcolor7":6,"mapcolor8":6,"mapcolor9":6,"mapcolor13":3,"pop_est":4000,"gdp_md_est":160,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"IO","iso_a3":"IOT","iso_n3":"086","un_a3":"-099","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"IOT","adm0_a3_us":"IOT","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Seven seas (open ocean)","region_un":"Seven seas (open ocean)","subregion":"Seven seas (open ocean)","region_wb":"Sub-Saharan Africa","name_len":21,"long_len":30,"abbrev_len":6,"tiny":5,"homepart":-99},"arcs":[[1098]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Ireland","sov_a3":"IRL","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Ireland","adm0_a3":"IRL","geou_dif":0,"geounit":"Ireland","gu_a3":"IRL","su_dif":0,"subunit":"Ireland","su_a3":"IRL","brk_diff":0,"name":"Ireland","name_long":"Ireland","brk_a3":"IRL","brk_name":"Ireland","brk_group":null,"abbrev":"Ire.","postal":"IRL","formal_en":"Ireland","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Ireland","name_alt":null,"mapcolor7":2,"mapcolor8":3,"mapcolor9":2,"mapcolor13":2,"pop_est":4203200,"gdp_md_est":188400,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"IE","iso_a3":"IRL","iso_n3":"372","un_a3":"372","wb_a2":"IE","wb_a3":"IRL","woe_id":-99,"adm0_a3_is":"IRL","adm0_a3_us":"IRL","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1099]],[[1100,-780]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Iran","sov_a3":"IRN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Iran","adm0_a3":"IRN","geou_dif":0,"geounit":"Iran","gu_a3":"IRN","su_dif":0,"subunit":"Iran","su_a3":"IRN","brk_diff":0,"name":"Iran","name_long":"Iran","brk_a3":"IRN","brk_name":"Iran","brk_group":null,"abbrev":"Iran","postal":"IRN","formal_en":"Islamic Republic of Iran","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Iran, Islamic Rep.","name_alt":null,"mapcolor7":4,"mapcolor8":3,"mapcolor9":4,"mapcolor13":13,"pop_est":66429284,"gdp_md_est":841700,"pop_year":-99,"lastcensus":2006,"gdp_year":-99,"economy":"5. Emerging region: G20","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"IR","iso_a3":"IRN","iso_n3":"364","un_a3":"364","wb_a2":"IR","wb_a3":"IRN","woe_id":-99,"adm0_a3_is":"IRN","adm0_a3_us":"IRN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Southern Asia","region_wb":"Middle East & North Africa","name_len":4,"long_len":4,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1101]],[[-48,-222,1102,1103,-5,1104,1105,1106,1107,1108,-219]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Iraq","sov_a3":"IRQ","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Iraq","adm0_a3":"IRQ","geou_dif":0,"geounit":"Iraq","gu_a3":"IRQ","su_dif":0,"subunit":"Iraq","su_a3":"IRQ","brk_diff":0,"name":"Iraq","name_long":"Iraq","brk_a3":"IRQ","brk_name":"Iraq","brk_group":null,"abbrev":"Iraq","postal":"IRQ","formal_en":"Republic of Iraq","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Iraq","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":3,"mapcolor13":1,"pop_est":31129225,"gdp_md_est":103900,"pop_year":-99,"lastcensus":1997,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"IQ","iso_a3":"IRQ","iso_n3":"368","un_a3":"368","wb_a2":"IQ","wb_a3":"IRQ","woe_id":-99,"adm0_a3_is":"IRQ","adm0_a3_us":"IRQ","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Western Asia","region_wb":"Middle East & North Africa","name_len":4,"long_len":4,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-1108,1109,1110,1111,1112,1113,1114]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Iceland","sov_a3":"ISL","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Iceland","adm0_a3":"ISL","geou_dif":0,"geounit":"Iceland","gu_a3":"ISL","su_dif":0,"subunit":"Iceland","su_a3":"ISL","brk_diff":0,"name":"Iceland","name_long":"Iceland","brk_a3":"ISL","brk_name":"Iceland","brk_group":null,"abbrev":"Iceland","postal":"IS","formal_en":"Republic of Iceland","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Iceland","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":4,"mapcolor13":9,"pop_est":306694,"gdp_md_est":12710,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"IS","iso_a3":"ISL","iso_n3":"352","un_a3":"352","wb_a2":"IS","wb_a3":"ISL","woe_id":-99,"adm0_a3_is":"ISL","adm0_a3_us":"ISL","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":7,"tiny":-99,"homepart":1},"arcs":[[1115]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Israel","sov_a3":"ISR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Israel","adm0_a3":"ISR","geou_dif":0,"geounit":"Israel","gu_a3":"ISR","su_dif":0,"subunit":"Israel","su_a3":"ISR","brk_diff":0,"name":"Israel","name_long":"Israel","brk_a3":"ISR","brk_name":"Israel","brk_group":null,"abbrev":"Isr.","postal":"IS","formal_en":"State of Israel","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Israel","name_alt":null,"mapcolor7":3,"mapcolor8":2,"mapcolor9":5,"mapcolor13":9,"pop_est":7233701,"gdp_md_est":201400,"pop_year":-99,"lastcensus":2009,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"IL","iso_a3":"ISR","iso_n3":"376","un_a3":"376","wb_a2":"IL","wb_a3":"ISR","woe_id":-99,"adm0_a3_is":"ISR","adm0_a3_us":"ISR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Western Asia","region_wb":"Middle East & North Africa","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[1116,1117,1118,1119,-677,1120,1121,1122,1123]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Italy","sov_a3":"ITA","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Italy","adm0_a3":"ITA","geou_dif":0,"geounit":"Italy","gu_a3":"ITA","su_dif":0,"subunit":"Italy","su_a3":"ITA","brk_diff":0,"name":"Italy","name_long":"Italy","brk_a3":"ITA","brk_name":"Italy","brk_group":null,"abbrev":"Italy","postal":"I","formal_en":"Italian Republic","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Italy","name_alt":null,"mapcolor7":6,"mapcolor8":7,"mapcolor9":8,"mapcolor13":7,"pop_est":58126212,"gdp_md_est":1823000,"pop_year":-99,"lastcensus":2012,"gdp_year":-99,"economy":"1. Developed region: G7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"IT","iso_a3":"ITA","iso_n3":"380","un_a3":"380","wb_a2":"IT","wb_a3":"ITA","woe_id":-99,"adm0_a3_is":"ITA","adm0_a3_us":"ITA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":5,"long_len":5,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[1124]],[[1125]],[[1126]],[[1127]],[[1128]],[[1129]],[[1130]],[[1131,1132,-761,-485,-213],[1133]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Jamaica","sov_a3":"JAM","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Jamaica","adm0_a3":"JAM","geou_dif":0,"geounit":"Jamaica","gu_a3":"JAM","su_dif":0,"subunit":"Jamaica","su_a3":"JAM","brk_diff":0,"name":"Jamaica","name_long":"Jamaica","brk_a3":"JAM","brk_name":"Jamaica","brk_group":null,"abbrev":"Jam.","postal":"J","formal_en":"Jamaica","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Jamaica","name_alt":null,"mapcolor7":1,"mapcolor8":2,"mapcolor9":4,"mapcolor13":10,"pop_est":2825928,"gdp_md_est":20910,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"JM","iso_a3":"JAM","iso_n3":"388","un_a3":"388","wb_a2":"JM","wb_a3":"JAM","woe_id":-99,"adm0_a3_is":"JAM","adm0_a3_us":"JAM","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[1134]]},{"type":"Polygon","properties":{"scalerank":4,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"United Kingdom","sov_a3":"GB1","adm0_dif":1,"level":2,"type":"Country","admin":"Jersey","adm0_a3":"JEY","geou_dif":0,"geounit":"Jersey","gu_a3":"JEY","su_dif":0,"subunit":"Jersey","su_a3":"JEY","brk_diff":0,"name":"Jersey","name_long":"Jersey","brk_a3":"JEY","brk_name":"Jersey","brk_group":"Channel Islands","abbrev":"Jey.","postal":"JE","formal_en":"Bailiwick of Jersey","formal_fr":null,"note_adm0":"U.K. crown dependency","note_brk":null,"name_sort":"Jersey","name_alt":null,"mapcolor7":6,"mapcolor8":6,"mapcolor9":6,"mapcolor13":3,"pop_est":91626,"gdp_md_est":5100,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"JE","iso_a3":"JEY","iso_n3":"832","un_a3":"832","wb_a2":"JG","wb_a3":"CHI","woe_id":-99,"adm0_a3_is":"JEY","adm0_a3_us":"JEY","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":-99},"arcs":[[1135]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Jordan","sov_a3":"JOR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Jordan","adm0_a3":"JOR","geou_dif":0,"geounit":"Jordan","gu_a3":"JOR","su_dif":0,"subunit":"Jordan","su_a3":"JOR","brk_diff":0,"name":"Jordan","name_long":"Jordan","brk_a3":"JOR","brk_name":"Jordan","brk_group":null,"abbrev":"Jord.","postal":"J","formal_en":"Hashemite Kingdom of Jordan","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Jordan","name_alt":null,"mapcolor7":5,"mapcolor8":3,"mapcolor9":4,"mapcolor13":4,"pop_est":6342948,"gdp_md_est":31610,"pop_year":-99,"lastcensus":2004,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"JO","iso_a3":"JOR","iso_n3":"400","un_a3":"400","wb_a2":"JO","wb_a3":"JOR","woe_id":-99,"adm0_a3_is":"JOR","adm0_a3_us":"JOR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Western Asia","region_wb":"Middle East & North Africa","name_len":6,"long_len":6,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[1136,1137,-1119,1138,-1117,1139,-1113]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Japan","sov_a3":"JPN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Japan","adm0_a3":"JPN","geou_dif":0,"geounit":"Japan","gu_a3":"JPN","su_dif":0,"subunit":"Japan","su_a3":"JPN","brk_diff":0,"name":"Japan","name_long":"Japan","brk_a3":"JPN","brk_name":"Japan","brk_group":null,"abbrev":"Japan","postal":"J","formal_en":"Japan","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Japan","name_alt":null,"mapcolor7":5,"mapcolor8":3,"mapcolor9":5,"mapcolor13":4,"pop_est":127078679,"gdp_md_est":4329000,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"1. Developed region: G7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"JP","iso_a3":"JPN","iso_n3":"392","un_a3":"392","wb_a2":"JP","wb_a3":"JPN","woe_id":-99,"adm0_a3_is":"JPN","adm0_a3_us":"JPN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Eastern Asia","region_wb":"East Asia & Pacific","name_len":5,"long_len":5,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[1140]],[[1141]],[[1142]],[[1143]],[[1144]],[[1145]],[[1146]],[[1147]],[[1148]],[[1149]],[[1150]],[[1151]],[[1152]],[[1153]],[[1154]],[[1155]],[[1156]],[[1157]],[[1158]],[[1159]],[[1160]],[[1161]],[[1162]],[[1163]],[[1164]],[[1165]],[[1166]],[[1167]],[[1168]],[[1169]],[[1170]],[[1171]],[[1172]],[[1173]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Kashmir","sov_a3":"KAS","adm0_dif":0,"level":2,"type":"Indeterminate","admin":"Siachen Glacier","adm0_a3":"KAS","geou_dif":0,"geounit":"Siachen Glacier","gu_a3":"KAS","su_dif":0,"subunit":"Siachen Glacier","su_a3":"KAS","brk_diff":1,"name":"Siachen Glacier","name_long":"Siachen Glacier","brk_a3":"B45","brk_name":"Siachen Glacier","brk_group":"Jammu and Kashmir","abbrev":"Siachen","postal":"SG","formal_en":null,"formal_fr":null,"note_adm0":null,"note_brk":"Claimed by Pakistan and India","name_sort":"Kashmir","name_alt":null,"mapcolor7":3,"mapcolor8":7,"mapcolor9":6,"mapcolor13":-99,"pop_est":6000,"gdp_md_est":15,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"-99","iso_a3":"-99","iso_n3":"-99","un_a3":"-099","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"-99","adm0_a3_us":"KAS","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Southern Asia","region_wb":"South Asia","name_len":15,"long_len":15,"abbrev_len":7,"tiny":-99,"homepart":1},"arcs":[[-1092,1174,-556]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Kazakhstan","sov_a3":"KAZ","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Kazakhstan","adm0_a3":"KAZ","geou_dif":0,"geounit":"Kazakhstan","gu_a3":"KAZ","su_dif":0,"subunit":"Kazakhstan","su_a3":"KAZ","brk_diff":0,"name":"Kazakhstan","name_long":"Kazakhstan","brk_a3":"KAZ","brk_name":"Kazakhstan","brk_group":null,"abbrev":"Kaz.","postal":"KZ","formal_en":"Republic of Kazakhstan","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Kazakhstan","name_alt":null,"mapcolor7":6,"mapcolor8":1,"mapcolor9":6,"mapcolor13":1,"pop_est":15399437,"gdp_md_est":175800,"pop_year":-99,"lastcensus":2009,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"KZ","iso_a3":"KAZ","iso_n3":"398","un_a3":"398","wb_a2":"KZ","wb_a3":"KAZ","woe_id":-99,"adm0_a3_is":"KAZ","adm0_a3_us":"KAZ","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Central Asia","region_wb":"Europe & Central Asia","name_len":10,"long_len":10,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1175]],[[1176]],[[1177]],[[-560,1178,1179,1180,1181,1182]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Kenya","sov_a3":"KEN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Kenya","adm0_a3":"KEN","geou_dif":0,"geounit":"Kenya","gu_a3":"KEN","su_dif":0,"subunit":"Kenya","su_a3":"KEN","brk_diff":0,"name":"Kenya","name_long":"Kenya","brk_a3":"KEN","brk_name":"Kenya","brk_group":null,"abbrev":"Ken.","postal":"KE","formal_en":"Republic of Kenya","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Kenya","name_alt":null,"mapcolor7":5,"mapcolor8":2,"mapcolor9":7,"mapcolor13":3,"pop_est":39002772,"gdp_md_est":61510,"pop_year":-99,"lastcensus":2009,"gdp_year":-99,"economy":"5. Emerging region: G20","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"KE","iso_a3":"KEN","iso_n3":"404","un_a3":"404","wb_a2":"KE","wb_a3":"KEN","woe_id":-99,"adm0_a3_is":"KEN","adm0_a3_us":"KEN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Eastern Africa","region_wb":"Sub-Saharan Africa","name_len":5,"long_len":5,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1183]],[[1184,1185,1186,1187,1188,-711]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Kyrgyzstan","sov_a3":"KGZ","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Kyrgyzstan","adm0_a3":"KGZ","geou_dif":0,"geounit":"Kyrgyzstan","gu_a3":"KGZ","su_dif":0,"subunit":"Kyrgyzstan","su_a3":"KGZ","brk_diff":0,"name":"Kyrgyzstan","name_long":"Kyrgyzstan","brk_a3":"KGZ","brk_name":"Kyrgyzstan","brk_group":null,"abbrev":"Kgz.","postal":"KG","formal_en":"Kyrgyz Republic","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Kyrgyz Republic","name_alt":null,"mapcolor7":5,"mapcolor8":7,"mapcolor9":7,"mapcolor13":6,"pop_est":5431747,"gdp_md_est":11610,"pop_year":-99,"lastcensus":2009,"gdp_year":-99,"economy":"6. Developing region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"KG","iso_a3":"KGZ","iso_n3":"417","un_a3":"417","wb_a2":"KG","wb_a3":"KGZ","woe_id":-99,"adm0_a3_is":"KGZ","adm0_a3_us":"KGZ","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Central Asia","region_wb":"Europe & Central Asia","name_len":10,"long_len":10,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-559,1189,1190,-1179],[1191],[1192],[1193]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Cambodia","sov_a3":"KHM","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Cambodia","adm0_a3":"KHM","geou_dif":0,"geounit":"Cambodia","gu_a3":"KHM","su_dif":0,"subunit":"Cambodia","su_a3":"KHM","brk_diff":0,"name":"Cambodia","name_long":"Cambodia","brk_a3":"KHM","brk_name":"Cambodia","brk_group":null,"abbrev":"Camb.","postal":"KH","formal_en":"Kingdom of Cambodia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Cambodia","name_alt":null,"mapcolor7":6,"mapcolor8":3,"mapcolor9":6,"mapcolor13":5,"pop_est":14494293,"gdp_md_est":27940,"pop_year":-99,"lastcensus":2008,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"KH","iso_a3":"KHM","iso_n3":"116","un_a3":"116","wb_a2":"KH","wb_a3":"KHM","woe_id":-99,"adm0_a3_is":"KHM","adm0_a3_us":"KHM","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"South-Eastern Asia","region_wb":"East Asia & Pacific","name_len":8,"long_len":8,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[1194]],[[1195]],[[1196,1197,1198,1199]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Kiribati","sov_a3":"KIR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Kiribati","adm0_a3":"KIR","geou_dif":0,"geounit":"Kiribati","gu_a3":"KIR","su_dif":0,"subunit":"Kiribati","su_a3":"KIR","brk_diff":0,"name":"Kiribati","name_long":"Kiribati","brk_a3":"KIR","brk_name":"Kiribati","brk_group":null,"abbrev":"Kir.","postal":"KI","formal_en":"Republic of Kiribati","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Kiribati","name_alt":null,"mapcolor7":5,"mapcolor8":7,"mapcolor9":6,"mapcolor13":12,"pop_est":112850,"gdp_md_est":579.5,"pop_year":-99,"lastcensus":2005,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"KI","iso_a3":"KIR","iso_n3":"296","un_a3":"296","wb_a2":"KI","wb_a3":"KIR","woe_id":-99,"adm0_a3_is":"KIR","adm0_a3_us":"KIR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Micronesia","region_wb":"East Asia & Pacific","name_len":8,"long_len":8,"abbrev_len":4,"tiny":2,"homepart":1},"arcs":[[[1200]],[[1201]],[[1202]],[[1203]],[[1204]],[[1205]],[[1206]],[[1207]],[[1208]],[[1209]],[[1210]],[[1211]],[[1212]],[[1213]],[[1214]],[[1215]],[[1216]],[[1217]],[[1218]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Saint Kitts and Nevis","sov_a3":"KNA","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Saint Kitts and Nevis","adm0_a3":"KNA","geou_dif":0,"geounit":"Saint Kitts and Nevis","gu_a3":"KNA","su_dif":0,"subunit":"Saint Kitts and Nevis","su_a3":"KNA","brk_diff":0,"name":"St. Kitts and Nevis","name_long":"Saint Kitts and Nevis","brk_a3":"KNA","brk_name":"Saint Kitts and Nevis","brk_group":null,"abbrev":"St.K.N.","postal":"KN","formal_en":"Federation of Saint Kitts and Nevis","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"St. Kitts and Nevis","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":1,"mapcolor13":8,"pop_est":40131,"gdp_md_est":777.7,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"KN","iso_a3":"KNA","iso_n3":"659","un_a3":"659","wb_a2":"KN","wb_a3":"KNA","woe_id":-99,"adm0_a3_is":"KNA","adm0_a3_us":"KNA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":19,"long_len":21,"abbrev_len":7,"tiny":4,"homepart":1},"arcs":[[[1219]],[[1220]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"South Korea","sov_a3":"KOR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"South Korea","adm0_a3":"KOR","geou_dif":0,"geounit":"South Korea","gu_a3":"KOR","su_dif":0,"subunit":"South Korea","su_a3":"KOR","brk_diff":0,"name":"Korea","name_long":"Republic of Korea","brk_a3":"KOR","brk_name":"Republic of Korea","brk_group":null,"abbrev":"S.K.","postal":"KR","formal_en":"Republic of Korea","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Korea, Rep.","name_alt":null,"mapcolor7":4,"mapcolor8":1,"mapcolor9":1,"mapcolor13":5,"pop_est":48508972,"gdp_md_est":1335000,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"4. Emerging region: MIKT","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"KR","iso_a3":"KOR","iso_n3":"410","un_a3":"410","wb_a2":"KR","wb_a3":"KOR","woe_id":-99,"adm0_a3_is":"KOR","adm0_a3_us":"KOR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Eastern Asia","region_wb":"East Asia & Pacific","name_len":5,"long_len":17,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1221]],[[1222]],[[1223]],[[1224]],[[1225]],[[1226]],[[1227]],[[1228]],[[1229]],[[1230]],[[1231,1232]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Kosovo","sov_a3":"KOS","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Kosovo","adm0_a3":"KOS","geou_dif":0,"geounit":"Kosovo","gu_a3":"KOS","su_dif":0,"subunit":"Kosovo","su_a3":"KOS","brk_diff":1,"name":"Kosovo","name_long":"Kosovo","brk_a3":"B57","brk_name":"Kosovo","brk_group":null,"abbrev":"Kos.","postal":"KO","formal_en":"Republic of Kosovo","formal_fr":null,"note_adm0":null,"note_brk":"Self admin.; Claimed by Serbia","name_sort":"Kosovo","name_alt":null,"mapcolor7":2,"mapcolor8":2,"mapcolor9":3,"mapcolor13":11,"pop_est":1804838,"gdp_md_est":5352,"pop_year":-99,"lastcensus":1981,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"-99","iso_a3":"-99","iso_n3":"-99","un_a3":"-099","wb_a2":"KV","wb_a3":"KSV","woe_id":-99,"adm0_a3_is":"SRB","adm0_a3_us":"KOS","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[1233,-17,1234,1235]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Kuwait","sov_a3":"KWT","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Kuwait","adm0_a3":"KWT","geou_dif":0,"geounit":"Kuwait","gu_a3":"KWT","su_dif":0,"subunit":"Kuwait","su_a3":"KWT","brk_diff":0,"name":"Kuwait","name_long":"Kuwait","brk_a3":"KWT","brk_name":"Kuwait","brk_group":null,"abbrev":"Kwt.","postal":"KW","formal_en":"State of Kuwait","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Kuwait","name_alt":null,"mapcolor7":2,"mapcolor8":2,"mapcolor9":2,"mapcolor13":2,"pop_est":2691158,"gdp_md_est":149100,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"KW","iso_a3":"KWT","iso_n3":"414","un_a3":"414","wb_a2":"KW","wb_a3":"KWT","woe_id":-99,"adm0_a3_is":"KWT","adm0_a3_us":"KWT","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Western Asia","region_wb":"Middle East & North Africa","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1236]],[[1237,-1111,1238]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Laos","sov_a3":"LAO","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Laos","adm0_a3":"LAO","geou_dif":0,"geounit":"Laos","gu_a3":"LAO","su_dif":0,"subunit":"Laos","su_a3":"LAO","brk_diff":0,"name":"Lao PDR","name_long":"Lao PDR","brk_a3":"LAO","brk_name":"Laos","brk_group":null,"abbrev":"Laos","postal":"LA","formal_en":"Lao People's Democratic Republic","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Lao PDR","name_alt":null,"mapcolor7":1,"mapcolor8":1,"mapcolor9":1,"mapcolor13":9,"pop_est":6834942,"gdp_md_est":13980,"pop_year":-99,"lastcensus":2005,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"LA","iso_a3":"LAO","iso_n3":"418","un_a3":"418","wb_a2":"LA","wb_a3":"LAO","woe_id":-99,"adm0_a3_is":"LAO","adm0_a3_us":"LAO","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"South-Eastern Asia","region_wb":"East Asia & Pacific","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[1239,1240,1241,-1199,1242,1243,-539]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Lebanon","sov_a3":"LBN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Lebanon","adm0_a3":"LBN","geou_dif":0,"geounit":"Lebanon","gu_a3":"LBN","su_dif":0,"subunit":"Lebanon","su_a3":"LBN","brk_diff":0,"name":"Lebanon","name_long":"Lebanon","brk_a3":"LBN","brk_name":"Lebanon","brk_group":null,"abbrev":"Leb.","postal":"LB","formal_en":"Lebanese Republic","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Lebanon","name_alt":null,"mapcolor7":4,"mapcolor8":4,"mapcolor9":4,"mapcolor13":12,"pop_est":4017095,"gdp_md_est":44060,"pop_year":-99,"lastcensus":1970,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"LB","iso_a3":"LBN","iso_n3":"422","un_a3":"422","wb_a2":"LB","wb_a3":"LBN","woe_id":-99,"adm0_a3_is":"LBN","adm0_a3_us":"LBN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Western Asia","region_wb":"Middle East & North Africa","name_len":7,"long_len":7,"abbrev_len":4,"tiny":4,"homepart":1},"arcs":[[-1123,1244,1245]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Liberia","sov_a3":"LBR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Liberia","adm0_a3":"LBR","geou_dif":0,"geounit":"Liberia","gu_a3":"LBR","su_dif":0,"subunit":"Liberia","su_a3":"LBR","brk_diff":0,"name":"Liberia","name_long":"Liberia","brk_a3":"LBR","brk_name":"Liberia","brk_group":null,"abbrev":"Liberia","postal":"LR","formal_en":"Republic of Liberia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Liberia","name_alt":null,"mapcolor7":2,"mapcolor8":3,"mapcolor9":4,"mapcolor13":9,"pop_est":3441790,"gdp_md_est":1526,"pop_year":-99,"lastcensus":2008,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"LR","iso_a3":"LBR","iso_n3":"430","un_a3":"430","wb_a2":"LR","wb_a3":"LBR","woe_id":-99,"adm0_a3_is":"LBR","adm0_a3_us":"LBR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Western Africa","region_wb":"Sub-Saharan Africa","name_len":7,"long_len":7,"abbrev_len":7,"tiny":-99,"homepart":1},"arcs":[[-568,1246,1247,-810]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Libya","sov_a3":"LBY","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Libya","adm0_a3":"LBY","geou_dif":0,"geounit":"Libya","gu_a3":"LBY","su_dif":0,"subunit":"Libya","su_a3":"LBY","brk_diff":0,"name":"Libya","name_long":"Libya","brk_a3":"LBY","brk_name":"Libya","brk_group":null,"abbrev":"Libya","postal":"LY","formal_en":"Libya","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Libya","name_alt":null,"mapcolor7":1,"mapcolor8":2,"mapcolor9":2,"mapcolor13":11,"pop_est":6310434,"gdp_md_est":88830,"pop_year":-99,"lastcensus":2006,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"LY","iso_a3":"LBY","iso_n3":"434","un_a3":"434","wb_a2":"LY","wb_a3":"LBY","woe_id":-99,"adm0_a3_is":"LBY","adm0_a3_us":"LBY","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Northern Africa","region_wb":"Middle East & North Africa","name_len":5,"long_len":5,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[-680,1248,1249,1250,-659,1251,1252]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Saint Lucia","sov_a3":"LCA","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Saint Lucia","adm0_a3":"LCA","geou_dif":0,"geounit":"Saint Lucia","gu_a3":"LCA","su_dif":0,"subunit":"Saint Lucia","su_a3":"LCA","brk_diff":0,"name":"Saint Lucia","name_long":"Saint Lucia","brk_a3":"LCA","brk_name":"Saint Lucia","brk_group":null,"abbrev":"S.L.","postal":"LC","formal_en":"Saint Lucia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"St. Lucia","name_alt":null,"mapcolor7":3,"mapcolor8":4,"mapcolor9":3,"mapcolor13":4,"pop_est":160267,"gdp_md_est":1778,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"LC","iso_a3":"LCA","iso_n3":"662","un_a3":"662","wb_a2":"LC","wb_a3":"LCA","woe_id":-99,"adm0_a3_is":"LCA","adm0_a3_us":"LCA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":11,"long_len":11,"abbrev_len":4,"tiny":4,"homepart":1},"arcs":[[1253]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Liechtenstein","sov_a3":"LIE","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Liechtenstein","adm0_a3":"LIE","geou_dif":0,"geounit":"Liechtenstein","gu_a3":"LIE","su_dif":0,"subunit":"Liechtenstein","su_a3":"LIE","brk_diff":0,"name":"Liechtenstein","name_long":"Liechtenstein","brk_a3":"LIE","brk_name":"Liechtenstein","brk_group":null,"abbrev":"Liech.","postal":"FL","formal_en":"Principality of Liechtenstein","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Liechtenstein","name_alt":null,"mapcolor7":2,"mapcolor8":4,"mapcolor9":2,"mapcolor13":9,"pop_est":34761,"gdp_md_est":4160,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"LI","iso_a3":"LIE","iso_n3":"438","un_a3":"438","wb_a2":"LI","wb_a3":"LIE","woe_id":-99,"adm0_a3_is":"LIE","adm0_a3_us":"LIE","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Western Europe","region_wb":"Europe & Central Asia","name_len":13,"long_len":13,"abbrev_len":6,"tiny":6,"homepart":1},"arcs":[[-484,-215]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Sri Lanka","sov_a3":"LKA","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Sri Lanka","adm0_a3":"LKA","geou_dif":0,"geounit":"Sri Lanka","gu_a3":"LKA","su_dif":0,"subunit":"Sri Lanka","su_a3":"LKA","brk_diff":0,"name":"Sri Lanka","name_long":"Sri Lanka","brk_a3":"LKA","brk_name":"Sri Lanka","brk_group":null,"abbrev":"Sri L.","postal":"LK","formal_en":"Democratic Socialist Republic of Sri Lanka","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Sri Lanka","name_alt":null,"mapcolor7":3,"mapcolor8":5,"mapcolor9":4,"mapcolor13":9,"pop_est":21324791,"gdp_md_est":91870,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"LK","iso_a3":"LKA","iso_n3":"144","un_a3":"144","wb_a2":"LK","wb_a3":"LKA","woe_id":-99,"adm0_a3_is":"LKA","adm0_a3_us":"LKA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Southern Asia","region_wb":"South Asia","name_len":9,"long_len":9,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[[1254]],[[1255]],[[1256]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Lesotho","sov_a3":"LSO","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Lesotho","adm0_a3":"LSO","geou_dif":0,"geounit":"Lesotho","gu_a3":"LSO","su_dif":0,"subunit":"Lesotho","su_a3":"LSO","brk_diff":0,"name":"Lesotho","name_long":"Lesotho","brk_a3":"LSO","brk_name":"Lesotho","brk_group":null,"abbrev":"Les.","postal":"LS","formal_en":"Kingdom of Lesotho","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Lesotho","name_alt":null,"mapcolor7":1,"mapcolor8":5,"mapcolor9":2,"mapcolor13":8,"pop_est":2130819,"gdp_md_est":3293,"pop_year":-99,"lastcensus":2006,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"LS","iso_a3":"LSO","iso_n3":"426","un_a3":"426","wb_a2":"LS","wb_a3":"LSO","woe_id":-99,"adm0_a3_is":"LSO","adm0_a3_us":"LSO","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Southern Africa","region_wb":"Sub-Saharan Africa","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[1257]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Lithuania","sov_a3":"LTU","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Lithuania","adm0_a3":"LTU","geou_dif":0,"geounit":"Lithuania","gu_a3":"LTU","su_dif":0,"subunit":"Lithuania","su_a3":"LTU","brk_diff":0,"name":"Lithuania","name_long":"Lithuania","brk_a3":"LTU","brk_name":"Lithuania","brk_group":null,"abbrev":"Lith.","postal":"LT","formal_en":"Republic of Lithuania","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Lithuania","name_alt":null,"mapcolor7":6,"mapcolor8":3,"mapcolor9":3,"mapcolor13":9,"pop_est":3555179,"gdp_md_est":63330,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"LT","iso_a3":"LTU","iso_n3":"440","un_a3":"440","wb_a2":"LT","wb_a3":"LTU","woe_id":-99,"adm0_a3_is":"LTU","adm0_a3_us":"LTU","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":9,"long_len":9,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[1258,1259]],[[-285,1260,1261,1262,1263]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Luxembourg","sov_a3":"LUX","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Luxembourg","adm0_a3":"LUX","geou_dif":0,"geounit":"Luxembourg","gu_a3":"LUX","su_dif":0,"subunit":"Luxembourg","su_a3":"LUX","brk_diff":0,"name":"Luxembourg","name_long":"Luxembourg","brk_a3":"LUX","brk_name":"Luxembourg","brk_group":null,"abbrev":"Lux.","postal":"L","formal_en":"Grand Duchy of Luxembourg","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Luxembourg","name_alt":null,"mapcolor7":1,"mapcolor8":7,"mapcolor9":3,"mapcolor13":7,"pop_est":491775,"gdp_md_est":39370,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"LU","iso_a3":"LUX","iso_n3":"442","un_a3":"442","wb_a2":"LU","wb_a3":"LUX","woe_id":-99,"adm0_a3_is":"LUX","adm0_a3_us":"LUX","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Western Europe","region_wb":"Europe & Central Asia","name_len":10,"long_len":10,"abbrev_len":4,"tiny":5,"homepart":1},"arcs":[[-634,-760,-230]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Latvia","sov_a3":"LVA","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Latvia","adm0_a3":"LVA","geou_dif":0,"geounit":"Latvia","gu_a3":"LVA","su_dif":0,"subunit":"Latvia","su_a3":"LVA","brk_diff":0,"name":"Latvia","name_long":"Latvia","brk_a3":"LVA","brk_name":"Latvia","brk_group":null,"abbrev":"Lat.","postal":"LV","formal_en":"Republic of Latvia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Latvia","name_alt":null,"mapcolor7":4,"mapcolor8":7,"mapcolor9":6,"mapcolor13":13,"pop_est":2231503,"gdp_md_est":38860,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"LV","iso_a3":"LVA","iso_n3":"428","un_a3":"428","wb_a2":"LV","wb_a3":"LVA","woe_id":-99,"adm0_a3_is":"LVA","adm0_a3_us":"LVA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[1264,-286,-1264,1265,-707]]},{"type":"Polygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"China","sov_a3":"CH1","adm0_dif":1,"level":2,"type":"Country","admin":"Macao S.A.R","adm0_a3":"MAC","geou_dif":0,"geounit":"Macao S.A.R","gu_a3":"MAC","su_dif":0,"subunit":"Macao S.A.R","su_a3":"MAC","brk_diff":0,"name":"Macao","name_long":"Macao","brk_a3":"MAC","brk_name":"Macao","brk_group":null,"abbrev":"Mac.","postal":"MO","formal_en":"Macao Special Administrative Region, PRC","formal_fr":null,"note_adm0":"China","note_brk":null,"name_sort":"Macao SAR, China","name_alt":null,"mapcolor7":4,"mapcolor8":4,"mapcolor9":4,"mapcolor13":3,"pop_est":559846,"gdp_md_est":18140,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"MO","iso_a3":"MAC","iso_n3":"446","un_a3":"446","wb_a2":"MO","wb_a3":"MAC","woe_id":-99,"adm0_a3_is":"MAC","adm0_a3_us":"MAC","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Eastern Asia","region_wb":"East Asia & Pacific","name_len":5,"long_len":5,"abbrev_len":4,"tiny":-99,"homepart":-99},"arcs":[[-536,1266]]},{"type":"Polygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"France","sov_a3":"FR1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Saint Martin","adm0_a3":"MAF","geou_dif":0,"geounit":"Saint Martin","gu_a3":"MAF","su_dif":0,"subunit":"Saint Martin","su_a3":"MAF","brk_diff":0,"name":"St-Martin","name_long":"Saint-Martin","brk_a3":"MAF","brk_name":"Saint-Martin","brk_group":null,"abbrev":"St. M.","postal":"MF","formal_en":"Saint-Martin (French part)","formal_fr":null,"note_adm0":"Fr.","note_brk":null,"name_sort":"St. Martin (French part)","name_alt":null,"mapcolor7":7,"mapcolor8":5,"mapcolor9":9,"mapcolor13":11,"pop_est":36661,"gdp_md_est":449,"pop_year":2008,"lastcensus":-99,"gdp_year":1999,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":0,"fips_10":null,"iso_a2":"MF","iso_a3":"MAF","iso_n3":"663","un_a3":"663","wb_a2":"MF","wb_a3":"MAF","woe_id":-99,"adm0_a3_is":"MAF","adm0_a3_us":"MAF","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":9,"long_len":12,"abbrev_len":6,"tiny":4,"homepart":-99},"arcs":[[1267,1268]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Morocco","sov_a3":"MAR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Morocco","adm0_a3":"MAR","geou_dif":0,"geounit":"Morocco","gu_a3":"MAR","su_dif":0,"subunit":"Morocco","su_a3":"MAR","brk_diff":0,"name":"Morocco","name_long":"Morocco","brk_a3":"MAR","brk_name":"Morocco","brk_group":null,"abbrev":"Mor.","postal":"MA","formal_en":"Kingdom of Morocco","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Morocco","name_alt":null,"mapcolor7":2,"mapcolor8":2,"mapcolor9":3,"mapcolor13":9,"pop_est":34859364,"gdp_md_est":136600,"pop_year":-99,"lastcensus":2004,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"MA","iso_a3":"MAR","iso_n3":"504","un_a3":"504","wb_a2":"MA","wb_a3":"MAR","woe_id":-99,"adm0_a3_is":"MAR","adm0_a3_us":"MAR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Northern Africa","region_wb":"Middle East & North Africa","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-664,1269,1270]]},{"type":"Polygon","properties":{"scalerank":6,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Monaco","sov_a3":"MCO","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Monaco","adm0_a3":"MCO","geou_dif":0,"geounit":"Monaco","gu_a3":"MCO","su_dif":0,"subunit":"Monaco","su_a3":"MCO","brk_diff":0,"name":"Monaco","name_long":"Monaco","brk_a3":"MCO","brk_name":"Monaco","brk_group":null,"abbrev":"Mco.","postal":"MC","formal_en":"Principality of Monaco","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Monaco","name_alt":null,"mapcolor7":1,"mapcolor8":1,"mapcolor9":2,"mapcolor13":12,"pop_est":32965,"gdp_md_est":976.3,"pop_year":-99,"lastcensus":2008,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"MC","iso_a3":"MCO","iso_n3":"492","un_a3":"492","wb_a2":"MC","wb_a3":"MCO","woe_id":-99,"adm0_a3_is":"MCO","adm0_a3_us":"MCO","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Western Europe","region_wb":"Europe & Central Asia","name_len":6,"long_len":6,"abbrev_len":4,"tiny":5,"homepart":1},"arcs":[[1271,-763]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Moldova","sov_a3":"MDA","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Moldova","adm0_a3":"MDA","geou_dif":0,"geounit":"Moldova","gu_a3":"MDA","su_dif":0,"subunit":"Moldova","su_a3":"MDA","brk_diff":0,"name":"Moldova","name_long":"Moldova","brk_a3":"MDA","brk_name":"Moldova","brk_group":null,"abbrev":"Mda.","postal":"MD","formal_en":"Republic of Moldova","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Moldova","name_alt":null,"mapcolor7":3,"mapcolor8":5,"mapcolor9":4,"mapcolor13":12,"pop_est":4320748,"gdp_md_est":10670,"pop_year":-99,"lastcensus":2004,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"MD","iso_a3":"MDA","iso_n3":"498","un_a3":"498","wb_a2":"MD","wb_a3":"MDA","woe_id":-99,"adm0_a3_is":"MDA","adm0_a3_us":"MDA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Eastern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[1272,1273]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Madagascar","sov_a3":"MDG","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Madagascar","adm0_a3":"MDG","geou_dif":0,"geounit":"Madagascar","gu_a3":"MDG","su_dif":0,"subunit":"Madagascar","su_a3":"MDG","brk_diff":0,"name":"Madagascar","name_long":"Madagascar","brk_a3":"MDG","brk_name":"Madagascar","brk_group":null,"abbrev":"Mad.","postal":"MG","formal_en":"Republic of Madagascar","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Madagascar","name_alt":null,"mapcolor7":6,"mapcolor8":5,"mapcolor9":2,"mapcolor13":3,"pop_est":20653556,"gdp_md_est":20130,"pop_year":-99,"lastcensus":1993,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"MG","iso_a3":"MDG","iso_n3":"450","un_a3":"450","wb_a2":"MG","wb_a3":"MDG","woe_id":-99,"adm0_a3_is":"MDG","adm0_a3_us":"MDG","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Eastern Africa","region_wb":"Sub-Saharan Africa","name_len":10,"long_len":10,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1274]],[[1275]],[[1276]]]},{"type":"MultiPolygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Maldives","sov_a3":"MDV","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Maldives","adm0_a3":"MDV","geou_dif":0,"geounit":"Maldives","gu_a3":"MDV","su_dif":0,"subunit":"Maldives","su_a3":"MDV","brk_diff":0,"name":"Maldives","name_long":"Maldives","brk_a3":"MDV","brk_name":"Maldives","brk_group":null,"abbrev":"Mald.","postal":"MV","formal_en":"Republic of Maldives","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Maldives","name_alt":null,"mapcolor7":2,"mapcolor8":3,"mapcolor9":1,"mapcolor13":7,"pop_est":396334,"gdp_md_est":1716,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"MV","iso_a3":"MDV","iso_n3":"462","un_a3":"462","wb_a2":"MV","wb_a3":"MDV","woe_id":-99,"adm0_a3_is":"MDV","adm0_a3_us":"B13","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Seven seas (open ocean)","region_un":"Asia","subregion":"Southern Asia","region_wb":"South Asia","name_len":8,"long_len":8,"abbrev_len":5,"tiny":2,"homepart":1},"arcs":[[[1277]],[[1278]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Mexico","sov_a3":"MEX","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Mexico","adm0_a3":"MEX","geou_dif":0,"geounit":"Mexico","gu_a3":"MEX","su_dif":0,"subunit":"Mexico","su_a3":"MEX","brk_diff":0,"name":"Mexico","name_long":"Mexico","brk_a3":"MEX","brk_name":"Mexico","brk_group":null,"abbrev":"Mex.","postal":"MX","formal_en":"United Mexican States","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Mexico","name_alt":null,"mapcolor7":6,"mapcolor8":1,"mapcolor9":7,"mapcolor13":3,"pop_est":111211789,"gdp_md_est":1563000,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"4. Emerging region: MIKT","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"MX","iso_a3":"MEX","iso_n3":"484","un_a3":"484","wb_a2":"MX","wb_a3":"MEX","woe_id":-99,"adm0_a3_is":"MEX","adm0_a3_us":"MEX","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Central America","region_wb":"Latin America & Caribbean","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1279]],[[1280]],[[1281]],[[1282]],[[1283]],[[1284]],[[1285]],[[1286]],[[1287]],[[1288]],[[1289]],[[1290]],[[1291]],[[1292]],[[1293]],[[1294,-290,-891,1295,1296]]]},{"type":"MultiPolygon","properties":{"scalerank":5,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Marshall Islands","sov_a3":"MHL","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Marshall Islands","adm0_a3":"MHL","geou_dif":0,"geounit":"Marshall Islands","gu_a3":"MHL","su_dif":0,"subunit":"Marshall Islands","su_a3":"MHL","brk_diff":0,"name":"Marshall Is.","name_long":"Marshall Islands","brk_a3":"MHL","brk_name":"Marshall Is.","brk_group":null,"abbrev":"M. Is.","postal":"MH","formal_en":"Republic of the Marshall Islands","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Marshall Islands","name_alt":null,"mapcolor7":2,"mapcolor8":5,"mapcolor9":5,"mapcolor13":3,"pop_est":64522,"gdp_md_est":133.5,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"MH","iso_a3":"MHL","iso_n3":"584","un_a3":"584","wb_a2":"MH","wb_a3":"MHL","woe_id":-99,"adm0_a3_is":"MHL","adm0_a3_us":"MHL","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Micronesia","region_wb":"East Asia & Pacific","name_len":12,"long_len":16,"abbrev_len":6,"tiny":2,"homepart":1},"arcs":[[[1297]],[[1298]],[[1299]],[[1300]],[[1301]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Macedonia","sov_a3":"MKD","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Macedonia","adm0_a3":"MKD","geou_dif":0,"geounit":"Macedonia","gu_a3":"MKD","su_dif":0,"subunit":"Macedonia","su_a3":"MKD","brk_diff":0,"name":"Macedonia","name_long":"Macedonia","brk_a3":"MKD","brk_name":"Macedonia","brk_group":null,"abbrev":"Mkd.","postal":"MK","formal_en":"Former Yugoslav Republic of Macedonia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Macedonia, FYR","name_alt":null,"mapcolor7":5,"mapcolor8":3,"mapcolor9":7,"mapcolor13":3,"pop_est":2066718,"gdp_md_est":18780,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"MK","iso_a3":"MKD","iso_n3":"807","un_a3":"807","wb_a2":"MK","wb_a3":"MKD","woe_id":-99,"adm0_a3_is":"MKD","adm0_a3_us":"MKD","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":9,"long_len":9,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-257,-867,-18,-1234,1302]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Mali","sov_a3":"MLI","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Mali","adm0_a3":"MLI","geou_dif":0,"geounit":"Mali","gu_a3":"MLI","su_dif":0,"subunit":"Mali","su_a3":"MLI","brk_diff":0,"name":"Mali","name_long":"Mali","brk_a3":"MLI","brk_name":"Mali","brk_group":null,"abbrev":"Mali","postal":"ML","formal_en":"Republic of Mali","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Mali","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":1,"mapcolor13":7,"pop_est":12666987,"gdp_md_est":14590,"pop_year":-99,"lastcensus":2009,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"ML","iso_a3":"MLI","iso_n3":"466","un_a3":"466","wb_a2":"ML","wb_a3":"MLI","woe_id":-99,"adm0_a3_is":"MLI","adm0_a3_us":"MLI","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Western Africa","region_wb":"Sub-Saharan Africa","name_len":4,"long_len":4,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[1303,-244,-570,-809,1304,1305,-661]]},{"type":"MultiPolygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Malta","sov_a3":"MLT","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Malta","adm0_a3":"MLT","geou_dif":0,"geounit":"Malta","gu_a3":"MLT","su_dif":0,"subunit":"Malta","su_a3":"MLT","brk_diff":0,"name":"Malta","name_long":"Malta","brk_a3":"MLT","brk_name":"Malta","brk_group":null,"abbrev":"Malta","postal":"M","formal_en":"Republic of Malta","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Malta","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":1,"mapcolor13":8,"pop_est":405165,"gdp_md_est":9962,"pop_year":-99,"lastcensus":2005,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"MT","iso_a3":"MLT","iso_n3":"470","un_a3":"470","wb_a2":"MT","wb_a3":"MLT","woe_id":-99,"adm0_a3_is":"MLT","adm0_a3_us":"MLT","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Middle East & North Africa","name_len":5,"long_len":5,"abbrev_len":5,"tiny":3,"homepart":1},"arcs":[[[1306]],[[1307]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Myanmar","sov_a3":"MMR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Myanmar","adm0_a3":"MMR","geou_dif":0,"geounit":"Myanmar","gu_a3":"MMR","su_dif":0,"subunit":"Myanmar","su_a3":"MMR","brk_diff":0,"name":"Myanmar","name_long":"Myanmar","brk_a3":"MMR","brk_name":"Myanmar","brk_group":null,"abbrev":"Myan.","postal":"MM","formal_en":"Republic of the Union of Myanmar","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Myanmar","name_alt":null,"mapcolor7":2,"mapcolor8":2,"mapcolor9":5,"mapcolor13":13,"pop_est":48137741,"gdp_md_est":55130,"pop_year":-99,"lastcensus":1983,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"MM","iso_a3":"MMR","iso_n3":"104","un_a3":"104","wb_a2":"MM","wb_a3":"MMR","woe_id":-99,"adm0_a3_is":"MMR","adm0_a3_us":"MMR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"South-Eastern Asia","region_wb":"East Asia & Pacific","name_len":7,"long_len":7,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[1308]],[[1309]],[[1310]],[[1311]],[[1312]],[[1313]],[[1314]],[[1315]],[[1316]],[[1317]],[[1318]],[[1319]],[[1320]],[[1321]],[[1322]],[[1323]],[[1324]],[[1325]],[[-1244,1326,1327,-251,-1089,-540]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Montenegro","sov_a3":"MNE","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Montenegro","adm0_a3":"MNE","geou_dif":0,"geounit":"Montenegro","gu_a3":"MNE","su_dif":0,"subunit":"Montenegro","su_a3":"MNE","brk_diff":0,"name":"Montenegro","name_long":"Montenegro","brk_a3":"MNE","brk_name":"Montenegro","brk_group":null,"abbrev":"Mont.","postal":"ME","formal_en":"Montenegro","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Montenegro","name_alt":null,"mapcolor7":4,"mapcolor8":1,"mapcolor9":4,"mapcolor13":5,"pop_est":672180,"gdp_md_est":6816,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"ME","iso_a3":"MNE","iso_n3":"499","un_a3":"499","wb_a2":"ME","wb_a3":"MNE","woe_id":-99,"adm0_a3_is":"MNE","adm0_a3_us":"MNE","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":10,"long_len":10,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[1328,-1235,-21,1329,-908,-277]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Mongolia","sov_a3":"MNG","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Mongolia","adm0_a3":"MNG","geou_dif":0,"geounit":"Mongolia","gu_a3":"MNG","su_dif":0,"subunit":"Mongolia","su_a3":"MNG","brk_diff":0,"name":"Mongolia","name_long":"Mongolia","brk_a3":"MNG","brk_name":"Mongolia","brk_group":null,"abbrev":"Mong.","postal":"MN","formal_en":"Mongolia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Mongolia","name_alt":null,"mapcolor7":3,"mapcolor8":5,"mapcolor9":5,"mapcolor13":6,"pop_est":3041142,"gdp_md_est":9476,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"MN","iso_a3":"MNG","iso_n3":"496","un_a3":"496","wb_a2":"MN","wb_a3":"MNG","woe_id":-99,"adm0_a3_is":"MNG","adm0_a3_us":"MNG","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Eastern Asia","region_wb":"East Asia & Pacific","name_len":8,"long_len":8,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[-562,1330]]},{"type":"MultiPolygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"United States of America","sov_a3":"US1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Northern Mariana Islands","adm0_a3":"MNP","geou_dif":0,"geounit":"Northern Mariana Islands","gu_a3":"MNP","su_dif":0,"subunit":"Northern Mariana Islands","su_a3":"MNP","brk_diff":0,"name":"N. Mariana Is.","name_long":"Northern Mariana Islands","brk_a3":"MNP","brk_name":"N. Mariana Is.","brk_group":null,"abbrev":"N.M.I.","postal":"MP","formal_en":"Commonwealth of the Northern Mariana Islands","formal_fr":null,"note_adm0":"Commonwealth of U.S.A.","note_brk":null,"name_sort":"Northern Mariana Islands","name_alt":null,"mapcolor7":4,"mapcolor8":5,"mapcolor9":1,"mapcolor13":1,"pop_est":88662,"gdp_md_est":900,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"MP","iso_a3":"MNP","iso_n3":"580","un_a3":"580","wb_a2":"MP","wb_a3":"MNP","woe_id":-99,"adm0_a3_is":"MNP","adm0_a3_us":"MNP","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Micronesia","region_wb":"East Asia & Pacific","name_len":14,"long_len":24,"abbrev_len":6,"tiny":3,"homepart":-99},"arcs":[[[1331]],[[1332]],[[1333]],[[1334]],[[1335]],[[1336]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Mozambique","sov_a3":"MOZ","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Mozambique","adm0_a3":"MOZ","geou_dif":0,"geounit":"Mozambique","gu_a3":"MOZ","su_dif":0,"subunit":"Mozambique","su_a3":"MOZ","brk_diff":0,"name":"Mozambique","name_long":"Mozambique","brk_a3":"MOZ","brk_name":"Mozambique","brk_group":null,"abbrev":"Moz.","postal":"MZ","formal_en":"Republic of Mozambique","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Mozambique","name_alt":null,"mapcolor7":4,"mapcolor8":2,"mapcolor9":1,"mapcolor13":4,"pop_est":21669278,"gdp_md_est":18940,"pop_year":-99,"lastcensus":2007,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"MZ","iso_a3":"MOZ","iso_n3":"508","un_a3":"508","wb_a2":"MZ","wb_a3":"MOZ","woe_id":-99,"adm0_a3_is":"MOZ","adm0_a3_us":"MOZ","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Eastern Africa","region_wb":"Sub-Saharan Africa","name_len":10,"long_len":10,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[1337,1338,1339,1340,1341,1342,1343,1344],[1345],[1346]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Mauritania","sov_a3":"MRT","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Mauritania","adm0_a3":"MRT","geou_dif":0,"geounit":"Mauritania","gu_a3":"MRT","su_dif":0,"subunit":"Mauritania","su_a3":"MRT","brk_diff":0,"name":"Mauritania","name_long":"Mauritania","brk_a3":"MRT","brk_name":"Mauritania","brk_group":null,"abbrev":"Mrt.","postal":"MR","formal_en":"Islamic Republic of Mauritania","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Mauritania","name_alt":null,"mapcolor7":3,"mapcolor8":3,"mapcolor9":2,"mapcolor13":1,"pop_est":3129486,"gdp_md_est":6308,"pop_year":-99,"lastcensus":2000,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"MR","iso_a3":"MRT","iso_n3":"478","un_a3":"478","wb_a2":"MR","wb_a3":"MRT","woe_id":-99,"adm0_a3_is":"MRT","adm0_a3_us":"MRT","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Western Africa","region_wb":"Sub-Saharan Africa","name_len":10,"long_len":10,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1347]],[[1348,1349,1350,-662,-1306]]]},{"type":"Polygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"United Kingdom","sov_a3":"GB1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Montserrat","adm0_a3":"MSR","geou_dif":0,"geounit":"Montserrat","gu_a3":"MSR","su_dif":0,"subunit":"Montserrat","su_a3":"MSR","brk_diff":0,"name":"Montserrat","name_long":"Montserrat","brk_a3":"MSR","brk_name":"Montserrat","brk_group":null,"abbrev":"Monts.","postal":"MS","formal_en":null,"formal_fr":null,"note_adm0":"U.K.","note_brk":null,"name_sort":"Montserrat","name_alt":null,"mapcolor7":6,"mapcolor8":6,"mapcolor9":6,"mapcolor13":3,"pop_est":5097,"gdp_md_est":29,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"MS","iso_a3":"MSR","iso_n3":"500","un_a3":"500","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"MSR","adm0_a3_us":"MSR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":10,"long_len":10,"abbrev_len":6,"tiny":6,"homepart":-99},"arcs":[[1351]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Mauritius","sov_a3":"MUS","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Mauritius","adm0_a3":"MUS","geou_dif":0,"geounit":"Mauritius","gu_a3":"MUS","su_dif":0,"subunit":"Mauritius","su_a3":"MUS","brk_diff":0,"name":"Mauritius","name_long":"Mauritius","brk_a3":"MUS","brk_name":"Mauritius","brk_group":null,"abbrev":"Mus.","postal":"MU","formal_en":"Republic of Mauritius","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Mauritius","name_alt":null,"mapcolor7":1,"mapcolor8":3,"mapcolor9":5,"mapcolor13":7,"pop_est":1284264,"gdp_md_est":15270,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"MU","iso_a3":"MUS","iso_n3":"480","un_a3":"480","wb_a2":"MU","wb_a3":"MUS","woe_id":-99,"adm0_a3_is":"MUS","adm0_a3_us":"MUS","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Seven seas (open ocean)","region_un":"Africa","subregion":"Eastern Africa","region_wb":"Sub-Saharan Africa","name_len":9,"long_len":9,"abbrev_len":4,"tiny":2,"homepart":1},"arcs":[[1352]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Malawi","sov_a3":"MWI","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Malawi","adm0_a3":"MWI","geou_dif":0,"geounit":"Malawi","gu_a3":"MWI","su_dif":0,"subunit":"Malawi","su_a3":"MWI","brk_diff":0,"name":"Malawi","name_long":"Malawi","brk_a3":"MWI","brk_name":"Malawi","brk_group":null,"abbrev":"Mal.","postal":"MW","formal_en":"Republic of Malawi","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Malawi","name_alt":null,"mapcolor7":1,"mapcolor8":3,"mapcolor9":4,"mapcolor13":5,"pop_est":14268711,"gdp_md_est":11810,"pop_year":-99,"lastcensus":2008,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"MW","iso_a3":"MWI","iso_n3":"454","un_a3":"454","wb_a2":"MW","wb_a3":"MWI","woe_id":-99,"adm0_a3_is":"MWI","adm0_a3_us":"MWI","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Eastern Africa","region_wb":"Sub-Saharan Africa","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[-1347]],[[-1346]],[[-1343,1353,1354]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Malaysia","sov_a3":"MYS","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Malaysia","adm0_a3":"MYS","geou_dif":0,"geounit":"Malaysia","gu_a3":"MYS","su_dif":0,"subunit":"Malaysia","su_a3":"MYS","brk_diff":0,"name":"Malaysia","name_long":"Malaysia","brk_a3":"MYS","brk_name":"Malaysia","brk_group":null,"abbrev":"Malay.","postal":"MY","formal_en":"Malaysia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Malaysia","name_alt":null,"mapcolor7":2,"mapcolor8":4,"mapcolor9":3,"mapcolor13":6,"pop_est":25715819,"gdp_md_est":384300,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"MY","iso_a3":"MYS","iso_n3":"458","un_a3":"458","wb_a2":"MY","wb_a3":"MYS","woe_id":-99,"adm0_a3_is":"MYS","adm0_a3_us":"MYS","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"South-Eastern Asia","region_wb":"East Asia & Pacific","name_len":8,"long_len":8,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[[1355]],[[1356]],[[1357]],[[-1064,1358]],[[1359]],[[1360]],[[1361,1362]],[[-1067,1363,-325,-324,1364]],[[1365]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Namibia","sov_a3":"NAM","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Namibia","adm0_a3":"NAM","geou_dif":0,"geounit":"Namibia","gu_a3":"NAM","su_dif":0,"subunit":"Namibia","su_a3":"NAM","brk_diff":0,"name":"Namibia","name_long":"Namibia","brk_a3":"NAM","brk_name":"Namibia","brk_group":null,"abbrev":"Nam.","postal":"NA","formal_en":"Republic of Namibia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Namibia","name_alt":null,"mapcolor7":4,"mapcolor8":1,"mapcolor9":1,"mapcolor13":7,"pop_est":2108665,"gdp_md_est":13250,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"NA","iso_a3":"NAM","iso_n3":"516","un_a3":"516","wb_a2":"NA","wb_a3":"NAM","woe_id":-99,"adm0_a3_is":"NAM","adm0_a3_us":"NAM","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Southern Africa","region_wb":"Sub-Saharan Africa","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[1366,-331,1367,1368,-10]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"France","sov_a3":"FR1","adm0_dif":1,"level":2,"type":"Dependency","admin":"New Caledonia","adm0_a3":"NCL","geou_dif":0,"geounit":"New Caledonia","gu_a3":"NCL","su_dif":0,"subunit":"New Caledonia","su_a3":"NCL","brk_diff":0,"name":"New Caledonia","name_long":"New Caledonia","brk_a3":"NCL","brk_name":"New Caledonia","brk_group":null,"abbrev":"New C.","postal":"NC","formal_en":"New Caledonia","formal_fr":"Nouvelle-Calédonie","note_adm0":"Fr.","note_brk":null,"name_sort":"New Caledonia","name_alt":null,"mapcolor7":7,"mapcolor8":5,"mapcolor9":9,"mapcolor13":11,"pop_est":227436,"gdp_md_est":3158,"pop_year":-99,"lastcensus":2009,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"NC","iso_a3":"NCL","iso_n3":"540","un_a3":"540","wb_a2":"NC","wb_a3":"NCL","woe_id":-99,"adm0_a3_is":"NCL","adm0_a3_us":"NCL","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Melanesia","region_wb":"East Asia & Pacific","name_len":13,"long_len":13,"abbrev_len":6,"tiny":-99,"homepart":-99},"arcs":[[[1369]],[[1370]],[[1371]],[[1372]],[[1373]],[[1374]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Niger","sov_a3":"NER","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Niger","adm0_a3":"NER","geou_dif":0,"geounit":"Niger","gu_a3":"NER","su_dif":0,"subunit":"Niger","su_a3":"NER","brk_diff":0,"name":"Niger","name_long":"Niger","brk_a3":"NER","brk_name":"Niger","brk_group":null,"abbrev":"Niger","postal":"NE","formal_en":"Republic of Niger","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Niger","name_alt":null,"mapcolor7":4,"mapcolor8":5,"mapcolor9":3,"mapcolor13":13,"pop_est":15306252,"gdp_md_est":10040,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"NE","iso_a3":"NER","iso_n3":"562","un_a3":"562","wb_a2":"NE","wb_a3":"NER","woe_id":-99,"adm0_a3_is":"NER","adm0_a3_us":"NER","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Western Africa","region_wb":"Sub-Saharan Africa","name_len":5,"long_len":5,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[1375,1376,-239,-240,-1304,-660,-1251]]},{"type":"Polygon","properties":{"scalerank":5,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Australia","sov_a3":"AU1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Norfolk Island","adm0_a3":"NFK","geou_dif":0,"geounit":"Norfolk Island","gu_a3":"NFK","su_dif":0,"subunit":"Norfolk Island","su_a3":"NFK","brk_diff":0,"name":"Norfolk Island","name_long":"Norfolk Island","brk_a3":"NFK","brk_name":"Norfolk Island","brk_group":null,"abbrev":"Nfk. I.","postal":"NF","formal_en":"Territory of Norfolk Island","formal_fr":null,"note_adm0":"Auz.","note_brk":null,"name_sort":"Norfolk Island","name_alt":null,"mapcolor7":1,"mapcolor8":2,"mapcolor9":2,"mapcolor13":7,"pop_est":2141,"gdp_md_est":32.115,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"NF","iso_a3":"NFK","iso_n3":"574","un_a3":"574","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"NFK","adm0_a3_us":"NFK","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Australia and New Zealand","region_wb":"East Asia & Pacific","name_len":14,"long_len":14,"abbrev_len":7,"tiny":-99,"homepart":-99},"arcs":[[1377]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Nigeria","sov_a3":"NGA","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Nigeria","adm0_a3":"NGA","geou_dif":0,"geounit":"Nigeria","gu_a3":"NGA","su_dif":0,"subunit":"Nigeria","su_a3":"NGA","brk_diff":0,"name":"Nigeria","name_long":"Nigeria","brk_a3":"NGA","brk_name":"Nigeria","brk_group":null,"abbrev":"Nigeria","postal":"NG","formal_en":"Federal Republic of Nigeria","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Nigeria","name_alt":null,"mapcolor7":3,"mapcolor8":2,"mapcolor9":5,"mapcolor13":2,"pop_est":149229090,"gdp_md_est":335400,"pop_year":-99,"lastcensus":2006,"gdp_year":-99,"economy":"5. Emerging region: G20","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"NG","iso_a3":"NGA","iso_n3":"566","un_a3":"566","wb_a2":"NG","wb_a3":"NGA","woe_id":-99,"adm0_a3_is":"NGA","adm0_a3_us":"NGA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Western Africa","region_wb":"Sub-Saharan Africa","name_len":7,"long_len":7,"abbrev_len":7,"tiny":-99,"homepart":1},"arcs":[[[1378]],[[1379,-575,1380,-235,-1377]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Nicaragua","sov_a3":"NIC","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Nicaragua","adm0_a3":"NIC","geou_dif":0,"geounit":"Nicaragua","gu_a3":"NIC","su_dif":0,"subunit":"Nicaragua","su_a3":"NIC","brk_diff":0,"name":"Nicaragua","name_long":"Nicaragua","brk_a3":"NIC","brk_name":"Nicaragua","brk_group":null,"abbrev":"Nic.","postal":"NI","formal_en":"Republic of Nicaragua","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Nicaragua","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":1,"mapcolor13":9,"pop_est":5891199,"gdp_md_est":16790,"pop_year":-99,"lastcensus":2005,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"NI","iso_a3":"NIC","iso_n3":"558","un_a3":"558","wb_a2":"NI","wb_a3":"NIC","woe_id":-99,"adm0_a3_is":"NIC","adm0_a3_us":"NIC","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Central America","region_wb":"Latin America & Caribbean","name_len":9,"long_len":9,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[1381,-608,1382,-900]]},{"type":"Polygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"New Zealand","sov_a3":"NZ1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Niue","adm0_a3":"NIU","geou_dif":0,"geounit":"Niue","gu_a3":"NIU","su_dif":0,"subunit":"Niue","su_a3":"NIU","brk_diff":0,"name":"Niue","name_long":"Niue","brk_a3":"NIU","brk_name":"Niue","brk_group":null,"abbrev":"Niue","postal":"NU","formal_en":null,"formal_fr":null,"note_adm0":"Assoc. with N.Z.","note_brk":null,"name_sort":"Niue","name_alt":null,"mapcolor7":3,"mapcolor8":3,"mapcolor9":4,"mapcolor13":4,"pop_est":1398,"gdp_md_est":10.01,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"NU","iso_a3":"NIU","iso_n3":"570","un_a3":"570","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"NIU","adm0_a3_us":"NIU","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Polynesia","region_wb":"East Asia & Pacific","name_len":4,"long_len":4,"abbrev_len":4,"tiny":3,"homepart":-99},"arcs":[[1383]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Netherlands","sov_a3":"NL1","adm0_dif":1,"level":2,"type":"Country","admin":"Netherlands","adm0_a3":"NLD","geou_dif":0,"geounit":"Netherlands","gu_a3":"NLD","su_dif":0,"subunit":"Netherlands","su_a3":"NLD","brk_diff":0,"name":"Netherlands","name_long":"Netherlands","brk_a3":"NLD","brk_name":"Netherlands","brk_group":null,"abbrev":"Neth.","postal":"NL","formal_en":"Kingdom of the Netherlands","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Netherlands","name_alt":null,"mapcolor7":4,"mapcolor8":2,"mapcolor9":2,"mapcolor13":9,"pop_est":16715999,"gdp_md_est":672000,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"NL","iso_a3":"NLD","iso_n3":"528","un_a3":"528","wb_a2":"NL","wb_a3":"NLD","woe_id":-99,"adm0_a3_is":"NLD","adm0_a3_us":"NLD","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Western Europe","region_wb":"Europe & Central Asia","name_len":11,"long_len":11,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[1384]],[[1385]],[[-233,1386]],[[1387]],[[1388]],[[1389]],[[1390,-635,1391,-234]],[[1392]],[[1393]],[[1394]],[[1395]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Norway","sov_a3":"NOR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Norway","adm0_a3":"NOR","geou_dif":0,"geounit":"Norway","gu_a3":"NOR","su_dif":0,"subunit":"Norway","su_a3":"NOR","brk_diff":0,"name":"Norway","name_long":"Norway","brk_a3":"NOR","brk_name":"Norway","brk_group":null,"abbrev":"Nor.","postal":"N","formal_en":"Kingdom of Norway","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Norway","name_alt":null,"mapcolor7":5,"mapcolor8":3,"mapcolor9":8,"mapcolor13":12,"pop_est":4676305,"gdp_md_est":276400,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"NO","iso_a3":"NOR","iso_n3":"578","un_a3":"578","wb_a2":"NO","wb_a3":"NOR","woe_id":-99,"adm0_a3_is":"NOR","adm0_a3_us":"NOR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1396]],[[1397]],[[1398]],[[1399]],[[1400]],[[1401]],[[1402]],[[1403]],[[1404]],[[1405]],[[1406]],[[1407]],[[1408]],[[1409]],[[1410]],[[1411]],[[1412]],[[1413]],[[1414]],[[1415]],[[1416,-724,1417,1418]],[[1419]],[[1420]],[[1421]],[[1422]],[[1423]],[[1424]],[[1425]],[[1426]],[[1427]],[[1428]],[[1429]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Nepal","sov_a3":"NPL","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Nepal","adm0_a3":"NPL","geou_dif":0,"geounit":"Nepal","gu_a3":"NPL","su_dif":0,"subunit":"Nepal","su_a3":"NPL","brk_diff":0,"name":"Nepal","name_long":"Nepal","brk_a3":"NPL","brk_name":"Nepal","brk_group":null,"abbrev":"Nepal","postal":"NP","formal_en":"Nepal","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Nepal","name_alt":null,"mapcolor7":2,"mapcolor8":2,"mapcolor9":3,"mapcolor13":12,"pop_est":28563377,"gdp_md_est":31080,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"NP","iso_a3":"NPL","iso_n3":"524","un_a3":"524","wb_a2":"NP","wb_a3":"NPL","woe_id":-99,"adm0_a3_is":"NPL","adm0_a3_us":"NPL","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Southern Asia","region_wb":"South Asia","name_len":5,"long_len":5,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[-1088,-543]]},{"type":"Polygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Nauru","sov_a3":"NRU","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Nauru","adm0_a3":"NRU","geou_dif":0,"geounit":"Nauru","gu_a3":"NRU","su_dif":0,"subunit":"Nauru","su_a3":"NRU","brk_diff":0,"name":"Nauru","name_long":"Nauru","brk_a3":"NRU","brk_name":"Nauru","brk_group":null,"abbrev":"Nauru","postal":"NR","formal_en":"Republic of Nauru","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Nauru","name_alt":null,"mapcolor7":3,"mapcolor8":7,"mapcolor9":6,"mapcolor13":9,"pop_est":14019,"gdp_md_est":60,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"NR","iso_a3":"NRU","iso_n3":"520","un_a3":"520","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"NRU","adm0_a3_us":"NRU","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Micronesia","region_wb":"East Asia & Pacific","name_len":5,"long_len":5,"abbrev_len":5,"tiny":3,"homepart":1},"arcs":[[1430]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"New Zealand","sov_a3":"NZ1","adm0_dif":1,"level":2,"type":"Country","admin":"New Zealand","adm0_a3":"NZL","geou_dif":0,"geounit":"New Zealand","gu_a3":"NZL","su_dif":0,"subunit":"New Zealand","su_a3":"NZL","brk_diff":0,"name":"New Zealand","name_long":"New Zealand","brk_a3":"NZL","brk_name":"New Zealand","brk_group":null,"abbrev":"N.Z.","postal":"NZ","formal_en":"New Zealand","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"New Zealand","name_alt":null,"mapcolor7":3,"mapcolor8":3,"mapcolor9":4,"mapcolor13":4,"pop_est":4213418,"gdp_md_est":116700,"pop_year":-99,"lastcensus":2006,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"NZ","iso_a3":"NZL","iso_n3":"554","un_a3":"554","wb_a2":"NZ","wb_a3":"NZL","woe_id":-99,"adm0_a3_is":"NZL","adm0_a3_us":"NZL","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Australia and New Zealand","region_wb":"East Asia & Pacific","name_len":11,"long_len":11,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1431]],[[1432]],[[1433]],[[1434]],[[1435]],[[1436]],[[1437]],[[1438]],[[1439]],[[1440]],[[1441]],[[1442]],[[1443]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Oman","sov_a3":"OMN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Oman","adm0_a3":"OMN","geou_dif":0,"geounit":"Oman","gu_a3":"OMN","su_dif":0,"subunit":"Oman","su_a3":"OMN","brk_diff":0,"name":"Oman","name_long":"Oman","brk_a3":"OMN","brk_name":"Oman","brk_group":null,"abbrev":"Oman","postal":"OM","formal_en":"Sultanate of Oman","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Oman","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":1,"mapcolor13":6,"pop_est":3418085,"gdp_md_est":66980,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"OM","iso_a3":"OMN","iso_n3":"512","un_a3":"512","wb_a2":"OM","wb_a3":"OMN","woe_id":-99,"adm0_a3_is":"OMN","adm0_a3_us":"OMN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Western Asia","region_wb":"Middle East & North Africa","name_len":4,"long_len":4,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1444]],[[1445,1446,1447,-32]],[[-36]],[[-35,1448]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Pakistan","sov_a3":"PAK","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Pakistan","adm0_a3":"PAK","geou_dif":0,"geounit":"Pakistan","gu_a3":"PAK","su_dif":0,"subunit":"Pakistan","su_a3":"PAK","brk_diff":0,"name":"Pakistan","name_long":"Pakistan","brk_a3":"PAK","brk_name":"Pakistan","brk_group":null,"abbrev":"Pak.","postal":"PK","formal_en":"Islamic Republic of Pakistan","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Pakistan","name_alt":null,"mapcolor7":2,"mapcolor8":2,"mapcolor9":3,"mapcolor13":11,"pop_est":176242949,"gdp_md_est":427300,"pop_year":-99,"lastcensus":1998,"gdp_year":-99,"economy":"5. Emerging region: G20","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"PK","iso_a3":"PAK","iso_n3":"586","un_a3":"586","wb_a2":"PK","wb_a3":"PAK","woe_id":-99,"adm0_a3_is":"PAK","adm0_a3_us":"PAK","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Southern Asia","region_wb":"South Asia","name_len":8,"long_len":8,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-1175,-1091,1449,-1106,-3,-557]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Panama","sov_a3":"PAN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Panama","adm0_a3":"PAN","geou_dif":0,"geounit":"Panama","gu_a3":"PAN","su_dif":0,"subunit":"Panama","su_a3":"PAN","brk_diff":0,"name":"Panama","name_long":"Panama","brk_a3":"PAN","brk_name":"Panama","brk_group":null,"abbrev":"Pan.","postal":"PA","formal_en":"Republic of Panama","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Panama","name_alt":null,"mapcolor7":4,"mapcolor8":4,"mapcolor9":6,"mapcolor13":3,"pop_est":3360474,"gdp_md_est":38830,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"PA","iso_a3":"PAN","iso_n3":"591","un_a3":"591","wb_a2":"PA","wb_a3":"PAN","woe_id":-99,"adm0_a3_is":"PAN","adm0_a3_us":"PAN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Central America","region_wb":"Latin America & Caribbean","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1450]],[[1451]],[[1452]],[[1453]],[[-592,1454,-606,1455]]]},{"type":"Polygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"United Kingdom","sov_a3":"GB1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Pitcairn Islands","adm0_a3":"PCN","geou_dif":0,"geounit":"Pitcairn Islands","gu_a3":"PCN","su_dif":0,"subunit":"Pitcairn Islands","su_a3":"PCN","brk_diff":0,"name":"Pitcairn Is.","name_long":"Pitcairn Islands","brk_a3":"PCN","brk_name":"Pitcairn Is.","brk_group":null,"abbrev":"Pit. Is.","postal":"PN","formal_en":"Pitcairn, Henderson, Ducie and Oeno Islands","formal_fr":null,"note_adm0":"U.K.","note_brk":null,"name_sort":"Pitcairn Islands","name_alt":null,"mapcolor7":6,"mapcolor8":6,"mapcolor9":6,"mapcolor13":3,"pop_est":48,"gdp_md_est":0.72,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"PN","iso_a3":"PCN","iso_n3":"612","un_a3":"612","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"PCN","adm0_a3_us":"PCN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Polynesia","region_wb":"East Asia & Pacific","name_len":12,"long_len":16,"abbrev_len":8,"tiny":-99,"homepart":-99},"arcs":[[1456]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Peru","sov_a3":"PER","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Peru","adm0_a3":"PER","geou_dif":0,"geounit":"Peru","gu_a3":"PER","su_dif":0,"subunit":"Peru","su_a3":"PER","brk_diff":0,"name":"Peru","name_long":"Peru","brk_a3":"PER","brk_name":"Peru","brk_group":null,"abbrev":"Peru","postal":"PE","formal_en":"Republic of Peru","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Peru","name_alt":null,"mapcolor7":4,"mapcolor8":4,"mapcolor9":4,"mapcolor13":11,"pop_est":29546963,"gdp_md_est":247300,"pop_year":-99,"lastcensus":2007,"gdp_year":-99,"economy":"5. Emerging region: G20","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"PE","iso_a3":"PER","iso_n3":"604","un_a3":"604","wb_a2":"PE","wb_a3":"PER","woe_id":-99,"adm0_a3_is":"PER","adm0_a3_us":"PER","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"South America","region_un":"Americas","subregion":"South America","region_wb":"Latin America & Caribbean","name_len":4,"long_len":4,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-318,-295,-519,1457,-674,-589]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Philippines","sov_a3":"PHL","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Philippines","adm0_a3":"PHL","geou_dif":0,"geounit":"Philippines","gu_a3":"PHL","su_dif":0,"subunit":"Philippines","su_a3":"PHL","brk_diff":0,"name":"Philippines","name_long":"Philippines","brk_a3":"PHL","brk_name":"Philippines","brk_group":null,"abbrev":"Phil.","postal":"PH","formal_en":"Republic of the Philippines","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Philippines","name_alt":null,"mapcolor7":3,"mapcolor8":2,"mapcolor9":2,"mapcolor13":8,"pop_est":97976603,"gdp_md_est":317500,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"5. Emerging region: G20","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"PH","iso_a3":"PHL","iso_n3":"608","un_a3":"608","wb_a2":"PH","wb_a3":"PHL","woe_id":-99,"adm0_a3_is":"PHL","adm0_a3_us":"PHL","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"South-Eastern Asia","region_wb":"East Asia & Pacific","name_len":11,"long_len":11,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[1458]],[[1459]],[[1460]],[[1461]],[[1462]],[[1463]],[[1464]],[[1465]],[[1466]],[[1467]],[[1468]],[[1469]],[[1470]],[[1471]],[[1472]],[[1473]],[[1474]],[[1475]],[[1476]],[[1477]],[[1478]],[[1479]],[[1480]],[[1481]],[[1482]],[[1483]],[[1484]],[[1485]],[[1486]],[[1487]],[[1488]],[[1489]],[[1490]],[[1491]],[[1492]],[[1493]],[[1494]],[[1495]],[[1496]],[[1497]],[[1498]],[[1499]],[[1500]],[[1501]],[[1502]],[[1503]],[[1504]],[[1505]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Palau","sov_a3":"PLW","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Palau","adm0_a3":"PLW","geou_dif":0,"geounit":"Palau","gu_a3":"PLW","su_dif":0,"subunit":"Palau","su_a3":"PLW","brk_diff":0,"name":"Palau","name_long":"Palau","brk_a3":"PLW","brk_name":"Palau","brk_group":null,"abbrev":"Palau","postal":"PW","formal_en":"Republic of Palau","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Palau","name_alt":null,"mapcolor7":2,"mapcolor8":5,"mapcolor9":1,"mapcolor13":12,"pop_est":20796,"gdp_md_est":164,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"PW","iso_a3":"PLW","iso_n3":"585","un_a3":"585","wb_a2":"PW","wb_a3":"PLW","woe_id":-99,"adm0_a3_is":"PLW","adm0_a3_us":"PLW","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Micronesia","region_wb":"East Asia & Pacific","name_len":5,"long_len":5,"abbrev_len":5,"tiny":2,"homepart":1},"arcs":[[[1506]],[[1507]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Papua New Guinea","sov_a3":"PNG","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Papua New Guinea","adm0_a3":"PNG","geou_dif":0,"geounit":"Papua New Guinea","gu_a3":"PNG","su_dif":1,"subunit":"Papua New Guinea","su_a3":"PN1","brk_diff":0,"name":"Papua New Guinea","name_long":"Papua New Guinea","brk_a3":"PN1","brk_name":"Papua New Guinea","brk_group":null,"abbrev":"P.N.G.","postal":"PG","formal_en":"Independent State of Papua New Guinea","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Papua New Guinea","name_alt":null,"mapcolor7":4,"mapcolor8":2,"mapcolor9":3,"mapcolor13":1,"pop_est":6057263,"gdp_md_est":13210,"pop_year":-99,"lastcensus":2000,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"PG","iso_a3":"PNG","iso_n3":"598","un_a3":"598","wb_a2":"PG","wb_a3":"PNG","woe_id":-99,"adm0_a3_is":"PNG","adm0_a3_us":"PNG","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Melanesia","region_wb":"East Asia & Pacific","name_len":16,"long_len":16,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[[1508]],[[1509]],[[1510]],[[1511]],[[1512]],[[1513]],[[1514]],[[1515]],[[1516]],[[1517]],[[1518]],[[1519]],[[1520]],[[1521]],[[1522]],[[1523]],[[1524]],[[1525]],[[1526]],[[1527]],[[-1023,1528,1529]],[[1530]],[[1531]],[[1532]],[[1533]],[[1534]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Poland","sov_a3":"POL","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Poland","adm0_a3":"POL","geou_dif":0,"geounit":"Poland","gu_a3":"POL","su_dif":0,"subunit":"Poland","su_a3":"POL","brk_diff":0,"name":"Poland","name_long":"Poland","brk_a3":"POL","brk_name":"Poland","brk_group":null,"abbrev":"Pol.","postal":"PL","formal_en":"Republic of Poland","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Poland","name_alt":null,"mapcolor7":3,"mapcolor8":7,"mapcolor9":1,"mapcolor13":2,"pop_est":38482919,"gdp_md_est":667900,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"PL","iso_a3":"POL","iso_n3":"616","un_a3":"616","wb_a2":"PL","wb_a3":"POL","woe_id":-99,"adm0_a3_is":"POL","adm0_a3_us":"POL","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Eastern Europe","region_wb":"Europe & Central Asia","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[1535,-1261,-284,1536,1537,-623,-632,1538,-627,1539]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"United States of America","sov_a3":"US1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Puerto Rico","adm0_a3":"PRI","geou_dif":0,"geounit":"Puerto Rico","gu_a3":"PRI","su_dif":0,"subunit":"Puerto Rico","su_a3":"PRI","brk_diff":0,"name":"Puerto Rico","name_long":"Puerto Rico","brk_a3":"PRI","brk_name":"Puerto Rico","brk_group":null,"abbrev":"P.R.","postal":"PR","formal_en":"Commonwealth of Puerto Rico","formal_fr":null,"note_adm0":"Commonwealth of U.S.A.","note_brk":null,"name_sort":"Puerto Rico","name_alt":null,"mapcolor7":4,"mapcolor8":5,"mapcolor9":1,"mapcolor13":1,"pop_est":3971020,"gdp_md_est":70230,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"PR","iso_a3":"PRI","iso_n3":"630","un_a3":"630","wb_a2":"PR","wb_a3":"PRI","woe_id":-99,"adm0_a3_is":"PRI","adm0_a3_us":"PRI","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":11,"long_len":11,"abbrev_len":4,"tiny":-99,"homepart":-99},"arcs":[[[1540]],[[1541]],[[1542]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"North Korea","sov_a3":"PRK","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"North Korea","adm0_a3":"PRK","geou_dif":0,"geounit":"North Korea","gu_a3":"PRK","su_dif":0,"subunit":"North Korea","su_a3":"PRK","brk_diff":0,"name":"Dem. Rep. Korea","name_long":"Dem. Rep. Korea","brk_a3":"PRK","brk_name":"Dem. Rep. Korea","brk_group":null,"abbrev":"N.K.","postal":"KP","formal_en":"Democratic People's Republic of Korea","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Korea, Dem. Rep.","name_alt":null,"mapcolor7":3,"mapcolor8":5,"mapcolor9":3,"mapcolor13":9,"pop_est":22665345,"gdp_md_est":40000,"pop_year":-99,"lastcensus":2009,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"KP","iso_a3":"PRK","iso_n3":"408","un_a3":"408","wb_a2":"KP","wb_a3":"PRK","woe_id":-99,"adm0_a3_is":"PRK","adm0_a3_us":"PRK","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Eastern Asia","region_wb":"East Asia & Pacific","name_len":15,"long_len":15,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1543]],[[1544,1545,-1233,1546,-532]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Portugal","sov_a3":"PRT","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Portugal","adm0_a3":"PRT","geou_dif":0,"geounit":"Portugal","gu_a3":"PRT","su_dif":1,"subunit":"Portugal","su_a3":"PR1","brk_diff":0,"name":"Portugal","name_long":"Portugal","brk_a3":"PR1","brk_name":"Portugal","brk_group":null,"abbrev":"Port.","postal":"P","formal_en":"Portuguese Republic","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Portugal","name_alt":null,"mapcolor7":1,"mapcolor8":7,"mapcolor9":1,"mapcolor13":4,"pop_est":10707924,"gdp_md_est":208627,"pop_year":-99,"lastcensus":2011,"gdp_year":0,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"PT","iso_a3":"PRT","iso_n3":"620","un_a3":"620","wb_a2":"PT","wb_a3":"PRT","woe_id":-99,"adm0_a3_is":"PRT","adm0_a3_us":"PRT","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":8,"long_len":8,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[1547]],[[1548]],[[1549]],[[1550]],[[1551]],[[1552]],[[1553]],[[1554]],[[1555,-701]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Paraguay","sov_a3":"PRY","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Paraguay","adm0_a3":"PRY","geou_dif":0,"geounit":"Paraguay","gu_a3":"PRY","su_dif":0,"subunit":"Paraguay","su_a3":"PRY","brk_diff":0,"name":"Paraguay","name_long":"Paraguay","brk_a3":"PRY","brk_name":"Paraguay","brk_group":null,"abbrev":"Para.","postal":"PY","formal_en":"Republic of Paraguay","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Paraguay","name_alt":null,"mapcolor7":6,"mapcolor8":3,"mapcolor9":6,"mapcolor13":2,"pop_est":6995655,"gdp_md_est":28890,"pop_year":-99,"lastcensus":2002,"gdp_year":-99,"economy":"5. Emerging region: G20","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"PY","iso_a3":"PRY","iso_n3":"600","un_a3":"600","wb_a2":"PY","wb_a3":"PRY","woe_id":-99,"adm0_a3_is":"PRY","adm0_a3_us":"PRY","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"South America","region_un":"Americas","subregion":"South America","region_wb":"Latin America & Caribbean","name_len":8,"long_len":8,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[-317,-41,-293]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Israel","sov_a3":"ISR","adm0_dif":1,"level":2,"type":"Disputed","admin":"Palestine","adm0_a3":"PSX","geou_dif":0,"geounit":"Palestine","gu_a3":"PSX","su_dif":0,"subunit":"Palestine","su_a3":"PSX","brk_diff":0,"name":"Palestine","name_long":"Palestine","brk_a3":"PSX","brk_name":"Palestine","brk_group":null,"abbrev":"Pal.","postal":"PAL","formal_en":"West Bank and Gaza","formal_fr":null,"note_adm0":"Partial self-admin.","note_brk":"Partial self-admin.","name_sort":"Palestine (West Bank and Gaza)","name_alt":null,"mapcolor7":3,"mapcolor8":2,"mapcolor9":5,"mapcolor13":8,"pop_est":4119083,"gdp_md_est":11950.77,"pop_year":-99,"lastcensus":2007,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"PS","iso_a3":"PSE","iso_n3":"275","un_a3":"275","wb_a2":"GZ","wb_a3":"WBG","woe_id":-99,"adm0_a3_is":"PSE","adm0_a3_us":"PSX","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Western Asia","region_wb":"Middle East & North Africa","name_len":9,"long_len":9,"abbrev_len":4,"tiny":-99,"homepart":-99},"arcs":[[[-676,1556,-1121]],[[-1118,-1139]]]},{"type":"MultiPolygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"France","sov_a3":"FR1","adm0_dif":1,"level":2,"type":"Dependency","admin":"French Polynesia","adm0_a3":"PYF","geou_dif":0,"geounit":"French Polynesia","gu_a3":"PYF","su_dif":0,"subunit":"French Polynesia","su_a3":"PYF","brk_diff":0,"name":"Fr. Polynesia","name_long":"French Polynesia","brk_a3":"PYF","brk_name":"Fr. Polynesia","brk_group":null,"abbrev":"Fr. Poly.","postal":"PF","formal_en":"French Polynesia","formal_fr":null,"note_adm0":"Fr.","note_brk":null,"name_sort":"French Polynesia","name_alt":null,"mapcolor7":7,"mapcolor8":5,"mapcolor9":9,"mapcolor13":11,"pop_est":287032,"gdp_md_est":4718,"pop_year":-99,"lastcensus":2007,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"PF","iso_a3":"PYF","iso_n3":"258","un_a3":"258","wb_a2":"PF","wb_a3":"PYF","woe_id":-99,"adm0_a3_is":"PYF","adm0_a3_us":"PYF","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Polynesia","region_wb":"East Asia & Pacific","name_len":13,"long_len":16,"abbrev_len":9,"tiny":2,"homepart":-99},"arcs":[[[1557]],[[1558]],[[1559]],[[1560]],[[1561]],[[1562]],[[1563]],[[1564]],[[1565]],[[1566]],[[1567]],[[1568]],[[1569]],[[1570]],[[1571]],[[1572]],[[1573]],[[1574]],[[1575]],[[1576]],[[1577]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Qatar","sov_a3":"QAT","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Qatar","adm0_a3":"QAT","geou_dif":0,"geounit":"Qatar","gu_a3":"QAT","su_dif":0,"subunit":"Qatar","su_a3":"QAT","brk_diff":0,"name":"Qatar","name_long":"Qatar","brk_a3":"QAT","brk_name":"Qatar","brk_group":null,"abbrev":"Qatar","postal":"QA","formal_en":"State of Qatar","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Qatar","name_alt":null,"mapcolor7":3,"mapcolor8":6,"mapcolor9":2,"mapcolor13":4,"pop_est":833285,"gdp_md_est":91330,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"QA","iso_a3":"QAT","iso_n3":"634","un_a3":"634","wb_a2":"QA","wb_a3":"QAT","woe_id":-99,"adm0_a3_is":"QAT","adm0_a3_us":"QAT","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Western Asia","region_wb":"Middle East & North Africa","name_len":5,"long_len":5,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[1578,1579]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Romania","sov_a3":"ROU","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Romania","adm0_a3":"ROU","geou_dif":0,"geounit":"Romania","gu_a3":"ROU","su_dif":0,"subunit":"Romania","su_a3":"ROU","brk_diff":0,"name":"Romania","name_long":"Romania","brk_a3":"ROU","brk_name":"Romania","brk_group":null,"abbrev":"Rom.","postal":"RO","formal_en":"Romania","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Romania","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":3,"mapcolor13":13,"pop_est":22215421,"gdp_md_est":271400,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"RO","iso_a3":"ROU","iso_n3":"642","un_a3":"642","wb_a2":"RO","wb_a3":"ROM","woe_id":-99,"adm0_a3_is":"ROU","adm0_a3_us":"ROU","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Eastern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[1580,1581,-259,1582,-927,1583,-1273]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Russia","sov_a3":"RUS","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Russia","adm0_a3":"RUS","geou_dif":0,"geounit":"Russia","gu_a3":"RUS","su_dif":0,"subunit":"Russia","su_a3":"RUS","brk_diff":0,"name":"Russia","name_long":"Russian Federation","brk_a3":"RUS","brk_name":"Russia","brk_group":null,"abbrev":"Rus.","postal":"RUS","formal_en":"Russian Federation","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Russian Federation","name_alt":null,"mapcolor7":2,"mapcolor8":5,"mapcolor9":7,"mapcolor13":7,"pop_est":140041247,"gdp_md_est":2266000,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"3. Emerging region: BRIC","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"RU","iso_a3":"RUS","iso_n3":"643","un_a3":"643","wb_a2":"RU","wb_a3":"RUS","woe_id":-99,"adm0_a3_is":"RUS","adm0_a3_us":"RUS","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Eastern Europe","region_wb":"Europe & Central Asia","name_len":6,"long_len":18,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1584]],[[1585]],[[1586]],[[1587]],[[1588]],[[1589]],[[1590]],[[1591]],[[1592]],[[1593]],[[1594]],[[1595]],[[1596]],[[1597]],[[1598]],[[1599]],[[1600]],[[1601]],[[1602]],[[-1262,-1536,1603,-1259,1604]],[[1605]],[[1606]],[[1607]],[[1608]],[[1609]],[[1610]],[[1611]],[[1612]],[[1613]],[[1614]],[[1615]],[[1616]],[[1617]],[[1618]],[[1619]],[[1620]],[[1621]],[[1622]],[[1623]],[[1624]],[[1625]],[[1626]],[[1627]],[[1628]],[[1629]],[[1630]],[[1631]],[[1632]],[[1633]],[[1634]],[[1635]],[[1636]],[[1637]],[[1638]],[[1639]],[[1640]],[[1641]],[[1642]],[[1643]],[[1644]],[[1645]],[[1646]],[[1647]],[[1648]],[[1649]],[[1650]],[[1651]],[[-1545,-563,-1331,-561,-1183,1652,-224,-804,1653,1654,-282,-1265,-706,1655,-721,-1417,1656]],[[1657]],[[1658]],[[1659]],[[1660]],[[1661]],[[1662]],[[1663]],[[1664]],[[1665]],[[1666]],[[1667]],[[1668]],[[1669]],[[1670]],[[1671]],[[1672]],[[1673]],[[1674]],[[1675]],[[1676]],[[1677]],[[1678]],[[1679]],[[1680]],[[1681]],[[1682]],[[1683]],[[1684]],[[1685]],[[1686]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Rwanda","sov_a3":"RWA","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Rwanda","adm0_a3":"RWA","geou_dif":0,"geounit":"Rwanda","gu_a3":"RWA","su_dif":0,"subunit":"Rwanda","su_a3":"RWA","brk_diff":0,"name":"Rwanda","name_long":"Rwanda","brk_a3":"RWA","brk_name":"Rwanda","brk_group":null,"abbrev":"Rwa.","postal":"RW","formal_en":"Republic of Rwanda","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Rwanda","name_alt":null,"mapcolor7":5,"mapcolor8":2,"mapcolor9":3,"mapcolor13":10,"pop_est":10473282,"gdp_md_est":9706,"pop_year":-99,"lastcensus":2002,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"RW","iso_a3":"RWA","iso_n3":"646","un_a3":"646","wb_a2":"RW","wb_a3":"RWA","woe_id":-99,"adm0_a3_is":"RWA","adm0_a3_us":"RWA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Eastern Africa","region_wb":"Sub-Saharan Africa","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[1687,-227,-579,1688]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":7,"sovereignt":"Western Sahara","sov_a3":"SAH","adm0_dif":0,"level":2,"type":"Indeterminate","admin":"Western Sahara","adm0_a3":"SAH","geou_dif":0,"geounit":"Western Sahara","gu_a3":"SAH","su_dif":0,"subunit":"Western Sahara","su_a3":"SAH","brk_diff":1,"name":"W. Sahara","name_long":"Western Sahara","brk_a3":"B28","brk_name":"W. Sahara","brk_group":null,"abbrev":"W. Sah.","postal":"WS","formal_en":"Sahrawi Arab Democratic Republic","formal_fr":null,"note_adm0":"Self admin.","note_brk":"Self admin.; Claimed by Morocco","name_sort":"Western Sahara","name_alt":null,"mapcolor7":4,"mapcolor8":7,"mapcolor9":4,"mapcolor13":4,"pop_est":-99,"gdp_md_est":-99,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"EH","iso_a3":"ESH","iso_n3":"732","un_a3":"732","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"MAR","adm0_a3_us":"SAH","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Northern Africa","region_wb":"Middle East & North Africa","name_len":9,"long_len":14,"abbrev_len":7,"tiny":-99,"homepart":1},"arcs":[[-1351,1689,-1270,-663]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Saudi Arabia","sov_a3":"SAU","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Saudi Arabia","adm0_a3":"SAU","geou_dif":0,"geounit":"Saudi Arabia","gu_a3":"SAU","su_dif":0,"subunit":"Saudi Arabia","su_a3":"SAU","brk_diff":0,"name":"Saudi Arabia","name_long":"Saudi Arabia","brk_a3":"SAU","brk_name":"Saudi Arabia","brk_group":null,"abbrev":"Saud.","postal":"SA","formal_en":"Kingdom of Saudi Arabia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Saudi Arabia","name_alt":null,"mapcolor7":6,"mapcolor8":1,"mapcolor9":6,"mapcolor13":7,"pop_est":28686633,"gdp_md_est":576500,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"SA","iso_a3":"SAU","iso_n3":"682","un_a3":"682","wb_a2":"SA","wb_a3":"SAU","woe_id":-99,"adm0_a3_is":"SAU","adm0_a3_us":"SAU","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Western Asia","region_wb":"Middle East & North Africa","name_len":12,"long_len":12,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[1690]],[[1691]],[[1692]],[[-1238,1693,-1579,1694,-33,-1448,1695,1696,-1137,-1112]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Sudan","sov_a3":"SDN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Sudan","adm0_a3":"SDN","geou_dif":0,"geounit":"Sudan","gu_a3":"SDN","su_dif":0,"subunit":"Sudan","su_a3":"SDN","brk_diff":0,"name":"Sudan","name_long":"Sudan","brk_a3":"SDN","brk_name":"Sudan","brk_group":null,"abbrev":"Sudan","postal":"SD","formal_en":"Republic of the Sudan","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Sudan","name_alt":null,"mapcolor7":2,"mapcolor8":6,"mapcolor9":4,"mapcolor13":1,"pop_est":25946220,"gdp_md_est":88080,"pop_year":-99,"lastcensus":2008,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"SD","iso_a3":"SDN","iso_n3":"729","un_a3":"729","wb_a2":"SD","wb_a3":"SDN","woe_id":-99,"adm0_a3_is":"SDN","adm0_a3_us":"SDN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Northern Africa","region_wb":"Sub-Saharan Africa","name_len":5,"long_len":5,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[1697,-686,-713,1698,-332,1699,-1249,-679]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"South Sudan","sov_a3":"SDS","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"South Sudan","adm0_a3":"SDS","geou_dif":0,"geounit":"South Sudan","gu_a3":"SDS","su_dif":0,"subunit":"South Sudan","su_a3":"SDS","brk_diff":0,"name":"S. Sudan","name_long":"South Sudan","brk_a3":"SDS","brk_name":"S. Sudan","brk_group":null,"abbrev":"S. Sud.","postal":"SS","formal_en":"Republic of South Sudan","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"South Sudan","name_alt":null,"mapcolor7":1,"mapcolor8":3,"mapcolor9":3,"mapcolor13":5,"pop_est":10625176,"gdp_md_est":13227,"pop_year":-99,"lastcensus":2008,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"SS","iso_a3":"SSD","iso_n3":"728","un_a3":"728","wb_a2":"SS","wb_a3":"SSD","woe_id":-99,"adm0_a3_is":"SSD","adm0_a3_us":"SDS","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Eastern Africa","region_wb":"Sub-Saharan Africa","name_len":8,"long_len":11,"abbrev_len":7,"tiny":-99,"homepart":1},"arcs":[[-712,-1189,1700,-577,-333,-1699]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Senegal","sov_a3":"SEN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Senegal","adm0_a3":"SEN","geou_dif":0,"geounit":"Senegal","gu_a3":"SEN","su_dif":0,"subunit":"Senegal","su_a3":"SEN","brk_diff":0,"name":"Senegal","name_long":"Senegal","brk_a3":"SEN","brk_name":"Senegal","brk_group":null,"abbrev":"Sen.","postal":"SN","formal_en":"Republic of Senegal","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Senegal","name_alt":null,"mapcolor7":2,"mapcolor8":6,"mapcolor9":5,"mapcolor13":5,"pop_est":13711597,"gdp_md_est":21980,"pop_year":-99,"lastcensus":2002,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"SN","iso_a3":"SEN","iso_n3":"686","un_a3":"686","wb_a2":"SN","wb_a3":"SEN","woe_id":-99,"adm0_a3_is":"SEN","adm0_a3_us":"SEN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Western Africa","region_wb":"Sub-Saharan Africa","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-1305,-814,-824,1701,-816,1702,-1349]]},{"type":"Polygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Singapore","sov_a3":"SGP","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Singapore","adm0_a3":"SGP","geou_dif":0,"geounit":"Singapore","gu_a3":"SGP","su_dif":0,"subunit":"Singapore","su_a3":"SGP","brk_diff":0,"name":"Singapore","name_long":"Singapore","brk_a3":"SGP","brk_name":"Singapore","brk_group":null,"abbrev":"Sing.","postal":"SG","formal_en":"Republic of Singapore","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Singapore","name_alt":null,"mapcolor7":5,"mapcolor8":3,"mapcolor9":7,"mapcolor13":3,"pop_est":4657542,"gdp_md_est":237300,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"SG","iso_a3":"SGP","iso_n3":"702","un_a3":"702","wb_a2":"SG","wb_a3":"SGP","woe_id":-99,"adm0_a3_is":"SGP","adm0_a3_us":"SGP","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"South-Eastern Asia","region_wb":"East Asia & Pacific","name_len":9,"long_len":9,"abbrev_len":5,"tiny":3,"homepart":1},"arcs":[[1703]]},{"type":"MultiPolygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"United Kingdom","sov_a3":"GB1","adm0_dif":1,"level":2,"type":"Dependency","admin":"South Georgia and South Sandwich Islands","adm0_a3":"SGS","geou_dif":0,"geounit":"South Georgia and South Sandwich Islands","gu_a3":"SGS","su_dif":0,"subunit":"South Georgia and South Sandwich Islands","su_a3":"SGS","brk_diff":0,"name":"S. Geo. and S. Sandw. Is.","name_long":"South Georgia and South Sandwich Islands","brk_a3":"SGS","brk_name":"S. Geo. and S. Sandw. Is.","brk_group":null,"abbrev":"S.G. S.S. Is.","postal":"GS","formal_en":"South Georgia and South Sandwich Islands","formal_fr":null,"note_adm0":"U.K.","note_brk":null,"name_sort":"South Georgia and the Islands","name_alt":null,"mapcolor7":6,"mapcolor8":6,"mapcolor9":6,"mapcolor13":3,"pop_est":30,"gdp_md_est":0.3,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"GS","iso_a3":"SGS","iso_n3":"239","un_a3":"-099","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"SGS","adm0_a3_us":"SGS","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Seven seas (open ocean)","region_un":"Seven seas (open ocean)","subregion":"Seven seas (open ocean)","region_wb":"Antarctica","name_len":25,"long_len":40,"abbrev_len":13,"tiny":3,"homepart":-99},"arcs":[[[1704]],[[1705]]]},{"type":"MultiPolygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"United Kingdom","sov_a3":"GB1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Saint Helena","adm0_a3":"SHN","geou_dif":0,"geounit":"Saint Helena","gu_a3":"SHN","su_dif":0,"subunit":"Saint Helena","su_a3":"SHN","brk_diff":0,"name":"Saint Helena","name_long":"Saint Helena","brk_a3":"SHN","brk_name":"Saint Helena","brk_group":null,"abbrev":"St.H.","postal":"SH","formal_en":null,"formal_fr":null,"note_adm0":"U.K.","note_brk":null,"name_sort":"St. Helena","name_alt":null,"mapcolor7":6,"mapcolor8":6,"mapcolor9":6,"mapcolor13":3,"pop_est":7637,"gdp_md_est":18,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"SH","iso_a3":"SHN","iso_n3":"654","un_a3":"654","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"SHN","adm0_a3_us":"SHN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Seven seas (open ocean)","region_un":"Africa","subregion":"Western Africa","region_wb":"Sub-Saharan Africa","name_len":12,"long_len":12,"abbrev_len":5,"tiny":-99,"homepart":-99},"arcs":[[[1706]],[[1707]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Solomon Islands","sov_a3":"SLB","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Solomon Islands","adm0_a3":"SLB","geou_dif":0,"geounit":"Solomon Islands","gu_a3":"SLB","su_dif":0,"subunit":"Solomon Islands","su_a3":"SLB","brk_diff":0,"name":"Solomon Is.","name_long":"Solomon Islands","brk_a3":"SLB","brk_name":"Solomon Is.","brk_group":null,"abbrev":"S. Is.","postal":"SB","formal_en":null,"formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Solomon Islands","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":1,"mapcolor13":6,"pop_est":595613,"gdp_md_est":1078,"pop_year":-99,"lastcensus":2009,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"SB","iso_a3":"SLB","iso_n3":"090","un_a3":"090","wb_a2":"SB","wb_a3":"SLB","woe_id":-99,"adm0_a3_is":"SLB","adm0_a3_us":"SLB","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Melanesia","region_wb":"East Asia & Pacific","name_len":11,"long_len":15,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[[1708]],[[1709]],[[1710]],[[1711]],[[1712]],[[1713]],[[1714]],[[1715]],[[1716]],[[1717]],[[1718]],[[1719]],[[1720]],[[1721]],[[1722]],[[1723]],[[1724]],[[1725]],[[1726]],[[1727]],[[1728]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Sierra Leone","sov_a3":"SLE","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Sierra Leone","adm0_a3":"SLE","geou_dif":0,"geounit":"Sierra Leone","gu_a3":"SLE","su_dif":0,"subunit":"Sierra Leone","su_a3":"SLE","brk_diff":0,"name":"Sierra Leone","name_long":"Sierra Leone","brk_a3":"SLE","brk_name":"Sierra Leone","brk_group":null,"abbrev":"S.L.","postal":"SL","formal_en":"Republic of Sierra Leone","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Sierra Leone","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":1,"mapcolor13":7,"pop_est":6440053,"gdp_md_est":4285,"pop_year":-99,"lastcensus":2004,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"SL","iso_a3":"SLE","iso_n3":"694","un_a3":"694","wb_a2":"SL","wb_a3":"SLE","woe_id":-99,"adm0_a3_is":"SLE","adm0_a3_us":"SLE","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Western Africa","region_wb":"Sub-Saharan Africa","name_len":12,"long_len":12,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1729]],[[-1248,1730,-811]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"El Salvador","sov_a3":"SLV","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"El Salvador","adm0_a3":"SLV","geou_dif":0,"geounit":"El Salvador","gu_a3":"SLV","su_dif":0,"subunit":"El Salvador","su_a3":"SLV","brk_diff":0,"name":"El Salvador","name_long":"El Salvador","brk_a3":"SLV","brk_name":"El Salvador","brk_group":null,"abbrev":"El. S.","postal":"SV","formal_en":"Republic of El Salvador","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"El Salvador","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":6,"mapcolor13":8,"pop_est":7185218,"gdp_md_est":43630,"pop_year":-99,"lastcensus":2007,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"SV","iso_a3":"SLV","iso_n3":"222","un_a3":"222","wb_a2":"SV","wb_a3":"SLV","woe_id":-99,"adm0_a3_is":"SLV","adm0_a3_us":"SLV","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Central America","region_wb":"Latin America & Caribbean","name_len":11,"long_len":11,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[-902,1731,-889]]},{"type":"Polygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"San Marino","sov_a3":"SMR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"San Marino","adm0_a3":"SMR","geou_dif":0,"geounit":"San Marino","gu_a3":"SMR","su_dif":0,"subunit":"San Marino","su_a3":"SMR","brk_diff":0,"name":"San Marino","name_long":"San Marino","brk_a3":"SMR","brk_name":"San Marino","brk_group":null,"abbrev":"S.M.","postal":"RSM","formal_en":"Republic of San Marino","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"San Marino","name_alt":null,"mapcolor7":2,"mapcolor8":3,"mapcolor9":1,"mapcolor13":6,"pop_est":30324,"gdp_md_est":1662,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"SM","iso_a3":"SMR","iso_n3":"674","un_a3":"674","wb_a2":"SM","wb_a3":"SMR","woe_id":-99,"adm0_a3_is":"SMR","adm0_a3_us":"SMR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":10,"long_len":10,"abbrev_len":4,"tiny":5,"homepart":1},"arcs":[[-1134]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Somaliland","sov_a3":"SOL","adm0_dif":0,"level":2,"type":"Indeterminate","admin":"Somaliland","adm0_a3":"SOL","geou_dif":0,"geounit":"Somaliland","gu_a3":"SOL","su_dif":0,"subunit":"Somaliland","su_a3":"SOL","brk_diff":1,"name":"Somaliland","name_long":"Somaliland","brk_a3":"B30","brk_name":"Somaliland","brk_group":null,"abbrev":"Solnd.","postal":"SL","formal_en":"Republic of Somaliland","formal_fr":null,"note_adm0":"Self admin.","note_brk":"Self admin.; Claimed by Somalia","name_sort":"Somaliland","name_alt":null,"mapcolor7":3,"mapcolor8":6,"mapcolor9":5,"mapcolor13":2,"pop_est":3500000,"gdp_md_est":12250,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"-99","iso_a3":"-99","iso_n3":"-99","un_a3":"-099","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"SOM","adm0_a3_us":"SOM","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Eastern Africa","region_wb":"Sub-Saharan Africa","name_len":10,"long_len":10,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[1732,-709,-639,1733]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Somalia","sov_a3":"SOM","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Somalia","adm0_a3":"SOM","geou_dif":0,"geounit":"Somalia","gu_a3":"SOM","su_dif":0,"subunit":"Somalia","su_a3":"SOM","brk_diff":0,"name":"Somalia","name_long":"Somalia","brk_a3":"SOM","brk_name":"Somalia","brk_group":null,"abbrev":"Som.","postal":"SO","formal_en":"Federal Republic of Somalia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Somalia","name_alt":null,"mapcolor7":2,"mapcolor8":8,"mapcolor9":6,"mapcolor13":7,"pop_est":9832017,"gdp_md_est":5524,"pop_year":-99,"lastcensus":1987,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"SO","iso_a3":"SOM","iso_n3":"706","un_a3":"706","wb_a2":"SO","wb_a3":"SOM","woe_id":-99,"adm0_a3_is":"SOM","adm0_a3_us":"SOM","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Eastern Africa","region_wb":"Sub-Saharan Africa","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-1185,-710,-1733,1734]]},{"type":"MultiPolygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"France","sov_a3":"FR1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Saint Pierre and Miquelon","adm0_a3":"SPM","geou_dif":0,"geounit":"Saint Pierre and Miquelon","gu_a3":"SPM","su_dif":0,"subunit":"Saint Pierre and Miquelon","su_a3":"SPM","brk_diff":0,"name":"St. Pierre and Miquelon","name_long":"Saint Pierre and Miquelon","brk_a3":"SPM","brk_name":"St. Pierre and Miquelon","brk_group":null,"abbrev":"St. P.M.","postal":"PM","formal_en":"Saint Pierre and Miquelon","formal_fr":null,"note_adm0":"Fr.","note_brk":null,"name_sort":"St. Pierre and Miquelon","name_alt":null,"mapcolor7":7,"mapcolor8":5,"mapcolor9":9,"mapcolor13":11,"pop_est":7051,"gdp_md_est":48.3,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"PM","iso_a3":"SPM","iso_n3":"666","un_a3":"666","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"SPM","adm0_a3_us":"SPM","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Northern America","region_wb":"North America","name_len":23,"long_len":25,"abbrev_len":8,"tiny":3,"homepart":-99},"arcs":[[[1735]],[[1736]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Republic of Serbia","sov_a3":"SRB","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Republic of Serbia","adm0_a3":"SRB","geou_dif":0,"geounit":"Republic of Serbia","gu_a3":"SRB","su_dif":0,"subunit":"Republic of Serbia","su_a3":"SRB","brk_diff":0,"name":"Serbia","name_long":"Serbia","brk_a3":"SRB","brk_name":"Serbia","brk_group":null,"abbrev":"Serb.","postal":"RS","formal_en":"Republic of Serbia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Serbia","name_alt":null,"mapcolor7":3,"mapcolor8":3,"mapcolor9":2,"mapcolor13":10,"pop_est":7379339,"gdp_md_est":80340,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"RS","iso_a3":"SRB","iso_n3":"688","un_a3":"688","wb_a2":"YF","wb_a3":"SRB","woe_id":-99,"adm0_a3_is":"SRB","adm0_a3_us":"SRB","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":6,"long_len":6,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[-1583,-258,-1303,-1236,-1329,-276,-919,-928]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Sao Tome and Principe","sov_a3":"STP","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Sao Tome and Principe","adm0_a3":"STP","geou_dif":0,"geounit":"Sao Tome and Principe","gu_a3":"STP","su_dif":0,"subunit":"Sao Tome and Principe","su_a3":"STP","brk_diff":0,"name":"São Tomé and Principe","name_long":"São Tomé and Principe","brk_a3":"STP","brk_name":"Sao Tome and Principe","brk_group":null,"abbrev":"S.T.P.","postal":"ST","formal_en":"Democratic Republic of São Tomé and Principe","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"São Tomé and Principe","name_alt":null,"mapcolor7":1,"mapcolor8":6,"mapcolor9":1,"mapcolor13":7,"pop_est":212679,"gdp_md_est":276.5,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"ST","iso_a3":"STP","iso_n3":"678","un_a3":"678","wb_a2":"ST","wb_a3":"STP","woe_id":-99,"adm0_a3_is":"STP","adm0_a3_us":"STP","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Middle Africa","region_wb":"Sub-Saharan Africa","name_len":21,"long_len":21,"abbrev_len":6,"tiny":3,"homepart":1},"arcs":[[[1737]],[[1738]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Suriname","sov_a3":"SUR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Suriname","adm0_a3":"SUR","geou_dif":0,"geounit":"Suriname","gu_a3":"SUR","su_dif":0,"subunit":"Suriname","su_a3":"SUR","brk_diff":0,"name":"Suriname","name_long":"Suriname","brk_a3":"SUR","brk_name":"Suriname","brk_group":null,"abbrev":"Sur.","postal":"SR","formal_en":"Republic of Suriname","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Suriname","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":7,"mapcolor13":6,"pop_est":481267,"gdp_md_est":4254,"pop_year":-99,"lastcensus":2004,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"SR","iso_a3":"SUR","iso_n3":"740","un_a3":"740","wb_a2":"SR","wb_a3":"SUR","woe_id":-99,"adm0_a3_is":"SUR","adm0_a3_us":"SUR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"South America","region_un":"Americas","subregion":"South America","region_wb":"Latin America & Caribbean","name_len":8,"long_len":8,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-752,-313,-893,1739]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Slovakia","sov_a3":"SVK","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Slovakia","adm0_a3":"SVK","geou_dif":0,"geounit":"Slovakia","gu_a3":"SVK","su_dif":0,"subunit":"Slovakia","su_a3":"SVK","brk_diff":0,"name":"Slovakia","name_long":"Slovakia","brk_a3":"SVK","brk_name":"Slovakia","brk_group":null,"abbrev":"Svk.","postal":"SK","formal_en":"Slovak Republic","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Slovak Republic","name_alt":null,"mapcolor7":2,"mapcolor8":4,"mapcolor9":4,"mapcolor13":9,"pop_est":5463046,"gdp_md_est":119500,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"SK","iso_a3":"SVK","iso_n3":"703","un_a3":"703","wb_a2":"SK","wb_a3":"SVK","woe_id":-99,"adm0_a3_is":"SVK","adm0_a3_us":"SVK","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Eastern Europe","region_wb":"Europe & Central Asia","name_len":8,"long_len":8,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[1740,-930,-210,-624,-1538]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Slovenia","sov_a3":"SVN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Slovenia","adm0_a3":"SVN","geou_dif":0,"geounit":"Slovenia","gu_a3":"SVN","su_dif":0,"subunit":"Slovenia","su_a3":"SVN","brk_diff":0,"name":"Slovenia","name_long":"Slovenia","brk_a3":"SVN","brk_name":"Slovenia","brk_group":null,"abbrev":"Slo.","postal":"SLO","formal_en":"Republic of Slovenia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Slovenia","name_alt":null,"mapcolor7":2,"mapcolor8":3,"mapcolor9":2,"mapcolor13":12,"pop_est":2005692,"gdp_md_est":59340,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"SI","iso_a3":"SVN","iso_n3":"705","un_a3":"705","wb_a2":"SI","wb_a3":"SVN","woe_id":-99,"adm0_a3_is":"SVN","adm0_a3_us":"SVN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Southern Europe","region_wb":"Europe & Central Asia","name_len":8,"long_len":8,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-921,1741,-1132,-212,-929]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Sweden","sov_a3":"SWE","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Sweden","adm0_a3":"SWE","geou_dif":0,"geounit":"Sweden","gu_a3":"SWE","su_dif":0,"subunit":"Sweden","su_a3":"SWE","brk_diff":0,"name":"Sweden","name_long":"Sweden","brk_a3":"SWE","brk_name":"Sweden","brk_group":null,"abbrev":"Swe.","postal":"S","formal_en":"Kingdom of Sweden","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Sweden","name_alt":null,"mapcolor7":1,"mapcolor8":4,"mapcolor9":2,"mapcolor13":4,"pop_est":9059651,"gdp_md_est":344300,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"SE","iso_a3":"SWE","iso_n3":"752","un_a3":"752","wb_a2":"SE","wb_a3":"SWE","woe_id":-99,"adm0_a3_is":"SWE","adm0_a3_us":"SWE","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Northern Europe","region_wb":"Europe & Central Asia","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1742]],[[1743]],[[1744]],[[1745]],[[1746]],[[1747,-1418,-723]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Swaziland","sov_a3":"SWZ","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Swaziland","adm0_a3":"SWZ","geou_dif":0,"geounit":"Swaziland","gu_a3":"SWZ","su_dif":0,"subunit":"Swaziland","su_a3":"SWZ","brk_diff":0,"name":"Swaziland","name_long":"Swaziland","brk_a3":"SWZ","brk_name":"Swaziland","brk_group":null,"abbrev":"Swz.","postal":"SW","formal_en":"Kingdom of Swaziland","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Swaziland","name_alt":null,"mapcolor7":3,"mapcolor8":6,"mapcolor9":2,"mapcolor13":5,"pop_est":1123913,"gdp_md_est":5702,"pop_year":-99,"lastcensus":2007,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"SZ","iso_a3":"SWZ","iso_n3":"748","un_a3":"748","wb_a2":"SZ","wb_a3":"SWZ","woe_id":-99,"adm0_a3_is":"SWZ","adm0_a3_us":"SWZ","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Southern Africa","region_wb":"Sub-Saharan Africa","name_len":9,"long_len":9,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-1339,1748]]},{"type":"Polygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Netherlands","sov_a3":"NL1","adm0_dif":1,"level":2,"type":"Country","admin":"Sint Maarten","adm0_a3":"SXM","geou_dif":0,"geounit":"Sint Maarten","gu_a3":"SXM","su_dif":0,"subunit":"Sint Maarten","su_a3":"SXM","brk_diff":0,"name":"Sint Maarten","name_long":"Sint Maarten","brk_a3":"SXM","brk_name":"Sint Maarten","brk_group":null,"abbrev":"St. M.","postal":"SX","formal_en":"Sint Maarten (Dutch part)","formal_fr":null,"note_adm0":"Neth.","note_brk":null,"name_sort":"St. Maarten (Dutch part)","name_alt":null,"mapcolor7":4,"mapcolor8":2,"mapcolor9":2,"mapcolor13":9,"pop_est":37429,"gdp_md_est":400,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"SX","iso_a3":"SXM","iso_n3":"534","un_a3":"534","wb_a2":"SX","wb_a3":"SXM","woe_id":-99,"adm0_a3_is":"SXM","adm0_a3_us":"SXM","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":12,"long_len":12,"abbrev_len":6,"tiny":4,"homepart":-99},"arcs":[[-1268,1749]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Seychelles","sov_a3":"SYC","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Seychelles","adm0_a3":"SYC","geou_dif":0,"geounit":"Seychelles","gu_a3":"SYC","su_dif":0,"subunit":"Seychelles","su_a3":"SYC","brk_diff":0,"name":"Seychelles","name_long":"Seychelles","brk_a3":"SYC","brk_name":"Seychelles","brk_group":null,"abbrev":"Syc.","postal":"SC","formal_en":"Republic of Seychelles","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Seychelles","name_alt":null,"mapcolor7":5,"mapcolor8":8,"mapcolor9":3,"mapcolor13":1,"pop_est":87476,"gdp_md_est":1715,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"SC","iso_a3":"SYC","iso_n3":"690","un_a3":"690","wb_a2":"SC","wb_a3":"SYC","woe_id":-99,"adm0_a3_is":"SYC","adm0_a3_us":"SYC","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Seven seas (open ocean)","region_un":"Africa","subregion":"Eastern Africa","region_wb":"Sub-Saharan Africa","name_len":10,"long_len":10,"abbrev_len":4,"tiny":2,"homepart":1},"arcs":[[1750]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Syria","sov_a3":"SYR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Syria","adm0_a3":"SYR","geou_dif":0,"geounit":"Syria","gu_a3":"SYR","su_dif":0,"subunit":"Syria","su_a3":"SYR","brk_diff":0,"name":"Syria","name_long":"Syria","brk_a3":"SYR","brk_name":"Syria","brk_group":null,"abbrev":"Syria","postal":"SYR","formal_en":"Syrian Arab Republic","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Syrian Arab Republic","name_alt":null,"mapcolor7":2,"mapcolor8":6,"mapcolor9":2,"mapcolor13":6,"pop_est":20178485,"gdp_md_est":98830,"pop_year":-99,"lastcensus":2004,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"SY","iso_a3":"SYR","iso_n3":"760","un_a3":"760","wb_a2":"SY","wb_a3":"SYR","woe_id":-99,"adm0_a3_is":"SYR","adm0_a3_us":"SYR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Western Asia","region_wb":"Middle East & North Africa","name_len":5,"long_len":5,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[-1114,-1140,-1124,-1246,1751,1752]]},{"type":"MultiPolygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"United Kingdom","sov_a3":"GB1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Turks and Caicos Islands","adm0_a3":"TCA","geou_dif":0,"geounit":"Turks and Caicos Islands","gu_a3":"TCA","su_dif":0,"subunit":"Turks and Caicos Islands","su_a3":"TCA","brk_diff":0,"name":"Turks and Caicos Is.","name_long":"Turks and Caicos Islands","brk_a3":"TCA","brk_name":"Turks and Caicos Is.","brk_group":null,"abbrev":"T.C. Is.","postal":"TC","formal_en":"Turks and Caicos Islands","formal_fr":null,"note_adm0":"U.K.","note_brk":null,"name_sort":"Turks and Caicos Islands","name_alt":null,"mapcolor7":6,"mapcolor8":6,"mapcolor9":6,"mapcolor13":3,"pop_est":22942,"gdp_md_est":216,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"TC","iso_a3":"TCA","iso_n3":"796","un_a3":"796","wb_a2":"TC","wb_a3":"TCA","woe_id":-99,"adm0_a3_is":"TCA","adm0_a3_us":"TCA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":20,"long_len":24,"abbrev_len":8,"tiny":-99,"homepart":-99},"arcs":[[[1753]],[[1754]],[[1755]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Chad","sov_a3":"TCD","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Chad","adm0_a3":"TCD","geou_dif":0,"geounit":"Chad","gu_a3":"TCD","su_dif":0,"subunit":"Chad","su_a3":"TCD","brk_diff":0,"name":"Chad","name_long":"Chad","brk_a3":"TCD","brk_name":"Chad","brk_group":null,"abbrev":"Chad","postal":"TD","formal_en":"Republic of Chad","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Chad","name_alt":null,"mapcolor7":6,"mapcolor8":1,"mapcolor9":8,"mapcolor13":6,"pop_est":10329208,"gdp_md_est":15860,"pop_year":-99,"lastcensus":2009,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"TD","iso_a3":"TCD","iso_n3":"148","un_a3":"148","wb_a2":"TD","wb_a3":"TCD","woe_id":-99,"adm0_a3_is":"TCD","adm0_a3_us":"TCD","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Middle Africa","region_wb":"Sub-Saharan Africa","name_len":4,"long_len":4,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-1700,-337,-576,-1380,-1376,-1250]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Togo","sov_a3":"TGO","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Togo","adm0_a3":"TGO","geou_dif":0,"geounit":"Togo","gu_a3":"TGO","su_dif":0,"subunit":"Togo","su_a3":"TGO","brk_diff":0,"name":"Togo","name_long":"Togo","brk_a3":"TGO","brk_name":"Togo","brk_group":null,"abbrev":"Togo","postal":"TG","formal_en":"Togolese Republic","formal_fr":"République Togolaise","note_adm0":null,"note_brk":null,"name_sort":"Togo","name_alt":null,"mapcolor7":3,"mapcolor8":1,"mapcolor9":3,"mapcolor13":5,"pop_est":6019877,"gdp_md_est":5118,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"TG","iso_a3":"TGO","iso_n3":"768","un_a3":"768","wb_a2":"TG","wb_a3":"TGO","woe_id":-99,"adm0_a3_is":"TGO","adm0_a3_us":"TGO","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Western Africa","region_wb":"Sub-Saharan Africa","name_len":4,"long_len":4,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-237,1756,-806,-241]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Thailand","sov_a3":"THA","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Thailand","adm0_a3":"THA","geou_dif":0,"geounit":"Thailand","gu_a3":"THA","su_dif":0,"subunit":"Thailand","su_a3":"THA","brk_diff":0,"name":"Thailand","name_long":"Thailand","brk_a3":"THA","brk_name":"Thailand","brk_group":null,"abbrev":"Thai.","postal":"TH","formal_en":"Kingdom of Thailand","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Thailand","name_alt":null,"mapcolor7":3,"mapcolor8":6,"mapcolor9":8,"mapcolor13":1,"pop_est":65905410,"gdp_md_est":547400,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"5. Emerging region: G20","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"TH","iso_a3":"THA","iso_n3":"764","un_a3":"764","wb_a2":"TH","wb_a3":"THA","woe_id":-99,"adm0_a3_is":"THA","adm0_a3_us":"THA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"South-Eastern Asia","region_wb":"East Asia & Pacific","name_len":8,"long_len":8,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[1757]],[[1758]],[[1759]],[[1760]],[[1761]],[[1762]],[[1763]],[[1764]],[[1765]],[[-1243,-1198,1766,-1363,1767,-1327]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Tajikistan","sov_a3":"TJK","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Tajikistan","adm0_a3":"TJK","geou_dif":0,"geounit":"Tajikistan","gu_a3":"TJK","su_dif":0,"subunit":"Tajikistan","su_a3":"TJK","brk_diff":0,"name":"Tajikistan","name_long":"Tajikistan","brk_a3":"TJK","brk_name":"Tajikistan","brk_group":null,"abbrev":"Tjk.","postal":"TJ","formal_en":"Republic of Tajikistan","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Tajikistan","name_alt":null,"mapcolor7":3,"mapcolor8":6,"mapcolor9":2,"mapcolor13":5,"pop_est":7349145,"gdp_md_est":13160,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"TJ","iso_a3":"TJK","iso_n3":"762","un_a3":"762","wb_a2":"TJ","wb_a3":"TJK","woe_id":-99,"adm0_a3_is":"TJK","adm0_a3_us":"TJK","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Central Asia","region_wb":"Europe & Central Asia","name_len":10,"long_len":10,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[-1192]],[[1768]],[[-1190,-558,-8,1769]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Turkmenistan","sov_a3":"TKM","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Turkmenistan","adm0_a3":"TKM","geou_dif":0,"geounit":"Turkmenistan","gu_a3":"TKM","su_dif":0,"subunit":"Turkmenistan","su_a3":"TKM","brk_diff":0,"name":"Turkmenistan","name_long":"Turkmenistan","brk_a3":"TKM","brk_name":"Turkmenistan","brk_group":null,"abbrev":"Turkm.","postal":"TM","formal_en":"Turkmenistan","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Turkmenistan","name_alt":null,"mapcolor7":3,"mapcolor8":2,"mapcolor9":1,"mapcolor13":9,"pop_est":4884887,"gdp_md_est":29780,"pop_year":-99,"lastcensus":1995,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"TM","iso_a3":"TKM","iso_n3":"795","un_a3":"795","wb_a2":"TM","wb_a3":"TKM","woe_id":-99,"adm0_a3_is":"TKM","adm0_a3_us":"TKM","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Central Asia","region_wb":"Europe & Central Asia","name_len":12,"long_len":12,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[[1770]],[[-6,-1104,1771,-1181,1772]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"East Timor","sov_a3":"TLS","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"East Timor","adm0_a3":"TLS","geou_dif":0,"geounit":"East Timor","gu_a3":"TLS","su_dif":0,"subunit":"East Timor","su_a3":"TLS","brk_diff":0,"name":"Timor-Leste","name_long":"Timor-Leste","brk_a3":"TLS","brk_name":"Timor-Leste","brk_group":null,"abbrev":"T.L.","postal":"TL","formal_en":"Democratic Republic of Timor-Leste","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Timor-Leste","name_alt":"East Timor","mapcolor7":2,"mapcolor8":2,"mapcolor9":4,"mapcolor13":3,"pop_est":1131612,"gdp_md_est":2520,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"TL","iso_a3":"TLS","iso_n3":"626","un_a3":"626","wb_a2":"TP","wb_a3":"TMP","woe_id":-99,"adm0_a3_is":"TLS","adm0_a3_us":"TLS","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"South-Eastern Asia","region_wb":"East Asia & Pacific","name_len":11,"long_len":11,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1773,-936]],[[-938,1774]],[[1775]]]},{"type":"MultiPolygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Tonga","sov_a3":"TON","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Tonga","adm0_a3":"TON","geou_dif":0,"geounit":"Tonga","gu_a3":"TON","su_dif":0,"subunit":"Tonga","su_a3":"TON","brk_diff":0,"name":"Tonga","name_long":"Tonga","brk_a3":"TON","brk_name":"Tonga","brk_group":null,"abbrev":"Tongo","postal":"TO","formal_en":"Kingdom of Tonga","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Tonga","name_alt":null,"mapcolor7":2,"mapcolor8":1,"mapcolor9":1,"mapcolor13":8,"pop_est":120898,"gdp_md_est":549,"pop_year":-99,"lastcensus":2006,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"TO","iso_a3":"TON","iso_n3":"776","un_a3":"776","wb_a2":"TO","wb_a3":"TON","woe_id":-99,"adm0_a3_is":"TON","adm0_a3_us":"TON","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Polynesia","region_wb":"East Asia & Pacific","name_len":5,"long_len":5,"abbrev_len":5,"tiny":3,"homepart":1},"arcs":[[[1776]],[[1777]],[[1778]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":5,"sovereignt":"Trinidad and Tobago","sov_a3":"TTO","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Trinidad and Tobago","adm0_a3":"TTO","geou_dif":0,"geounit":"Trinidad and Tobago","gu_a3":"TTO","su_dif":0,"subunit":"Trinidad and Tobago","su_a3":"TTO","brk_diff":0,"name":"Trinidad and Tobago","name_long":"Trinidad and Tobago","brk_a3":"TTO","brk_name":"Trinidad and Tobago","brk_group":null,"abbrev":"Tr.T.","postal":"TT","formal_en":"Republic of Trinidad and Tobago","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Trinidad and Tobago","name_alt":null,"mapcolor7":5,"mapcolor8":6,"mapcolor9":2,"mapcolor13":5,"pop_est":1310000,"gdp_md_est":29010,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"TT","iso_a3":"TTO","iso_n3":"780","un_a3":"780","wb_a2":"TT","wb_a3":"TTO","woe_id":-99,"adm0_a3_is":"TTO","adm0_a3_us":"TTO","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":19,"long_len":19,"abbrev_len":5,"tiny":2,"homepart":1},"arcs":[[[1779]],[[1780]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Tunisia","sov_a3":"TUN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Tunisia","adm0_a3":"TUN","geou_dif":0,"geounit":"Tunisia","gu_a3":"TUN","su_dif":0,"subunit":"Tunisia","su_a3":"TUN","brk_diff":0,"name":"Tunisia","name_long":"Tunisia","brk_a3":"TUN","brk_name":"Tunisia","brk_group":null,"abbrev":"Tun.","postal":"TN","formal_en":"Republic of Tunisia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Tunisia","name_alt":null,"mapcolor7":4,"mapcolor8":3,"mapcolor9":3,"mapcolor13":2,"pop_est":10486339,"gdp_md_est":81710,"pop_year":-99,"lastcensus":2004,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"TN","iso_a3":"TUN","iso_n3":"788","un_a3":"788","wb_a2":"TN","wb_a3":"TUN","woe_id":-99,"adm0_a3_is":"TUN","adm0_a3_us":"TUN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Northern Africa","region_wb":"Middle East & North Africa","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1781]],[[1782]],[[-1252,-658,1783]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Turkey","sov_a3":"TUR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Turkey","adm0_a3":"TUR","geou_dif":0,"geounit":"Turkey","gu_a3":"TUR","su_dif":0,"subunit":"Turkey","su_a3":"TUR","brk_diff":0,"name":"Turkey","name_long":"Turkey","brk_a3":"TUR","brk_name":"Turkey","brk_group":null,"abbrev":"Tur.","postal":"TR","formal_en":"Republic of Turkey","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Turkey","name_alt":null,"mapcolor7":6,"mapcolor8":3,"mapcolor9":8,"mapcolor13":4,"pop_est":76805524,"gdp_md_est":902700,"pop_year":-99,"lastcensus":2000,"gdp_year":-99,"economy":"4. Emerging region: MIKT","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"TR","iso_a3":"TUR","iso_n3":"792","un_a3":"792","wb_a2":"TR","wb_a3":"TUR","woe_id":-99,"adm0_a3_is":"TUR","adm0_a3_us":"TUR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Western Asia","region_wb":"Europe & Central Asia","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1784]],[[-802,-50,-220,-1109,-1115,-1753,1785]],[[1786,-868,-255]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Taiwan","sov_a3":"TWN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Taiwan","adm0_a3":"TWN","geou_dif":0,"geounit":"Taiwan","gu_a3":"TWN","su_dif":0,"subunit":"Taiwan","su_a3":"TWN","brk_diff":1,"name":"Taiwan","name_long":"Taiwan","brk_a3":"B77","brk_name":"Taiwan","brk_group":null,"abbrev":"Taiwan","postal":"TW","formal_en":null,"formal_fr":null,"note_adm0":null,"note_brk":"Self admin.; Claimed by China","name_sort":"Taiwan","name_alt":null,"mapcolor7":1,"mapcolor8":5,"mapcolor9":7,"mapcolor13":2,"pop_est":22974347,"gdp_md_est":712000,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"TW","iso_a3":"TWN","iso_n3":"158","un_a3":"-099","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"TWN","adm0_a3_us":"TWN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Eastern Asia","region_wb":"East Asia & Pacific","name_len":6,"long_len":6,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[[1787]],[[1788]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"United Republic of Tanzania","sov_a3":"TZA","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"United Republic of Tanzania","adm0_a3":"TZA","geou_dif":0,"geounit":"Tanzania","gu_a3":"TZA","su_dif":0,"subunit":"Tanzania","su_a3":"TZA","brk_diff":0,"name":"Tanzania","name_long":"Tanzania","brk_a3":"TZA","brk_name":"Tanzania","brk_group":null,"abbrev":"Tanz.","postal":"TZ","formal_en":"United Republic of Tanzania","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Tanzania","name_alt":null,"mapcolor7":3,"mapcolor8":6,"mapcolor9":2,"mapcolor13":2,"pop_est":41048532,"gdp_md_est":54250,"pop_year":-99,"lastcensus":2002,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"TZ","iso_a3":"TZA","iso_n3":"834","un_a3":"834","wb_a2":"TZ","wb_a3":"TZA","woe_id":-99,"adm0_a3_is":"TZA","adm0_a3_us":"TZA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Eastern Africa","region_wb":"Sub-Saharan Africa","name_len":8,"long_len":8,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[1789]],[[1790]],[[1791]],[[-1187,1792,-1344,-1355,1793,-580,-225,-1688,1794]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Uganda","sov_a3":"UGA","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Uganda","adm0_a3":"UGA","geou_dif":0,"geounit":"Uganda","gu_a3":"UGA","su_dif":0,"subunit":"Uganda","su_a3":"UGA","brk_diff":0,"name":"Uganda","name_long":"Uganda","brk_a3":"UGA","brk_name":"Uganda","brk_group":null,"abbrev":"Uga.","postal":"UG","formal_en":"Republic of Uganda","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Uganda","name_alt":null,"mapcolor7":6,"mapcolor8":3,"mapcolor9":6,"mapcolor13":4,"pop_est":32369558,"gdp_md_est":39380,"pop_year":-99,"lastcensus":2002,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"UG","iso_a3":"UGA","iso_n3":"800","un_a3":"800","wb_a2":"UG","wb_a3":"UGA","woe_id":-99,"adm0_a3_is":"UGA","adm0_a3_us":"UGA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Eastern Africa","region_wb":"Sub-Saharan Africa","name_len":6,"long_len":6,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[-1795,-1689,-578,-1701,-1188]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Ukraine","sov_a3":"UKR","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Ukraine","adm0_a3":"UKR","geou_dif":0,"geounit":"Ukraine","gu_a3":"UKR","su_dif":0,"subunit":"Ukraine","su_a3":"UKR","brk_diff":0,"name":"Ukraine","name_long":"Ukraine","brk_a3":"UKR","brk_name":"Ukraine","brk_group":null,"abbrev":"Ukr.","postal":"UA","formal_en":"Ukraine","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Ukraine","name_alt":null,"mapcolor7":5,"mapcolor8":1,"mapcolor9":6,"mapcolor13":3,"pop_est":45700395,"gdp_md_est":339800,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"UA","iso_a3":"UKR","iso_n3":"804","un_a3":"804","wb_a2":"UA","wb_a3":"UKR","woe_id":-99,"adm0_a3_is":"UKR","adm0_a3_us":"UKR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Europe","region_un":"Europe","subregion":"Eastern Europe","region_wb":"Europe & Central Asia","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1795]],[[1796,-1581,-1274,-1584,-926,-1741,-1537,-283,-1655]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Uruguay","sov_a3":"URY","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Uruguay","adm0_a3":"URY","geou_dif":0,"geounit":"Uruguay","gu_a3":"URY","su_dif":0,"subunit":"Uruguay","su_a3":"URY","brk_diff":0,"name":"Uruguay","name_long":"Uruguay","brk_a3":"URY","brk_name":"Uruguay","brk_group":null,"abbrev":"Ury.","postal":"UY","formal_en":"Oriental Republic of Uruguay","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Uruguay","name_alt":null,"mapcolor7":1,"mapcolor8":2,"mapcolor9":2,"mapcolor13":10,"pop_est":3494382,"gdp_md_est":43160,"pop_year":-99,"lastcensus":2004,"gdp_year":-99,"economy":"5. Emerging region: G20","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"UY","iso_a3":"URY","iso_n3":"858","un_a3":"858","wb_a2":"UY","wb_a3":"URY","woe_id":-99,"adm0_a3_is":"URY","adm0_a3_us":"URY","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"South America","region_un":"Americas","subregion":"South America","region_wb":"Latin America & Caribbean","name_len":7,"long_len":7,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[1797,-43,-316]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"United States of America","sov_a3":"US1","adm0_dif":1,"level":2,"type":"Country","admin":"United States of America","adm0_a3":"USA","geou_dif":0,"geounit":"United States of America","gu_a3":"USA","su_dif":0,"subunit":"United States of America","su_a3":"USA","brk_diff":0,"name":"United States","name_long":"United States","brk_a3":"USA","brk_name":"United States","brk_group":null,"abbrev":"U.S.A.","postal":"US","formal_en":"United States of America","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"United States of America","name_alt":null,"mapcolor7":4,"mapcolor8":5,"mapcolor9":1,"mapcolor13":1,"pop_est":313973000,"gdp_md_est":15094000,"pop_year":0,"lastcensus":2010,"gdp_year":0,"economy":"1. Developed region: G7","income_grp":"1. High income: OECD","wikipedia":0,"fips_10":null,"iso_a2":"US","iso_a3":"USA","iso_n3":"840","un_a3":"840","wb_a2":"US","wb_a3":"USA","woe_id":-99,"adm0_a3_is":"USA","adm0_a3_us":"USA","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Northern America","region_wb":"North America","name_len":13,"long_len":13,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[[1798]],[[1799]],[[1800]],[[1801]],[[1802]],[[1803]],[[1804]],[[1805]],[[1806]],[[1807]],[[1808]],[[1809]],[[1810]],[[1811]],[[1812]],[[1813]],[[1814]],[[1815]],[[1816]],[[1817]],[[1818]],[[1819]],[[1820]],[[1821]],[[1822]],[[1823]],[[1824]],[[1825]],[[1826]],[[1827]],[[1828]],[[1829]],[[1830]],[[1831]],[[1832]],[[1833]],[[1834]],[[1835]],[[1836]],[[1837]],[[1838]],[[1839]],[[1840]],[[1841]],[[1842]],[[1843]],[[1844]],[[1845]],[[1846]],[[1847]],[[1848]],[[1849]],[[1850]],[[1851]],[[1852]],[[1853]],[[1854]],[[1855]],[[-354,1856,-1297,1857,-440]],[[1858]],[[1859]],[[1860]],[[1861]],[[1862]],[[1863]],[[1864]],[[1865]],[[1866]],[[1867]],[[1868]],[[1869]],[[1870]],[[1871]],[[1872]],[[1873]],[[1874]],[[1875]],[[1876]],[[1877]],[[1878]],[[1879]],[[1880]],[[1881]],[[1882]],[[1883]],[[1884]],[[1885]],[[1886]],[[1887]],[[1888]],[[1889]],[[1890]],[[1891]],[[1892]],[[1893]],[[1894]],[[1895]],[[1896]],[[1897]],[[1898]],[[1899]],[[1900]],[[1901]],[[1902]],[[1903]],[[1904]],[[1905]],[[1906]],[[1907]],[[1908]],[[1909]],[[1910]],[[1911]],[[1912]],[[1913]],[[1914]],[[1915]],[[1916]],[[1917]],[[1918]],[[1919]],[[1920]],[[1921]],[[1922]],[[1923]],[[1924]],[[-442,1925,-382,1926]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Uzbekistan","sov_a3":"UZB","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Uzbekistan","adm0_a3":"UZB","geou_dif":0,"geounit":"Uzbekistan","gu_a3":"UZB","su_dif":0,"subunit":"Uzbekistan","su_a3":"UZB","brk_diff":0,"name":"Uzbekistan","name_long":"Uzbekistan","brk_a3":"UZB","brk_name":"Uzbekistan","brk_group":null,"abbrev":"Uzb.","postal":"UZ","formal_en":"Republic of Uzbekistan","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Uzbekistan","name_alt":null,"mapcolor7":2,"mapcolor8":3,"mapcolor9":5,"mapcolor13":4,"pop_est":27606007,"gdp_md_est":71670,"pop_year":-99,"lastcensus":1989,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"UZ","iso_a3":"UZB","iso_n3":"860","un_a3":"860","wb_a2":"UZ","wb_a3":"UZB","woe_id":-99,"adm0_a3_is":"UZB","adm0_a3_us":"UZB","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Central Asia","region_wb":"Europe & Central Asia","name_len":10,"long_len":10,"abbrev_len":4,"tiny":5,"homepart":1},"arcs":[[[-1193]],[[-1194]],[[-1191,-1770,-7,-1773,-1180],[-1769]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"Saint Vincent and the Grenadines","sov_a3":"VCT","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Saint Vincent and the Grenadines","adm0_a3":"VCT","geou_dif":0,"geounit":"Saint Vincent and the Grenadines","gu_a3":"VCT","su_dif":0,"subunit":"Saint Vincent and the Grenadines","su_a3":"VCT","brk_diff":0,"name":"St. Vin. and Gren.","name_long":"Saint Vincent and the Grenadines","brk_a3":"VCT","brk_name":"St. Vin. and Gren.","brk_group":null,"abbrev":"St.V.G.","postal":"VC","formal_en":"Saint Vincent and the Grenadines","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"St. Vincent and the Grenadines","name_alt":null,"mapcolor7":1,"mapcolor8":1,"mapcolor9":5,"mapcolor13":7,"pop_est":104574,"gdp_md_est":1070,"pop_year":-99,"lastcensus":2011,"gdp_year":-99,"economy":"6. Developing region","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"VC","iso_a3":"VCT","iso_n3":"670","un_a3":"670","wb_a2":"VC","wb_a3":"VCT","woe_id":-99,"adm0_a3_is":"VCT","adm0_a3_us":"VCT","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":18,"long_len":32,"abbrev_len":7,"tiny":-99,"homepart":1},"arcs":[[[1927]],[[1928]],[[1929]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Venezuela","sov_a3":"VEN","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Venezuela","adm0_a3":"VEN","geou_dif":0,"geounit":"Venezuela","gu_a3":"VEN","su_dif":0,"subunit":"Venezuela","su_a3":"VEN","brk_diff":0,"name":"Venezuela","name_long":"Venezuela","brk_a3":"VEN","brk_name":"Venezuela","brk_group":null,"abbrev":"Ven.","postal":"VE","formal_en":"Bolivarian Republic of Venezuela","formal_fr":"República Bolivariana de Venezuela","note_adm0":null,"note_brk":null,"name_sort":"Venezuela, RB","name_alt":null,"mapcolor7":1,"mapcolor8":3,"mapcolor9":1,"mapcolor13":4,"pop_est":26814843,"gdp_md_est":357400,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"5. Emerging region: G20","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"VE","iso_a3":"VEN","iso_n3":"862","un_a3":"862","wb_a2":"VE","wb_a3":"VEN","woe_id":-99,"adm0_a3_is":"VEN","adm0_a3_us":"VEN","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"South America","region_un":"Americas","subregion":"South America","region_wb":"Latin America & Caribbean","name_len":9,"long_len":9,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1930]],[[1931]],[[1932]],[[1933]],[[-894,-320,-588,1934]]]},{"type":"MultiPolygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"United Kingdom","sov_a3":"GB1","adm0_dif":1,"level":2,"type":"Dependency","admin":"British Virgin Islands","adm0_a3":"VGB","geou_dif":0,"geounit":"British Virgin Islands","gu_a3":"VGB","su_dif":0,"subunit":"British Virgin Islands","su_a3":"VGB","brk_diff":0,"name":"British Virgin Is.","name_long":"British Virgin Islands","brk_a3":"VGB","brk_name":"British Virgin Is.","brk_group":null,"abbrev":"V.I. (Br.)","postal":"VG","formal_en":"British Virgin Islands","formal_fr":null,"note_adm0":"U.K.","note_brk":null,"name_sort":"British Virgin Islands","name_alt":null,"mapcolor7":6,"mapcolor8":6,"mapcolor9":6,"mapcolor13":3,"pop_est":24491,"gdp_md_est":853.4,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"2. Developed region: nonG7","income_grp":"1. High income: OECD","wikipedia":-99,"fips_10":null,"iso_a2":"VG","iso_a3":"VGB","iso_n3":"092","un_a3":"092","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"VGB","adm0_a3_us":"VGB","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":18,"long_len":22,"abbrev_len":10,"tiny":3,"homepart":-99},"arcs":[[[1935]],[[1936]],[[1937]]]},{"type":"MultiPolygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":6,"sovereignt":"United States of America","sov_a3":"US1","adm0_dif":1,"level":2,"type":"Dependency","admin":"United States Virgin Islands","adm0_a3":"VIR","geou_dif":0,"geounit":"United States Virgin Islands","gu_a3":"VIR","su_dif":0,"subunit":"United States Virgin Islands","su_a3":"VIR","brk_diff":0,"name":"U.S. Virgin Is.","name_long":"United States Virgin Islands","brk_a3":"VIR","brk_name":"U.S. Virgin Is.","brk_group":null,"abbrev":"V.I. (U.S.)","postal":"VI","formal_en":"Virgin Islands of the United States","formal_fr":null,"note_adm0":"U.S.A.","note_brk":null,"name_sort":"Virgin Islands (U.S.)","name_alt":null,"mapcolor7":4,"mapcolor8":5,"mapcolor9":1,"mapcolor13":1,"pop_est":109825,"gdp_md_est":1577,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"6. Developing region","income_grp":"2. High income: nonOECD","wikipedia":-99,"fips_10":null,"iso_a2":"VI","iso_a3":"VIR","iso_n3":"850","un_a3":"850","wb_a2":"VI","wb_a3":"VIR","woe_id":-99,"adm0_a3_is":"VIR","adm0_a3_us":"VIR","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"North America","region_un":"Americas","subregion":"Caribbean","region_wb":"Latin America & Caribbean","name_len":15,"long_len":28,"abbrev_len":11,"tiny":3,"homepart":-99},"arcs":[[[1938]],[[1939]],[[1940]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"Vietnam","sov_a3":"VNM","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Vietnam","adm0_a3":"VNM","geou_dif":0,"geounit":"Vietnam","gu_a3":"VNM","su_dif":0,"subunit":"Vietnam","su_a3":"VNM","brk_diff":0,"name":"Vietnam","name_long":"Vietnam","brk_a3":"VNM","brk_name":"Vietnam","brk_group":null,"abbrev":"Viet.","postal":"VN","formal_en":"Socialist Republic of Vietnam","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Vietnam","name_alt":null,"mapcolor7":5,"mapcolor8":6,"mapcolor9":5,"mapcolor13":4,"pop_est":86967524,"gdp_md_est":241700,"pop_year":-99,"lastcensus":2009,"gdp_year":-99,"economy":"5. Emerging region: G20","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"VN","iso_a3":"VNM","iso_n3":"704","un_a3":"704","wb_a2":"VN","wb_a3":"VNM","woe_id":-99,"adm0_a3_is":"VNM","adm0_a3_us":"VNM","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"South-Eastern Asia","region_wb":"East Asia & Pacific","name_len":7,"long_len":7,"abbrev_len":5,"tiny":2,"homepart":1},"arcs":[[[1941]],[[1942]],[[1943]],[[1944]],[[1945]],[[1946]],[[1947]],[[1948,-1200,-1242,1949,-1240,-538]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Vanuatu","sov_a3":"VUT","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Vanuatu","adm0_a3":"VUT","geou_dif":0,"geounit":"Vanuatu","gu_a3":"VUT","su_dif":0,"subunit":"Vanuatu","su_a3":"VUT","brk_diff":0,"name":"Vanuatu","name_long":"Vanuatu","brk_a3":"VUT","brk_name":"Vanuatu","brk_group":null,"abbrev":"Van.","postal":"VU","formal_en":"Republic of Vanuatu","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Vanuatu","name_alt":null,"mapcolor7":6,"mapcolor8":3,"mapcolor9":7,"mapcolor13":3,"pop_est":218519,"gdp_md_est":988.5,"pop_year":-99,"lastcensus":2009,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"VU","iso_a3":"VUT","iso_n3":"548","un_a3":"548","wb_a2":"VU","wb_a3":"VUT","woe_id":-99,"adm0_a3_is":"VUT","adm0_a3_us":"VUT","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Melanesia","region_wb":"East Asia & Pacific","name_len":7,"long_len":7,"abbrev_len":4,"tiny":2,"homepart":1},"arcs":[[[1950]],[[1951]],[[1952]],[[1953]],[[1954]],[[1955]],[[1956]],[[1957]],[[1958]],[[1959]],[[1960]],[[1961]],[[1962]],[[1963]]]},{"type":"MultiPolygon","properties":{"scalerank":3,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"France","sov_a3":"FR1","adm0_dif":1,"level":2,"type":"Dependency","admin":"Wallis and Futuna","adm0_a3":"WLF","geou_dif":0,"geounit":"Wallis and Futuna","gu_a3":"WLF","su_dif":0,"subunit":"Wallis and Futuna","su_a3":"WLF","brk_diff":0,"name":"Wallis and Futuna Is.","name_long":"Wallis and Futuna Islands","brk_a3":"WLF","brk_name":"Wallis and Futuna Islands","brk_group":null,"abbrev":"Wlf.","postal":"WF","formal_en":"Wallis and Futuna Islands","formal_fr":null,"note_adm0":"Fr.","note_brk":null,"name_sort":"Wallis and Futuna","name_alt":null,"mapcolor7":7,"mapcolor8":5,"mapcolor9":9,"mapcolor13":11,"pop_est":15289,"gdp_md_est":60,"pop_year":-99,"lastcensus":-99,"gdp_year":-99,"economy":"6. Developing region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"WF","iso_a3":"WLF","iso_n3":"876","un_a3":"876","wb_a2":"-99","wb_a3":"-99","woe_id":-99,"adm0_a3_is":"WLF","adm0_a3_us":"WLF","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Polynesia","region_wb":"East Asia & Pacific","name_len":21,"long_len":25,"abbrev_len":4,"tiny":3,"homepart":-99},"arcs":[[[1964]],[[1965]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":4,"sovereignt":"Samoa","sov_a3":"WSM","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Samoa","adm0_a3":"WSM","geou_dif":0,"geounit":"Samoa","gu_a3":"WSM","su_dif":0,"subunit":"Samoa","su_a3":"WSM","brk_diff":0,"name":"Samoa","name_long":"Samoa","brk_a3":"WSM","brk_name":"Samoa","brk_group":null,"abbrev":"Samoa","postal":"WS","formal_en":"Independent State of Samoa","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Samoa","name_alt":null,"mapcolor7":3,"mapcolor8":3,"mapcolor9":4,"mapcolor13":6,"pop_est":219998,"gdp_md_est":1049,"pop_year":-99,"lastcensus":2006,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"WS","iso_a3":"WSM","iso_n3":"882","un_a3":"882","wb_a2":"WS","wb_a3":"WSM","woe_id":-99,"adm0_a3_is":"WSM","adm0_a3_us":"WSM","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Oceania","region_un":"Oceania","subregion":"Polynesia","region_wb":"East Asia & Pacific","name_len":5,"long_len":5,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[1966]],[[1967]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Yemen","sov_a3":"YEM","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Yemen","adm0_a3":"YEM","geou_dif":0,"geounit":"Yemen","gu_a3":"YEM","su_dif":0,"subunit":"Yemen","su_a3":"YEM","brk_diff":0,"name":"Yemen","name_long":"Yemen","brk_a3":"YEM","brk_name":"Yemen","brk_group":null,"abbrev":"Yem.","postal":"YE","formal_en":"Republic of Yemen","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Yemen, Rep.","name_alt":null,"mapcolor7":5,"mapcolor8":3,"mapcolor9":3,"mapcolor13":11,"pop_est":23822783,"gdp_md_est":55280,"pop_year":-99,"lastcensus":2004,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"YE","iso_a3":"YEM","iso_n3":"887","un_a3":"887","wb_a2":"RY","wb_a3":"YEM","woe_id":-99,"adm0_a3_is":"YEM","adm0_a3_us":"YEM","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Asia","region_un":"Asia","subregion":"Western Asia","region_wb":"Middle East & North Africa","name_len":5,"long_len":5,"abbrev_len":4,"tiny":-99,"homepart":1},"arcs":[[[1968]],[[1969]],[[1970]],[[1971]],[[1972,-1696,-1447]]]},{"type":"MultiPolygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":2,"sovereignt":"South Africa","sov_a3":"ZAF","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"South Africa","adm0_a3":"ZAF","geou_dif":0,"geounit":"South Africa","gu_a3":"ZAF","su_dif":0,"subunit":"South Africa","su_a3":"ZAF","brk_diff":0,"name":"South Africa","name_long":"South Africa","brk_a3":"ZAF","brk_name":"South Africa","brk_group":null,"abbrev":"S.Af.","postal":"ZA","formal_en":"Republic of South Africa","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"South Africa","name_alt":null,"mapcolor7":2,"mapcolor8":3,"mapcolor9":4,"mapcolor13":2,"pop_est":49052489,"gdp_md_est":491000,"pop_year":-99,"lastcensus":2001,"gdp_year":-99,"economy":"5. Emerging region: G20","income_grp":"3. Upper middle income","wikipedia":-99,"fips_10":null,"iso_a2":"ZA","iso_a3":"ZAF","iso_n3":"710","un_a3":"710","wb_a2":"ZA","wb_a3":"ZAF","woe_id":-99,"adm0_a3_is":"ZAF","adm0_a3_us":"ZAF","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Southern Africa","region_wb":"Sub-Saharan Africa","name_len":12,"long_len":12,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[[1973]],[[-1340,-1749,-1338,1974,-1368,-330,1975],[-1258]]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Zambia","sov_a3":"ZMB","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Zambia","adm0_a3":"ZMB","geou_dif":0,"geounit":"Zambia","gu_a3":"ZMB","su_dif":0,"subunit":"Zambia","su_a3":"ZMB","brk_diff":0,"name":"Zambia","name_long":"Zambia","brk_a3":"ZMB","brk_name":"Zambia","brk_group":null,"abbrev":"Zambia","postal":"ZM","formal_en":"Republic of Zambia","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Zambia","name_alt":null,"mapcolor7":5,"mapcolor8":8,"mapcolor9":5,"mapcolor13":13,"pop_est":11862740,"gdp_md_est":17500,"pop_year":-99,"lastcensus":2010,"gdp_year":-99,"economy":"7. Least developed region","income_grp":"4. Lower middle income","wikipedia":-99,"fips_10":null,"iso_a2":"ZM","iso_a3":"ZMB","iso_n3":"894","un_a3":"894","wb_a2":"ZM","wb_a3":"ZMB","woe_id":-99,"adm0_a3_is":"ZMB","adm0_a3_us":"ZMB","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Eastern Africa","region_wb":"Sub-Saharan Africa","name_len":6,"long_len":6,"abbrev_len":6,"tiny":-99,"homepart":1},"arcs":[[-1354,-1342,1976,-1367,-9,-581,-1794]]},{"type":"Polygon","properties":{"scalerank":1,"featurecla":"Admin-0 country","labelrank":3,"sovereignt":"Zimbabwe","sov_a3":"ZWE","adm0_dif":0,"level":2,"type":"Sovereign country","admin":"Zimbabwe","adm0_a3":"ZWE","geou_dif":0,"geounit":"Zimbabwe","gu_a3":"ZWE","su_dif":0,"subunit":"Zimbabwe","su_a3":"ZWE","brk_diff":0,"name":"Zimbabwe","name_long":"Zimbabwe","brk_a3":"ZWE","brk_name":"Zimbabwe","brk_group":null,"abbrev":"Zimb.","postal":"ZW","formal_en":"Republic of Zimbabwe","formal_fr":null,"note_adm0":null,"note_brk":null,"name_sort":"Zimbabwe","name_alt":null,"mapcolor7":1,"mapcolor8":5,"mapcolor9":3,"mapcolor13":9,"pop_est":12619600,"gdp_md_est":9323,"pop_year":0,"lastcensus":2002,"gdp_year":0,"economy":"5. Emerging region: G20","income_grp":"5. Low income","wikipedia":-99,"fips_10":null,"iso_a2":"ZW","iso_a3":"ZWE","iso_n3":"716","un_a3":"716","wb_a2":"ZW","wb_a3":"ZWE","woe_id":-99,"adm0_a3_is":"ZWE","adm0_a3_us":"ZWE","adm0_a3_un":-99,"adm0_a3_wb":-99,"continent":"Africa","region_un":"Africa","subregion":"Eastern Africa","region_wb":"Sub-Saharan Africa","name_len":8,"long_len":8,"abbrev_len":5,"tiny":-99,"homepart":1},"arcs":[[-1976,-329,-1977,-1341]]}]}},"arcs":[[[3058,5901],[0,-2],[-1,1],[-2,4],[-2,2],[1,3],[0,1],[2,-2],[2,-5],[0,-2]],[[7080,7328],[-2,0],[-2,1],[-1,2],[0,1],[-2,-2],[-3,-1],[-5,-5],[0,-1],[4,-5],[0,-1],[1,-1]],[[7070,7316],[-3,-2],[-7,-5],[-4,-4],[-1,0],[-3,1],[-4,3],[-1,-1],[-9,0],[-8,-1],[-3,-1],[-6,-1],[-4,0],[-3,-1],[-3,-3],[-3,-1],[-2,0],[-2,-2],[-2,-4],[-5,-6],[-3,-3],[-1,-3],[-2,0],[-2,0],[-2,-3],[-3,-5],[-4,-7],[-2,-3],[-1,-4],[1,-3],[3,-3],[2,-4],[0,-2],[2,-7],[1,-7],[1,-3],[1,-5],[0,-3],[-1,-2],[0,-2],[0,-3],[1,-2],[0,-2],[1,-2],[-1,-2],[-1,-2],[-1,-3],[-2,-5],[-3,-3],[-1,-3],[-2,-5],[-3,-6],[-2,-4],[-1,-3],[-1,-1],[0,-3],[1,-3],[2,-4],[0,-5],[0,-4],[0,-5],[-1,-4],[-6,-4],[-5,-2],[-7,0],[-2,1],[-2,1],[-7,4],[-3,-2],[-1,-7],[5,-10],[2,-6],[3,-9],[2,-5],[-1,-5],[-5,-5],[-4,-5],[-6,-1],[-4,-2],[-2,-2],[-1,-11],[-2,-4],[0,-5],[-1,-5],[-2,-3],[-1,-6],[0,-11],[1,-18],[-3,-5],[-3,-6],[-3,-4],[-3,-2],[-2,1],[-2,3],[-1,3],[-2,3],[-2,-1],[-2,-2],[-4,1],[-3,2],[-1,0],[-1,-3],[-3,-5],[-8,-7],[-3,-1],[-2,-1],[1,-4],[1,-2],[3,-2],[0,-2],[-2,-2],[-2,-2],[-4,-2],[-5,-1],[-4,1],[-3,4],[-3,0],[-2,-2],[-3,-4],[-3,-9],[-1,-1],[-1,-2],[-2,-2],[-2,-3],[-2,-6],[-1,-11],[0,-6],[0,-11],[-1,-7],[-1,-5],[1,-4],[1,-4],[0,-3],[-2,-3],[-1,-2],[-6,-3],[-9,-4],[-5,-3],[-8,-5],[-2,-1],[-5,0],[-3,1],[-3,0],[-5,0],[-4,-1],[-4,-3],[-2,-2],[-2,-3],[0,-1],[-4,2],[-11,4],[-30,-5],[-3,1],[-10,6],[-14,7],[-8,5],[-11,7]],[[6689,6904],[8,15]],[[6697,6919],[6,14],[6,13],[7,14],[0,4],[0,10],[-1,12],[-3,5],[-9,3],[-6,1],[-7,2],[-1,1],[-1,9],[0,5],[0,8],[0,6],[1,11],[0,4],[-3,21],[-2,11],[-2,11],[0,4],[0,4],[4,11],[1,3],[3,5],[1,3],[0,2],[-3,1],[-4,0],[-2,1],[-2,3],[0,5],[1,7],[-2,15],[3,7],[2,5],[7,1],[-3,5],[-1,4],[-1,0],[0,2],[1,2],[1,0],[1,2],[2,3],[1,1],[1,3],[1,2],[1,3],[1,3],[0,4],[1,5],[0,3],[1,2],[-1,4],[0,3],[0,3],[1,1],[1,2],[0,3],[1,3],[1,3],[1,2],[0,3],[-1,3]],[[6701,7235],[2,1],[1,-2],[1,-3],[4,-5],[2,-1],[3,-1],[3,1],[3,1],[1,-1],[3,-3],[3,-6],[2,-2],[0,-3],[1,-1],[2,3],[2,1],[2,0],[3,-1],[2,1],[1,1],[3,5],[4,3],[2,2],[1,7],[1,4],[1,3],[0,3],[-1,2],[-1,3],[1,1],[1,1],[4,0],[6,3],[5,3],[4,3],[2,0],[2,0],[1,1],[1,2],[1,3],[2,2],[5,4],[4,7],[2,5],[1,7],[2,12],[2,12],[1,5],[1,5],[4,3],[3,3],[6,0],[7,0],[2,7],[1,6],[1,3],[2,2],[0,1],[4,-4],[6,-5],[6,-3],[4,-1],[1,0]],[[6847,7335],[9,1],[6,-2],[4,-6],[3,-1],[4,3],[2,0],[1,-1],[1,-1],[3,0],[1,-2],[1,-1]],[[6882,7325],[0,-2],[2,-4],[3,-6],[3,-1],[4,4],[1,0],[1,1],[1,3],[2,3],[4,3],[3,2],[1,2],[1,0],[2,0],[1,1],[0,1],[1,1],[1,1],[1,0],[1,0],[2,-4],[4,-6],[2,-3],[1,1],[2,2],[1,3],[1,5],[-1,6],[1,5],[2,4],[3,2],[6,1],[3,0],[1,-2],[2,-2],[2,0],[2,2],[2,5],[0,6],[-2,7],[1,2],[0,1],[2,3],[3,5],[3,7],[3,8],[3,5],[4,2],[5,-2],[6,-7],[2,-8],[-2,-9],[0,-5],[1,-1],[2,0],[3,2],[2,0],[1,-2],[0,-2],[-1,-4],[-1,-11],[-1,-10],[-1,-9],[0,-9],[1,-6],[1,-10],[2,-6],[2,-3],[2,0],[2,0],[4,4],[6,8],[5,5],[9,3],[2,8],[4,5],[9,8],[5,4],[2,0],[4,-1],[1,-1],[2,-1],[0,-2],[0,-3],[-2,-2],[0,-2],[0,-1],[3,-1],[5,3],[4,2],[2,1],[2,2],[1,3],[3,0],[2,-1],[2,-1],[4,1],[2,-2],[3,-5],[1,-2],[1,-1]],[[5665,4558],[1,-8],[0,-10],[1,-8],[0,-3],[0,-2],[0,-2],[0,-5],[-1,-4],[-1,-2],[1,-6],[-1,-7],[0,-8],[0,-7],[1,-14],[0,-4],[-1,-7],[-1,-5],[-1,-6],[0,-3],[2,-9],[0,-2],[-2,-1],[-1,0],[-6,0],[-8,0],[-9,0],[-8,0],[-7,0],[-8,0],[-6,0],[0,-9],[0,-18],[0,-19],[0,-18],[0,-19],[0,-18],[0,-19],[0,-18],[0,-19],[0,-13],[2,-18],[3,-19],[1,-2],[3,-3],[4,-8],[3,-5],[5,-10],[6,-12],[6,-11],[6,-9]],[[5649,4168],[-9,-4],[-12,-4],[-8,-4],[-11,-4],[-6,-2],[-9,-3],[-1,0],[-2,2],[-5,1],[-6,-3],[-4,-1],[-4,1],[-3,3],[-3,4],[-6,1],[-7,-1],[-8,1],[-7,2],[-6,1],[-3,0],[-3,0],[-4,2],[-3,4],[-3,8],[-3,7],[-1,1],[-1,1],[-1,1],[-8,0],[-7,0],[-4,0],[-11,0],[-11,0],[-10,0],[-11,0],[-11,0],[-10,0],[-11,0],[-10,0],[-6,0],[-5,0],[-6,-1],[-1,0],[-1,1],[-1,2],[-3,4],[-3,3],[-4,5],[-2,6],[-2,2],[-4,1],[-2,1],[-3,0],[-3,-2],[-3,-3],[-2,-3],[-4,-3],[-3,-3],[-5,1],[-1,-1],[-3,1],[-3,2],[-3,0],[-3,-3],[-4,-2]],[[5326,4190],[1,22],[1,10],[0,11],[-1,30],[-1,4],[0,5],[3,4],[1,2],[2,5],[1,7],[2,16],[6,35],[2,34],[4,17],[1,18],[10,23],[2,15],[5,7],[7,8],[5,13],[3,9],[2,18],[0,19],[2,25],[0,7],[-3,10],[0,7],[-3,7],[-2,6],[-2,9],[-4,15],[-1,10],[-3,7],[0,9],[-1,9],[-2,9],[-2,11],[0,3],[1,4],[1,1],[0,-2],[-1,-2],[0,-2],[9,18],[0,4],[0,4],[0,5],[0,6],[-8,34],[-6,31],[-1,16],[-9,21],[-3,14],[-2,9],[-1,4],[0,2],[2,0],[5,3],[7,2],[6,6],[1,2]],[[5362,4846],[4,0],[3,-1],[1,1],[1,0],[8,0],[3,1],[6,-1],[4,0],[2,-1],[5,-1],[8,1],[2,0],[10,0],[9,1],[8,0],[10,0],[7,0],[3,-2],[3,-4],[1,-3],[1,-2],[1,-3],[1,-3],[1,-5],[-1,-6],[1,-7],[1,-8],[1,-9],[3,-10],[2,-7],[-1,-5],[1,-6],[2,-6],[2,-4],[1,-2],[2,-9],[5,-15],[4,-11],[1,-2],[2,1],[3,1],[4,0],[3,-2],[1,0],[4,5],[4,1],[4,2],[2,2],[3,0],[6,-4],[2,0],[5,0],[6,2],[1,15],[0,3],[1,6],[2,4],[0,5],[0,7],[1,7],[4,6],[6,3],[3,1],[5,2],[8,1],[3,0],[1,-1],[-2,-10],[0,-4],[1,-3],[1,-2],[8,-1],[8,0],[9,0],[7,-1],[0,-1],[1,0],[1,-6],[0,-10],[-2,-15],[1,-14],[3,-14],[0,-20],[-1,-12],[-1,-15],[-1,-18],[2,-7],[2,-7],[4,-8],[3,-11],[2,-12],[1,-8],[-1,-3],[0,-6],[1,-8],[-1,-5],[-2,-3],[-1,-4],[2,-7],[0,-6],[1,-2],[0,-2],[1,0],[2,2],[3,4],[2,2],[3,0],[4,-1],[7,-1],[3,1],[6,6],[2,0],[3,-1],[4,-1],[3,-1],[2,2],[1,2],[0,3],[1,2]],[[5339,4852],[-1,2],[-1,5],[1,6],[1,4],[-1,8],[-2,7],[-2,10],[-1,2]],[[5333,4896],[2,3],[2,6],[1,4],[3,0],[1,3],[1,4],[0,2],[4,2],[4,3],[2,3],[2,3],[1,0],[1,-1],[3,-6],[2,-4],[1,-1]],[[5363,4917],[-1,-1],[-3,-3],[-3,-2],[-4,-10],[-3,-4],[0,-1],[-2,-2],[-2,-2],[0,-1],[1,-2],[1,-2],[0,-16],[0,-15],[-1,-2],[-2,0],[-4,-1],[-1,-1]],[[3250,6233],[-5,-3],[0,2],[4,4],[1,0],[0,-3]],[[5557,7634],[1,-1],[2,-6],[2,-5],[3,-1],[1,-2],[2,-3],[2,-3],[1,-9],[0,-6],[0,-2]],[[5571,7596],[-1,-1],[-1,-9],[0,-5],[0,-3],[-1,-1],[-1,-2],[2,-7],[0,-3],[0,-4],[2,-8],[1,-3],[1,-1],[2,-8],[1,-1],[3,1],[2,-1],[1,-2],[0,-1]],[[5582,7537],[0,-5],[0,-3],[2,-3],[0,-2],[-1,-4],[-2,-4],[-2,-1],[-2,-2],[-1,-3],[0,-3],[-1,-2],[-1,-3],[-1,-6],[0,-2],[-1,-2],[-2,0],[-2,0],[-2,-1],[0,-2],[-2,-2],[0,-2],[1,-4],[1,-2],[0,-3],[-1,0],[-1,0],[-1,-1],[0,-2],[0,-2],[-1,-2],[-1,-1],[-2,0],[-2,2],[-1,1],[-1,0]],[[5555,7471],[0,5],[-1,4],[-3,10],[-10,10],[-3,4],[-1,4],[-1,3],[1,0],[1,-1],[1,-1],[1,2],[-1,4],[-2,9],[0,2],[1,7],[2,8],[0,10],[1,8],[-1,5],[-1,6],[2,8],[1,2],[1,2],[0,9],[-3,4],[-3,0]],[[5537,7595],[0,3],[0,5],[0,1],[0,3],[-1,3],[-1,3],[1,4],[2,6],[2,4],[2,4],[2,5],[1,3],[2,1],[0,-1],[1,-1],[0,-5],[0,-1],[1,-2],[2,1],[2,1],[3,3],[1,-1]],[[5572,8642],[0,-1],[-3,-1],[0,2],[-3,-1],[0,1],[1,1],[2,1],[2,0],[1,-2]],[[5546,8650],[0,-1],[-1,1],[-1,-1],[-1,-2],[-1,1],[0,2],[1,4],[2,0],[1,-4]],[[5555,8660],[1,0],[1,0],[3,-2],[0,-1],[2,-1],[0,-1],[-2,-4],[-1,0],[-1,0],[-1,0],[-1,-1],[0,-2],[0,-3],[-7,-1],[-1,1],[-2,8],[0,2],[2,1],[1,0],[0,-4],[2,0],[0,3],[0,2],[0,1],[-1,1],[-1,1],[1,2],[2,1],[1,-3],[2,0]],[[5047,7632],[-1,0],[-2,-3],[-2,-1],[-1,0],[-1,0],[-1,2],[0,2],[0,2],[0,1],[0,2]],[[5039,7637],[1,2],[1,1],[2,0],[4,-2],[1,-2],[0,-1],[-1,-2],[0,-1]],[[6497,6576],[0,-2],[-2,1],[-1,-1],[-3,1],[-2,1],[2,2],[4,3],[1,-2],[1,-3]],[[6461,6583],[-1,-1],[0,3],[0,1],[1,2],[1,-3],[-1,-2]],[[6481,6581],[-2,0],[-2,2],[4,3],[1,1],[1,3],[1,-2],[-1,-4],[-1,-2],[-1,-1]],[[6512,6592],[0,-1],[-1,0],[-2,1],[0,1],[1,2],[1,-2],[1,-1]],[[6563,6661],[2,-4],[0,-32],[1,-2]],[[6566,6623],[-1,-1],[-1,-2],[-2,-4],[-1,-2],[-2,-2],[-1,-3],[-1,0],[-2,3],[-1,4],[1,1],[0,1],[0,3],[-1,1],[-1,0],[-2,-1],[-1,-2],[-1,-3],[0,-5],[0,-5],[0,-3],[0,-4],[-1,-5],[1,-3],[0,-3],[1,-2],[-2,-6],[1,-1],[4,0],[1,-5],[1,-2],[-1,-2],[-2,-1],[-3,-2],[-3,1],[-4,-2],[-2,-3],[1,-2],[1,-1],[0,-4],[-1,-6],[-1,-5],[-1,-7],[-2,-7],[-2,-11],[-2,-9],[-1,-7],[1,-4],[-1,-8]],[[6532,6492],[-2,-5],[-2,0],[-1,1],[-2,0],[-3,1],[-5,1],[-5,1],[-5,2],[-6,1],[-6,2],[-6,1],[-6,2],[-6,1],[-5,1],[-4,2],[-4,0],[-2,1],[-3,1],[-1,3],[-2,4],[-1,3],[-2,4],[-1,4],[-2,4],[-1,3],[-2,4],[-1,4],[-2,4],[-1,4],[-2,3],[-1,4],[-2,4],[-1,4],[-2,3],[-1,4],[-2,3],[0,3],[0,7],[0,2]],[[6432,6583],[1,3],[0,-2],[1,-3],[2,0],[1,0],[1,-11],[1,-3],[2,-2],[6,-1],[4,2],[7,7],[4,2],[10,0],[9,-3],[13,-2],[2,1],[7,5],[5,5],[2,1],[2,5],[1,6],[1,4],[1,2],[2,3],[1,5],[2,6],[10,13],[6,11],[0,4],[3,5],[3,6],[11,17],[3,8],[1,7],[0,1]],[[6557,6685],[1,0],[2,-1],[0,-6],[-1,-5],[0,-6],[0,-3],[1,-3],[2,-1],[1,0],[0,1]],[[6561,6636],[1,0],[1,1],[0,3],[0,1],[-2,0],[0,-2],[0,-3]],[[3207,2032],[3,-1],[6,1],[3,0],[1,-1],[1,0],[4,1],[2,0],[0,-3],[-4,-2],[-2,1],[-8,0],[-4,-3],[-1,0],[-4,-3],[-2,2],[-1,2],[2,3],[2,0],[1,1],[1,2]],[[3093,2024],[0,13],[0,18],[0,15],[0,16],[0,15],[0,16],[0,17],[0,17]],[[3093,2151],[2,-2],[6,-12],[2,-5],[1,-6],[-2,4],[-3,-2],[-2,-3],[-1,-4],[0,-3],[1,-2],[3,-2],[6,-1],[1,0],[4,-14],[1,-4],[3,-2],[5,-7],[5,-8],[5,-7],[7,-6],[5,-4],[6,-6],[6,-7],[6,-5],[7,-4],[6,-3],[11,1],[3,0],[2,-3],[-2,-6],[-2,-5],[-4,-2],[-4,-1],[-3,0],[-3,1],[-3,0],[-3,-3],[-3,-1],[-4,0],[-3,-2],[-3,-1],[-3,1],[-8,5],[-6,1],[-18,2],[-6,2],[-6,1],[-3,0],[-5,-1],[-3,0],[-1,-1]],[[3281,2928],[0,-4],[-1,0],[-4,4],[-1,3],[0,1],[3,-1],[2,-1],[1,-2]],[[3259,3903],[1,-1],[0,-2],[2,-4],[5,-5],[5,-10],[4,-14],[3,-11],[4,-7],[3,-5],[3,-3],[2,-3],[0,-2],[3,-3],[5,-6],[4,-6],[1,-5],[6,-6],[9,-6],[7,-3],[4,0],[6,-5],[8,-10],[5,-7],[1,-4],[6,-6],[12,-13],[6,-3],[3,-3],[1,-4],[2,-1],[2,2],[3,-2],[5,-4],[4,-5],[4,-11],[2,-4],[1,-4],[-1,-4],[-1,-4],[-3,-4],[-1,-1],[0,-2],[0,-3],[-3,-7],[0,-4],[0,-2],[-2,-3],[-4,-5],[-1,-2],[0,-3],[0,-1],[-1,-1],[0,-2],[-1,-5],[0,-5],[0,-7],[0,-2],[-1,-1],[0,-2],[0,-3],[-1,-2],[-1,-2],[-1,-1],[1,-2],[-1,-2],[-3,-2],[-1,-3],[0,-3],[-2,-3],[-2,-3],[0,-4],[1,-6],[12,2],[10,-3],[11,-6],[8,-2],[4,2],[3,-1],[2,-2],[2,-1],[3,2],[3,-1],[2,-4],[2,1],[1,5],[2,5],[3,2],[2,1],[3,-1],[3,-2],[2,-3],[2,0],[2,3],[1,4],[0,5],[1,3],[2,2],[1,3],[1,3],[2,2],[4,1],[2,2],[0,2],[1,3],[3,2],[1,3],[1,3],[1,2],[2,1],[2,7],[2,12],[1,18],[1,25]],[[3483,3711],[2,0],[1,-2],[1,-1],[2,2],[1,1],[3,0],[1,2],[1,1],[1,-2],[1,-1],[2,0],[2,-4],[2,-2],[0,-4],[2,-12],[2,-8],[2,-8],[0,-3],[-1,-4],[-1,-5],[0,-13],[0,-5],[0,-3],[1,-5],[-2,-5],[-2,-8],[-2,-3],[-1,0],[-2,-4],[-3,-2],[-1,1],[-1,-2],[-2,-5],[-1,-3],[-4,-1],[-1,-1],[-2,0],[-1,-1],[-2,-3],[-1,-1],[-2,1],[-1,-1],[-2,-3],[0,-3],[-1,-3],[-1,-2],[-2,-2],[-1,-1],[0,-3],[-1,-1],[-4,-2],[-3,-3],[-2,-5],[-1,-3],[-3,-2],[-4,-5],[-1,-3],[2,-2],[0,-3],[0,-2],[-1,0],[-3,1],[-1,1],[-1,-1],[0,-2],[0,-2],[-1,-2],[-1,-1],[-1,-2],[-1,-3],[-2,-4],[-3,-5],[-3,-7],[-2,-8],[-2,-6],[-3,-3],[-2,-3],[-1,-5],[-2,-8],[-5,-10],[-4,-7],[-4,-4],[-2,-4],[0,-5],[-3,-5],[-4,-6],[-2,-3]],[[3399,3445],[-1,-2],[0,-4],[-1,-5],[-4,-7],[-1,-5],[2,-7],[0,-9],[-1,-3],[-1,-1],[-1,-2],[1,-4],[0,-4],[0,-5],[-2,-6],[-2,-7],[-1,-4],[1,-3],[1,-2],[0,-2],[-1,-4],[-1,-5],[-1,-4],[-2,-2],[-1,-3],[1,-4],[0,-3],[0,-4],[0,-4],[1,-4],[0,-4],[-2,-9]],[[3383,3313],[-1,-5],[2,-23],[-1,-3],[-1,-3],[-2,-1],[-2,1],[-1,-2],[-1,-10],[-3,-22],[1,-5],[2,-9],[1,-5],[0,-4],[1,-8],[-2,-3],[-1,-1],[-1,-2],[2,-9],[1,-4],[4,-9],[14,-12],[6,-7],[7,-10],[4,-10],[0,-8],[-5,-13],[-1,-10],[1,-7],[2,-7],[5,-9],[4,-3],[5,0],[1,-2],[1,-2],[1,-18],[-1,-7],[-1,-6],[-10,-28],[-9,-17],[-3,-10],[-1,-10],[-3,-5],[-14,-15],[-23,-14],[-19,-7],[-4,-2],[-30,-8],[-6,-1],[-7,1],[-7,-1],[-6,2],[-6,2],[-4,6],[-4,1],[-1,-3],[2,-8],[-1,-9],[1,-6],[3,-1],[2,-2],[2,-4],[-4,0],[2,-3],[1,-2],[0,-6],[-1,-15],[-4,-3],[-1,-1],[-1,-3],[-2,-14],[0,-10],[1,-6],[4,-12],[-2,-8],[-3,-4],[-11,-9],[-4,-4],[-7,-3],[-12,0],[-4,1],[-10,8],[-7,5],[-6,4],[-7,2],[1,1],[1,2],[-2,1],[-2,1],[-4,-5],[-2,-4],[0,-4],[0,-9],[1,-7],[3,-19],[0,-11],[-2,-13],[3,-7],[2,-4],[5,-3],[3,-2],[2,0],[1,-1],[-1,-2],[-1,-3],[0,-3],[4,-1],[5,0],[4,2],[1,2],[0,5],[-5,1],[1,2],[4,2],[5,3],[3,1],[1,-2],[2,-2],[1,-6],[1,-7],[0,-8],[0,-8],[-1,-3],[-2,-4],[-9,-4],[-3,1],[-2,6],[-1,6],[-2,5],[-5,3],[-4,-1],[-5,-6],[-4,-2],[-2,-5],[11,-9],[6,-2],[1,0],[2,-1],[-2,-3],[-1,-2],[-8,-5],[-3,-3],[-4,-6],[-6,-13],[-2,-3],[-1,-3],[0,-9],[2,-15],[-2,-7],[1,-7],[-1,-4],[-2,-7],[-8,-11],[-1,-7],[2,-5],[0,-4],[-1,-4],[-3,0],[-12,3],[-4,-4],[-4,-5],[-1,-2],[-2,-2],[-8,-2],[-2,-2],[-9,-18],[-3,-12],[-5,-11],[-1,-5],[0,-6],[0,-6],[1,-5],[2,-5],[3,-7],[17,-26],[3,-2],[18,-3],[4,-3],[3,-6],[1,-5],[-1,-13],[-1,-4],[-2,-4],[-5,-4],[-5,-3],[2,-2],[2,1],[4,1],[2,-1],[2,-6],[-3,-2],[-1,-2],[-2,-4],[-11,-15],[-5,-4],[-5,-6],[-7,-6],[-3,-4],[-4,-7],[-5,-8],[-6,-17],[-1,-3],[1,-2],[-3,-30],[-1,-3],[-3,-4],[-6,-6],[-3,-1],[-4,3],[-3,4],[-2,7],[-3,6],[0,-2],[1,-4],[-1,-4],[-7,-2],[-1,-2],[6,1],[4,-2],[2,-1],[2,-3],[1,-4],[-1,-2],[-4,-2],[-4,-3],[-5,-6],[-3,-7],[-1,-5],[-2,-9],[0,-7],[-3,-5],[-3,-4],[0,-1],[3,2],[1,1],[2,-6],[2,-12],[1,-8],[0,-3],[-1,-3],[-4,-1],[-4,0],[-3,-1],[2,-2],[2,1],[4,-4],[4,2],[2,-3],[1,-2],[7,-17],[5,-11],[3,-6],[-2,-3]],[[3098,2168],[0,4],[-4,1],[-3,1],[-6,3],[-8,4],[-8,0],[-6,3],[-7,4],[-14,1],[-13,0],[-13,0],[-8,0],[-6,0],[-1,2],[0,5],[-2,3],[-3,4],[-4,3],[-2,5],[-2,4],[2,4],[1,10],[0,4],[-1,3],[-1,5],[1,2],[1,1],[1,7],[-1,7],[-1,7],[-1,2],[-2,2],[-1,0],[-4,-2],[-5,0],[-1,-1],[-3,-2],[-3,-4],[-2,1],[-1,4],[-1,4],[-1,3],[-1,5],[-1,6],[-2,8],[-3,6],[0,5],[-1,7],[2,7],[-1,5],[-2,7],[1,7],[1,4],[1,4],[9,1],[0,7],[1,5],[2,5],[1,2],[4,2],[3,2],[3,4],[1,2],[0,4],[0,4],[0,8],[1,3],[2,3],[4,3],[2,8],[-1,7],[-3,5],[-2,3],[-1,5],[2,6],[1,5],[2,7],[0,4],[2,3],[5,6],[2,6],[1,1],[2,1],[0,3],[-1,4],[0,4],[0,4],[0,6],[3,3],[3,5],[1,3],[0,4],[-1,9],[-1,6],[0,2],[-2,4],[-1,3],[2,3],[3,4],[2,5],[-1,4],[-2,3],[-1,6],[1,9],[1,2],[5,1],[1,5],[4,6],[0,6],[-3,3],[-2,6],[-2,5],[-6,3],[-6,1],[-1,5],[0,3],[3,-1],[5,1],[3,0],[3,1],[3,0],[3,-2],[2,2],[1,7],[2,4],[0,4],[-1,3],[-4,1],[-13,2],[-1,3],[0,6],[1,5],[0,2],[1,3],[2,4],[1,4],[-1,4],[-3,6],[2,2],[0,4],[0,3],[-3,4],[-2,5],[0,5],[3,1],[1,2],[1,3],[-1,4],[-3,2],[-5,2],[-1,2],[-1,5],[1,12],[-1,7],[0,4],[1,4],[1,2],[0,7],[-2,3],[1,3],[1,3],[1,3],[1,1],[1,-2],[3,1],[2,3],[1,3],[-1,4],[-2,12],[-2,7],[1,2],[0,3],[0,10],[0,5],[0,18],[0,5],[-2,6],[1,6],[1,4],[1,6],[1,5],[1,2],[2,1],[0,3],[-1,2],[-2,3],[0,4],[0,3],[1,1],[2,0],[1,5],[1,5],[0,2],[-1,3],[-1,8],[-1,4],[1,2],[1,0],[2,-1],[1,1],[1,2],[0,2],[0,2],[2,5],[1,7],[0,5],[0,12],[0,3],[2,3],[2,2],[2,2],[3,3],[4,2],[1,3],[1,4],[1,4],[-2,2],[-2,3],[-1,8],[0,7],[0,9],[-2,7],[-2,9],[-1,7],[1,4],[1,7],[-1,3],[-1,5],[1,5],[1,6],[0,3],[-1,8],[-1,5],[1,4],[1,5],[2,2],[-1,4],[1,3],[2,2],[2,4],[2,1],[1,0],[1,1],[1,3],[0,3],[3,4],[2,4],[3,1],[1,4],[0,5],[0,5],[1,6],[-1,10],[0,5],[-1,4],[0,4],[-1,3],[-2,1],[0,4],[1,1],[1,2],[2,2],[2,13],[1,4],[0,5],[0,2],[1,4],[1,5],[2,5],[1,4],[2,4],[0,3],[1,2],[2,0],[2,1],[0,2],[0,2],[0,6],[0,8],[-1,12],[1,7],[1,8],[1,4],[0,3],[-1,4],[-2,2],[-2,-2],[-1,0],[-2,4],[-1,5],[1,6],[1,3],[1,5],[-1,1],[-2,3],[-2,11],[1,8],[-2,3],[-1,7],[-2,2],[0,5],[-1,6],[0,2],[2,1],[1,4],[-1,2],[-1,3],[-2,-1],[-1,3],[-2,10],[-2,5],[1,9],[0,6],[1,5],[0,5],[1,2],[1,-1],[1,0],[2,4],[1,2],[0,2],[-1,2],[0,3],[0,4],[2,9],[2,10],[1,3],[0,4],[0,1],[1,-2],[4,2],[2,5],[0,4],[2,2],[-1,3],[-2,1],[-1,1],[1,4],[0,8],[0,6],[-1,13],[-1,13],[0,4],[3,6],[2,3],[0,3],[2,15],[1,8],[1,5],[1,8],[3,8],[1,4],[2,1],[1,2],[2,5],[2,6],[2,2],[1,5],[1,6],[2,10],[1,7],[2,2],[1,9],[1,6],[2,2],[2,1],[2,-3],[1,1],[2,3],[4,2],[1,1],[1,3],[0,6],[-2,4],[-3,8],[-2,8],[-1,3],[0,3],[1,4],[1,4],[3,7],[0,5],[-2,19],[-1,5],[-2,10],[0,4],[2,10],[1,4],[2,1],[1,2],[0,2],[-1,2],[-1,3],[0,4],[-2,2],[-1,3],[0,5],[2,7],[1,2],[1,3],[2,3],[1,2],[2,4],[5,5],[5,3],[9,8],[6,4],[0,4],[1,2],[2,18],[4,22],[2,14],[-5,10]],[[3133,3869],[1,3],[3,7],[1,6],[1,2],[5,6],[1,4],[1,4],[1,3],[2,1],[3,3],[4,2],[1,4],[2,6],[0,6],[1,2],[2,0],[2,-2],[1,-2],[5,-9],[3,-4],[2,-1],[5,1],[1,0],[12,0],[1,-1],[4,-2],[3,-1],[1,-1],[3,-3],[2,-8],[2,-6],[1,-6],[2,-10],[1,-4],[0,2],[2,11],[1,6],[2,8],[5,16],[1,3],[2,1],[1,0],[1,-1],[2,0],[1,1],[11,1],[12,0],[1,-3],[2,-7],[2,-3],[0,-1]],[[6265,7523],[-1,-1],[-1,1],[0,2],[0,1],[1,0],[1,-1],[0,-2]],[[6291,7425],[-5,0],[-4,-2],[-2,0]],[[6280,7423],[-1,5],[-1,3],[-2,9],[1,4],[-2,2],[-3,4],[-1,2],[0,2],[1,4],[-1,4],[-1,1],[-2,0],[-2,-1],[-4,-3],[-3,2],[-2,2],[-1,1],[-2,-1],[0,1],[0,4],[-1,2],[-1,3],[-2,1],[-4,-2],[-3,-1]],[[6243,7471],[-1,2],[-5,8],[-4,6],[-3,3],[-3,0],[-5,-1],[-2,0],[-4,3],[-4,3],[1,1],[1,1],[-1,5],[-2,6],[0,2],[-1,3],[0,3],[2,5],[2,4],[0,4],[-1,4],[-2,8],[-1,3],[-2,2],[-2,3],[0,3]],[[6206,7552],[1,0],[5,0],[4,1],[3,1],[5,2],[2,1],[2,1],[7,-2],[2,1],[8,1],[-1,2],[5,1],[0,1]],[[6249,7562],[1,-3],[2,-2],[2,-2],[1,-1],[0,-1],[-4,-2],[0,-1],[1,-1],[5,-3],[3,0],[1,-1],[1,-3],[2,-3],[2,-2],[0,-1],[-1,-2],[-4,-6],[-1,-1],[0,-3],[2,-6],[3,-6],[5,-5],[6,-6],[0,-3],[-1,-4],[-1,-3],[0,-2],[-1,-1],[-6,1],[-1,-1],[0,-1],[-1,-1],[3,-1],[3,-4],[2,-4],[2,-2],[3,-3],[2,-4],[3,-4],[3,2],[5,-4],[0,-2],[-1,-2],[-2,-3],[-1,-1],[0,-1],[1,-1],[1,-2],[2,-3],[2,-4],[-1,-1],[-2,0],[-1,0],[-1,-1],[0,-1],[2,-3],[1,-3],[0,-4],[0,-5]],[[6249,7547],[0,-1],[1,1],[0,1],[0,2],[-1,0],[-1,0],[0,-2],[1,-1]],[[258,4357],[-2,0],[-1,2],[3,3],[1,1],[3,-1],[-2,-1],[-2,-4]],[[500,396],[-9,-1],[-20,3],[-6,2],[-2,2],[-6,2],[-2,1],[0,2],[0,2],[-2,1],[-1,1],[-2,1],[28,-1],[11,-2],[2,-1],[19,-6],[-5,-1],[-5,-5]],[[611,455],[-2,-1],[-2,3],[-11,7],[-6,4],[-5,3],[-1,2],[2,0],[15,-7],[3,-2],[12,-5],[-5,-4]],[[543,484],[-3,0],[-75,7],[-14,2],[-4,1],[-1,1],[0,1],[0,2],[2,2],[19,2],[20,-2],[25,-5],[17,-3],[9,-4],[4,-2],[1,-2]],[[724,574],[-5,0],[-7,0],[-5,2],[-11,2],[-3,4],[-13,3],[-6,1],[2,3],[14,-4],[17,-5],[14,-3],[3,-3]],[[3340,556],[-1,-12],[0,-6],[-1,-4],[-3,-3],[-5,-3],[-4,-3],[-9,-4],[-40,4],[-18,3],[-8,4],[-1,2],[-2,6],[-2,2],[-16,-2],[-10,-2],[-2,-1],[-2,-3],[-2,-1],[-26,8],[-27,9],[-11,5],[-4,3],[-1,1],[2,2],[3,1],[3,1],[3,0],[2,-1],[2,-1],[2,-5],[1,-1],[4,-1],[96,0],[8,1],[17,1],[9,2],[3,3],[-8,1],[-3,2],[-3,4],[-1,4],[1,3],[11,1],[1,1],[-2,2],[0,3],[6,2],[2,3],[13,4],[20,-2],[4,-6],[-1,-4],[-1,-3],[0,-6],[8,-1],[2,-2],[3,-2],[-3,0],[-3,-1],[-2,-3],[-2,-3],[-2,-2]],[[4135,588],[4,-2],[4,3],[-1,3],[3,4],[3,-5],[22,-5],[7,-5],[-3,-1],[-2,0],[-7,0],[-10,-5],[-12,4],[-21,3],[-6,3],[-5,6],[9,6],[2,-1],[13,-8]],[[4101,595],[-5,-1],[-1,2],[2,3],[3,4],[7,0],[6,-2],[-1,-2],[-1,0],[-10,-4]],[[3162,571],[-3,0],[-2,1],[-1,1],[-1,4],[-14,4],[-1,2],[-1,5],[-3,2],[-17,8],[-2,2],[-1,2],[3,1],[7,-2],[13,0],[3,-1],[3,-1],[14,-1],[7,0],[4,-7],[8,-2],[1,-4],[1,-6],[-11,-5],[-2,-1],[-5,-2]],[[3131,607],[-4,-2],[-21,1],[-7,1],[-3,1],[3,6],[3,2],[2,1],[6,3],[9,1],[6,0],[12,-3],[-3,-2],[-2,-1],[-2,-4],[1,-4]],[[4057,615],[-3,-2],[-68,4],[-3,0],[1,4],[9,1],[5,1],[7,2],[6,3],[2,0],[31,-7],[11,-4],[2,-1],[0,-1]],[[582,587],[-35,-2],[-14,2],[-29,6],[-41,11],[-11,4],[-7,3],[-7,4],[-1,4],[1,7],[1,5],[2,3],[9,4],[4,4],[9,4],[2,4],[4,0],[7,-1],[7,-1],[6,-1],[6,-2],[15,-6],[10,-6],[14,-7],[15,-8],[8,-3],[7,-5],[8,-6],[1,-2],[3,-3],[2,-2],[2,-2],[2,-1],[1,-3],[0,-2],[-1,-2]],[[3046,594],[-6,0],[-12,1],[-12,2],[-3,1],[-5,3],[-1,2],[-1,2],[0,3],[3,11],[6,7],[5,4],[18,9],[2,1],[16,5],[6,2],[10,5],[53,18],[13,3],[5,-2],[3,-2],[-2,-2],[-7,-5],[-3,-4],[-9,-6],[-19,-11],[-13,-8],[-17,-12],[-4,-4],[-8,-9],[1,-4],[-2,-6],[-11,-3],[-6,-1]],[[9656,683],[-4,-4],[-4,-2],[-12,1],[-8,-3],[-10,-2],[-4,2],[-2,4],[-1,5],[0,1],[2,1],[13,-3],[5,-3],[3,0],[8,4],[6,4],[2,3],[2,1],[2,-2],[2,-5],[0,-2]],[[3743,644],[4,0],[15,1],[14,0],[9,-1],[3,-2],[2,-3],[3,-5],[2,-5],[3,-5],[1,-8],[3,-3],[4,-7],[1,-6],[-2,-13],[-2,-5],[-5,-5],[-7,1],[-2,-1],[-3,-1],[-1,0],[-1,-1],[8,-5],[0,-1],[1,-2],[-1,-1],[-1,-1],[-158,-26],[-6,-1],[-6,-3],[-2,-2],[-2,-2],[-122,-5],[-1,0],[-1,1],[-3,5],[-1,8],[1,3],[6,3],[2,2],[11,12],[5,5],[2,5],[2,-1],[5,-2],[3,-1],[7,1],[6,3],[3,2],[3,-1],[1,-2],[1,-1],[16,9],[15,9],[14,11],[8,7],[1,2],[2,3],[-1,3],[-2,2],[-1,1],[-1,0],[-8,2],[3,3],[2,4],[1,4],[1,4],[-1,3],[1,1],[3,2],[2,2],[2,3],[-3,1],[-1,2],[3,5],[2,5],[2,3],[5,6],[17,13],[6,8],[1,2],[39,12],[6,2],[12,1],[6,0],[16,-1],[7,-1],[13,-3],[19,-6],[7,-3],[7,-3],[7,-5],[6,-5],[2,-1],[0,-3],[1,-3],[-1,-3],[-1,-5],[-3,-4],[-31,-4],[-4,-1],[-3,-3],[-1,-3],[3,-2]],[[855,729],[8,-3],[-14,1],[-6,4],[4,2],[4,0],[3,-2],[1,-2]],[[822,727],[-2,0],[-24,5],[-5,1],[8,3],[6,0],[14,-7],[4,0],[-1,-2]],[[9640,730],[11,-4],[27,0],[23,-3],[2,-4],[-6,-3],[-10,-5],[-7,-2],[-5,0],[-12,3],[-14,-1],[-3,-3],[-7,-3],[-9,-5],[-2,4],[-3,4],[-8,9],[-1,2],[5,1],[2,3],[5,4],[-1,2],[-4,3],[-1,2],[2,4],[6,1],[8,-1],[3,-5],[-1,-2],[0,-1]],[[872,748],[-11,0],[-7,1],[-1,5],[1,0],[15,-2],[6,-1],[2,-1],[-1,-1],[-4,-1]],[[855,742],[-2,-1],[-12,0],[-3,1],[-1,1],[-17,1],[-7,4],[-2,2],[3,2],[6,1],[2,2],[15,1],[2,-1],[1,-2],[7,-4],[2,-3],[0,-2],[4,-1],[2,-1]],[[928,751],[-11,-3],[-3,1],[1,4],[-1,2],[-1,1],[1,2],[6,0],[18,-3],[2,-3],[-12,-1]],[[852,765],[11,-1],[7,1],[8,-2],[2,-1],[-1,-1],[-9,-1],[-4,-2],[-5,0],[-7,1],[-6,4],[4,2]],[[827,762],[-12,-1],[-5,1],[-1,2],[1,1],[18,2],[2,-2],[1,-1],[-4,-2]],[[900,769],[1,-1],[-5,1],[-6,3],[-1,1],[3,1],[3,-1],[4,-2],[1,-2]],[[922,770],[-3,-5],[-9,3],[-3,3],[2,3],[4,2],[5,-2],[2,0],[2,-4]],[[925,792],[-5,-1],[-8,4],[-5,3],[-2,2],[0,1],[0,1],[2,1],[11,-2],[7,-9]],[[9526,831],[-5,-7],[-4,0],[-2,1],[4,5],[3,1],[3,1],[1,-1]],[[966,823],[-4,0],[-5,1],[-14,5],[-3,2],[2,2],[5,2],[4,-1],[10,-4],[2,-3],[2,-2],[1,-2]],[[9554,874],[-4,0],[-2,1],[-1,4],[0,2],[8,4],[5,2],[-3,-8],[-1,-1],[-2,-4]],[[1322,896],[-4,-3],[-9,2],[1,2],[8,2],[5,-1],[-1,-2]],[[1359,888],[-3,-1],[-12,3],[-6,0],[-3,2],[-2,1],[-1,2],[-3,2],[6,4],[5,2],[4,0],[1,-3],[9,-2],[8,0],[0,-3],[0,-3],[-3,-4]],[[1462,886],[-4,-1],[-9,3],[-2,2],[-3,3],[-2,1],[0,1],[-1,8],[2,1],[5,-2],[11,-4],[7,-1],[2,-3],[-2,-6],[-4,-2]],[[1757,912],[-14,-2],[-3,2],[-1,2],[0,3],[28,12],[5,-1],[1,-1],[-8,-7],[-4,-2],[2,-1],[0,-1],[-1,-2],[-5,-2]],[[1679,915],[-6,-1],[-2,1],[-1,1],[-1,1],[3,3],[3,1],[1,1],[-4,10],[4,1],[4,1],[8,0],[7,-2],[2,-1],[1,-2],[-3,-6],[-2,-1],[-11,-5],[-3,-2]],[[1651,936],[5,-6],[2,-4],[1,-4],[-20,-10],[-1,0],[-1,-5],[1,-2],[1,0],[0,-2],[-2,-1],[-34,-4],[-16,4],[-2,2],[-1,4],[2,0],[4,1],[-1,2],[-2,2],[-1,3],[5,6],[3,2],[-9,5],[-2,1],[-1,1],[-4,-1],[-4,1],[1,2],[1,4],[4,3],[3,0],[3,0],[13,0],[13,-2],[13,-1],[21,-1],[5,0]],[[4427,928],[-1,-13],[0,-2],[1,-3],[5,-7],[1,-5],[-1,-2],[-2,-3],[-6,1],[-3,1],[0,1],[-4,13],[-2,2],[-3,3],[-13,2],[-12,-1],[3,3],[18,4],[5,3],[3,3],[1,6],[3,6],[5,3],[3,0],[2,-5],[0,-5],[-3,-5]],[[9717,944],[-4,-1],[-5,4],[-1,1],[5,7],[-1,2],[1,2],[2,2],[1,-1],[3,-7],[2,-4],[-3,-3],[0,-2]],[[1491,963],[7,-2],[3,-2],[3,-2],[3,-1],[3,-3],[2,-5],[2,-1],[5,-3],[1,-3],[0,-2],[-9,-1],[-3,1],[-3,-1],[-1,-2],[0,-2],[1,-1],[4,-1],[3,0],[7,1],[2,0],[4,-1],[3,-1],[8,5],[2,1],[2,0],[12,-6],[2,-3],[-1,-1],[-2,-2],[1,-2],[5,-2],[3,-3],[1,-1],[0,-2],[-1,-3],[0,-3],[-3,-2],[-1,0],[-6,2],[-19,1],[-6,1],[-9,6],[-4,1],[-3,1],[-6,5],[-10,4],[-6,4],[0,4],[-1,3],[-1,1],[-1,1],[-4,0],[-3,0],[-2,-1],[-3,-3],[-3,0],[-3,0],[0,1],[0,7],[-3,1],[-2,3],[-1,4],[1,4],[4,5],[4,0],[4,-1],[4,1],[6,1],[8,0]],[[2948,959],[-3,-2],[-2,1],[-3,3],[0,2],[2,2],[1,1],[6,7],[4,0],[4,-1],[-4,-6],[-1,-4],[-4,-3]],[[2096,970],[-3,-3],[-7,1],[-4,4],[-2,6],[-1,2],[2,1],[3,2],[12,-13]],[[2934,973],[-4,-7],[0,-1],[-4,-2],[1,-2],[1,-1],[1,-2],[2,-3],[3,-3],[-2,-5],[-4,-3],[-37,16],[-2,3],[-2,1],[-1,3],[0,3],[1,3],[1,1],[3,2],[4,0],[7,-3],[1,0],[2,3],[4,0],[1,3],[-6,0],[-4,3],[-3,2],[-1,2],[10,3],[25,-4],[4,-1],[1,-2],[2,-3],[-4,-6]],[[2394,984],[-4,0],[-4,2],[0,1],[1,2],[2,0],[5,-3],[1,-2],[-1,0]],[[2468,969],[-6,-2],[-4,1],[1,13],[3,3],[-1,3],[-4,6],[-4,8],[2,2],[9,2],[9,0],[4,-3],[2,-5],[-1,-2],[-3,-6],[3,-1],[1,-4],[-1,-4],[-3,-6],[-3,-3],[-4,-2]],[[2360,998],[-5,0],[-2,1],[2,3],[13,5],[5,3],[1,-1],[0,-1],[3,-5],[0,-2],[-17,-3]],[[4552,998],[-2,-2],[-4,0],[-3,3],[-2,4],[0,3],[1,3],[3,1],[2,-1],[3,-7],[2,-4]],[[6901,1019],[-1,0],[0,3],[4,4],[3,5],[1,1],[4,-5],[-1,-3],[-4,-3],[-6,-2]],[[4652,1027],[-2,-2],[-4,1],[-4,3],[-2,2],[-1,2],[2,3],[1,1],[2,-1],[5,-3],[2,-4],[1,-2]],[[6941,1041],[-3,-7],[-1,0],[-2,5],[1,2],[2,2],[3,-1],[0,-1]],[[2275,1042],[-2,-6],[0,-6],[7,0],[3,11],[6,2],[3,-6],[-3,-6],[2,-3],[2,-2],[3,0],[3,3],[1,2],[1,3],[2,6],[6,5],[13,1],[8,-3],[-5,-9],[-12,-5],[-7,-5],[2,-2],[3,0],[2,0],[7,3],[16,5],[6,3],[2,0],[0,-6],[2,-5],[-1,-9],[-7,-2],[-7,0],[2,-5],[-1,-1],[0,-2],[-18,2],[-3,0],[-3,-2],[-3,1],[-7,3],[-3,0],[-6,-2],[-7,0],[-9,0],[-7,0],[-6,4],[-7,0],[-7,1],[-8,3],[-7,2],[-9,4],[-3,1],[-2,1],[-5,0],[-34,6],[-6,-1],[-3,0],[-3,0],[-7,3],[-1,3],[0,3],[2,1],[3,2],[48,6],[5,2],[4,0],[2,-6],[5,-6],[1,0],[1,1],[5,5],[9,-2],[4,3],[4,4],[9,5],[7,-1],[5,-2],[3,-5]],[[4917,1082],[-3,-1],[-3,0],[-3,2],[-3,3],[0,1],[0,3],[0,1],[4,0],[1,-1],[1,-1],[6,-7]],[[3318,1091],[-3,0],[-4,1],[-3,2],[-1,2],[1,2],[3,1],[5,0],[2,-3],[1,-2],[-1,-2],[0,-1]],[[4929,1108],[3,-2],[5,0],[4,-1],[0,-2],[-3,-3],[-2,-6],[-2,-2],[-7,-6],[-5,-1],[-1,3],[0,3],[1,2],[0,2],[-5,3],[0,3],[-1,2],[-13,7],[-3,1],[1,2],[14,0],[8,-1],[6,-4]],[[2952,1115],[5,-5],[-4,-4],[-15,-7],[-8,-3],[-8,-2],[-38,-7],[-3,0],[-3,1],[-1,1],[-3,6],[1,3],[3,2],[4,2],[6,2],[23,3],[2,2],[2,2],[0,3],[1,3],[2,1],[1,0],[3,-2],[6,-10],[2,2],[1,2],[0,8],[2,1],[5,-2],[3,-3],[0,5],[2,1],[2,0],[3,-1],[4,-4]],[[3312,1111],[-2,0],[-2,1],[-2,4],[0,1],[1,4],[1,1],[10,1],[2,-2],[1,-4],[-2,-2],[-7,-4]],[[4836,1120],[-7,-3],[-1,1],[-3,2],[-4,6],[5,0],[5,3],[3,-1],[0,-1],[2,-7]],[[5084,1118],[-10,-2],[-2,2],[-1,3],[2,2],[12,7],[3,-1],[1,0],[1,-3],[-1,-4],[-1,-2],[-4,-2]],[[4908,1121],[-4,0],[-1,2],[-1,1],[6,8],[3,2],[7,2],[4,-1],[2,-2],[1,-3],[0,-5],[-2,-2],[-15,-2]],[[3008,1137],[1,-2],[6,2],[3,-2],[0,-1],[-3,-5],[-3,-2],[-4,-1],[-2,8],[-1,1],[3,2]],[[6999,1115],[-2,0],[-2,1],[-3,4],[-2,3],[-1,3],[0,7],[2,3],[3,1],[1,-3],[0,-3],[1,-2],[3,-3],[2,-3],[0,-1],[1,-3],[-1,-2],[-2,-2]],[[5125,1124],[-4,-1],[-5,3],[-2,2],[-1,5],[0,2],[1,2],[4,1],[6,-1],[3,-2],[1,-4],[-1,-4],[-2,-3]],[[5745,1130],[-1,-2],[-5,0],[-4,-2],[-3,1],[-10,3],[-1,5],[-1,2],[1,3],[9,8],[3,0],[5,-1],[3,-2],[1,-4],[4,-8],[-1,-3]],[[5036,1137],[-3,-7],[-1,0],[-2,4],[-3,5],[-1,3],[0,4],[2,3],[8,2],[3,-1],[1,-6],[-4,-7]],[[3301,1153],[-4,0],[-2,2],[-1,1],[0,2],[2,2],[5,-1],[1,-5],[-1,-1]],[[2917,1168],[5,-2],[7,-6],[2,-3],[1,-2],[-1,-1],[-3,-2],[-3,-8],[-4,-2],[-12,1],[-13,3],[-1,1],[-1,3],[0,3],[1,4],[2,2],[10,2],[1,1],[1,4],[2,1],[2,0],[4,1]],[[5450,1151],[-2,-3],[-8,5],[-5,1],[-2,1],[-1,4],[0,1],[1,2],[3,3],[5,3],[10,1],[9,-1],[1,-2],[-8,-5],[-3,-10]],[[3000,1169],[-6,-2],[-4,2],[-12,3],[-5,7],[1,4],[2,2],[4,1],[7,-3],[4,-2],[9,-12]],[[3278,1168],[-3,-1],[-2,6],[-2,8],[-7,12],[-2,6],[1,2],[2,0],[6,-2],[3,-2],[4,-5],[5,-4],[0,-4],[0,-4],[-3,-1],[0,-3],[-2,-6],[0,-2]],[[3054,1199],[-1,-7],[5,2],[1,0],[4,-3],[8,-15],[2,-5],[4,-14],[3,-10],[11,-19],[4,-10],[3,-5],[0,-8],[3,-2],[1,-4],[1,-10],[1,-13],[0,-23],[0,-6],[-4,-9],[-2,-6],[-2,-4],[-3,-3],[-14,-13],[-2,-6],[-23,-5],[-14,-3],[-5,3],[-5,0],[-7,0],[-19,-1],[-15,-2],[-1,1],[-2,2],[-1,2],[-4,-1],[-3,1],[-3,2],[-3,4],[-2,2],[0,2],[6,6],[3,2],[4,0],[6,-1],[7,-2],[15,-2],[20,0],[6,0],[6,2],[7,6],[-3,2],[-4,1],[-3,0],[-3,0],[-8,-3],[-6,-2],[-7,-2],[-7,2],[-6,6],[0,2],[22,4],[2,1],[4,2],[1,3],[0,2],[-14,4],[-3,0],[-3,-1],[-7,2],[-7,5],[-5,5],[-3,1],[-2,-2],[-14,-15],[-1,0],[-6,1],[-6,3],[-7,1],[-4,-1],[-1,-1],[4,-3],[3,-3],[1,-3],[-10,-7],[-3,-1],[-4,1],[-2,1],[-3,4],[-3,1],[-6,-1],[-4,0],[-3,2],[-3,2],[-3,2],[-4,3],[-2,2],[-1,3],[0,2],[1,2],[0,2],[0,2],[0,2],[1,2],[6,3],[6,1],[6,-4],[5,-2],[2,0],[0,1],[1,1],[0,2],[-2,4],[0,3],[2,2],[2,1],[2,1],[1,0],[4,-1],[3,-2],[6,-4],[5,-4],[2,0],[1,1],[1,2],[-6,5],[0,2],[0,3],[4,2],[2,0],[10,-3],[6,-1],[5,0],[12,3],[-6,3],[-13,3],[-3,3],[-2,3],[10,3],[10,0],[18,-4],[5,2],[6,6],[3,1],[13,0],[10,2],[1,0],[2,-1],[10,-9],[1,0],[1,2],[0,3],[0,4],[0,3],[-1,2],[-2,0],[-2,-1],[-2,1],[-3,2],[-3,1],[-10,1],[-7,2],[-4,1],[-3,3],[-1,3],[4,7],[14,8],[6,2],[7,1],[3,-1],[8,-3],[1,0],[1,1],[-7,5],[-7,4],[-3,4],[-3,1],[-11,1],[-5,-3],[-3,-1],[-3,1],[-16,7],[-1,1],[-2,3],[-1,2],[-1,3],[0,4],[1,2],[2,9],[2,7],[-1,6],[-3,3],[-3,3],[-4,3],[0,3],[-1,2],[0,4],[1,3],[1,3],[2,2],[3,2],[14,4],[27,5],[3,-3],[4,-5],[1,-2],[2,-11],[0,-2]],[[2485,1221],[-1,0],[-1,0],[-1,0],[0,1],[0,1],[0,1],[0,1],[0,1],[1,0],[1,0],[1,0],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1]],[[3315,1223],[-1,-2],[-4,1],[-2,1],[-3,3],[2,2],[3,-1],[3,-1],[2,-3]],[[3129,1281],[-6,-2],[-4,2],[0,4],[-1,1],[0,1],[5,3],[4,1],[5,-1],[2,-1],[0,-2],[-3,-3],[-1,-2],[-1,-1]],[[9578,1294],[-3,-2],[-1,0],[-2,4],[2,5],[-1,7],[1,2],[4,-4],[0,-2],[2,-3],[0,-2],[-1,-3],[-1,-2]],[[3129,1331],[-2,-1],[-3,1],[-2,1],[3,4],[-1,3],[3,1],[2,-1],[2,-4],[0,-1],[-2,-3]],[[7383,1327],[-5,-1],[0,1],[0,1],[-8,5],[-1,5],[1,3],[6,-1],[7,-2],[3,-7],[-3,-4]],[[6348,1337],[-5,-1],[-2,0],[0,2],[0,1],[0,2],[2,1],[7,0],[4,-1],[0,-1],[1,-2],[-1,-1],[-6,0]],[[9535,1335],[0,-3],[-2,0],[-2,3],[-2,7],[2,1],[2,-2],[1,-3],[1,-2],[0,-1]],[[7403,1338],[-3,-1],[-2,0],[-3,3],[1,2],[3,1],[4,0],[1,-1],[2,-1],[-3,-3]],[[3111,1297],[-3,-3],[-2,-1],[-2,1],[-2,0],[-2,-1],[-1,-6],[-2,-3],[-2,-2],[-1,1],[-2,0],[-2,-1],[-2,-1],[-2,1],[-2,4],[-4,4],[0,1],[-1,4],[0,4],[2,2],[7,10],[2,5],[3,5],[2,4],[4,8],[2,3],[12,8],[3,2],[3,0],[1,-5],[-2,-2],[-5,-5],[-1,-8],[0,-3],[0,-1],[2,-1],[2,-1],[1,-2],[2,-2],[-4,-4],[-3,-2],[-2,-3],[-4,-2],[-2,-2],[3,0],[4,-2],[1,-2],[-1,-2]],[[7370,1347],[-3,-2],[-3,1],[-1,1],[-1,2],[2,3],[1,0],[1,-2],[4,-3]],[[7745,1355],[-3,0],[-2,1],[-2,3],[0,1],[4,1],[6,-3],[-3,-3]],[[9516,1355],[-1,-3],[-2,0],[-6,7],[1,3],[-1,3],[0,2],[1,1],[7,-11],[1,-2]],[[7784,1370],[-3,-1],[-2,2],[3,4],[3,1],[0,-4],[-1,-2]],[[3150,1371],[-6,-7],[-1,1],[-1,0],[0,1],[2,3],[1,7],[4,2],[1,0],[-1,-3],[1,-3],[0,-1]],[[7683,1380],[3,-1],[6,0],[2,-2],[0,-3],[0,-1],[-2,-2],[-15,-2],[-3,3],[3,6],[3,2],[3,0]],[[7572,1393],[-4,0],[-4,0],[-2,3],[0,1],[1,2],[6,0],[3,-1],[1,-2],[0,-1],[-1,-2]],[[3171,1391],[-6,-2],[-4,1],[0,2],[1,3],[3,2],[-1,5],[2,1],[1,4],[4,3],[5,-2],[0,-4],[0,-2],[-4,-1],[0,-1],[-1,-3],[0,-4],[0,-2]],[[7804,1401],[-12,-1],[-1,1],[-4,0],[-2,1],[0,3],[1,5],[2,3],[4,3],[2,1],[8,1],[5,-1],[4,-4],[1,-3],[-1,-3],[-7,-6]],[[7871,1414],[-1,-1],[-5,1],[-1,1],[0,5],[-1,2],[-1,1],[-8,3],[0,4],[1,2],[2,0],[7,-3],[2,-3],[-1,-4],[0,-1],[3,-3],[3,-3],[0,-1]],[[3241,1448],[-4,-3],[-3,0],[3,7],[2,0],[5,3],[1,0],[-2,-3],[-2,-4]],[[3410,1465],[-3,0],[-3,1],[0,3],[0,2],[2,1],[2,0],[8,5],[3,1],[-1,-2],[0,-3],[-1,-2],[-7,-6]],[[3245,1470],[-3,-6],[4,1],[3,2],[3,1],[2,-3],[-5,-3],[-5,-4],[-2,-2],[-2,-1],[-3,1],[-3,-1],[-2,-4],[-3,-2],[-1,2],[-1,1],[-5,1],[-3,2],[-2,2],[-3,0],[2,4],[1,3],[9,4],[-1,1],[-1,2],[7,2],[0,2],[0,3],[2,1],[2,3],[1,0],[4,0],[3,-3],[-1,-3],[3,-6]],[[3268,1473],[-2,-2],[-1,-1],[-2,1],[-2,-3],[-4,1],[-1,1],[1,0],[0,2],[3,3],[3,8],[1,2],[-3,4],[-1,2],[1,2],[1,2],[3,2],[3,0],[2,-2],[0,-3],[6,-2],[-1,-6],[-2,-4],[-1,-4],[-3,-2],[-1,-1]],[[3279,1493],[-3,0],[1,3],[2,2],[4,1],[-2,-3],[-1,-2],[-1,-1]],[[3393,1494],[1,0],[1,0],[1,1],[1,2],[3,2],[3,1],[-1,-3],[7,-5],[0,-4],[1,-3],[-3,-1],[-2,-4],[2,-1],[1,-3],[-2,0],[-6,1],[-3,0],[1,3],[-1,1],[-4,-1],[-1,-6],[-1,0],[-1,1],[1,3],[-2,1],[-1,0],[-4,-3],[-1,0],[-3,3],[8,5],[-3,2],[-1,2],[0,4],[-2,-1],[-3,-1],[-1,0],[-2,1],[1,3],[2,4],[2,4],[4,3],[2,1],[2,1],[2,2],[2,0],[2,-4],[0,-2],[-2,-3],[0,-6]],[[3406,1509],[0,-1],[6,0],[1,-1],[-3,-2],[-1,0],[-2,-1],[-8,2],[-2,2],[7,2],[2,-1]],[[3315,1505],[-4,-2],[-2,1],[-3,2],[5,1],[0,7],[2,3],[4,-2],[-2,-4],[-1,-2],[1,-3],[0,-1]],[[3448,1524],[-3,-2],[-6,4],[-1,2],[0,2],[10,2],[3,-1],[1,-4],[-4,-3]],[[0,325],[45,1],[9,-1],[9,-2],[21,0],[19,-2],[5,-3],[7,-2],[13,2],[11,1],[9,0],[82,-5],[85,-8],[17,-2],[15,-6],[17,0],[95,-4],[15,0],[59,-5],[102,-12],[9,0],[10,0],[-5,6],[-10,6],[-13,4],[9,1],[18,0],[-4,3],[-10,2],[-36,2],[-147,14],[-3,1],[-2,1],[-4,1],[-6,2],[-22,1],[-6,1],[-3,2],[1,0],[2,0],[34,1],[4,2],[0,1],[-2,1],[-5,1],[-14,5],[-5,2],[3,3],[2,1],[11,1],[3,3],[-2,4],[-24,8],[-16,3],[-11,-2],[-20,0],[-25,-2],[-7,2],[-7,3],[-8,5],[-5,2],[-7,5],[-11,4],[-56,11],[-10,3],[-70,18],[-3,3],[-2,3],[32,-7],[7,0],[7,2],[5,-1],[8,2],[8,1],[22,-6],[44,-8],[12,-4],[6,-2],[6,0],[5,-2],[6,1],[4,-1],[9,1],[42,1],[16,-1],[20,-5],[8,-7],[5,-3],[11,3],[9,3],[17,2],[6,-1],[9,-4],[10,-6],[45,2],[19,0],[13,-3],[48,9],[8,2],[11,7],[-9,2],[-7,0],[-2,4],[4,1],[14,2],[28,3],[16,2],[8,7],[37,11],[12,5],[11,8],[-25,16],[-23,13],[8,4],[7,4],[3,2],[3,4],[-7,4],[-7,4],[-12,3],[-44,8],[-15,3],[6,5],[8,4],[17,2],[108,6],[108,7],[3,4],[-14,4],[-13,1],[-4,2],[-2,2],[0,4],[-1,1],[-5,0],[-19,5],[-5,1],[-6,4],[-2,4],[4,8],[6,3],[11,2],[7,1],[23,0],[8,1],[4,1],[-1,4],[-2,2],[0,2],[4,1],[4,0],[2,3],[-3,5],[-7,2],[-17,5],[-40,6],[-16,5],[-9,4],[-7,4],[-8,2],[-5,3],[1,2],[-2,5],[-3,1],[-13,-2],[-22,1],[-28,4],[-19,5],[-26,12],[-9,7],[7,4],[8,3],[33,6],[5,2],[7,6],[-11,3],[-10,-1],[-8,2],[-34,0],[-20,0],[-16,7],[-12,7],[-3,4],[-3,6],[4,9],[4,7],[-1,8],[1,12],[6,3],[4,1],[11,-9],[9,0],[13,1],[8,5],[5,2],[8,0],[15,-2],[8,1],[8,-1],[25,-5],[5,-3],[3,-2],[1,-3],[3,-3],[11,-2],[30,2],[8,-1],[21,-8],[18,-9],[6,-3],[10,-1],[4,1],[3,4],[10,4],[21,5],[5,5],[-2,3],[-9,3],[-5,1],[-3,3],[1,5],[1,5],[6,1],[10,-6],[13,-6],[5,-1],[3,0],[7,2],[8,2],[15,-12],[8,-1],[11,0],[2,1],[-1,4],[-2,3],[-2,1],[0,3],[5,3],[3,1],[-2,2],[-5,4],[-3,0],[-3,2],[1,2],[4,1],[5,3],[-2,4],[0,5],[-2,3],[-11,5],[-17,9],[-16,4],[-35,-3],[-12,2],[-8,2],[-9,3],[10,3],[11,3],[3,2],[4,4],[5,3],[4,0],[13,-1],[29,-11],[6,-1],[20,-5],[5,0],[7,1],[-6,5],[-6,3],[-14,10],[1,4],[10,8],[24,0],[11,3],[14,6],[18,9],[15,2],[19,3],[7,-3],[16,-9],[10,-3],[4,0],[4,0],[-10,11],[6,2],[8,1],[7,3],[5,3],[17,11],[15,3],[42,5],[15,-5],[12,0],[3,1],[2,6],[7,11],[5,4],[19,5],[14,0],[11,-5],[9,-3],[9,-2],[9,0],[14,3],[17,1],[9,1],[9,-2],[24,-1],[18,-4],[12,0],[15,4],[8,0],[30,6],[24,1],[17,-2],[29,1],[29,-1],[11,-2],[66,1],[51,6],[8,2],[11,6],[6,5],[4,2],[9,1],[14,-2],[21,-4],[18,2],[33,-3],[3,2],[4,11],[5,16],[5,5],[8,-1],[23,-10],[0,-4],[-2,-2],[-4,-2],[-1,-8],[3,-2],[5,1],[4,-4],[-8,-6],[-5,-3],[-3,-2],[-2,-11],[-4,-4],[0,-4],[5,0],[5,2],[4,0],[14,3],[26,4],[8,1],[5,1],[3,2],[-4,6],[-1,5],[2,3],[-1,7],[-2,7],[5,5],[5,-1],[7,1],[5,-3],[7,-2],[6,-1],[7,-5],[2,-9],[-2,-10],[-7,-8],[-12,-6],[-13,-11],[3,-5],[7,2],[31,-1],[19,1],[13,-1],[16,-3],[12,-4],[15,0],[9,1],[9,-2],[34,9],[14,4],[8,-2],[12,2],[8,-2],[13,3],[8,0],[10,-1],[30,0],[2,-6],[9,-8],[7,-3],[9,1],[7,3],[11,-1],[15,3],[15,-1],[7,1],[3,2],[2,5],[-5,3],[-13,3],[-12,8],[-6,1],[-9,-1],[-4,2],[-4,2],[6,3],[7,9],[-3,9],[-4,2],[-8,-1],[-9,-3],[-4,2],[-7,2],[-2,7],[-7,15],[-4,4],[-10,4],[-10,2],[-9,2],[-3,6],[2,8],[11,2],[10,-1],[6,-2],[7,0],[8,-2],[5,-2],[4,-1],[7,-1],[26,3],[4,1],[3,3],[5,1],[5,-1],[8,2],[-9,2],[-9,5],[-14,5],[-11,3],[-21,2],[-11,-1],[-6,1],[-24,0],[-7,2],[-4,5],[-7,14],[-2,8],[5,2],[3,3],[7,0],[10,-1],[3,-1],[3,-4],[-3,-5],[-3,-2],[2,-2],[11,-1],[5,-1],[4,-1],[10,2],[14,1],[7,-2],[9,-1],[12,2],[45,-1],[5,-1],[6,-4],[4,-2],[5,1],[15,-5],[7,-3],[8,-2],[7,-1],[7,1],[10,3],[8,1],[6,-1],[12,0],[10,-4],[7,2],[8,4],[24,3],[17,-1],[29,-8],[7,0],[14,4],[4,7],[0,8],[4,2],[3,-1],[6,6],[8,0],[5,-2],[3,4],[3,8],[10,0],[7,-1],[9,-5],[0,-4],[-4,-4],[-6,-11],[4,-6],[6,0],[7,-1],[9,3],[6,0],[10,-9],[7,-1],[5,1],[17,8],[5,1],[6,-4],[9,-9],[8,-5],[12,-3],[9,-1],[12,-4],[6,-4],[15,0],[6,-1],[18,-7],[16,3],[8,4],[4,6],[-2,9],[-1,9],[3,4],[4,1],[19,-11],[-1,6],[-2,5],[-5,8],[1,6],[4,2],[8,-3],[10,-2],[8,-3],[15,-13],[5,-11],[11,-3],[7,1],[8,1],[11,2],[9,0],[8,2],[2,-7],[-7,-8],[-3,-6],[2,-2],[5,2],[4,2],[13,-1],[10,4],[9,1],[8,4],[7,0],[5,-1],[8,-3],[7,2],[4,-1],[5,0],[30,14],[7,0],[8,1],[11,3],[8,2],[7,0],[12,5],[19,-1],[10,3],[19,3],[13,4],[23,10],[9,6],[10,13],[6,12],[7,18],[-3,11],[-4,5],[-3,5],[-7,11],[-2,14],[1,13],[-3,12],[-3,9],[-5,16],[-7,10],[-7,13],[0,12],[-2,9],[-5,7],[-2,6],[4,1],[3,1],[9,2],[21,-3],[2,5],[6,4],[3,5],[-1,8],[-5,3],[-5,7],[2,5],[5,0],[2,5],[-2,6],[2,7],[5,9],[2,3],[-5,6],[-5,7],[2,5],[2,6],[3,8],[4,6],[3,1],[-1,2],[-6,2],[-6,1],[-10,-4],[-2,1],[0,2],[-1,4],[1,9],[2,9],[1,1],[4,2],[4,6],[4,1],[2,-2],[1,-10],[1,-2],[-1,-4],[2,-2],[2,3],[4,2],[2,-3],[2,-2],[0,3],[0,7],[-1,3],[0,5],[0,2],[1,4],[-1,8],[0,3],[4,4],[2,1],[3,0],[7,-3],[3,0],[2,1],[1,3],[1,10],[-2,4],[0,3],[1,2],[3,7],[4,0],[4,-1],[4,2],[-1,2],[-1,5],[4,2],[3,0],[8,-2],[3,-2],[3,4],[-1,3],[-3,2],[-1,3],[1,4],[5,-2],[1,1],[1,3],[-1,2],[0,2],[6,0],[1,1],[1,3],[2,1],[6,0],[1,1],[1,3],[-4,1],[-4,3],[0,8],[1,6],[3,5],[5,3],[7,-3],[6,1],[3,-3],[3,-1],[1,3],[-2,3],[-1,5],[10,6],[3,-1],[4,1],[-2,5],[2,6],[3,0],[2,-4],[3,-2],[3,2],[7,5],[3,1],[4,1],[3,3],[1,4],[2,3],[6,4],[3,2],[5,10],[-1,2],[2,2],[16,9],[8,1],[14,5],[8,6],[5,2],[4,7],[6,1],[13,5],[9,8],[14,5],[6,0],[2,-2],[2,-6],[2,-8],[4,-4],[-1,-3],[-4,0],[-4,-1],[-1,4],[2,3],[-2,3],[-4,-1],[-4,-1],[-4,-2],[-4,-4],[-3,-3],[-12,-6],[-7,-9],[-6,-9],[-3,-6],[-4,-1],[-2,-2],[2,-2],[2,-1],[3,0],[0,-3],[-3,-1],[1,-2],[2,-3],[1,-5],[-3,0],[-5,5],[-5,0],[-3,2],[-3,4],[-2,-1],[-2,-5],[1,-5],[-2,-3],[-3,1],[0,7],[-3,1],[-3,0],[-8,-7],[-2,0],[-2,-4],[-4,-3],[-3,-3],[-7,-11],[-4,-4],[-8,-2],[-3,0],[-2,1],[-3,1],[-2,0],[-1,-3],[4,-9],[-2,-3],[-6,0],[-2,3],[-2,-2],[-2,-3],[-2,-3],[3,-7],[4,-4],[3,0],[1,-3],[-6,-1],[-5,-6],[-2,-5],[-2,-4],[0,-4],[4,-7],[4,-4],[5,-1],[6,2],[1,1],[6,1],[3,4],[2,1],[1,-1],[3,0],[2,3],[2,1],[2,-1],[6,0],[1,-3],[-1,-3],[-4,-4],[-3,3],[-3,-1],[-1,-2],[3,-5],[-1,-4],[-3,-4],[-2,3],[-1,4],[-4,3],[-4,1],[-2,-5],[-5,-1],[0,-5],[-2,-5],[-2,1],[-1,6],[-7,5],[-3,1],[-7,-1],[-3,0],[-2,-1],[-3,-5],[3,-3],[1,-4],[0,-3],[0,-1],[-1,-3],[3,-3],[1,-5],[-3,0],[-2,1],[-8,13],[-5,6],[-2,5],[-6,1],[-4,0],[-4,-2],[2,-2],[1,-4],[-3,-1],[-4,-6],[-2,-5],[-2,-1],[-1,-2],[7,-7],[1,-2],[1,-4],[-3,-2],[-5,-1],[-10,4],[-4,0],[-2,3],[-2,0],[-2,-5],[-1,-5],[-2,-3],[0,-4],[2,-1],[-1,-2],[-4,-2],[-2,-2],[5,-1],[1,-2],[0,-2],[-7,-2],[-5,0],[-3,2],[-2,-1],[-2,-3],[0,-4],[0,-5],[1,-3],[1,-1],[1,-3],[-5,-8],[0,-1],[-1,-4],[2,-3],[2,-4],[-2,-3],[-3,-4],[3,-1],[4,-1],[5,1],[7,4],[2,1],[1,-2],[1,-2],[-2,-3],[-13,-6],[-2,-3],[3,-2],[7,0],[2,-2],[-1,-3],[-3,-2],[-3,-5],[3,-2],[7,-4],[13,-4],[10,-1],[-2,5],[-1,6],[7,4],[4,2],[16,3],[4,0],[4,-1],[-2,-3],[-4,1],[-6,-2],[-10,-5],[-2,-2],[1,-4],[8,-4],[3,-3],[-4,-8],[1,-5],[4,-6],[6,-6],[3,-4],[4,-3],[7,-6],[4,-6],[1,-14],[6,-12],[7,-5],[0,-5],[-2,-4],[-6,2],[-3,-2],[-1,-5],[4,-4],[6,-4],[14,1],[1,-5],[-4,-3],[-2,-3],[-3,-2],[-5,-1],[-2,-4],[3,-6],[7,3],[5,0],[6,-1],[1,-8],[7,-9],[1,-5],[-1,-4],[-4,-1],[-2,-4],[-4,-3],[-4,-1],[-8,-8],[-3,-1],[-1,-2],[6,0],[5,-1],[9,7],[4,-2],[2,-4],[2,-5],[-3,-4],[-17,-2],[-8,-3],[-9,-6],[10,-3],[8,1],[4,-1],[5,-3],[5,1],[5,3],[3,0],[3,-1],[0,-5],[1,-7],[1,-5],[-2,-4],[-9,-2],[-7,0],[0,-8],[10,-6],[6,3],[5,-1],[0,-9],[4,-10],[4,-1],[3,5],[4,0],[1,-6],[-1,-9],[-3,-5],[-8,2],[-5,2],[-3,-3],[-6,-3],[-5,-1],[-4,5],[-6,3],[-8,2],[-8,1],[3,-4],[3,-3],[2,-7],[3,-7],[6,2],[9,-4],[6,-4],[2,-6],[-3,-9],[-5,-3],[-3,-2],[-6,4],[-4,0],[-4,-2],[-1,-4],[-3,-2],[14,-1],[5,-1],[3,-4],[-5,-4],[-10,0],[-4,-2],[-3,-3],[14,-2],[6,1],[9,4],[2,-4],[-3,-4],[-5,-6],[-10,-2],[-8,0],[-9,2],[-3,1],[-4,1],[0,-4],[3,-2],[6,-10],[1,-3],[-2,-5],[-5,-4],[-7,-1],[-5,3],[-4,9],[-5,3],[-5,0],[-3,0],[0,-5],[1,-4],[-2,-4],[-4,2],[-6,-2],[-5,-2],[-5,-3],[10,-2],[6,0],[5,-5],[-2,-2],[-9,-1],[-8,-2],[-12,-5],[9,-2],[8,0],[5,0],[5,-1],[2,-3],[-3,-3],[-20,-7],[-20,-10],[-7,-2],[-8,-2],[-18,-8],[-11,-3],[-32,-6],[-49,-14],[-17,-10],[-5,-7],[-4,-2],[-9,-2],[-10,-1],[-25,-1],[-25,4],[-21,0],[-12,-1],[-38,7],[-5,0],[-6,-2],[-5,0],[-3,1],[-8,1],[-26,-3],[-3,-4],[3,-8],[10,-9],[16,-16],[8,-4],[6,-3],[10,-5],[22,0],[31,-3],[17,-3],[-1,-6],[-10,-12],[-7,-4],[-15,-8],[-21,-4],[-17,1],[-29,7],[-36,6],[-54,5],[-11,3],[-14,2],[-8,-2],[-6,-3],[-13,0],[3,-2],[54,-16],[46,-11],[5,-3],[7,-2],[-1,-7],[-2,-6],[-9,-5],[-24,0],[-29,-4],[-15,0],[-14,4],[-31,11],[-19,8],[-13,10],[-9,8],[-10,7],[0,-5],[2,-4],[5,-6],[7,-6],[1,-3],[-4,0],[-5,3],[-4,-3],[-2,-3],[2,-5],[3,-4],[9,-9],[8,-3],[11,-6],[25,-10],[5,-4],[8,-8],[1,-6],[8,-5],[5,-1],[5,0],[1,5],[0,6],[2,2],[7,1],[20,-2],[82,-1],[8,-4],[3,-4],[2,-10],[-9,-11],[-6,-5],[-10,-2],[-8,-3],[-14,-1],[-27,1],[-27,0],[21,-5],[20,-5],[28,1],[12,1],[9,2],[4,-3],[8,-8],[5,-3],[3,-2],[4,-9],[2,-5],[4,-5],[3,-5],[4,-4],[8,-1],[8,3],[16,1],[15,-5],[10,-1],[13,4],[11,5],[22,5],[4,2],[6,1],[9,0],[4,-1],[4,-5],[5,-7],[6,-4],[7,-2],[3,-1],[13,-2],[16,2],[8,-2],[1,-4],[4,-3],[5,-1],[66,-18],[23,-4],[35,-2],[28,0],[4,-1],[5,-3],[-11,-3],[-11,0],[-17,1],[-6,-1],[-13,1],[-6,0],[-6,1],[-9,-3],[-17,-2],[4,-2],[6,-1],[12,-1],[18,1],[1,-5],[-16,-1],[-33,-1],[-4,0],[-2,-3],[5,-1],[3,-1],[1,-3],[-3,-8],[5,-5],[4,-1],[4,1],[7,-3],[7,-3],[15,0],[17,4],[9,0],[23,3],[20,-1],[29,5],[5,0],[4,-1],[-8,-4],[-35,-11],[-13,-2],[-5,-2],[3,-5],[5,-6],[9,-6],[6,-9],[6,-1],[11,4],[2,-3],[1,-7],[-3,-4],[-4,-3],[-3,-3],[-1,-4],[4,-3],[13,-1],[16,-1],[15,0],[9,-1],[35,19],[13,10],[7,3],[6,3],[28,12],[7,4],[8,5],[14,1],[19,9],[17,6],[7,1],[5,1],[6,1],[15,0],[11,1],[19,4],[14,3],[16,2],[17,1],[46,4],[13,-2],[15,-5],[10,1],[12,1],[9,2],[4,-6],[2,-6],[-5,-7],[-7,-4],[-1,-6],[9,-4],[11,1],[20,4],[17,4],[4,2],[7,0],[11,3],[13,15],[17,14],[15,10],[9,11],[8,6],[8,5],[6,2],[13,1],[19,7],[28,9],[21,-4],[22,-6],[11,5],[9,1],[7,2],[8,2],[5,4],[7,4],[5,5],[27,3],[29,4],[4,1],[3,-1],[10,1],[13,3],[17,1],[9,0],[8,8],[16,2],[18,3],[7,2],[6,1],[141,6],[6,3],[13,3],[4,6],[-19,3],[-5,2],[-7,1],[-4,-1],[-16,1],[-130,9],[-3,1],[-5,6],[1,10],[-4,8],[-9,2],[-9,0],[-12,-1],[-31,-4],[-13,-1],[-33,7],[-22,8],[-15,2],[-10,6],[-10,4],[-1,9],[3,8],[18,25],[12,12],[8,0],[7,6],[7,12],[6,5],[14,7],[5,2],[22,8],[5,0],[10,-1],[11,7],[33,15],[7,6],[9,4],[27,13],[24,6],[11,2],[15,4],[16,6],[14,6],[49,11],[30,3],[21,3],[14,-2],[14,1],[13,2],[5,3],[8,6],[28,-3],[18,4],[7,0],[8,2],[-3,2],[-3,0],[-3,3],[-3,6],[3,7],[3,4],[8,4],[5,7],[4,9],[13,19],[4,2],[9,1],[7,0],[8,0],[21,-5],[4,2],[7,5],[5,7],[12,10],[3,3],[-1,5],[-18,-2],[-14,-3],[-13,1],[-2,3],[3,2],[5,1],[2,3],[-5,3],[-8,2],[-3,2],[0,5],[2,8],[4,2],[4,3],[10,10],[5,4],[17,2],[19,-4],[4,1],[5,6],[-5,9],[-4,4],[0,2],[10,-1],[10,-2],[11,0],[12,9],[19,8],[8,3],[8,2],[4,7],[7,15],[4,7],[0,5],[-1,4],[-5,-1],[-4,-1],[-10,4],[-13,6],[-4,7],[-2,6],[4,3],[4,2],[4,1],[8,-3],[9,-6],[5,-2],[5,-5],[4,0],[4,7],[4,8],[3,3],[5,3],[6,4],[-3,4],[-5,2],[-1,2],[2,3],[5,1],[6,-6],[8,-4],[5,-1],[5,-4],[7,-10],[9,-18],[4,-1],[8,2],[9,1],[5,5],[1,13],[3,5],[-1,6],[-4,6],[-3,5],[0,3],[3,2],[4,1],[6,3],[10,-3],[6,-1],[8,2],[8,3],[9,3],[6,-2],[3,-6],[-3,-7],[-5,-5],[-5,-6],[-2,-6],[1,-3],[4,-1],[42,0],[5,0],[8,0],[7,-2],[14,1],[11,2],[6,0],[10,-2],[7,-5],[14,2],[4,1],[4,6],[4,1],[5,-5],[1,-11],[2,-5],[6,-5],[6,4],[4,5],[10,9],[10,8],[9,4],[20,7],[10,4],[19,6],[25,3],[45,11],[14,1],[24,3],[13,3],[12,2],[8,8],[17,-6],[6,0],[8,4],[9,12],[14,-5],[7,-7],[9,-6],[21,-11],[7,-2],[14,-2],[3,1],[7,7],[6,10],[5,5],[6,3],[7,6],[-2,3],[-4,1],[-4,1],[1,3],[12,1],[7,-10],[6,-4],[8,-3],[19,3],[16,0],[14,-2],[7,0],[6,8],[9,3],[6,-4],[4,-11],[12,-3],[27,-5],[3,1],[3,6],[2,7],[6,1],[7,4],[3,0],[6,-5],[-2,-11],[-3,-11],[3,-8],[4,-5],[4,-1],[6,0],[8,0],[6,0],[26,4],[3,10],[4,10],[10,14],[4,-1],[4,-1],[7,-7],[4,-3],[1,-5],[-5,-5],[1,-3],[5,-3],[15,-4],[4,1],[8,4],[7,9],[4,10],[6,-1],[6,-2],[4,-5],[0,-10],[5,-6],[5,-4],[12,-5],[13,-1],[9,-3],[15,1],[7,3],[4,1],[8,2],[9,6],[5,2],[19,6],[15,5],[15,11],[15,6],[23,3],[6,1],[9,0],[22,7],[8,4],[5,2],[5,5],[3,10],[2,7],[-1,6],[-2,8],[-4,7],[-5,10],[2,12],[4,5],[9,5],[10,1],[11,0],[9,-1],[1,-5],[-4,-6],[-5,-5],[-3,-3],[1,-4],[6,-1],[15,1],[5,-4],[10,-19],[3,-8],[4,-3],[5,1],[13,0],[9,2],[7,0],[3,-1],[4,-4],[7,-5],[8,3],[5,2],[6,0],[10,-6],[10,-13],[11,-7],[0,4],[-1,6],[4,4],[6,8],[7,10],[6,11],[2,15],[3,11],[5,6],[4,4],[8,4],[9,0],[9,9],[6,3],[13,5],[16,5],[12,13],[4,2],[6,2],[10,0],[18,5],[5,0],[9,4],[8,7],[6,3],[10,-1],[9,5],[7,0],[7,2],[1,5],[-3,3],[0,5],[4,5],[3,2],[9,0],[7,-5],[6,0],[1,-3],[-5,-3],[-3,-6],[6,-6],[5,-3],[5,0],[8,4],[7,-3],[3,-5],[0,-7],[1,-4],[5,3],[3,8],[-1,10],[0,6],[12,9],[5,8],[-9,1],[-5,-1],[-4,3],[-3,7],[10,6],[11,0],[7,-5],[14,-8],[8,0],[8,-1],[1,2],[-3,12],[1,7],[-6,4],[-2,9],[2,9],[8,5],[9,2],[21,14],[6,3],[13,3],[16,1],[20,5],[36,-3],[9,-2],[6,-3],[6,-4],[7,-8],[11,-9],[14,-3],[4,-3],[5,-8],[-6,-5],[-4,-1],[-9,3],[-6,4],[-4,-2],[4,-5],[4,-4],[1,-4],[-2,-7],[-17,-13],[10,-4],[6,3],[6,6],[5,2],[4,1],[13,1],[7,2],[6,-2],[5,-3],[8,-4],[12,-4],[14,-14],[11,1],[6,3],[17,2],[15,-7],[8,-2],[24,-2],[15,-5],[9,5],[6,2],[13,1],[6,-1],[18,-5],[32,-6],[21,-2],[19,-1],[9,-2],[17,-2],[6,-3],[16,2],[8,2],[7,5],[4,-1],[2,-6],[-1,-10],[3,-7],[2,-7],[3,-6],[2,-5],[-1,-4],[-5,-3],[-6,-8],[0,-7],[3,-5],[-3,-5],[2,-7],[0,-5],[-2,-3],[-5,-3],[-8,0],[-5,-2],[0,-6],[2,-4],[5,-2],[1,-4],[-1,-7],[-2,-5],[-4,-3],[-5,-1],[-9,2],[-7,3],[-4,-3],[-3,-3],[-10,-8],[-4,-5],[-4,-6],[11,-3],[8,-5],[17,0],[5,3],[8,2],[3,0],[3,-6],[-2,-9],[0,-7],[-9,-19],[-2,-3],[-4,-5],[-5,-4],[-4,-2],[-8,-6],[-4,-11],[-5,-9],[-8,-15],[-4,-17],[-2,-10],[-2,-10],[-7,-18],[-4,-3],[-7,-7],[2,-5],[6,0],[7,-2],[8,-3],[12,7],[6,5],[2,10],[-2,9],[4,6],[9,8],[20,6],[5,0],[6,2],[6,7],[6,7],[9,5],[8,7],[1,5],[3,1],[10,5],[2,4],[3,2],[2,7],[1,12],[2,8],[5,12],[4,9],[4,5],[10,3],[4,3],[6,8],[3,4],[0,9],[2,8],[6,5],[8,10],[10,1],[7,5],[8,-4],[10,-4],[16,1],[7,-2],[6,3],[5,7],[2,8],[7,5],[6,0],[12,9],[12,8],[9,1],[8,7],[5,10],[6,8],[8,7],[2,13],[4,7],[9,6],[7,3],[30,10],[22,7],[24,8],[7,0],[9,4],[15,1],[4,0],[6,9],[11,9],[7,3],[9,7],[7,1],[11,-2],[8,-2],[8,0],[11,7],[18,1],[5,3],[4,2],[25,9],[9,-2],[14,2],[8,-1],[7,-1],[10,0],[16,3],[7,2],[14,8],[14,1],[7,2],[8,2],[6,-3],[5,-3],[3,0],[4,-1],[10,3],[8,0],[10,-4],[6,-2],[4,0],[6,2],[8,6],[7,2],[6,-1],[5,-3],[8,-3],[13,1],[12,1],[10,3],[8,3],[8,-5],[10,-2],[15,8],[5,-1],[4,-2],[3,-2],[4,-6],[15,1],[12,6],[11,4],[10,3],[9,4],[12,15],[0,4],[1,3],[3,1],[19,0],[6,1],[8,4],[14,-3],[13,-5],[4,1],[5,0],[9,-3],[11,-6],[9,-1],[38,-14],[22,-4],[11,-5],[3,-1],[3,-5],[6,0],[5,1],[6,-7],[14,-5],[16,-3],[10,4],[17,13],[5,5],[-1,12],[9,14],[15,7],[19,3],[12,3],[15,3],[7,-3],[4,-2],[6,-3],[7,-7],[10,-17],[8,-7],[7,0],[6,-1],[6,-4],[9,-12],[-5,-11],[-5,-4],[-19,-5],[-9,-3],[-7,-2],[-3,-9],[4,-5],[8,2],[9,1],[8,2],[6,3],[6,4],[14,2],[9,3],[9,2],[5,4],[6,0],[6,-4],[4,0],[13,-1],[6,3],[5,0],[5,-2],[5,-3],[6,0],[7,1],[10,5],[12,4],[12,2],[3,0],[2,-1],[-12,-6],[-18,-7],[-10,-7],[5,-3],[36,8],[16,6],[14,2],[3,2],[12,9],[4,3],[13,3],[16,3],[12,4],[9,4],[6,1],[5,-3],[6,-3],[6,0],[8,3],[5,8],[3,5],[6,2],[7,1],[6,-1],[10,-4],[7,-2],[5,-15],[14,-14],[5,-3],[12,1],[13,-5],[5,1],[5,1],[5,-1],[7,3],[7,17],[7,16],[7,7],[4,4],[5,1],[7,3],[11,1],[7,-1],[17,-1],[14,4],[15,-1],[8,5],[8,1],[11,-5],[3,-2],[6,-5],[2,-4],[1,-7],[3,0],[11,7],[5,1],[11,12],[6,-3],[12,-5],[5,-2],[10,-8],[5,2],[5,4],[12,-1],[12,-3],[4,-3],[6,-5],[4,-1],[3,1],[24,-2],[10,-3],[8,-5],[28,-2],[11,-5],[6,3],[13,-1],[5,-4],[5,-4],[10,-4],[5,1],[8,3],[8,4],[8,0],[3,-4],[2,-9],[5,1],[7,4],[5,-1],[2,-6],[-3,-9],[-7,-11],[-3,-9],[-6,-9],[1,-4],[6,-2],[6,6],[14,4],[6,6],[12,2],[12,-2],[8,-8],[16,-12],[0,-4],[2,-5],[-1,-4],[-2,-5],[8,-5],[7,-1],[6,1],[25,-6],[12,2],[10,0],[13,1],[10,0],[7,-1],[9,2],[8,2],[3,-1],[2,-14],[0,-8],[5,-3],[4,3],[3,4],[20,-2],[7,0],[8,-2],[7,-5],[8,2],[4,3],[6,2],[1,5],[1,9],[0,8],[3,1],[4,-1],[4,-4],[11,-12],[8,-8],[3,-4],[5,-3],[10,-8],[14,-3],[13,-6],[15,0],[13,-7],[8,6],[4,1],[6,-2],[8,-5],[6,-1],[20,-8],[12,-4],[4,-6],[5,-6],[0,-6],[2,-8],[13,-6],[4,-6],[6,-7],[11,-30],[6,-5],[8,1],[7,-8],[3,1],[0,3],[-7,20],[0,11],[5,6],[13,1],[10,-11],[9,-7],[6,-1],[12,0],[11,8],[8,-3],[14,-1],[18,-4],[8,0],[14,-1],[16,-7],[10,-2],[2,-2],[4,-4],[2,-5],[3,-5],[6,-5],[5,-1],[12,-5],[24,-13],[9,-4],[5,-3],[2,4],[1,7],[4,1],[5,-10],[5,-9],[2,-7],[-5,-5],[-7,1],[-6,0],[-5,-10],[-2,-16],[5,0],[3,1],[1,-6],[-2,-5],[-4,-2],[-8,4],[-9,3],[-11,1],[-9,5],[-4,0],[-4,0],[5,-6],[5,-4],[13,-4],[15,-6],[1,-4],[-4,-5],[-4,-10],[-15,-8],[-8,6],[-10,1],[-5,-3],[-9,0],[-20,-1],[-7,7],[-12,5],[0,-4],[10,-13],[11,-3],[11,-3],[3,-4],[-5,-3],[-7,1],[-8,-6],[-16,1],[-7,-1],[-5,-2],[-4,-1],[3,-2],[4,-6],[-5,-5],[-5,-3],[-5,1],[-6,-2],[-3,6],[0,12],[-3,11],[-3,1],[-6,-2],[-2,-9],[4,-16],[3,-5],[-2,-5],[-4,-1],[7,-14],[7,-9],[3,-3],[1,-5],[-3,-2],[-9,2],[-4,-1],[-4,1],[-8,2],[-7,0],[-6,-2],[-6,0],[-5,8],[-4,3],[-4,-3],[-3,-10],[-5,-3],[-6,-5],[-4,-5],[-2,-20],[-4,-4],[-5,0],[-4,-1],[-4,1],[-7,1],[-21,-6],[3,-4],[6,1],[18,-1],[8,-4],[2,-9],[3,-4],[6,-4],[5,-2],[2,-3],[-2,-6],[-3,-6],[-6,-6],[2,-3],[6,-1],[3,-13],[-4,-6],[2,-6],[0,-5],[-4,-4],[-3,-3],[-1,-5],[6,-3],[5,-1],[6,0],[5,-6],[6,-8],[4,-7],[0,-11],[4,-7],[8,-4],[0,-4],[5,-2],[5,0],[2,-4],[-1,-5],[-9,-6],[-4,-5],[9,0],[9,-5],[12,5],[6,6],[4,5],[3,-2],[0,-5],[4,-8],[15,-9],[8,-3],[8,-1],[8,0],[2,-5],[-3,-4],[-5,0],[-9,-1],[-7,4],[-5,3],[-41,-2],[-9,-1],[-11,-5],[-11,-3],[-17,-5],[-7,-3],[-19,12],[-6,9],[-2,0],[-5,-2],[0,-6],[9,-13],[4,-4],[0,-3],[-3,-2],[-3,0],[-6,3],[-9,2],[-9,-4],[-11,-9],[2,-6],[3,-3],[-1,-4],[-12,-7],[-4,-1],[-2,-1],[3,-3],[6,0],[1,-3],[-2,-3],[-11,-3],[1,-4],[6,-2],[7,1],[5,-3],[0,-5],[-5,-2],[-6,-2],[-39,-12],[-5,-3],[0,-4],[14,-2],[41,1],[2,-1],[-1,-3],[-2,-5],[2,-3],[6,-2],[1,-3],[-3,-1],[-7,-2],[-6,0],[0,-4],[9,-3],[3,0],[1,-12],[-1,-5],[-4,-3],[-2,-1],[0,-4],[12,-3],[18,-13],[5,0],[7,-2],[12,-7],[4,-4],[7,-2],[1,-3],[4,-2],[17,-9],[2,-4],[-35,-7],[-35,-6],[3,-4],[38,0],[10,-3],[5,1],[2,3],[21,4],[20,2],[7,-1],[28,-15],[13,-5],[8,-2],[6,0],[4,-2],[4,-5],[-1,-4],[2,-2],[3,-1],[6,-3],[6,1],[7,4],[5,-1],[10,-5],[-4,-3],[-2,-2],[-2,-3],[-3,-1],[-7,-1],[-4,0],[-4,1],[-1,-3],[5,-2],[8,-3],[48,-2],[13,-4],[14,2],[6,-1],[5,-1],[2,-5],[7,-1],[11,-4],[14,-2],[12,0],[15,-5],[7,0],[4,-3],[33,-1],[5,-2],[4,-4],[8,-2],[8,0],[47,-6],[17,-3],[4,0],[4,0],[13,-3],[12,-1],[6,-4],[-9988,-5]],[[3457,1545],[2,-1],[7,0],[2,-1],[1,-2],[1,-5],[-2,-1],[-13,1],[-4,2],[-2,0],[-5,-3],[-2,-2],[-8,-3],[-3,1],[-1,4],[0,1],[1,1],[0,1],[0,1],[2,3],[10,4],[13,2],[1,-2],[0,-1]],[[3442,1551],[-5,-6],[-3,0],[-5,4],[-2,3],[0,1],[4,3],[9,-1],[2,-1],[1,-2],[-1,-1]],[[3319,1557],[-1,-1],[-2,1],[0,-1],[1,-1],[-1,-1],[-2,1],[-2,3],[1,3],[2,0],[4,-4]],[[3260,1551],[-1,0],[1,2],[3,6],[6,3],[-1,-2],[-2,-3],[-6,-6]],[[3316,1580],[1,0],[12,1],[4,-4],[4,0],[-10,-7],[-3,2],[-1,2],[0,3],[-7,-1],[-2,1],[-3,-2],[-6,-1],[-2,0],[-2,2],[0,3],[5,0],[4,3],[1,3],[2,-1],[3,-4]],[[3350,1587],[-4,0],[-2,3],[-2,2],[5,0],[3,0],[1,-3],[-1,-2]],[[3365,1595],[-6,-2],[-3,2],[-1,1],[4,3],[2,-1],[1,0],[2,-1],[1,-2]],[[3389,1618],[4,-2],[3,1],[2,-1],[1,-3],[0,-1],[-5,0],[-4,-4],[-6,1],[0,-3],[1,-2],[-2,-1],[-4,3],[-3,-1],[-2,-5],[-1,-1],[-1,-1],[-1,2],[-3,0],[0,1],[-2,2],[-5,-2],[1,2],[7,7],[1,2],[7,4],[4,-1],[8,3]],[[3498,1653],[-2,0],[-1,2],[-1,1],[2,3],[2,3],[1,1],[0,-7],[-1,-3]],[[3467,1658],[-3,-2],[-2,2],[0,4],[-2,2],[1,2],[20,-2],[-1,-2],[-10,-1],[-3,-3]],[[3730,1698],[6,-2],[3,-2],[1,-2],[3,-1],[1,0],[0,-2],[1,-1],[0,-2],[-6,4],[-9,1],[-2,3],[-4,-2],[-1,1],[0,2],[1,3],[2,-1],[4,1]],[[6924,2358],[-2,0],[0,2],[0,2],[-1,2],[-1,2],[1,2],[2,0],[3,0],[1,-4],[-2,-4],[-1,-2]],[[6921,2355],[2,0],[2,0],[6,8],[1,0],[0,-6],[2,-2],[-2,-1],[-4,0],[-1,-3],[4,-4],[2,-1],[1,0],[3,1],[3,2],[3,3],[2,2],[5,0],[2,3],[1,1],[2,0],[2,-1],[1,-3],[1,-4],[0,-4],[-2,-3],[-2,-3],[0,-2],[-1,-2],[-1,0],[-1,1],[-2,3],[-2,2],[-4,0],[-3,-1],[0,-2],[-1,-2],[-1,-1],[-2,1],[0,-1],[1,-3],[2,-3],[3,-2],[3,0],[0,4],[2,0],[3,-1],[1,-3],[-1,-1],[-1,-2],[0,-2],[-3,-2],[-1,0],[-4,1],[-3,2],[-1,2],[-1,1],[-2,-3],[-2,0],[-4,2],[-3,3],[-2,1],[-4,1],[-2,-7],[-2,-3],[-4,0],[-1,0],[-1,3],[0,3],[1,3],[1,3],[0,3],[0,3],[-1,2],[1,4],[-2,3],[1,2],[2,2],[-1,1],[-1,1],[-1,2],[0,2],[0,4],[1,4],[0,4],[2,4],[2,5],[1,2],[2,0],[0,-1],[1,-3],[-1,-1],[1,-1],[1,-6],[-1,-2],[0,-2],[-2,-5],[0,-3],[4,-2]],[[6439,2509],[-2,-1],[-2,2],[-1,3],[3,2],[1,-1],[1,-2],[0,-3]],[[3285,6165],[-1,-2],[-3,1],[0,3],[0,2],[2,4],[2,-2],[1,-2],[0,-2],[0,-1],[-1,-1]],[[3284,6196],[0,-1],[-2,2],[-1,5],[0,2],[1,0],[0,-1],[2,0],[0,-2],[0,-5]],[[9412,2033],[-1,-3],[0,3],[2,11],[2,2],[-1,-6],[-2,-7]],[[9092,2684],[-1,-6],[-2,1],[-2,-1],[-2,4],[0,1],[2,-1],[1,2],[0,1],[1,1],[0,2],[1,3],[1,0],[1,-4],[0,-3]],[[9095,2693],[-2,0],[-1,1],[0,3],[-1,1],[0,1],[1,1],[0,2],[1,-2],[2,-7]],[[9113,2724],[-1,-1],[-1,0],[0,3],[0,2],[1,3],[2,-2],[1,-2],[-2,-2],[0,-1]],[[9028,2835],[3,-1],[2,2],[2,0],[2,-4],[2,-2],[1,1],[2,-1],[1,-2],[3,-2],[1,-2],[1,-2],[2,-1],[8,-6],[5,-2],[8,1],[2,2],[2,2],[1,-2],[2,-3],[0,3],[0,3],[2,2],[2,2],[3,0],[4,0],[1,2],[1,0],[2,-2],[2,-1],[1,2],[3,5],[1,2],[5,-1],[2,0],[2,5],[2,0],[5,-4],[2,-6],[0,-9],[0,-4],[1,-3],[0,-7],[-1,-7],[0,-5],[0,-5],[0,-10],[1,-6],[0,-5],[0,-2],[0,-2],[1,-2],[-1,-3],[1,-3],[-1,-2],[-1,0],[0,2],[0,3],[0,2],[-1,2],[-2,2],[1,1],[1,1],[-1,3],[-1,-2],[-1,-3],[1,-1],[-1,-1],[-2,-4],[-1,-5],[-1,-5],[0,-5],[-1,-4],[-1,-4],[0,-5],[0,-9],[1,-9],[1,-11],[-1,-1],[-3,-1],[-2,-2],[-2,6],[-2,6],[2,2],[2,-1],[1,1],[0,2],[0,1],[-3,3],[-4,2],[-1,-2],[1,-5],[-1,-2],[-2,-2],[-1,8],[-3,6],[0,-3],[1,-5],[0,-2],[-1,-3],[-1,-1],[0,-2],[0,-3],[-1,-5],[-2,-3],[-5,6],[0,-2],[0,-2],[3,-3],[-2,-2],[0,-3],[-2,-8],[-2,-6],[-1,-1],[-4,1],[-4,6],[-4,-1],[-6,1],[-4,-2],[-1,5],[-1,3],[1,1],[3,2],[3,0],[-1,2],[0,1],[-2,-1],[-4,2],[-3,-1],[-2,3],[-3,10],[-2,4],[-1,2],[-2,1],[-1,1],[-6,22],[-1,5],[-1,13],[5,-6],[2,-4],[1,-5],[2,6],[-1,2],[-4,8],[-1,2],[0,2],[-1,-2],[-2,-1],[1,5],[-1,6],[-5,11],[-3,10],[-4,13],[-1,2],[0,3],[-2,8],[0,7],[-1,5],[2,12],[0,6],[3,-3],[6,-3]],[[9117,2850],[-2,-4],[-1,3],[-1,1],[3,1],[1,-1]],[[9021,2851],[-1,-5],[-1,6],[1,1],[1,2],[0,-4]],[[9119,2862],[3,-3],[1,-4],[-2,-3],[-1,-1],[-1,4],[-3,-1],[-3,0],[-2,3],[-1,1],[2,1],[4,0],[3,3]],[[9110,2894],[5,-11],[3,-1],[0,-1],[0,-5],[-1,-2],[2,-2],[0,-2],[-3,-4],[-3,-1],[-1,1],[0,2],[-1,2],[-4,9],[1,3],[-1,3],[-2,0],[-1,2],[2,3],[2,6],[2,-2]],[[8997,2873],[-1,0],[0,3],[0,5],[-1,4],[0,5],[0,5],[1,2],[1,3],[1,4],[1,0],[3,-3],[0,-9],[0,-5],[1,-4],[-1,-4],[-2,-4],[-3,-2]],[[9036,2967],[1,-3],[0,-1],[-3,2],[-4,0],[3,4],[2,-1],[1,-1]],[[9040,2975],[-4,-4],[-1,2],[0,2],[0,2],[4,0],[1,-2]],[[8821,3125],[7,-1],[2,2],[4,-2],[2,-5],[-2,-3],[-1,0],[-5,2],[-5,-2],[-1,-2],[-1,-5],[-4,-3],[-2,3],[-4,2],[-2,-3],[-4,1],[-3,-1],[-4,0],[-5,6],[-1,3],[1,4],[2,4],[12,5],[7,4],[5,-1],[2,-1],[1,-2],[-1,-4],[0,-1]],[[9264,3604],[-2,-16],[-1,0],[-1,2],[0,10],[1,5],[3,-1]],[[9261,3610],[-1,5],[-1,6],[1,5],[1,1],[1,-1],[-1,-9],[0,-7]],[[8143,3683],[-1,-2],[-5,18],[-1,12],[1,2],[1,1],[3,-17],[1,-4],[0,-4],[0,-1],[1,-5]],[[9251,3701],[0,-2],[-2,3],[-1,10],[1,6],[2,5],[0,3],[-1,7],[4,7],[1,4],[1,4],[-2,5],[-1,2],[1,2],[1,2],[1,0],[1,0],[0,-10],[2,-4],[0,-5],[-6,-26],[-2,-9],[0,-4]],[[9198,3831],[1,-2],[1,0],[0,-4],[1,-4],[1,-3],[-1,-3],[-1,-1],[-1,2],[-5,12],[1,5],[3,-2]],[[9180,3898],[-1,0],[0,1],[0,2],[0,3],[1,-1],[1,-4],[-1,-1]],[[9164,3906],[-1,-2],[-1,4],[0,4],[1,2],[1,-6],[0,-2]],[[8206,3986],[-2,-4],[-2,1],[0,2],[1,4],[3,4],[0,-2],[0,-5]],[[9139,4015],[0,-1],[-1,0],[-2,1],[1,8],[1,-4],[1,-3],[0,-1]],[[9136,4023],[-1,1],[0,2],[1,2],[1,1],[0,-5],[-1,-1]],[[9062,4134],[1,-6],[1,-4],[0,-3],[-1,-2],[-2,2],[-1,5],[-2,4],[-1,3],[3,-1],[1,1],[1,1]],[[8873,4198],[-1,-1],[0,2],[1,3],[1,3],[2,-3],[0,-3],[-3,-1]],[[8874,4229],[-2,-5],[-1,1],[-1,-3],[-2,-1],[-1,0],[-2,-1],[-1,1],[1,5],[2,6],[1,3],[5,2],[4,2],[3,-6],[-4,-1],[-2,-3]],[[8807,4275],[-1,-3],[-1,3],[-1,3],[-1,1],[1,2],[0,1],[1,4],[1,-4],[1,-5],[0,-2]],[[8793,4284],[-1,-1],[-1,1],[0,2],[0,3],[2,0],[1,-1],[-1,-4]],[[8801,4284],[-1,0],[0,4],[1,3],[1,-5],[-1,-2]],[[8460,4297],[-1,-2],[-1,1],[0,2],[-1,2],[1,3],[0,1],[1,0],[0,-2],[1,-3],[0,-2]],[[8477,4344],[-2,-4],[-1,3],[1,6],[1,2],[1,-1],[0,-4],[0,-2]],[[8797,4389],[1,-3],[1,0],[1,6],[1,-1],[1,-1],[0,-3],[-2,-4],[-1,-2],[-1,-8],[0,-2],[1,-3],[2,-2],[2,1],[0,-4],[-1,-2],[-4,1],[-3,-1],[-5,3],[-3,0],[-1,1],[2,2],[1,3],[-1,7],[1,8],[3,4],[1,4],[2,3],[1,0],[0,-3],[1,-4]],[[8783,4388],[0,-1],[-3,1],[0,2],[1,2],[0,1],[2,4],[1,-3],[1,-5],[-2,-1]],[[8786,4516],[-4,-5],[2,6],[5,5],[1,1],[0,-2],[-3,-4],[-1,-1]],[[8623,4511],[2,-1],[1,-2],[1,-2],[0,-3],[-3,-1],[-5,4],[-5,-3],[-2,0],[-1,2],[1,6],[2,-1],[2,2],[-1,7],[-1,4],[3,6],[1,2],[2,0],[1,-5],[0,-5],[1,-5],[1,-5]],[[8627,4529],[4,-1],[5,4],[2,-1],[1,0],[3,4],[2,1],[1,3],[2,-3],[3,-4],[1,-4],[2,-2],[0,-1],[-2,-4],[0,-5],[-2,1],[-3,-8],[-9,-12],[-9,10],[-4,8],[-2,10],[-1,8],[-1,5],[1,1],[0,1],[1,0],[3,-6],[1,-1],[1,-4]],[[8794,4528],[-2,-3],[-1,3],[1,2],[3,8],[1,2],[1,1],[0,3],[0,5],[2,0],[-2,-10],[-3,-11]],[[8682,4533],[0,-1],[-2,9],[0,3],[-1,4],[2,1],[1,3],[0,-2],[0,-6],[1,-4],[-1,-7]],[[8976,4495],[0,-7],[-2,-5],[0,-3],[0,-5],[3,-3],[1,-2],[1,-6],[3,-8],[0,-6],[2,-7],[2,-13],[0,-12],[2,-9],[-1,-17],[1,-7],[1,-5],[2,-12],[1,-11],[2,-3],[4,-3],[4,4],[3,5],[3,1],[4,3],[3,-7],[2,-8],[8,-10],[4,-7],[3,-4],[3,-5],[0,-5],[-1,-4],[1,-6],[0,-7],[-1,-9],[3,-13],[0,-10],[3,-10],[-1,-10],[0,-4],[0,-6],[2,-7],[1,-6],[3,-6],[3,-8],[2,-2],[2,0],[0,-9],[4,-18],[2,-15],[-1,-20],[-2,-11],[1,-6],[5,-13],[3,-3],[-1,-6],[0,-10],[2,-8],[3,-6],[3,-4],[3,-2],[4,-3],[5,-1],[2,-5],[1,-3],[4,-1],[2,0],[2,2],[2,-3],[1,-3],[2,-8],[4,-9],[3,-1],[2,-5],[2,-1],[2,0],[3,-4],[5,-7],[5,-1],[2,-3],[4,-8],[2,-4],[2,-7],[-2,0],[-3,1],[-1,-7],[3,-9],[4,-6],[4,-7],[4,-9],[1,-7],[1,-3],[1,-10],[4,-6],[0,-11],[2,-15],[2,-13],[1,-4],[2,-7],[1,1],[2,2],[3,-6],[1,-3],[1,2],[-2,12],[1,7],[1,1],[2,0],[2,-6],[2,-6],[5,-5],[4,-6],[1,1],[-1,4],[1,6],[1,0],[1,-2],[3,-10],[0,-18],[1,-16],[1,-16],[3,-5],[1,-4],[3,-5],[2,-5],[2,-2],[7,-11],[3,-1],[3,-1],[4,-5],[2,-4],[4,-17],[2,-6],[4,-6],[2,-2],[3,-4],[1,-6],[0,-3],[2,-6],[2,-8],[4,-4],[4,-9],[0,-15],[2,-7],[1,-3],[3,-3],[1,-3],[-3,-19],[3,-39],[-2,-13],[3,-12],[5,-21],[1,-7],[1,-9],[3,-11],[0,-17],[1,-8],[0,-10],[-4,-11],[-3,-14],[0,-12],[-2,-23],[-2,-6],[-1,-10],[-4,-23],[0,-9],[0,-10],[0,-11],[-1,-7],[-1,-13],[-5,-20],[-6,-15],[-1,-11],[0,-5],[-2,-7],[-3,-6],[-3,-3],[-1,-4],[-2,0],[0,-2],[2,-1],[-1,-2],[-6,-4],[-4,-4],[-4,-12],[-2,-6],[-2,-5],[-1,-3],[-1,-3],[0,-7],[-3,-1],[-1,-2],[0,-7],[0,-8],[-1,-5],[-1,-4],[-1,2],[-1,-1],[-1,-2],[2,0],[1,-1],[-4,-8],[-4,-8],[0,-5],[-2,-6],[-1,-15],[-2,-8],[1,-6],[0,-1],[-1,0],[-2,-2],[0,-2],[0,-2],[1,-1],[0,-1],[-1,-1],[-2,0],[-1,-2],[-6,-22],[-2,-5],[-3,-9],[-1,-8],[-1,-9],[-1,-14],[-1,-10],[-2,-10],[0,-7],[-1,-14],[1,-10],[0,-6],[0,-5],[-1,-5],[-4,-1],[-2,-4],[-4,-6],[-3,-3],[-5,-2],[-10,1],[-19,-2],[-3,-2],[-7,-4],[-7,-7],[-7,-10],[-15,-25],[-11,-3],[-2,0],[-2,1],[-2,-2],[0,-3],[2,-3],[1,-3],[3,4],[1,-1],[0,-8],[0,-5],[-1,-3],[-1,-2],[-2,1],[0,3],[-2,7],[-3,5],[-2,2],[-2,-2],[-2,-2],[-2,7],[-2,7],[-3,0],[-2,0],[-2,3],[-4,4],[1,4],[1,3],[2,1],[-1,5],[-1,4],[-3,1],[-2,-1],[-1,-3],[-2,-5],[-6,-7],[-3,4],[-4,5],[2,0],[3,0],[3,5],[2,3],[1,7],[-2,4],[-2,4],[-2,3],[-10,-10],[-2,-2],[-2,-2],[3,-2],[2,1],[3,-3],[-4,-4],[-2,-1],[-4,-3],[-6,-7],[-8,-13],[-4,-4],[-4,-3],[-5,3],[-3,1],[-4,6],[-7,4],[-6,7],[-5,4],[-3,1],[-4,-2],[-8,7],[-5,0],[-4,-6],[-3,0],[-1,1],[-6,11],[-6,6],[-11,2],[-6,8],[-5,15],[-9,16],[-3,7],[-1,5],[0,5],[1,9],[2,9],[0,5],[-4,17],[-5,16],[-2,5],[-6,10],[-6,8],[-1,4],[-1,2],[3,-1],[1,4],[2,1],[2,-5],[1,0],[0,7],[1,3],[0,2],[-1,1],[-2,2],[-3,-3],[-2,-3],[-3,-2],[-1,-3],[-3,0],[-1,-1],[-6,-5],[-4,0],[-5,2],[1,7],[3,4],[2,5],[3,17],[-1,15],[-1,7],[-5,12],[-2,8],[-3,8],[-1,-5],[-1,-5],[-3,-7],[-1,-15],[-5,-24],[-4,-1],[-3,1],[-5,-2],[-3,-4],[-3,0],[-2,-1],[-3,1],[4,19],[3,-1],[4,1],[1,0],[3,0],[1,8],[1,10],[0,6],[-1,7],[1,7],[0,5],[5,18],[3,9],[5,7],[-1,6],[-1,9],[-1,6],[2,3],[2,4],[-2,18],[-1,6],[-3,5],[0,-7],[1,-7],[-3,-9],[-4,-6],[-3,-6],[-2,-14],[-4,-11],[-3,-4],[-2,-1],[-3,-2],[-4,-5],[-4,-4],[-3,-5],[-3,-2],[-9,-23],[-4,-8],[0,-3],[-2,-3],[0,-3],[2,-3],[1,-10],[-1,-2],[-1,1],[-4,6],[-2,-2],[-2,-3],[-5,11],[-1,2],[-3,4],[-2,4],[-2,0],[-1,0],[0,3],[1,2],[1,0],[2,-3],[3,-3],[1,0],[1,1],[-3,12],[-1,10],[-1,3],[-2,11],[-1,3],[-4,7],[-4,9],[-1,10],[-2,7],[-2,4],[-3,4],[-8,2],[-4,10],[-2,14],[2,0],[2,1],[0,4],[0,6],[-9,8],[-4,8],[-3,4],[-3,1],[-4,0],[-6,0],[-12,13],[-3,1],[-9,-5],[-3,1],[-14,18],[-9,9],[-3,1],[-4,2],[-3,-2],[-2,-2],[-5,-3],[-18,2],[-16,-3],[-10,-2],[-7,-2],[-11,-11],[-13,-10],[-11,-5],[-10,-7],[-7,-1],[-8,-1],[-18,3],[-6,-2],[-10,-12],[-3,-3],[-5,-4],[-14,-15],[-7,-3],[-4,-2],[-4,-3],[-3,-6],[-4,-19],[-3,-8],[-6,-14],[-4,-5],[-4,1],[-4,-5],[-4,5],[-3,1],[-5,0],[-18,-6],[-2,7],[-3,1],[-6,-1],[-9,2],[-17,-2],[-8,-3],[-3,-2],[-6,1],[-10,-2],[-3,-4],[-3,-3],[-5,-16],[-5,-5],[-5,0],[-5,-1],[-11,-15],[-10,-14],[-4,-2],[-4,-2],[-5,-1],[-3,-2],[-12,4],[-8,0],[-9,3],[-9,7],[-6,4],[-7,15],[-5,6],[-8,7],[-2,0],[-2,-2],[-3,5],[0,6],[-1,6],[0,14],[0,16],[3,-3],[3,-4],[5,0],[4,6],[2,10],[3,10],[-1,11],[-1,19],[1,4],[1,2],[1,10],[0,29],[-1,11],[-7,23],[-4,19],[-3,9],[-3,15],[-3,19],[0,10],[-1,19],[1,10],[-1,6],[-2,17],[-7,16],[-1,6],[0,6],[-1,7],[-5,14],[-6,12],[0,6],[-1,25],[-2,12],[-9,28],[-11,25],[-3,10],[-1,4],[1,0],[1,-1],[1,-3],[1,0],[1,2],[0,5],[0,3],[1,-2],[1,-5],[3,-14],[1,-7],[4,-2],[2,2],[1,3],[1,10],[-2,4],[-2,2],[-4,8],[-2,11],[-3,11],[0,4],[2,2],[2,-1],[2,-6],[3,-6],[-1,-10],[0,-3],[0,-2],[1,-2],[1,-2],[2,3],[1,5],[1,0],[1,-14],[2,-3],[2,-4],[3,3],[1,3],[0,9],[0,9],[0,7],[-6,17],[-6,22],[-3,11],[-3,17],[-2,5],[-2,9],[0,11],[0,7],[2,15],[1,8],[6,18],[0,8],[0,6],[1,9],[0,6],[-1,6],[-2,10],[3,18],[5,22],[1,3],[3,4],[1,-5],[-2,-16],[2,-8],[0,-9],[2,1],[2,2],[2,5],[1,5],[6,18],[3,7],[4,5],[8,6],[8,8],[4,8],[5,6],[3,8],[4,4],[16,19],[3,3],[4,1],[4,-1],[4,1],[4,-4],[3,-1],[8,5],[4,4],[7,9],[3,2],[8,3],[8,4],[10,15],[7,-1],[6,-1],[5,4],[12,3],[7,4],[12,10],[3,4],[5,7],[5,9],[4,12],[3,11],[1,6],[2,9],[2,7],[1,4],[5,4],[7,14],[3,3],[0,4],[-1,2],[-2,2],[-2,14],[-1,10],[0,7],[1,7],[2,10],[2,4],[3,5],[3,2],[2,4],[3,5],[1,4],[3,9],[2,7],[1,0],[3,-16],[2,-8],[3,-10],[3,-15],[3,-7],[1,-4],[1,-2],[1,2],[-1,4],[2,11],[-1,8],[0,3],[1,1],[1,-1],[3,-4],[1,-2],[1,1],[0,7],[1,4],[0,3],[-3,0],[0,4],[-2,5],[-2,3],[-3,7],[-1,3],[1,1],[2,0],[1,3],[1,4],[-1,7],[1,3],[2,-1],[4,-11],[1,1],[2,5],[2,1],[2,-1],[2,-3],[3,-3],[4,0],[2,-1],[5,1],[2,-1],[0,2],[-3,2],[-3,0],[-3,0],[-1,2],[-1,6],[1,4],[1,1],[2,0],[2,0],[0,5],[1,5],[1,4],[0,3],[-2,-1],[-2,-8],[-2,7],[-2,5],[1,8],[1,7],[2,1],[1,-1],[3,5],[1,3],[-1,3],[1,2],[1,-1],[7,-6],[1,-4],[1,1],[1,4],[-1,4],[-1,0],[-3,0],[-1,2],[0,2],[-1,5],[2,2],[2,1],[1,2],[0,2],[0,2],[1,-2],[4,-1],[3,-3],[1,-1],[1,2],[0,4],[-4,4],[0,4],[-2,5],[0,4],[3,4],[0,4],[2,1],[2,0],[2,3],[2,2],[1,7],[0,4],[1,2],[2,-2],[-1,-6],[0,-5],[0,-3],[1,0],[0,1],[1,4],[2,-2],[1,-3],[0,-4],[1,-1],[2,5],[2,2],[0,7],[0,5],[1,4],[1,2],[0,4],[-1,3],[0,5],[1,1],[2,-3],[1,-6],[1,-3],[1,2],[1,4],[2,2],[3,-3],[2,-5],[3,4],[3,8],[-1,5],[1,5],[3,2],[3,-2],[3,-5],[5,-4],[5,-5],[2,-4],[4,-6],[2,-6],[4,-11],[8,-13],[0,-2],[-1,-4],[-1,-6],[-1,-9],[0,-14],[1,1],[1,5],[1,-1],[2,-3],[0,3],[-1,2],[-1,6],[0,3],[1,3],[2,3],[2,2],[1,2],[0,3],[2,2],[3,1],[1,-1],[12,-6],[3,-5],[0,-8],[1,-2],[1,4],[0,10],[1,2],[3,-1],[2,-2],[3,-7],[1,-3],[1,-2],[1,3],[-1,4],[-1,5],[1,4],[4,1],[2,1],[-1,1],[-2,1],[-2,4],[-2,4],[3,4],[0,1],[-3,0],[-3,4],[-3,6],[2,10],[5,10],[2,4],[0,3],[2,6],[0,6],[1,4],[1,4],[3,4],[3,2],[2,1],[2,4],[1,5],[-3,9],[0,5],[1,5],[4,5],[2,11],[2,2],[3,-1],[1,1],[0,9],[1,4],[1,1],[2,-1],[1,-4],[2,-4],[1,2],[0,4],[0,5],[2,2],[2,0],[0,4],[0,3],[0,2],[5,0],[1,4],[1,3],[1,-2],[1,-6],[2,-4],[8,0],[5,2],[2,-1],[3,-2],[3,4],[2,2],[3,-3],[1,-3],[1,6],[2,3],[2,1],[3,-1],[1,1],[-3,5],[0,4],[0,7],[1,6],[1,5],[-6,9],[-5,1],[-4,-2],[-2,2],[-4,7],[-3,3],[0,2],[4,5],[1,-1],[3,-5],[1,-2],[1,1],[1,3],[1,2],[2,-1],[6,-8],[4,-8],[2,2],[3,5],[2,-1],[2,-3],[3,-10],[2,-4],[4,-2],[3,-2],[2,-3],[4,0],[7,-1],[6,-6],[3,-4],[3,-1],[2,-1],[3,-1],[6,5],[2,-5],[1,-2],[5,-6],[5,-1],[4,5],[5,4],[4,6],[3,3],[3,5],[1,0],[-2,-5],[-1,-3],[2,-1],[0,-1],[-3,-4],[-2,-5],[0,-3],[1,-2],[1,1],[2,2],[2,2],[2,-2],[1,-8],[1,-6],[3,0],[2,0],[2,7],[-1,6],[-1,2],[0,2],[5,10],[3,0],[2,-10],[3,-5],[3,0],[2,-1],[1,-7],[-11,-25],[-1,-2],[2,-5],[0,-5],[-3,-13],[-2,-1],[-1,4],[-2,2],[-2,-1],[-1,-1],[-7,-8],[0,-18],[2,-11],[-1,-7],[-2,-12],[-2,-5],[-2,-3],[-6,-17],[-2,-4],[-2,-6],[1,-6],[1,-4],[2,-4],[8,-9],[4,-7],[7,-7],[1,-6],[1,-4],[5,-5],[3,-3],[1,1],[1,1],[1,0],[0,-1],[0,-3],[0,-3],[0,-2],[3,-4],[4,0],[2,1],[2,-3],[2,-3],[4,-5],[6,-5],[5,-4],[6,-14],[4,-8],[5,-6],[7,-4],[4,0],[5,-4],[6,-3],[2,-6],[1,-5],[1,-4],[2,-9],[5,-3],[7,-10],[6,-4],[2,-2],[2,-3],[5,0],[8,5],[4,4],[5,8],[2,13],[2,10],[7,21],[2,11],[2,13],[1,9],[0,10],[1,17],[4,24],[1,8],[0,11],[-3,22],[1,8],[1,11],[-1,7],[-2,6],[0,7],[2,14],[1,8],[2,9],[-1,18],[3,7],[2,3],[2,0],[1,-2],[1,4],[-1,3],[-1,4],[-1,2],[-1,1],[-1,2],[-2,2],[0,8],[3,16],[2,6],[1,-2],[1,-3],[1,5],[-1,5],[3,15],[2,20],[1,19],[5,4],[2,5],[1,5],[3,0],[1,-2],[-1,-4],[0,-4],[5,-7],[1,-6],[1,-6],[1,-5],[0,-8],[0,-11],[1,-11],[1,-4],[2,-2],[2,0],[3,-2]],[[8951,4567],[-2,-3],[-2,2],[0,3],[0,2],[2,3],[2,-7]],[[8953,4597],[-2,-4],[-1,1],[-1,2],[1,3],[2,1],[1,-3]],[[8948,4599],[-1,-2],[-1,4],[2,4],[1,-2],[-1,-4]],[[5470,7983],[0,-1],[0,-2],[-1,-2],[-1,-4],[0,-3],[3,-11],[3,-7],[0,-2],[2,-2]],[[5476,7949],[-2,-3],[0,-3],[-1,-2],[0,-2],[0,-2],[0,-2],[1,-3],[-3,-1],[-3,0],[-1,0],[-1,-1],[-1,0],[-3,3],[-2,1],[-1,0],[-1,-1],[-1,-2],[-1,-1],[0,-1],[6,-3],[1,-4],[-1,-4],[-1,-1],[-1,-2],[-2,-1],[-2,0],[0,-2],[1,-5],[-1,-2],[-1,-1],[1,-5],[1,0],[1,-1],[-1,-2],[0,-2],[0,-2],[-1,-1],[-3,0],[-2,-2],[-5,-6]],[[5446,7883],[-1,-1],[-2,-3],[0,-5],[0,-1],[0,-1],[-6,2],[-3,0],[-3,-3],[-3,-1],[-6,0],[-6,-1],[-1,0],[-2,-1],[-1,-1],[-1,-2],[-2,-3],[-2,-2],[-2,-2],[-1,-1],[0,-1],[-2,1],[-1,0],[-1,1],[-4,1],[-5,1],[-2,1],[-3,1],[-2,1],[-3,0],[-1,0]],[[5380,7863],[-6,2],[-4,0],[-5,1],[-10,3],[-3,2],[-3,0],[-3,1],[-2,2],[-2,3],[-2,4],[-3,6],[-1,3],[1,3],[1,1],[0,1],[0,1],[-6,-3],[-5,-3],[-3,0],[-2,1],[-2,0],[-3,-1],[-5,0],[-3,-3],[-2,-4],[-1,-4],[-1,-1],[-2,0],[-3,0],[-2,1],[-2,3],[-3,0],[-2,1],[-1,0]],[[5290,7883],[0,2],[-1,4],[-2,1],[-5,-7],[-1,-1],[-4,2],[-3,3],[-1,3],[0,1],[-3,2],[-3,1],[-1,0]],[[5266,7894],[0,1],[0,2],[0,2],[-1,1],[0,2],[0,1],[0,1],[-1,2],[0,1]],[[5264,7907],[2,6],[1,5],[-2,2],[-1,1]],[[5264,7921],[1,1],[3,-1],[1,2],[1,1],[3,-1],[3,-3],[2,-2],[1,-1],[0,-1],[0,-2],[1,-1],[2,-1],[1,0],[-1,-3],[0,-2],[2,0],[2,2],[2,3],[0,3],[1,7],[0,1],[2,-1],[5,0],[2,-1],[4,0],[-1,-1],[1,-2],[2,-2],[0,-2],[2,0],[3,0],[1,1],[1,0],[2,0],[2,2],[1,2],[2,1],[3,3],[4,2],[13,2],[0,1],[0,4],[1,0],[1,-1],[3,0],[2,-2],[1,-1],[1,0],[2,1],[3,0],[2,-1],[1,-2],[0,-1],[0,-2],[0,-1],[2,-2],[3,-2],[1,0],[0,2],[1,4],[0,5],[0,2],[-2,1],[-1,0],[-1,1],[0,1],[1,3],[0,5],[-3,6],[-2,5],[0,2],[1,3],[3,2],[5,4],[1,1],[3,1],[3,2],[1,1],[1,2],[1,10],[1,0],[0,1],[5,-3],[1,0],[1,1],[1,2],[1,2],[0,4],[0,4],[0,1]],[[5383,7993],[1,-1],[2,-2],[2,-2],[2,-5],[4,-1],[5,0],[1,2],[2,1],[2,-1],[4,-1],[0,4],[2,5],[1,1],[3,0],[1,3],[0,9],[1,1],[2,0],[2,-2],[1,-1],[1,0],[1,1],[2,1],[2,-1],[6,-4],[3,-2],[1,0],[2,0],[6,-6],[5,-1],[4,0],[1,2],[2,2],[2,-1],[2,0],[3,-3],[1,-1],[2,0],[1,-1],[2,-5],[0,-1]],[[6280,7423],[-5,2],[-10,4],[-2,1],[-3,6],[-1,2],[-3,3],[-1,2],[-2,2],[0,3],[-2,3],[-2,4],[-4,11],[-1,2]],[[6244,7468],[-1,2],[0,1]],[[6349,7594],[2,-3],[5,-9],[6,-15],[1,-4],[1,-5],[1,-6],[2,-5],[6,-13],[3,-5],[4,-6],[2,-2],[2,0],[4,0],[4,-2],[1,-2],[2,-3],[2,-3],[1,-7],[-6,2],[-6,0],[-4,-2],[-3,-2],[-3,-3],[-2,-6],[-2,-14],[-3,-14],[1,-6],[1,-6],[0,-3],[-2,-1],[-1,-2],[-2,-13],[-1,-2],[-1,-2],[-1,2],[1,3],[-3,3],[-2,-3],[-1,-7],[-2,-7],[0,-1],[1,-22]],[[6357,7398],[-1,0],[-6,-2],[-1,0],[-5,10],[-1,1],[-2,1],[-1,2],[-1,2],[-1,2],[-5,6],[0,2],[0,1],[0,2],[1,1],[3,2],[2,1],[1,1],[1,1],[0,3],[-1,2],[-4,4],[0,2],[0,2],[0,2],[0,2],[4,3],[2,2],[-1,3],[-4,6],[-4,8],[-3,0],[-4,-3],[-5,-6],[-3,-2],[-4,-4],[-4,-5],[-3,-5],[-2,-4],[-4,-2],[-2,-4],[-6,-10],[-2,0]],[[6249,7562],[6,8],[2,1],[4,-1],[8,-5],[0,-3],[1,-2],[1,-2],[4,-2],[3,-1],[2,1],[2,1],[3,-3],[3,-3],[1,-1],[1,-1],[2,1],[3,5],[1,4],[0,3],[-2,3],[-3,4],[-3,3],[-2,3],[-2,5],[-1,1],[-1,0],[0,2],[0,3],[1,2],[1,1],[2,0],[1,2],[1,4],[1,2]],[[6289,7597],[3,-2],[0,-3],[1,-1],[1,1],[2,1],[2,-1],[2,-4],[3,-4],[2,-3],[0,-2],[2,-2],[2,-2],[2,-3],[1,-9],[2,-1],[5,-3],[2,-1],[6,-1],[2,1],[3,7],[2,7],[3,1],[4,4],[3,3],[1,4],[2,6],[2,4]],[[5848,5046],[0,-2],[-3,-11],[0,-1],[0,-1],[1,-2],[-1,-4],[0,-1],[0,-3],[0,-3],[0,-1],[2,-1],[3,-1],[2,-3],[2,0],[1,-2],[0,-3],[0,-3],[0,-5],[0,-4],[-3,-2],[-2,-2],[0,-1],[0,-1],[0,-2],[-3,-4],[-2,-6],[-1,-4],[-1,-4],[-1,-3],[-2,-4],[-2,-8],[-1,-6],[-6,-12],[-5,-7],[-1,-2],[-9,1]],[[5816,4928],[0,8],[-2,12],[-3,11],[0,4],[0,9],[0,12],[0,6],[0,5],[0,8],[0,5],[-2,6],[-2,6],[-2,3],[0,2],[0,2]],[[5805,5027],[1,3],[1,4],[1,0],[2,-1],[3,-3],[2,-7],[1,-1],[2,0],[5,1],[1,0],[3,1],[2,3],[1,3],[0,7],[1,12],[1,0],[3,-4],[1,0],[1,0],[1,2],[1,2],[1,0],[4,2],[2,-4],[1,-1],[1,0]],[[5158,8108],[0,1],[3,1],[2,-3],[3,0]],[[5166,8107],[0,-1],[3,-3],[1,-3],[3,-2],[-2,-3],[0,-1],[1,-2],[2,0],[2,-2],[0,-3],[0,-5],[-5,-5],[-1,-5],[-1,-1]],[[5169,8071],[0,2],[-1,0],[-3,0],[-3,-5],[-1,-4],[-1,-3],[-1,-2],[0,-2],[0,-2],[0,-1],[0,-1],[1,-3],[1,-2],[2,-5],[-1,-2],[0,-2],[-1,-1],[-1,-1]],[[5160,8037],[-2,0],[-3,0],[-2,-1],[-1,0],[-2,2],[-2,4],[-1,2],[-1,1],[-2,1],[-2,2],[-2,2],[-1,1],[-3,1],[-1,0],[-1,3],[0,4],[-1,2],[2,11],[-2,1],[-1,-1],[-2,-3],[-1,-3],[0,-2],[-3,-3],[-5,0],[-6,0],[0,1],[-1,1],[0,1],[1,1],[1,2],[0,2],[-1,2],[-1,1],[1,2],[0,2],[0,2],[-3,4],[-3,1],[-2,0],[-2,1],[-1,0],[-1,-2],[-1,-1],[-1,1],[-1,8],[-1,1],[-3,1],[-4,1],[-2,1],[0,4],[-1,4],[-1,4],[-1,1],[-1,2],[-3,-1],[-2,-2],[-2,-1],[-1,0],[-2,2],[-2,3],[-2,4],[-1,2],[1,3],[-1,2],[-1,3],[0,3]],[[5070,8127],[12,10],[7,5],[4,1]],[[5093,8143],[0,-5],[1,-1],[1,-2],[1,0],[1,2],[2,1],[3,-1],[2,-1],[1,-1],[1,-1],[2,-1],[4,3],[3,3],[1,2],[1,3]],[[5117,8144],[2,-2],[2,0],[1,0],[-1,4],[2,2],[2,1],[0,-2],[2,-1],[1,0],[4,4],[0,-1],[1,-2],[0,-1],[0,-1],[1,0],[3,0],[1,2],[1,1],[1,-1],[0,-2],[1,-4],[3,-4],[3,-1],[3,1],[2,1],[1,-1],[0,-2],[2,-2],[4,-2],[2,-1],[0,-1],[0,-3],[-2,-5],[0,-2],[0,-1],[0,-1],[-3,-3],[0,-2],[1,-2],[1,-2]],[[5099,5857],[-1,-3],[-2,-8],[0,-6],[5,-12],[0,-2],[1,-2],[1,-2],[0,-6],[1,-7],[0,-5],[2,-7],[0,-2],[-1,-10],[-1,-1],[-2,0],[-1,-1],[-1,-3],[-1,-3],[0,-2],[2,-6],[-1,-9],[-2,-6],[-2,-3],[-2,-1],[-1,-1],[-1,-2],[0,-6],[-3,-6],[-2,-4],[0,-3],[0,-7],[-1,-8],[-2,-6],[-4,-1],[-3,-1],[-2,-15],[0,-10],[0,-10],[0,-4],[0,-6],[0,-13],[-1,-10],[1,-2],[0,-6],[0,-7],[1,-4],[1,-4],[0,-1],[-1,-2],[0,-1],[0,-15],[0,-4],[0,-3],[-1,-2],[0,-7],[1,-5],[1,-4],[-1,-2],[-1,-4],[0,-10],[0,-3]],[[5075,5551],[-12,-3],[-13,-4],[-5,-2]],[[5045,5542],[-1,2],[5,2],[-1,8],[-3,9],[-1,2],[-1,4],[1,3],[0,2],[-1,6],[-1,7],[3,0],[0,21],[0,21],[0,17],[0,14],[-1,17],[0,12],[0,16],[-1,5],[-4,9],[-1,4],[0,6],[-1,6],[0,10],[0,13],[-1,2],[-4,5],[-6,9],[-4,6],[-1,0],[0,2],[0,19],[1,2],[2,8],[1,6]],[[5025,5817],[1,2],[1,3],[1,-1],[1,0],[1,1],[0,2],[0,2],[1,1],[0,3],[0,2],[1,1],[2,-1],[1,1],[1,1],[1,5],[1,2],[0,1],[1,1],[2,1],[2,-1],[1,-3],[7,3],[4,-2],[6,13],[2,3],[2,9],[1,3]],[[5066,5869],[1,6],[-2,11],[0,2],[3,2],[4,2],[1,0],[1,1],[1,2],[2,2],[2,0],[0,-1],[8,-14],[3,-7],[1,-4],[2,-3],[2,-2],[3,-3],[1,-6]],[[5006,6043],[-1,-3],[0,-5],[0,-7],[-1,-9],[2,-6],[3,-6],[1,-3],[-1,-6],[1,-3],[1,-6],[3,-8],[3,-8],[2,-1],[1,-1],[1,-1],[2,-1],[1,-1],[2,-2],[1,-2],[1,-4],[3,-4],[2,-3],[-1,-1],[-3,0],[-2,2],[0,-3],[0,-9],[0,-7],[0,-1],[3,-1],[6,-10],[5,-9],[2,-2],[3,-1],[3,-1],[2,1],[3,5],[2,0],[1,0],[1,-1],[1,-3],[2,-6],[0,-4],[0,-2],[0,-1],[-3,-1],[-1,-1],[0,-1],[0,-3],[1,-2],[2,-8],[5,-11],[1,-3]],[[5025,5817],[-8,-1],[-2,-1],[-2,0],[0,1],[0,1],[-9,4],[-6,3]],[[4998,5824],[-7,3],[0,-3],[-1,-2],[-1,0],[-1,1],[-1,-2],[-1,-3],[-2,-2],[-1,-1],[-1,-2],[-1,0],[-1,4],[-2,0],[-4,0],[-1,0],[-2,1],[-6,-1],[-8,2],[-2,-1],[0,-1],[-8,0],[-9,0],[-8,0],[-7,0],[-2,0],[0,-1],[-2,-14],[0,-8],[1,-5],[1,-3],[1,-1],[0,-2],[-1,-2],[0,-3],[1,-2],[1,-2],[-1,-3],[0,-6],[1,-10],[0,-7],[-1,-3],[1,-5],[1,-7],[1,-3]],[[4925,5730],[-1,-1],[-1,-2],[-2,0],[-1,4],[-1,2],[-1,4],[-1,5],[-2,2],[-1,2],[-2,5],[-2,3],[-2,-1],[-3,1],[-5,1],[-6,0],[-2,-1],[-3,-2],[-6,-5],[-2,-2],[-2,-6],[-2,1],[-2,1],[-1,3],[-3,-1],[-3,3],[-2,5],[-2,1],[-3,4],[0,6],[-2,5],[-1,7],[-2,3],[-3,1],[-3,0],[-2,2],[-2,4]],[[4846,5784],[1,4],[0,4],[0,5],[1,7],[0,9],[-1,7],[2,2],[2,3],[1,4],[2,10],[0,8],[0,4],[-1,2],[0,4],[-1,4],[1,4],[1,4],[2,3],[2,1],[3,2],[5,2],[3,2],[2,3],[1,2],[1,4],[2,3],[1,3],[1,9],[0,5],[-1,3],[-1,3],[7,7],[0,5],[-1,5],[-1,5],[-1,3],[2,5],[2,3],[1,3],[3,5],[3,1],[2,-2],[8,-10],[2,-1],[1,1],[2,3],[3,2],[1,7],[0,10],[0,4],[2,1],[4,-2],[1,0],[2,1],[0,2],[0,3],[0,3],[2,9],[2,7],[6,9],[1,2],[2,1],[10,-6],[1,1],[3,15],[2,2],[3,0],[2,1],[1,2],[5,5],[8,8],[4,3],[1,2],[3,5],[4,7],[3,1],[4,0],[2,-1],[0,-2],[1,-1],[5,3],[7,-4],[6,-4]],[[7553,6423],[-1,-1],[-1,2],[0,2],[0,8],[1,1],[1,0],[0,-2],[1,-5],[-1,-5]],[[7551,6441],[-1,-4],[0,3],[0,4],[1,3],[1,-3],[-1,-3]],[[7531,6461],[-3,-4],[1,24],[2,-9],[1,-5],[-1,-6]],[[7542,6473],[-1,-2],[-1,2],[-2,5],[1,7],[1,1],[0,-2],[2,-5],[0,-4],[0,-2]],[[7521,6456],[-5,-2],[-2,1],[4,15],[0,7],[-1,5],[-2,5],[0,3],[-1,4],[-1,5],[3,2],[2,-3],[0,-2],[1,-4],[1,-4],[3,-9],[0,-6],[-1,-13],[-1,-4]],[[7517,6506],[1,-2],[-2,1],[-1,2],[-1,2],[1,2],[2,-5]],[[7571,6450],[0,-2],[0,-20],[0,-8],[1,-6],[0,-3],[-1,-2],[-1,3],[-2,2],[-3,3],[-1,2],[-1,-1],[-2,-4],[-1,-4],[0,-5],[1,-5],[1,-3],[0,-3],[1,-5],[0,-3],[1,-5]],[[7564,6381],[-1,0],[-1,6],[-2,5],[-4,11],[-1,20],[0,10],[-3,11],[-1,16],[-1,4],[1,5],[0,2],[-2,-3],[-2,6],[-1,6],[-4,12],[-2,5],[0,5],[-2,-5],[-2,-4],[-3,-5],[-2,-2],[-5,-1],[-4,8],[-5,17],[0,4],[0,10],[-1,10],[0,5],[0,4],[-1,-1],[0,-2],[0,-4],[0,-3],[-4,0],[-4,2],[3,-5],[4,-1],[2,-5],[0,-4],[0,-4],[-2,-3],[-2,-1],[1,-4],[2,-5],[-3,-1],[-1,-3],[0,-5],[2,-4],[0,-2],[0,-3],[1,-3],[2,-6],[0,-4],[0,-6],[-1,-2],[-2,-3],[-4,-7],[-2,-9],[-1,-4],[-2,-1],[-1,2],[-2,2],[0,5],[1,3],[3,8],[-2,-1],[-2,-2],[-3,-5],[-1,6],[-1,5],[0,6],[3,9],[-3,-5],[-1,-5],[1,-7],[-1,-5],[-1,-6],[-1,-4],[-3,-2],[-1,-4],[-2,-2],[0,5],[0,7],[-2,17],[0,-4],[0,-10],[0,-7],[-1,-5],[-3,-6],[-2,-1],[-1,1],[-2,4],[-2,5],[0,8],[-1,4]],[[7473,6456],[0,6],[0,5],[-2,13],[-2,7],[0,3],[0,1],[0,9],[-1,5],[-1,6],[2,8],[0,2],[-3,1],[-2,1],[-1,2],[1,9],[-1,3],[-2,3],[0,2],[-1,1],[-1,4],[2,9],[2,10],[1,4],[0,7],[0,2],[0,3],[-2,3],[-4,1],[-3,3],[-2,3],[-1,2],[-2,-1],[-2,1],[-2,4],[-2,4],[1,2],[0,3],[3,12],[1,0],[2,-2],[1,0],[2,5],[2,13],[4,0],[3,-1],[1,-1],[2,1],[2,1],[2,2],[0,2],[0,2],[-3,2],[-1,2],[0,5],[-1,2],[-5,0],[-2,3],[-2,2],[-2,7],[-3,5],[-3,1],[-1,2],[-1,3],[0,4],[1,3],[1,4],[2,6],[3,4],[1,3],[2,4],[0,1],[0,3],[-2,2],[-1,0],[0,1],[1,4],[1,0],[3,-3],[3,-5],[2,-4],[0,-4],[1,0],[1,-1],[2,-1],[2,0],[1,-1],[1,1],[0,2],[-1,3],[-1,2],[1,2],[1,1],[1,-1],[1,-2],[1,-4],[0,-6],[3,-6],[3,-3],[2,-2],[2,-2],[3,2],[1,4],[-1,3],[1,3],[1,2],[1,0],[1,-3],[3,-13],[0,-6],[0,-16],[0,-11],[0,-2],[0,-2],[1,0],[1,0],[3,-2],[4,-3],[3,-2],[5,-1],[4,0],[1,0],[4,0],[8,1],[7,0],[3,-2],[2,0],[8,1],[8,1],[4,-4],[5,-5],[3,-4],[0,-3],[0,-2],[-1,-1],[-2,0],[-3,3],[-1,-1],[0,-6],[-1,-5],[-2,-11],[0,-5],[-1,-2],[-2,0],[-2,-1],[0,-2],[-1,-4],[-1,-4],[0,-1],[-3,2],[-1,0],[-1,-1],[-2,-2],[-1,-3],[-1,-1],[-4,1],[-1,0],[0,-2],[-1,-3],[-3,-5],[-1,-9],[-1,-6],[1,-5],[2,-12],[2,-15],[0,-2],[1,0],[0,3],[0,4],[1,1],[1,-1],[1,-3],[1,-6],[1,-3],[2,-1],[2,2],[2,3],[1,3],[-1,6],[0,4],[1,4],[4,7],[0,2],[0,5],[0,5],[1,0],[2,0],[2,2],[1,0],[1,-3],[2,1],[1,-11],[1,-10],[0,-4],[0,-10],[1,-9],[1,-1],[1,-5],[1,-5],[0,-3],[1,-9],[1,-6],[0,-21],[1,-4]],[[5793,7703],[0,-14],[-3,-6],[-4,2],[-5,-2],[-3,-7],[-1,-2],[-2,-3],[-1,-9],[0,-16],[-2,-2],[-2,0],[-7,-14],[4,-4],[2,-3],[3,-8],[5,-9],[1,-5]],[[5778,7601],[-4,1],[-1,0],[-1,-2],[-2,1],[-2,0],[-2,-2],[-2,-1],[-1,2],[-3,4],[-2,4],[-2,0],[-1,-1],[-5,-1],[-1,-2],[-3,-2],[-2,0],[-3,-1],[-2,0],[-1,-1],[-1,-3],[-1,-3],[0,-1],[-4,-1],[-1,-2],[-1,-2],[1,-1]],[[5731,7587],[-4,1],[-2,-1],[-1,-1],[-1,-2],[1,-2],[1,-2],[1,-5],[0,-5],[-1,-2],[-2,-2],[-3,-3],[-4,1],[-2,-1],[-3,0],[-2,0],[-5,-2],[-3,-2],[-3,5],[-4,2],[-4,2],[-2,-1],[0,-1],[-4,4],[-1,1],[-1,1],[-2,5],[-3,-2],[-3,1],[-1,0],[-5,0],[-1,-4],[-1,0],[-1,-1],[-2,1],[-3,-3],[-4,-1],[-3,0],[-3,0],[-1,0],[-4,0],[-2,-4],[-4,0],[-3,1]],[[5636,7565],[0,1],[1,14],[1,7],[0,1],[0,1],[-1,1],[-1,3],[-2,10],[-1,1],[-3,2],[-3,3],[-3,3],[-4,9]],[[5620,7621],[2,1],[1,2],[2,4],[0,3],[0,1],[-1,2],[-1,5],[0,5],[0,2],[0,3],[1,2],[1,2],[1,1],[4,0],[3,6],[1,2],[2,3],[1,1],[0,3],[1,2],[-4,4],[-1,3],[-1,3],[-2,2],[-4,4],[-2,3],[0,5],[-1,4],[-1,2],[-1,2],[0,3],[0,4],[1,6],[0,3],[2,0],[3,3],[0,5],[1,2],[1,2],[1,1]],[[5630,7732],[2,-3],[5,-4],[2,-2],[0,-2],[-1,-2],[-2,-2],[-1,-2],[-1,-3],[1,-2],[1,-1],[9,2],[8,-1],[12,-4],[7,-1],[6,1],[11,-3],[9,-3],[10,-1],[5,3],[4,3],[3,6],[8,8],[7,4],[10,4],[7,1],[1,-1],[8,-8],[4,0],[3,-1],[1,-2],[1,0],[4,1],[2,-4],[3,-5],[4,-3],[5,-2],[1,0],[4,0]],[[6405,6675],[-1,-5],[-1,2],[-2,7],[1,6],[-1,7],[0,3],[3,1],[1,-1],[-1,-2],[1,-4],[0,-8],[0,-6]],[[2971,6404],[-1,-4],[-3,-8],[-6,-2],[-7,0],[-1,2],[0,2],[0,3],[0,1],[0,1],[3,2],[1,3],[3,1],[4,-3],[1,0],[3,3],[2,6],[2,0],[-1,-7]],[[2974,6423],[-3,-3],[-1,3],[2,3],[2,-3]],[[2971,6476],[2,-1],[4,-2],[2,-2],[0,-1],[-1,-2],[-3,4],[-3,0],[-3,0],[-2,1],[1,4],[3,-1]],[[2938,6463],[-2,-1],[1,3],[4,5],[2,4],[1,2],[0,1],[2,1],[1,3],[0,3],[-2,4],[0,2],[0,2],[3,1],[0,-3],[1,-8],[-4,-10],[-3,-3],[-4,-6]],[[2943,6493],[0,-1],[-2,-3],[-4,3],[-1,3],[-1,2],[1,2],[2,-1],[1,-3],[4,-2]],[[2921,6502],[0,-1],[-4,12],[-4,2],[-3,3],[1,2],[1,0],[1,4],[-1,4],[-2,8],[-2,5],[0,2],[0,4],[2,-7],[2,-6],[1,-6],[2,-11],[3,-3],[3,-5],[0,-7]],[[2898,6534],[-1,0],[-2,2],[-5,7],[-2,0],[0,4],[2,-1],[4,-6],[1,-3],[3,-3]],[[2932,6570],[-2,-6],[-1,0],[1,8],[1,1],[1,0],[0,-3]],[[2843,6581],[0,-2],[-3,-3],[2,-3],[2,6],[1,-5],[1,-9],[0,-1],[0,-1],[0,-2],[0,-2],[-1,-8],[-6,1],[0,6],[-1,1],[-1,9],[-2,3],[-2,8],[1,2],[2,-1],[1,1],[3,1],[1,1],[2,-2]],[[2908,6578],[0,-3],[-2,0],[-3,-1],[-1,0],[1,2],[2,3],[0,2],[-2,4],[-3,9],[-1,3],[-1,3],[-2,4],[0,2],[1,0],[1,-1],[4,-13],[0,-1],[6,-13]],[[2851,6625],[-3,-2],[-2,2],[-1,0],[1,2],[2,1],[4,1],[1,-2],[0,-1],[-2,-1]],[[2840,6607],[0,-7],[0,-5],[0,-2],[-3,-4],[-1,-2],[-2,-2],[-2,-2],[-1,4],[-2,3],[0,5],[-1,-2],[-2,1],[-3,4],[-2,4],[3,1],[0,-3],[2,4],[0,2],[-1,0],[0,4],[3,9],[1,6],[-2,10],[2,0],[3,-3],[2,-3],[0,-5],[1,-4],[2,-8],[3,-5]],[[2871,6652],[4,-7],[4,-2],[4,-8],[2,-3],[0,-3],[0,-12],[-1,-7],[0,-6],[-1,1],[-1,5],[-2,2],[0,1],[3,1],[0,6],[1,5],[0,6],[-3,6],[-3,5],[-3,1],[-4,6],[-2,0],[-2,-1],[1,3],[0,5],[1,0],[2,-4]],[[2819,6723],[4,-1],[2,0],[1,1],[5,0],[4,1],[0,-3],[0,-1],[-8,-2],[-8,-4],[-5,-3],[-2,-1],[-1,2],[-5,9],[1,-1],[4,-5],[2,1],[2,3],[1,3],[-1,1],[1,4],[3,-4]],[[2855,6676],[-1,-1],[-2,6],[-2,2],[3,4],[1,3],[0,8],[1,4],[-1,4],[1,4],[-1,4],[-2,3],[-5,13],[-8,3],[-4,0],[2,3],[2,-1],[3,-1],[4,-1],[2,-3],[3,-6],[2,-2],[0,-1],[0,-1],[1,-2],[2,-2],[3,-4],[1,-11],[-4,-6],[0,-16],[-1,-3]],[[5527,7768],[1,0],[3,2],[3,1],[2,-1],[1,-1],[0,-1],[0,-5],[-2,-5],[-2,-5],[-2,-4],[0,-3],[0,-4],[0,-3],[0,-2],[0,-1],[3,-2],[3,-3],[2,-4],[3,-5],[1,-1],[0,-2],[-1,-2],[-2,0],[-3,0],[-1,1],[-1,-1],[-1,-1],[0,-1],[3,-6],[4,-8],[0,-3],[0,-3],[-1,-2],[-2,0],[-1,2],[-1,0],[-2,-1],[-1,-3]],[[5533,7691],[-1,0],[-2,0],[-1,-1],[-1,1],[-1,1],[-1,-1],[0,-2],[1,-3],[1,-5],[0,-4],[-1,0],[-2,3],[-1,1],[-1,-1],[-3,-3],[-2,-3],[0,-2],[-1,-3],[0,-1],[0,-6],[-4,-1],[-1,-1],[0,-1],[0,-7],[0,-4],[3,-6],[0,-2],[-1,-1],[-1,-3],[-1,-1]],[[5512,7635],[-3,2],[-1,0],[-5,6],[-2,3],[-4,3],[-2,3],[-1,3],[-2,1],[-2,-1]],[[5490,7655],[-2,2]],[[5488,7657],[2,1],[0,1],[0,2],[-1,2],[-6,9],[-3,6],[-1,2],[0,6],[0,2],[-5,2],[-5,8],[-5,7],[-1,2],[-3,6],[-3,5],[-3,4],[-2,3],[-2,6],[-1,7],[-1,7],[-1,3],[-2,1],[-4,8],[-4,5],[0,5],[0,9],[1,10],[1,1],[2,1],[2,0],[2,-1],[3,-7],[2,-3],[2,-1],[2,3],[3,6],[2,3],[7,-1],[3,5],[6,-6],[3,-1],[1,1],[2,-1],[4,-2],[1,0],[1,0],[3,2],[1,0],[3,-5],[2,0],[2,2],[1,2],[4,-1],[3,0],[1,0],[2,0],[2,-1],[2,-1],[5,-1],[2,-3],[1,-3],[0,-1],[0,-2],[2,-2],[3,-1],[1,0]],[[3254,6213],[0,1],[-1,1],[0,1],[2,-1],[0,-1],[-1,-1]],[[5781,8418],[4,-5],[1,-1],[2,2],[1,0],[4,1],[2,-2],[1,-4],[2,-2],[1,-1],[5,3],[2,2],[1,0],[6,-4],[2,-1],[1,-2],[0,-2],[-1,-2],[0,-3],[1,-4],[2,-2],[4,4],[2,1],[2,0],[2,2],[1,2],[2,0],[3,0],[5,0],[6,-3],[1,-1],[3,-4],[1,-2],[1,-1],[2,-1],[2,-2],[2,1],[0,-1],[1,-1],[0,-3],[0,-7],[-1,-3],[-1,-1],[-1,-2],[0,-1],[2,-3],[2,-5],[1,-3],[0,-2],[-3,-7],[-1,-1],[-1,-3],[0,-3],[0,-2],[5,-5],[4,-3],[1,-1],[0,-1],[-2,-5],[0,-2],[3,-2],[1,-3],[2,-6],[3,-6],[6,-4],[5,-4],[0,-1],[1,-2],[-1,-4],[-1,-4],[-1,-3],[2,-1],[5,0],[6,0],[7,-6],[0,-2],[-1,-2],[1,-2],[0,-2],[6,-6],[1,-1],[0,-3],[0,-2],[-2,-1],[-2,0],[-3,-3],[-1,-3],[-5,-5],[-3,-2],[-2,0],[-6,1],[-2,2],[-1,2],[-2,1],[-3,0],[-4,0],[-1,-1],[0,-2],[-2,-5],[-1,-3],[1,-1],[1,-3],[3,-4],[2,-4],[1,-2],[0,-2],[-1,-2],[0,-4],[3,-5],[-1,0],[0,-7],[0,-6],[0,-2],[2,-1],[1,-2],[2,-6],[0,-1]],[[5882,8185],[-6,0],[-6,0],[-3,-3],[-2,1],[-2,0],[-3,-1],[-4,-6],[-2,-3],[-3,-5],[0,-2],[-2,-5],[-1,-5],[0,-4],[1,-4],[1,-3],[0,-3],[-1,-2],[-1,-3],[-3,0],[-3,3],[-1,4],[-2,3],[-2,2],[-2,0],[-5,-1],[-5,-1],[-5,-1],[-2,-1],[-3,-2],[-2,2],[-2,5],[-1,5],[-1,2],[-1,0],[-1,0],[-2,-1],[-1,-2],[-1,0],[-2,-2],[-2,-1],[-1,-5],[-2,1],[-1,1],[-1,5],[-2,1],[-3,0],[-4,1],[-3,1],[-1,0],[-2,-2],[-1,0],[-5,1],[-1,0],[-1,-3],[-1,-3],[-1,0],[-1,1],[1,4],[-3,2],[-4,0],[-3,0],[-1,0],[-1,1],[-4,8],[-2,0],[-3,0],[-5,1],[-6,2],[-3,0],[-1,2],[-4,1],[-9,3],[-4,1],[-6,0],[-9,0],[-5,0],[-3,-1],[-3,-1],[-5,-1],[-2,1],[-3,-1],[-4,-1],[-1,-1],[-1,-4],[-4,-6],[-4,-5],[-1,0],[-3,2],[-2,1],[-2,0],[-2,0],[-1,-2],[0,-4],[0,-1]],[[5655,8151],[-2,6],[0,5],[1,3],[2,3],[-1,4],[1,5],[0,4],[0,2],[-1,2],[-3,2],[-1,2],[-4,2],[-3,3],[-1,1],[0,2],[1,1],[3,6],[3,5],[2,2],[10,6],[1,2],[1,4],[0,3],[0,5],[-1,7],[-1,5],[-2,9],[-5,19],[-3,20]],[[5652,8291],[2,-2],[5,0],[4,1],[2,1],[1,-1],[3,1],[2,0],[2,-1],[2,-2],[4,2],[4,3],[4,0],[1,1],[1,7],[1,1],[5,0],[2,1],[2,3],[3,3],[2,0],[3,2],[1,-2],[1,-2],[-1,-3],[0,-1],[2,-1],[3,0],[2,1],[0,1],[0,3],[0,2],[-2,2],[-2,1],[-2,0],[0,1],[1,3],[1,5],[2,4],[1,2],[0,1],[0,3],[0,4],[2,7],[2,5],[3,2],[3,1],[3,2],[1,3],[0,2],[1,2],[1,1],[8,-1],[2,4],[0,2],[2,1],[1,1],[0,2],[-2,0],[-6,1],[-1,1],[1,2],[1,5],[1,5],[1,5],[0,2]],[[5738,8390],[1,1],[4,1],[1,1],[4,6],[3,1],[7,-2],[3,0],[1,0],[3,0],[1,0],[1,6],[2,2],[5,8],[4,3],[2,1],[1,0]],[[2559,6187],[-2,-8],[0,3],[1,6],[1,2],[1,2],[0,2],[1,-1],[0,-2],[-2,-4]],[[2557,6216],[-2,-1],[1,3],[1,3],[1,8],[1,0],[1,0],[-3,-13]],[[2530,6099],[-1,0],[-5,1],[-3,-1],[0,15],[1,22],[0,16],[0,16],[0,12],[1,16],[0,14]],[[2523,6210],[0,5],[1,4],[2,2],[3,-4],[1,-1],[1,0],[2,3],[2,6],[4,12],[2,9],[1,2],[3,0],[2,0]],[[2547,6248],[-1,-7],[1,-1],[1,1],[4,0],[1,-7],[0,-6],[-3,-16],[-1,-6],[-1,-8],[2,-5],[-2,-7],[-1,-5],[0,-7],[1,-13],[-1,-19],[-3,-8],[-2,-4],[-2,-8],[-4,-2],[-5,-14],[-1,-3],[0,-4]],[[3202,7044],[-3,-2],[-1,0],[0,1],[2,2],[3,4],[-1,-5]],[[3384,4022],[1,10],[-1,8],[0,2],[-9,10],[-7,9],[-10,12],[-12,0],[-13,-1],[-13,-5],[-12,-5],[-5,-3],[-12,-4],[-7,-3],[-2,-9],[-2,-14],[-3,-9],[-3,-8],[-4,-13],[0,-14],[0,-15],[-3,-19],[-3,-17],[-2,-17],[-2,-11],[-1,-3]],[[3133,3869],[-4,-2],[-7,-2],[-3,0],[-2,1],[-1,1],[-2,2],[0,2],[0,4],[0,5],[0,8],[-2,9],[0,3],[0,5],[-1,8],[-2,5],[-1,7],[0,6],[-2,8],[-1,9],[0,9],[-3,10],[-3,10],[-3,2],[-1,1],[0,3],[0,5],[0,2],[2,5],[0,1],[0,1],[-6,6],[-1,2],[0,3],[0,2],[1,2],[1,2],[-2,5],[1,4],[-1,2],[0,2],[1,1],[3,1],[1,5],[0,3],[0,3],[-4,7],[0,1],[4,9],[2,6],[1,2],[0,1],[-1,1],[-1,3],[-2,2],[-2,3],[-2,5],[-3,4],[-2,4],[-1,3],[0,4],[0,5],[-2,9],[0,6],[-1,7],[0,4],[-1,5],[0,4],[-1,4],[1,2],[1,2],[-1,1],[-5,5],[-1,1],[-1,10],[-4,9],[0,6]],[[3069,4175],[0,1],[0,2],[0,4],[-2,3],[-1,3],[-1,2],[1,3],[3,6],[2,1],[0,2],[1,3],[4,8],[1,5],[2,3],[3,2],[0,2],[0,6],[0,4],[1,2],[2,3],[2,2],[0,1],[0,1],[-2,3],[-3,3],[-3,-1],[-1,3],[-1,2],[-5,23],[-1,6],[0,2],[4,12],[1,4],[2,5],[0,2],[-4,10],[-1,4],[0,4],[0,6],[2,2],[1,5],[1,4],[0,1],[2,3],[1,3],[2,3],[1,3],[0,6],[1,2],[2,2],[1,2],[-1,4],[-1,5],[-1,2],[-2,11],[-1,6],[1,2],[1,3],[0,5],[1,7],[0,24],[0,5],[1,3],[2,4],[1,2],[2,2],[0,5],[1,2],[1,4],[-4,13],[-3,12],[-3,11],[-4,13],[-2,8],[-3,10],[-3,9],[-3,13]],[[3067,4553],[3,0],[7,0],[6,-2],[4,-1],[2,-2],[0,-3],[2,-2],[1,1],[2,0],[3,3],[3,2],[2,3],[1,2],[3,9],[3,4],[2,2],[4,1],[2,-2],[2,0],[1,5],[2,6],[5,6],[2,2],[2,3],[2,0],[2,2],[11,17],[4,5],[3,0],[2,1],[4,3],[9,2],[6,1],[2,-2],[3,0],[1,4],[2,1],[1,0],[2,-4],[1,-5],[-1,-3],[0,-6],[1,-7],[-1,-6],[-2,-8],[-1,-3],[0,-3],[0,-5],[1,-7],[2,-11],[0,-7],[-1,-5],[-1,-4],[0,-4],[1,-2],[1,-2],[0,-3],[0,-4],[1,-4],[2,-4],[1,-4],[0,-4],[0,-2],[1,-1],[0,1],[1,1],[1,0],[1,-6],[0,-1],[1,-4],[0,-3],[3,-2],[2,-1],[1,-2],[3,-5],[2,-3],[3,-3],[1,-4],[1,-7],[5,-2],[5,-1],[4,-2],[4,4],[3,-1],[2,-2],[2,-2],[2,-3],[3,-5],[3,-1],[2,2],[1,1],[2,-1],[1,-5],[0,-3],[2,-2],[3,-6],[2,-3],[2,0],[5,-4],[5,-4],[2,0],[3,0],[1,-1],[1,-5],[4,-9],[2,-4],[2,-3],[6,0],[2,-1],[3,1],[8,1],[1,1],[5,-4],[5,-6],[3,-5],[3,-2],[1,-5],[1,-4],[1,-5],[-1,-4],[-1,-2],[0,-3],[0,-5],[2,-4],[1,-5],[1,-8],[1,-3],[0,-27],[-3,-1],[-5,0],[1,-2],[4,-11],[4,-9],[1,-15],[0,-9],[1,-13],[0,-8],[10,-1],[11,-1],[13,-1],[12,-1],[1,0],[2,1],[1,2],[1,0],[0,-3],[0,-4],[0,-5],[-4,-9],[0,-3],[1,-12],[1,-10],[1,-9],[1,-3],[4,-4],[6,-9],[2,-1],[2,1],[1,-3],[1,-6],[3,-16],[2,-10],[1,-4],[2,-1],[-1,-2],[-1,0],[-1,-2],[-1,-11],[-3,-15],[-1,-11],[1,0],[0,-3],[0,-4],[-1,-1],[-1,-1],[-2,-9],[-3,-11],[-2,-12],[-2,-6],[3,-6],[4,-8],[0,-2],[-2,-2],[-2,0],[-1,-4],[-1,-2],[-2,-1]],[[3653,3584],[-2,-2],[0,14],[1,4],[1,4],[2,2],[1,-3],[-1,-7],[-2,-8],[0,-4]],[[3650,3663],[0,-1],[-2,8],[3,6],[1,-2],[0,-6],[-1,-4],[-1,-1]],[[3742,3808],[0,-3],[-1,1],[-3,-1],[-1,2],[4,10],[1,-1],[1,-2],[0,-3],[0,-1],[-1,-2]],[[3774,3851],[1,-2],[-2,0],[-2,-1],[-2,-1],[-2,2],[3,3],[1,3],[0,-1],[1,-1],[2,-2]],[[3919,4408],[-1,-4],[-1,1],[-1,2],[0,2],[0,2],[1,1],[2,0],[0,-4]],[[3923,4429],[-1,-1],[0,4],[3,4],[0,6],[2,-3],[0,-2],[0,-2],[-4,-6]],[[3764,5014],[-3,-5],[1,6],[-1,5],[1,3],[1,4],[1,0],[0,-4],[0,-1],[0,-8]],[[3753,5108],[-2,-3],[0,-1],[-2,1],[0,1],[1,0],[0,5],[3,-1],[0,-2]],[[3560,5101],[-3,-1],[4,15],[3,6],[0,14],[4,11],[3,5],[5,2],[3,-8],[-4,-20],[-1,0],[-4,-11],[-5,-7],[-5,-6]],[[3621,5171],[3,-1],[3,1],[3,3],[3,1],[2,-1],[9,-3],[6,-1],[2,0],[2,-2],[1,-1],[1,-4],[-2,-5],[-1,-5],[-1,-7],[0,-2],[-1,0],[0,-6],[0,-3],[-1,-3],[-1,-5],[-2,-7],[-1,-1],[-2,-3],[-1,-3],[0,-3],[1,-3],[-1,-3],[-2,-6],[-2,-1],[-2,0],[-1,0],[-2,5],[-1,-4],[0,-4],[-1,-2],[-3,0],[-2,2],[-3,3],[0,-7],[-2,-5],[-2,-1],[-2,-1],[-2,-2],[-3,1],[-3,3],[-1,1],[-1,-3],[-7,0],[-3,-3],[-1,1],[-3,5],[0,3],[-2,7],[-1,9],[-1,7],[0,7],[2,0],[2,-1],[1,0],[0,2],[-1,2],[-3,0],[-2,4],[0,6],[0,12],[0,3],[2,3],[0,3],[0,4],[0,6],[2,5],[5,7],[6,2],[17,-6]],[[3593,5176],[-8,-11],[-3,4],[0,2],[0,2],[0,1],[1,4],[4,3],[2,0],[3,-1],[1,-2],[0,-2]],[[3626,5177],[-7,-1],[-4,2],[1,3],[3,4],[3,2],[3,2],[2,-2],[1,-3],[0,-3],[-2,-4]],[[3618,5199],[1,-3],[-4,-12],[-2,-2],[-2,0],[-3,4],[-5,-1],[-2,1],[0,6],[2,5],[4,0],[7,4],[4,-2]],[[3599,5192],[-1,-9],[-5,4],[1,9],[2,2],[2,5],[1,5],[0,8],[1,1],[0,1],[1,-1],[0,-11],[1,-7],[-3,-7]],[[3607,5206],[-4,-2],[0,2],[0,8],[1,4],[4,1],[0,1],[1,1],[1,-3],[0,-4],[-3,-8]],[[3602,5295],[-2,-2],[-2,1],[-1,7],[0,5],[2,2],[2,0],[0,-1],[2,-9],[-1,-3]],[[3431,5296],[1,-1],[1,0],[5,-3],[6,-2],[1,1],[1,2],[0,5],[0,3],[-1,3],[-1,4],[-2,5],[-2,1],[1,2],[1,3],[1,1],[1,2],[0,6],[1,1],[1,0],[1,-2],[5,-5],[2,1],[7,1],[1,3],[2,1],[3,3],[1,0],[1,-1],[1,1],[2,2],[1,-2],[1,-3],[1,-3],[1,-1],[2,1],[2,-1],[0,-2],[0,-2],[1,-2],[2,0]],[[3483,5318],[0,-1],[1,-1],[1,-3],[3,-2],[4,-3],[1,0],[2,-1],[1,-1],[1,2],[4,4],[2,3],[1,2],[1,2],[1,0],[1,-1],[0,-1],[1,-1],[4,-2],[1,0],[2,1],[2,3],[1,1],[2,-3],[0,-4],[1,-1],[1,0],[3,0],[2,-2],[1,1],[2,1],[1,3],[2,3],[3,3],[1,4],[2,5],[1,3],[0,4],[3,13],[1,2],[0,4],[1,5],[0,3],[1,4],[2,3],[1,2],[2,6],[1,5],[3,11],[0,3],[2,2],[0,2],[2,3],[1,3],[1,3],[1,4],[2,2],[1,2]],[[3565,5418],[2,10],[1,4],[2,0],[4,-5],[3,-7],[4,-25],[1,-22],[1,-12],[5,-24],[0,-5],[1,-5],[1,-6],[2,-10],[0,-2],[-1,-2],[1,0],[2,-2],[1,-6],[1,-4],[2,-6],[4,-2],[4,0],[3,-4],[3,-4],[2,-13],[-1,-9],[1,-6],[-2,-3],[-3,-4],[0,-2],[-6,-10],[-2,-5],[-3,-6],[-3,-13],[-5,-11],[-2,-3],[-3,-1],[-1,-2],[-4,-9],[-5,-3],[0,-5],[-3,-13],[-3,-7],[-1,-2],[-5,-12],[0,-5],[0,-10],[-3,-6],[-3,-3],[0,-8],[-1,-3],[-1,-2],[-6,2],[-9,-8],[-3,-3],[10,0],[3,-5],[7,3],[8,11],[3,3],[7,7],[2,5],[5,6],[1,3],[3,3],[1,-4],[0,-2],[-2,-4],[1,-3],[1,-4],[1,-5],[0,-3],[1,-7],[3,-9],[0,-3],[0,-4],[1,-3],[1,-2],[6,-9],[4,5],[2,2],[2,2],[3,1],[2,-2],[6,-3],[3,3],[8,8],[-3,-14],[-1,-12],[-2,-6],[-1,-13],[-1,-4],[-1,-4],[2,1],[1,2],[2,6],[1,9],[6,24],[1,3],[5,2],[8,20],[3,0],[2,-4],[1,-3],[1,5],[3,2],[-3,3],[-1,3],[0,4],[2,5],[-1,5],[4,6],[-1,4],[2,4],[2,4],[2,2],[0,3],[1,2],[1,0],[2,-4],[3,5],[2,2],[1,-1],[1,-2],[1,-1],[1,0],[3,3],[2,-4],[1,-1],[0,2],[-1,3],[1,1],[1,2],[4,-1],[2,-2],[2,-4],[2,0],[3,0],[1,-2],[2,0],[1,-3],[4,-5],[1,-3],[3,-2],[2,-2],[3,0],[3,0],[0,-4],[2,-1],[3,1],[2,-5],[5,-3],[4,-6],[2,1],[3,-1],[3,-12],[0,-9],[2,1],[1,4],[2,7],[3,2],[1,-2],[3,-5],[2,-4],[1,-4],[2,0],[-1,-4],[1,1],[2,2],[2,-5],[1,-6],[0,-6],[-1,-4],[-1,-2],[-1,-5],[-1,0],[-2,-2],[2,-3],[1,-3],[2,8],[2,3],[2,1],[2,-6],[0,-5],[-4,-3],[0,-4],[-1,-3],[-1,-2],[-1,-6],[0,-5],[-3,-22],[0,-4],[3,4],[5,11],[2,12],[2,12],[2,3],[1,0],[2,-1],[1,-4],[-1,-2],[-2,-6],[-1,-3],[1,-3],[5,10],[2,3],[2,-1],[4,5],[8,1],[0,5],[2,2],[4,-1],[8,-4],[3,-4],[4,-3],[2,-4],[10,-8],[7,-1],[3,4],[5,-4],[2,-4],[4,-2],[5,-1],[3,3],[9,1],[11,4],[7,-1],[7,-3],[6,-7],[4,-4],[3,-4],[4,-4],[10,-11],[3,-7],[6,-9],[6,-3],[3,-9],[3,-5],[6,-15],[7,-11],[4,-11],[9,-7],[4,-11],[6,-2],[3,-1],[3,-5],[4,-3],[6,1],[6,-1],[5,3],[12,-5],[2,-2],[2,-5],[5,-18],[2,-20],[2,-15],[3,-12],[1,-23],[2,-7],[0,-6],[1,-1],[1,-15],[-1,-6],[-1,-8],[0,-4],[0,-2],[0,-3],[0,-3],[1,-8],[0,-5],[-2,-7],[-2,-18],[-5,-31],[-5,-17],[-7,-18],[-5,-9],[-2,-1],[-1,2],[1,-5],[-1,-4],[-5,-14],[-5,-8],[-4,-15],[-1,0],[-6,-6],[-4,-5],[-4,-8],[-5,-14],[-1,-2],[-1,1],[0,-7],[-4,-10],[-1,-2],[0,3],[1,2],[0,3],[0,3],[-1,-2],[-2,-8],[0,-6],[-1,-9],[-6,-26],[-8,-22],[-1,-6],[-7,-15],[-4,-7],[-1,0],[-2,1],[-1,11],[-3,6],[-1,2],[-2,-7],[-1,-2],[-2,-1],[2,-3],[1,-4],[-2,-7],[0,-6],[-4,-8],[-2,-5],[-1,-7],[0,-6],[1,2],[1,-1],[1,-2],[-1,-3],[-1,-6],[0,-13],[0,-3],[1,-3],[1,5],[1,-1],[-3,-36],[1,-16],[0,-19],[2,-18],[1,-16],[1,-1],[-3,-19],[-2,-18],[-2,-15],[-1,-16],[-1,-8],[-1,-8],[2,-18],[0,-4],[-3,-8],[-4,-4],[-2,-4],[-5,-16],[-2,-22],[0,-12],[1,-25],[-1,-10],[-1,-7],[-2,-4],[-5,-5],[-3,-13],[-2,-14],[-3,-5],[0,-8],[-2,-8],[-6,-12],[-4,-4],[-1,-3],[-2,-8],[-3,-11],[-3,-16],[1,-5],[0,-1],[1,-18],[0,-4],[-4,-5],[-12,-9],[-4,-4],[-8,-16],[0,-3],[0,-6],[2,-3],[-2,-3],[-1,-6],[-2,0],[-13,0],[-7,-1],[-4,0],[-1,1],[-2,3],[-1,3],[1,4],[0,3],[-2,0],[-2,-1],[-1,-3],[1,-2],[0,-3],[1,-3],[-1,-3],[-4,-1],[-5,-3],[-5,-1],[-5,-2],[-2,3],[2,1],[3,-1],[3,2],[0,3],[-5,3],[-5,-2],[-3,-4],[-6,1],[-7,-3],[-2,-3],[1,-6],[1,-1],[2,-3],[-2,-2],[-1,-1],[-8,-3],[-7,-11],[-3,-2],[-3,-4],[0,-5],[-1,-2],[-2,0],[-4,2],[-5,0],[-3,-2],[-19,-18],[-6,-7],[-8,-15],[-12,-17],[-7,-9],[-1,-3],[-1,0],[-2,-2],[0,-2],[2,0],[-1,-6],[-2,-4],[-5,-10],[-1,1],[1,5],[-2,0],[-4,2],[-1,-2],[0,-5],[-1,-3],[-2,0],[-3,1],[-2,4],[1,-7],[5,-2],[2,-2],[1,-3],[-4,-12],[-3,-2],[-1,-2],[2,0],[1,-3],[-1,-14],[-2,-3],[-1,0],[0,-2],[1,-5],[1,-3],[0,-7],[0,-5],[-1,-5],[2,-10],[1,-11],[1,-3],[0,-5],[-1,-4],[0,-6],[-2,-10],[1,-16],[0,-14],[-1,-8],[-1,-6],[-3,-7],[0,-8],[-6,-7],[-7,-10],[-6,-12],[-7,-16],[-8,-26],[-8,-36],[-8,-27],[-4,-10],[-5,-11],[-6,-12],[-9,-13],[-9,-12],[-4,-5],[-3,-7],[-1,3],[1,5],[0,4],[-1,4],[2,1],[3,-3],[2,2],[1,2],[3,2],[7,12],[4,5],[3,8],[1,4],[-1,8],[2,3],[4,-1],[0,2],[0,3],[1,6],[4,5],[3,6],[-1,16],[1,1],[2,-2],[1,1],[1,7],[-1,3],[-2,1],[-8,-8],[-3,1],[0,6],[-4,3],[-2,5],[0,3],[-1,2],[0,-6],[0,-6],[4,-7],[-1,-3],[-2,-3],[-1,-7],[0,-9],[-1,2],[-1,2],[0,-10],[-3,-4],[0,-3],[0,-5],[-1,-3],[-6,-8],[-6,-5],[-1,-3],[-1,-6],[-1,-6],[-2,-6],[-2,-11],[0,-4],[1,-7],[1,-5],[-2,-3],[-2,-6],[-2,-7],[-5,-25],[-4,-15],[-3,-7],[-4,-8],[-13,-20]],[[3517,3240],[-1,1],[-1,1],[-2,2],[0,1],[-1,2],[1,7],[0,19],[0,4],[1,2],[2,3],[3,5],[2,6],[3,5],[-1,3],[-2,4],[-4,2],[-3,5],[-3,5],[-2,6],[-1,7],[-1,5],[-1,2],[-1,1],[-2,3],[-1,2],[-2,2],[-3,1],[-3,3],[-5,6],[-3,7],[-1,5],[-2,3],[-8,6],[-4,6],[-2,-2],[-2,2],[-2,3],[-1,3],[-1,2],[-1,3],[0,3],[-3,4],[-3,5],[-1,2],[-1,-1],[0,-2],[-1,-1],[-1,-2],[-1,-2],[-2,-3],[-1,-2],[-3,0],[-1,0],[0,1],[0,4],[0,9],[-1,3],[-2,4],[-2,5],[-6,10],[-9,15],[-3,5],[-3,0],[-3,0],[-2,-2],[-2,-7],[-1,-1],[-4,0],[-5,1],[-2,4]],[[3483,3711],[0,8],[4,12],[1,6],[-1,3],[1,11],[3,20],[1,13],[-1,6],[0,4],[1,4],[1,1],[-4,4],[-2,4],[-2,3],[-3,2],[-1,-1],[-1,-1],[-3,-2],[-3,-4],[-2,-1],[-2,-1],[-4,-2],[-2,1],[-2,1],[-2,2],[0,5],[0,4],[-1,6],[-2,4],[0,3],[0,3],[0,3],[0,3],[0,3],[-1,3],[1,4],[-1,5],[-1,4],[0,4],[0,4],[-1,4],[0,4],[0,4],[1,4],[-1,3],[-2,2],[-1,4],[0,6],[-1,3],[-2,3],[-1,0],[-3,1],[-2,0],[-3,0],[-2,1],[-1,2],[-2,3],[-1,5],[-1,1],[-2,-1],[-1,-2],[-1,-3],[-1,-3],[-2,0],[-2,-1],[-2,-1],[-3,0],[-2,2],[-4,1],[-2,1],[-3,-1],[-2,1],[-2,1],[-2,0],[-2,3],[-3,2],[-1,-1],[-1,-2],[-2,1],[-2,1],[-1,4],[0,2],[1,3],[0,3],[0,3],[0,3],[1,3],[0,3],[0,3],[0,3],[-1,3],[0,3],[1,4],[1,4],[0,3],[0,2],[0,3],[1,5],[0,7],[-1,5],[0,1],[-1,2],[1,1],[-1,2],[0,2],[1,2],[-1,3],[-1,1],[-1,1],[0,4],[-1,4],[0,3],[0,3],[-1,2],[-1,3],[-1,2],[0,3],[-1,4]],[[3067,4553],[-3,0],[-4,1],[-4,0],[-3,-3],[-4,-4],[-2,0],[-1,-1],[-2,1],[-1,2],[-3,4],[-1,-1],[-2,-2],[0,9],[0,15],[0,13],[1,10],[0,12],[0,9],[1,3],[1,4],[-1,5],[0,4],[0,3],[1,3],[-2,-1],[0,-1],[-1,-2],[-3,-4],[-1,-3],[-2,-2],[-3,-6],[-2,-3],[-2,-2],[-3,-6],[-3,-2],[-7,-1],[-8,0],[-7,1],[-1,0],[0,5],[0,4],[-3,4],[0,5],[0,3],[-1,4],[-2,3],[-2,1],[-4,2],[-6,3],[-5,0],[-6,0],[3,8],[4,8],[0,8],[-3,6],[-1,4],[-3,6],[-2,3],[-2,5],[0,3],[0,2],[-1,2],[-1,1],[-2,2],[-1,3],[0,3],[-1,3],[-1,3],[0,3],[-1,4],[-1,3],[-1,2],[-2,3],[0,2],[2,1],[0,3],[0,3],[-1,1],[-2,1],[-2,5],[-1,2],[-1,2],[-1,2],[1,1],[0,1],[0,3],[0,3],[0,2],[1,0],[1,0],[1,1],[2,1],[1,0],[1,2],[0,2],[-1,6],[-1,2],[0,3],[0,6],[1,4],[2,4],[5,9],[5,6],[2,1],[2,2],[1,3],[0,4],[0,3],[-1,5],[-1,6],[-1,4],[1,4],[1,5],[3,8],[2,9],[1,3],[0,5],[1,11],[1,6],[0,3],[0,2],[2,1],[3,2],[3,3],[4,6],[3,7],[3,2],[4,6],[3,4],[1,2],[3,2],[5,1],[4,1],[2,2],[4,1],[2,2],[2,0],[5,2],[2,3],[1,4],[2,3],[2,1],[3,0],[3,0],[3,1],[2,-3],[0,-3],[3,-3],[1,0],[2,1],[2,-3],[1,1],[1,1],[0,4]],[[3056,4940],[1,2],[1,12],[1,19],[2,18],[2,19],[1,20],[2,21],[2,16],[1,15],[1,8],[1,12],[0,10],[1,3],[0,2],[-1,4],[0,1],[0,2],[0,2],[-2,2],[0,1],[-1,2],[0,2],[-1,3],[0,2],[-1,2],[0,2],[0,3],[1,2],[-1,2],[0,3],[-1,2],[-1,2],[-2,2],[-2,4],[-3,4],[-3,6],[-1,4],[0,9],[0,10],[1,15],[0,7],[2,1],[1,0],[2,0],[2,1],[1,1],[1,1],[1,1],[1,0],[1,1],[1,1],[1,1],[2,1],[1,-2],[1,-2],[1,-1],[1,1],[1,-1],[0,-1],[1,0],[1,0],[1,0],[1,1],[0,1],[-1,1],[0,2],[0,2],[0,3],[0,4],[0,2],[-1,3],[-1,3],[-2,2],[-1,1],[-1,-1],[-1,0],[-1,1],[-1,0],[-2,0],[-1,1],[-3,-1],[-1,1],[-1,0],[-2,-1],[0,14],[0,14],[0,9],[2,0],[1,2],[3,0],[2,2],[1,0],[2,-1],[2,-2],[2,0],[6,0],[5,0],[7,0],[6,0],[6,0],[2,0],[-1,3],[-1,4],[0,3],[1,4],[0,1],[2,-2],[2,-5],[1,-4],[1,-2],[2,0],[1,0],[2,2],[3,8],[3,6],[1,2],[2,2],[1,1],[1,0],[2,-2],[1,-3],[3,-11],[2,-8],[1,-5],[0,-13],[0,-11],[0,-1],[1,0],[5,2]],[[3142,5254],[7,-13],[5,-10],[3,-3],[1,-1],[3,1],[4,1],[1,1],[2,4],[4,4],[2,2],[1,0],[1,0],[2,-3],[2,-5],[-1,-5],[0,-4],[2,1],[2,5],[1,5],[3,3],[2,6],[2,5],[2,3],[4,3],[2,2],[3,0],[1,2],[3,5],[1,3],[1,1],[3,0],[2,1],[3,4],[3,5],[1,9],[1,7],[1,2],[1,1],[1,1],[2,1],[5,4],[3,4],[3,1],[1,1],[1,4],[0,7],[0,4],[-6,1],[-3,0],[-6,1],[-3,2],[0,1],[0,1],[0,3],[1,6],[-1,7],[-3,12],[-2,11],[0,8],[0,9],[0,5],[-2,5],[-8,13],[-3,7],[-1,4],[-3,9],[1,2],[2,0],[1,-2],[2,-5],[1,-1],[1,0],[8,0],[2,0],[1,-2],[1,-2],[1,-5],[1,-3],[3,0],[5,0],[3,1],[1,-2],[2,-1],[4,3],[1,0],[1,-1],[5,-10],[2,-4],[3,-5],[3,0],[2,4],[1,16],[1,4],[1,1],[2,1],[1,2],[2,3],[2,1],[7,-3],[2,1],[7,5],[8,5],[2,6],[3,2],[2,5],[2,-1],[3,0],[2,1],[1,1],[1,2],[2,7],[2,2],[2,3],[2,3],[2,4],[0,3],[0,2],[-1,6],[-1,4],[-1,2],[-1,0]],[[3312,5483],[3,2],[2,-2],[3,0],[2,1],[2,-1],[2,4],[2,-1],[1,0],[1,-3],[1,-3],[2,-3],[0,-6],[0,-5],[-1,-5],[0,-4],[-1,-4],[-1,-4],[-1,-2],[0,-2],[1,-1],[2,-1],[2,0],[2,-1],[2,0],[2,-4],[1,-2],[0,-1],[0,-4],[-1,-4],[1,-2],[1,-2],[2,-7],[0,-3],[1,-1],[0,-2],[0,-3],[-1,-3],[-2,-4],[0,-3],[-2,-2],[-3,-5],[1,-7],[0,-3],[0,-3],[-1,-4],[-2,-11],[-1,-6],[-1,-13],[0,-4],[1,-6],[2,-13],[1,-2],[3,-3],[0,-9],[0,-9],[0,-4],[0,-1],[1,-1],[1,-1],[0,-3],[0,-3],[2,-1],[2,-1],[1,-4],[3,-6],[1,-1],[1,-3],[2,-5],[4,-2],[4,-2],[1,-3],[2,-3],[1,0],[1,0],[1,3],[2,2],[2,-1],[2,1],[1,1],[0,2],[-1,6],[1,1],[3,1],[0,3],[0,1],[1,2],[1,0],[1,-1],[1,0],[2,-1],[1,-2],[1,0],[2,0],[0,1],[1,2],[0,5],[1,0],[2,1],[2,2],[3,0],[3,0],[1,1],[1,3],[3,8],[1,2],[2,1],[1,0],[2,1],[2,2],[1,-1],[1,-4],[1,-1],[1,0],[4,-2],[2,1],[2,1],[2,1],[1,-1],[2,1],[1,1]],[[3347,5937],[-1,-1],[-2,2],[-1,3],[0,9],[1,1],[3,-7],[2,-3],[-2,-4]],[[8194,5466],[4,0]],[[8198,5466],[0,-2],[2,-7],[1,-6],[0,-11],[2,-4],[-1,-1],[-2,-1],[-2,1],[-1,2],[-2,11],[-1,6],[0,7],[0,5]],[[8194,5466],[-2,-2],[-2,-4],[-2,-2],[-1,-2],[0,-3],[0,-7],[1,-5],[1,-2],[0,-2],[0,-2],[-1,-5],[-1,-6],[-1,-4],[-2,-4],[-1,0],[-1,1],[-2,4],[-2,5],[-1,3],[-2,0],[-1,3],[0,3],[-1,3],[-1,4],[-1,3],[-3,2],[0,1]],[[8168,5448],[3,0],[3,1],[4,3],[3,4],[3,4],[2,5],[3,4],[5,4],[1,0],[0,-3],[-1,-4]],[[7545,6783],[-1,-2],[0,-3],[-1,-4],[1,-3],[1,-4],[3,-3],[3,0],[2,1],[2,0],[1,-5],[1,-4],[-1,-5],[-1,-4],[0,-2],[0,-1],[1,-3],[1,-3],[0,-4],[-1,-2],[-1,-1],[-2,0],[-1,0],[-2,-1],[-2,-1],[-2,-1],[-5,0],[-1,3],[-1,0],[-4,-4],[-4,1],[-8,-2],[-3,0],[-4,0],[-1,1],[-3,3],[-3,3],[-3,-2],[-1,-1],[-2,-5],[-5,-2],[-5,-1],[-2,0],[-3,1],[0,1],[0,1],[0,1],[-1,1],[-2,1],[-3,1],[-1,1],[-5,-2],[-3,3],[-4,4],[-1,2],[-1,6],[-1,2],[-1,2],[-1,2],[1,3],[3,4],[0,1]],[[7468,6757],[2,9],[2,3],[2,4],[2,7],[3,7],[3,7],[3,6],[1,3],[4,3],[2,1],[2,4],[2,2],[3,1],[3,0],[3,-1],[4,-2],[0,-2],[0,-3],[0,-3],[0,-1],[0,-1],[4,0],[4,0],[2,0],[5,-3],[2,-2],[2,-1],[1,0],[2,3],[2,3],[2,0],[1,-1],[1,-2],[4,-2],[3,-2],[1,-2],[0,-7],[0,-2]],[[5701,4159],[0,-3],[-1,-4],[1,-3],[1,-4],[1,-4],[2,-2],[1,-6],[1,-6],[2,-5],[6,-12],[1,-5],[0,-4],[4,-8],[1,-3],[-1,-5],[4,-17],[2,-10],[2,-1],[7,-11],[5,-8],[7,-6],[5,-3],[2,-3],[2,-3],[1,-5],[0,-8],[0,-6],[5,0],[5,0],[1,-1],[1,-2],[0,-3],[0,-6],[0,-4],[0,-5],[-1,-6],[0,-6],[1,-3],[4,-9],[2,-5],[1,-9],[2,-3],[0,-1],[4,-1],[10,-3],[6,-4],[5,-3],[2,-1],[1,-1],[-1,-8],[1,-2],[0,-2],[1,-2],[1,-1],[4,-1],[2,-4],[1,-3]],[[5815,3905],[-6,-1],[-4,-3],[-2,-7],[-2,-5],[-4,-3],[-5,-2],[-4,-2],[-5,-5],[-5,-11],[-3,-6],[0,-3],[-1,-2],[-2,-2],[-1,-3],[-1,-2],[-1,-2],[-2,0],[-1,-2],[-1,-4],[-2,-2],[-2,-1],[-3,-2],[-2,-4],[-1,-2],[-2,0],[-1,-3],[-3,-8],[0,-3],[-4,-27],[-2,-4],[-4,-5],[-3,-7],[-2,-4],[-1,-2],[-8,-3],[-2,-2],[-4,-3],[-1,-2],[0,-8],[-3,-13],[-2,-9],[-1,-7],[-2,-10],[-2,-3],[-2,-3],[-3,-2],[-3,-1],[-4,1],[-2,-1],[-4,-3],[-3,0],[-5,2],[-5,2],[-2,0],[-4,6],[-2,0],[-4,1],[-2,1],[-2,3],[-4,7],[-4,5],[-4,3],[-3,1],[-4,-1],[-2,-1],[-1,-1],[-2,-2],[-2,-6],[-2,-7],[0,-5],[-2,-11],[-3,-12],[-1,-3],[-1,-3],[-2,-2],[-7,-10],[-4,-11],[-2,-3],[-3,-2],[-2,-1],[-1,-2],[-2,-5],[-1,-2],[-1,-1],[-4,1],[-2,0],[-10,-1],[-4,2],[-2,1],[-3,-3],[-2,2],[-1,4],[-1,10],[0,8],[2,6],[2,4],[2,6],[0,2],[0,3],[-1,4],[0,5],[-2,11],[-3,14],[-4,15],[-1,4],[-2,7],[-9,13],[-2,2]],[[5554,3757],[0,1],[0,13],[0,16],[0,17],[0,16],[0,17],[0,16],[0,17],[0,16],[0,17],[0,14],[7,0],[8,0],[9,0],[4,0],[0,2],[0,10],[0,24],[0,23],[0,24],[0,23],[0,24],[0,23],[0,24],[0,23],[0,12],[7,0],[8,3],[14,4],[12,4],[8,3],[10,3],[3,1],[1,0],[2,-2],[4,-11],[3,-9],[0,-4],[1,0],[1,0],[2,2],[4,9],[1,2],[3,4],[4,5],[3,3],[3,2],[2,0],[1,-3],[2,-1],[7,11],[3,2],[9,2],[1,0]],[[5634,5813],[2,-7],[1,-3],[8,-17],[2,-4],[4,-12],[2,-8],[3,-12],[1,-7],[-1,-5],[0,-16],[-1,-5],[-4,-8],[0,-4],[1,-3],[1,-2],[1,-1],[-1,-7],[2,-3],[2,-2],[7,-2],[3,-1],[3,-1]],[[5670,5683],[2,-1],[0,-2],[-1,-9],[1,-5],[2,-5],[3,-2],[2,-1],[8,-2],[3,-3],[4,-10],[5,-9],[2,-5],[0,-5],[-2,-5],[0,-2],[3,-5],[2,-6],[6,-6],[9,-9],[4,-7],[1,-4],[2,-6],[4,-4],[2,-4],[-2,-10],[1,-4],[0,-3],[2,-4],[1,-5],[2,-7],[2,-3],[4,-1],[2,-3],[4,-5],[4,-4],[1,-4],[1,-2],[1,-4],[1,-3],[0,-7],[1,-9],[2,-5],[2,-5]],[[5761,5478],[-8,5],[-2,0],[-1,-1],[-4,-6],[-2,-1],[-1,1],[-4,1],[-13,5],[-9,4],[-3,2],[-6,2],[-3,-3],[-3,-12],[-1,-2],[-5,-3],[-3,1],[-6,-3],[-9,4],[-3,-1],[-3,-2],[-6,-5],[-4,-3],[-5,-2],[-4,-4],[-3,-3],[-3,0],[-3,3],[-2,2],[-4,0],[-3,-1],[-3,-5],[-2,-3],[-2,-8],[-3,-14],[-2,-3],[-1,-1],[-14,7],[-6,1],[-4,-2],[-5,4],[-3,1],[-1,-1],[-3,1],[-4,5],[-5,2],[-4,-1],[-2,2],[-2,4],[-3,9],[-5,8],[-6,7],[-4,5],[-1,3],[-4,2],[-5,0],[-5,-3],[-7,-10],[-6,-22],[-4,-8],[-3,-2],[-1,-5],[2,-8],[0,-9],[-1,-16],[0,-12]],[[5516,5384],[-1,2],[-2,5],[0,1],[-5,-2],[-2,-2],[-1,-2],[-1,-1],[-1,3],[-2,1],[-1,-1],[-2,0],[-1,1],[-1,-1],[-2,2],[-7,5],[-2,1],[-1,0],[-4,-4],[-2,-1],[-6,-2],[-7,-2],[-2,0],[-2,-1],[-1,-3],[-1,-5],[-1,-9],[-1,-3],[0,-4],[0,-6],[0,-5],[0,-4],[-2,-8],[-2,-9],[-2,-8],[-2,-7]],[[5449,5315],[-1,5],[-1,6],[0,8],[0,1],[-1,3],[0,6],[0,3],[0,4],[-2,4],[-1,3],[-1,3],[-1,1],[-1,1],[-2,1],[-3,6],[-3,6],[-3,7],[-3,6],[-3,8],[-3,7],[-2,7],[-1,4],[1,1],[1,0],[1,0],[0,2],[-1,6],[-1,7],[-1,4],[-4,6],[-3,5],[-1,3],[-1,4],[-1,23],[-1,6],[-1,3],[-1,1],[0,2],[0,4],[1,4],[0,1],[0,3],[0,22],[0,1],[-1,2],[-1,-1],[-1,1],[-1,3],[-1,4],[1,2],[1,3],[1,2],[1,1],[4,4],[1,2],[1,2],[0,2],[2,11],[4,11],[1,3],[2,7],[1,9],[1,4],[1,4],[1,3],[4,6],[2,9]],[[5429,5617],[3,0],[4,-2],[4,-1],[3,2],[2,4],[4,3],[5,3],[1,5],[2,3],[1,3],[1,0],[0,-2],[1,-5],[2,-5],[4,-6],[1,0],[2,4],[5,3],[1,1],[4,7],[4,4],[1,0],[1,1],[5,5],[3,-1],[5,1],[8,2],[6,0],[3,1],[1,1],[1,6],[1,2],[2,3],[5,9],[3,8],[0,2],[0,1],[1,0],[1,3],[-1,4],[-5,7],[0,1],[0,1],[0,1],[2,3],[3,3],[2,1],[7,0],[6,1],[2,-1],[4,2],[4,2],[3,3],[8,0],[6,8],[2,2],[0,1],[1,1],[2,4],[4,7],[2,6],[1,4],[7,15],[3,0],[1,2],[3,10],[0,2],[2,0],[1,2],[2,2],[1,5],[0,5],[-1,5],[0,2],[1,2],[1,2],[6,5],[1,3],[1,2],[1,1],[2,-1],[1,2],[1,2],[4,4],[3,2],[4,-1],[3,-1],[2,-2],[1,0]],[[3339,7715],[-4,-2],[-3,0],[-2,2],[5,0],[2,0],[4,3],[-2,-3]],[[3159,7735],[-2,-2],[1,2],[1,5],[2,1],[-2,-6]],[[3145,7757],[-4,-3],[2,8],[1,3],[2,-1],[-1,-5],[0,-2]],[[3306,7804],[-1,-1],[0,1],[-2,3],[0,1],[2,1],[3,-1],[-1,-3],[-1,-1]],[[2953,7809],[-4,-1],[-1,1],[4,5],[4,2],[-3,-7]],[[2956,7803],[-2,-1],[-4,1],[-4,-2],[-1,0],[3,4],[5,3],[4,8],[2,0],[-2,-9],[0,-3],[-1,-1]],[[3027,7884],[-3,-1],[1,2],[3,4],[3,2],[1,0],[-2,-5],[-3,-2]],[[3302,7830],[1,0],[4,2],[2,0],[0,-2],[-3,-2],[-2,-1],[2,-2],[0,-1],[-2,-2],[-1,-3],[1,-3],[3,3],[2,0],[2,-1],[2,1],[1,1],[6,10],[0,2],[-7,-3],[0,2],[4,6],[0,3],[2,5],[2,3],[2,2],[2,1],[1,-2],[1,-4],[3,0],[4,-1],[3,-1],[0,-2],[0,-1],[-1,-3],[-1,-3],[3,-3],[-1,-1],[-4,-4],[-3,-3],[-3,-4],[-5,-6],[-8,-3],[-2,0],[-3,1],[-3,0],[-3,-2],[-3,0],[-1,0],[-2,0],[-1,1],[-2,4],[-1,3],[-2,13],[1,7],[2,6],[3,4],[2,4],[7,20],[1,4],[2,4],[3,4],[4,7],[1,1],[2,0],[3,0],[-1,-2],[0,-2],[3,-9],[0,-2],[-2,-7],[-2,-12],[-1,-6],[0,-2],[-1,-3],[-1,-3],[-5,-4],[-2,-1],[-2,-2],[-6,-6]],[[3227,7860],[1,0],[1,1],[2,5],[4,-2],[2,-2],[1,1],[1,0],[3,-3],[4,-2],[5,0],[7,1],[1,1],[7,1],[7,0],[2,-1],[1,-1],[1,-1],[-4,-4],[-4,-5],[-6,-4],[-1,-2],[0,-4],[0,-4],[1,0],[1,-2],[-1,-1],[-6,-1],[-2,1],[-2,1],[-1,4],[-2,0],[-1,0],[4,3],[-2,5],[-2,-1],[-1,2],[0,3],[2,1],[0,2],[-2,-2],[-2,-2],[-2,-1],[-2,-2],[3,-1],[-1,-1],[-2,-1],[-8,3],[-2,2],[-3,3],[-2,4],[1,1],[1,0],[0,1],[-3,1],[-5,0],[-2,1],[0,8],[-1,2],[-3,2],[-4,0],[0,3],[1,5],[2,3],[2,4],[2,3],[4,6],[0,-4],[0,-4],[-3,-8],[6,-8],[0,-2],[1,-2],[-1,-2],[0,-1],[2,-1],[0,-2]],[[3280,7907],[1,-1],[2,0],[1,0],[-2,-2],[-3,0],[-2,0],[3,11],[2,3],[6,7],[2,2],[2,1],[2,0],[-2,-5],[-3,0],[-3,-3],[-2,-4],[-2,-2],[-1,-3],[-1,-4]],[[3493,7916],[-1,-2],[-1,0],[0,2],[1,4],[1,2],[0,1],[1,2],[1,1],[1,2],[0,-4],[-3,-8]],[[3208,7942],[-1,-4],[-2,-4],[-2,0],[1,3],[-1,4],[2,0],[1,0],[2,1]],[[3209,7946],[-4,-3],[2,5],[0,1],[1,0],[1,0],[0,-3]],[[1571,7992],[-1,-2],[-1,1],[0,1],[-2,10],[1,0],[2,-4],[0,-1],[1,-3],[1,-2],[-1,0]],[[1573,8000],[-1,-1],[-4,4],[-3,5],[-1,4],[6,-8],[3,-3],[0,-1]],[[2924,7776],[4,2],[9,9],[6,3],[8,9],[5,1],[2,2],[0,8],[1,2],[3,7],[3,6],[2,9],[5,5],[7,5],[7,10],[4,3],[3,2],[2,4],[2,2],[5,5],[7,1],[6,4],[5,2],[3,4],[5,1],[13,11],[3,5],[5,10],[4,5],[2,5],[6,9],[6,11],[3,9],[5,4],[8,13],[5,6],[2,0],[5,5],[4,5],[5,5],[10,6],[9,7],[12,6],[15,9],[11,5],[9,1],[10,2],[3,0],[16,-4],[7,-5],[9,-10],[1,-3],[0,-4],[-4,2],[-4,0],[2,-2],[5,-7],[0,-8],[-3,-7],[-8,-4],[-2,-3],[-1,-4],[-2,-2],[-4,-2],[-2,-3],[-6,-5],[-3,-1],[-3,1],[-8,5],[-5,4],[-2,-2],[-2,-3],[-5,1],[-2,-1],[-3,1],[-7,-5],[2,-1],[5,3],[2,0],[5,-4],[10,-5],[2,-3],[3,-9],[1,-1],[4,0],[4,5],[3,3],[6,2],[-1,-3],[5,0],[4,-4],[-1,-3],[-3,-6],[-1,-12],[-5,-8],[-7,-7],[2,-2],[2,-1],[4,2],[3,0],[3,-2],[-1,-6],[-1,-4],[0,-3],[2,-7],[3,-2],[1,-9],[1,-5],[0,-4],[2,-3],[1,-4],[9,-1],[2,-2],[6,-1],[1,-1],[2,-2],[-7,-5],[5,-4],[5,-6],[4,1],[2,0],[4,-4],[1,-1],[1,-2],[2,0],[3,2],[5,-1],[6,-2],[0,-3],[-1,-2],[4,1],[3,-2],[1,1],[1,1],[5,4],[8,8],[1,-1],[0,-3],[1,-5],[3,-4],[3,0],[5,2],[1,-2],[2,-4],[3,-6],[-1,-2],[-2,-2],[-3,-2],[10,-1],[1,-1],[1,-2],[-1,-3],[-1,-1],[-1,1],[-4,-1],[-3,-3],[-3,-1],[-2,0],[-2,-2],[-2,-2],[-2,0],[-6,-6],[-7,-3],[-7,-5],[-7,-4],[-7,-4],[-2,0],[-2,0],[-4,-4],[-2,1],[-2,-1],[-2,1],[-2,1],[1,-4],[1,-4],[-1,-1],[-1,-2],[-4,0],[-2,2],[-2,2],[-1,3],[-2,2],[-1,-3],[0,-2],[-2,-4],[-2,6],[-3,-2],[-1,-6],[0,-2],[1,-5],[-1,-2],[-2,1],[-2,-7],[-3,-3],[-3,-7],[-4,-5],[-1,-3],[-6,-9],[-3,1],[-1,-1],[-3,-3],[0,-7],[-2,1],[-1,0],[0,-2],[-1,-1],[-3,2],[-2,-1],[-2,2],[-3,10],[-2,3],[-2,1],[-1,-2],[-1,-2],[-2,4],[-2,16],[0,3],[3,13],[6,12],[-2,0],[-6,-8],[1,2],[1,2],[2,3],[3,4],[4,1],[2,1],[2,1],[3,3],[0,2],[-2,-2],[-4,-2],[1,3],[1,1],[21,21],[4,3],[8,4],[2,3],[-2,2],[4,-1],[-1,-3],[0,-2],[0,-2],[0,-3],[3,-2],[3,-5],[-1,7],[2,4],[10,6],[8,0],[2,3],[-6,1],[-8,0],[-6,1],[-6,-1],[-8,1],[-2,-1],[-2,-4],[-2,2],[-1,0],[-1,1],[2,6],[7,9],[5,7],[1,2],[1,3],[-2,-1],[-2,-1],[-2,4],[-3,4],[0,-2],[1,-5],[-5,-10],[-3,-1],[-4,-5],[-7,-4],[-7,-8],[-9,-6],[-2,0],[-5,5],[2,2],[1,4],[-1,-1],[-1,-2],[-3,-2],[2,-4],[-1,-2],[-3,-2],[-2,-4],[-3,-2],[-2,3],[-5,-3],[-5,-1],[-1,1],[0,3],[-2,1],[-3,-1],[-1,1]],[[3135,7785],[-1,1],[-1,1],[-1,0],[-1,-1],[0,-1],[-1,0],[-2,1],[-1,2],[-1,2],[-1,2],[1,2],[0,1],[1,2],[-1,3],[-1,1],[0,2],[0,2],[1,0],[1,1],[0,2],[0,2],[-2,1],[-1,0],[-2,0],[-2,2],[-1,1],[-1,1],[-1,1],[-1,2],[0,2],[1,2],[0,1],[0,1],[0,1],[0,1],[0,1],[0,2],[0,2],[0,5],[0,9],[0,8],[-1,9],[0,7],[0,9],[0,9],[0,9],[-3,5],[-5,6],[-4,4],[-2,0],[-1,0],[-1,-2],[-3,-2],[-5,-1],[-4,-3],[-2,0],[-1,0],[-2,2],[-1,2],[-1,3],[1,5],[-3,2],[-3,1],[-1,-4],[-2,-3],[-3,-6],[-4,-9],[-3,-5],[-4,-9],[-4,-8],[-1,-8],[-1,-7],[-3,-6],[-2,-5],[0,-6],[-1,-5],[0,-5],[0,-2],[0,-2],[-1,-2],[-2,-4],[0,-4],[-2,-2],[-3,-3],[-3,-6],[0,-3],[0,-2],[0,-2],[0,-1],[-2,0],[-1,0],[-1,-2],[0,-3],[-1,-3],[-1,0],[0,1],[-1,3],[-2,0],[-1,-1],[-2,-3],[-2,0],[-4,1],[-2,-5],[-3,-11],[-11,0],[-12,0],[-12,0],[-11,0],[-12,0],[-11,0],[-12,0],[-6,0],[-2,0]],[[1497,8027],[1,-6],[-3,1],[-2,1],[0,3],[1,2],[3,-1]],[[3484,8040],[-4,-3],[-1,-2],[-1,0],[-1,1],[-1,3],[0,1],[1,1],[1,-1],[0,-1],[1,0],[3,3],[2,0],[1,0],[-1,-2]],[[3497,8049],[2,-4],[1,-1],[-7,-4],[-1,0],[0,4],[0,3],[0,1],[2,-2],[2,3],[1,0]],[[1551,8037],[1,-1],[-7,4],[-2,3],[-1,2],[-1,1],[-3,2],[-1,2],[1,1],[2,-1],[4,-2],[3,-3],[4,-8]],[[1482,8041],[-1,0],[-2,0],[-2,2],[-3,5],[-1,0],[1,1],[1,1],[0,1],[-1,3],[3,2],[2,-1],[1,-2],[2,-4],[0,-4],[0,-3],[0,-1]],[[3283,8012],[-12,-1],[-9,3],[-7,2],[-6,3],[-15,10],[-2,4],[-1,4],[-3,4],[-3,3],[-15,10],[-2,3],[4,2],[3,2],[3,-1],[11,-3],[13,-4],[5,-2],[7,-4],[6,-5],[14,-12],[2,-1],[7,-7],[2,-4],[1,-4],[-1,-2],[-2,0]],[[1528,8065],[-1,6],[1,3],[0,1],[0,1],[1,-3],[1,-2],[0,-2],[0,-1],[-2,-3]],[[1523,8069],[-1,-3],[-2,5],[-2,11],[0,2],[1,4],[1,0],[2,-2],[2,-3],[0,-1],[1,-3],[1,-3],[-2,-3],[-1,-4]],[[3457,8105],[-1,0],[-1,0],[-1,0],[0,1],[1,3],[2,1],[2,0],[0,-2],[-1,-2],[-1,-1]],[[1467,8101],[13,-8],[14,-3],[10,-4],[7,-2],[2,-1],[1,-1],[2,-4],[3,-8],[2,-6],[5,-9],[3,-7],[1,-2],[0,-1],[0,-2],[2,-6],[6,-6],[4,-3],[8,-5],[6,-4],[1,-3],[2,-3],[1,-2],[2,-8],[4,-7],[3,-14],[1,1],[0,4],[1,1],[1,1],[0,-2],[1,-4],[2,-8],[0,-3],[-1,0],[-3,1],[-1,-1],[-2,-4],[-1,-1],[0,1],[-9,3],[-6,3],[-7,4],[-9,5],[-5,3],[-4,4],[-3,2],[0,3],[0,1],[5,8],[3,4],[1,3],[0,3],[0,4],[-1,-4],[-1,-3],[-1,-3],[0,-1],[-7,-1],[-5,0],[-3,-3],[-1,-1],[-1,1],[-4,5],[-4,3],[0,1],[3,2],[2,3],[-1,0],[-1,0],[-1,1],[-1,3],[-2,1],[-2,-2],[-1,0],[-1,3],[2,5],[0,1],[-3,-2],[0,1],[-1,2],[-1,0],[-2,0],[-2,2],[-1,-1],[0,-2],[-1,-1],[-3,4],[-2,-3],[-1,0],[0,1],[-1,7],[0,2],[1,1],[3,2],[7,2],[1,1],[-6,-1],[-1,1],[-2,3],[-2,0],[-1,0],[-1,2],[-2,7],[-2,1],[-3,1],[-1,2],[-1,-1],[0,-2],[-1,-1],[-2,-1],[-2,1],[-2,2],[0,2],[-1,2],[1,4],[0,1],[0,1],[-1,2],[-1,1],[0,-1],[0,-2],[-1,-1],[-2,-1],[-1,2],[-1,2],[-1,2],[-6,0],[-2,-2],[-2,0],[-1,0],[0,1],[1,4],[0,5],[-1,1],[-2,1],[-1,1],[2,5],[1,1],[1,1],[5,0],[2,0],[3,-4],[-1,1],[0,4],[-1,3],[2,2],[-2,1],[-6,1],[0,-2],[1,-2],[-4,-3],[-3,0],[-2,0],[-2,2],[-4,5],[-2,5],[0,3],[1,2],[2,2],[3,2],[6,0],[5,-2],[15,-10]],[[3459,8152],[-2,-6],[-1,-2],[-2,-1],[-2,-1],[-6,-1],[-3,-1],[0,-4],[0,-2],[1,-1],[1,-1],[3,1],[1,0],[0,-1],[1,-1],[0,-2],[0,-3],[0,-3],[-2,-7],[-3,-4],[-3,-3],[-1,-2],[0,-1],[-1,-5],[-1,-4],[-6,-9],[-2,-2],[0,-2],[0,-5],[-2,-3],[-4,-9],[-1,-3],[-1,-2],[0,-4],[0,-1],[-1,-3],[-1,-3],[0,-1],[0,-2],[1,-1],[0,-2],[-1,-4],[2,3],[4,7],[3,5],[2,2],[2,2],[1,5],[2,4],[2,1],[1,0],[1,-3],[0,-2],[-1,-4],[0,-1],[2,3],[4,2],[2,-1],[3,-3],[2,1],[4,2],[1,-1],[-1,-3],[-1,-2],[-4,-4],[-9,-7],[-3,-5],[1,0],[2,2],[2,1],[2,0],[1,0],[-1,-2],[0,-3],[-5,-8],[1,0],[6,4],[4,-5],[5,2],[3,1],[0,-1],[1,-2],[0,-3],[2,1],[0,1],[0,6],[2,-1],[0,-1],[0,-4],[0,-5],[-1,-3],[-3,-6],[1,-3],[-1,-2],[1,0],[2,2],[0,1],[0,2],[0,2],[2,2],[3,3],[1,1],[1,-1],[-1,-2],[1,1],[2,2],[2,2],[2,1],[2,2],[2,3],[2,2],[2,2],[1,1],[-1,-4],[1,-4],[0,-3],[0,-1],[2,4],[1,1],[1,1],[1,-1],[9,2],[2,-1],[3,-3],[4,-3],[2,-4],[0,-4],[0,-3],[-3,-3],[-3,-3],[-1,-2],[0,-3],[-1,-1],[-2,-2],[-7,-6],[2,0],[4,1],[3,0],[0,-1],[-1,-1],[-2,-2],[-1,-1],[1,-1],[2,-1],[3,1],[2,-1],[0,-2],[-2,-4],[-1,-3],[-2,-3],[-5,-3],[-2,-2],[1,0],[4,3],[3,0],[1,0],[2,3],[3,1],[2,-2],[4,5],[1,1],[3,-1],[1,1],[3,3],[2,1],[1,-1],[0,-4],[-1,-3],[0,-2],[-2,-4],[-2,-2],[-1,-1],[-2,1],[-1,-1],[-2,-4],[-3,-3],[-3,-2],[2,-1],[0,-4],[0,-1],[-4,-2],[-2,-1],[-3,-1],[2,-1],[4,1],[1,-1],[-1,-2],[-1,-3],[-5,-7],[0,-1],[1,-3],[1,-3],[1,-2],[3,0],[2,1],[2,5],[7,14],[5,4],[5,5],[1,-1],[0,-1],[0,-1],[-2,-4],[-2,-3],[-3,-9],[-1,-5],[0,-4],[0,-9],[0,-1],[1,-2],[2,2],[3,4],[2,4],[2,6],[0,2],[2,0],[0,-1],[1,-3],[1,-4],[0,-4],[0,-5],[-1,-3],[-6,-18],[1,-3],[0,-2],[0,-3],[-3,-8],[-1,-6],[-2,-2],[-1,-2],[-1,0],[-2,0],[-1,3],[-1,1],[-1,0],[-1,-1],[-4,-4],[-1,0],[-1,0],[-1,3],[1,12],[0,3],[-1,4],[1,5],[0,2],[-1,0],[-2,-3],[-2,-4],[-2,-5],[-5,-5],[-1,-1],[-1,0],[-1,1],[-1,2],[0,2],[0,3],[2,7],[3,10],[3,7],[1,3],[-1,2],[-1,2],[-1,8],[-1,6],[-2,3],[-4,3],[-1,-5],[-5,-12],[0,-5],[-1,-2],[-1,-2],[-2,-1],[1,2],[2,7],[-1,0],[-2,-5],[-2,-3],[-3,0],[-2,0],[-1,-1],[-7,-12],[0,-4],[-1,-3],[-3,-6],[-2,-3],[-2,0],[-2,1],[-2,0],[-3,-2],[-4,-1],[-2,1],[-1,0],[-2,3],[0,1],[0,1],[1,3],[3,3],[1,1],[5,2],[3,2],[3,4],[1,2],[5,11],[6,4],[3,3],[2,4],[0,1],[-3,-2],[-2,0],[-2,0],[-1,2],[-4,-1],[-4,1],[-1,-1],[-1,-5],[0,-3],[-1,-1],[-1,-1],[-2,0],[-6,2],[-1,1],[-1,0],[-6,-1],[-1,0],[1,1],[6,4],[0,11],[0,2],[-2,-1],[-2,-2],[-2,0],[-1,1],[-1,0],[-2,-6],[-1,-1],[-2,0],[-4,-3],[-7,-1],[-1,-2],[-5,1],[-15,3],[-5,0],[-6,2],[-1,1],[-9,-1],[-3,1],[0,2],[0,1],[-2,-3],[-3,-1],[-2,-2],[-10,-3],[-4,0],[-3,2],[-1,1],[-2,6],[-1,8],[0,1],[0,3],[2,3],[9,10],[7,9],[3,5],[3,2],[4,4],[0,1],[-4,-1],[-3,1],[-4,1],[-6,-1],[-6,0],[0,2],[3,4],[6,7],[1,0],[-2,-4],[-1,-2],[1,-2],[1,-1],[4,0],[0,1],[2,8],[2,8],[2,6],[2,5],[2,1],[1,-1],[3,-1],[4,-5],[1,0],[1,0],[-2,2],[-1,2],[0,2],[1,5],[2,2],[0,1],[-3,0],[-3,2],[-1,3],[1,4],[0,3],[3,4],[2,2],[2,0],[3,-4],[1,1],[0,1],[-3,6],[0,4],[0,1],[6,19],[2,10],[4,15],[1,3],[2,4],[1,2],[3,0],[1,0],[-2,2],[-1,2],[0,1],[1,1],[1,2],[3,2],[2,4],[1,5],[0,1],[-1,2],[0,1],[2,1],[4,6],[1,1],[1,7],[2,3],[2,2],[3,2],[8,5],[5,5],[4,0],[1,-3],[5,-3],[1,3],[-2,3],[1,1],[4,1],[1,-1],[1,-1],[0,-2]],[[1446,8149],[0,-1],[-1,0],[-2,1],[-1,2],[-2,6],[0,2],[1,1],[2,2],[1,0],[1,-2],[1,-4],[1,-1],[0,-5],[-1,-1]],[[3462,8173],[-1,0],[-1,0],[1,2],[1,3],[2,1],[0,-4],[-2,-2]],[[2795,8176],[-2,0],[-2,0],[-2,2],[-2,1],[9,6],[2,-1],[0,-1],[-2,-3],[0,-2],[0,-1],[-1,-1]],[[1360,8177],[-1,1],[-1,2],[0,5],[0,2],[0,1],[3,-4],[-1,-7]],[[1434,8202],[-2,-1],[1,3],[0,2],[-1,2],[0,3],[0,8],[2,5],[3,0],[0,-2],[-1,-12],[-1,-5],[0,-2],[-1,-1]],[[1418,8208],[-1,-2],[-3,6],[-2,2],[-2,7],[-1,2],[0,2],[1,1],[1,-1],[0,-1],[6,-7],[1,-3],[0,-6]],[[1408,8236],[-1,0],[-1,0],[-1,2],[-2,4],[0,2],[-1,3],[1,0],[1,0],[3,-7],[1,-4]],[[2757,8222],[-2,-1],[-6,2],[-2,1],[-7,4],[-14,6],[-4,3],[-1,2],[2,5],[2,2],[1,1],[14,2],[6,-1],[6,-9],[4,-7],[2,-5],[0,-3],[-1,-2]],[[1340,8248],[3,-6],[1,-4],[-1,-6],[-4,-2],[-2,2],[-1,-1],[-2,-1],[2,-1],[2,-3],[3,-4],[3,0],[4,-3],[-3,-4],[0,-3],[4,-7],[0,-2],[1,0],[3,0],[1,0],[0,-2],[-2,-4],[0,-1],[2,0],[3,0],[1,-4],[-3,-4],[-6,5],[-2,4],[-2,5],[-1,2],[-6,6],[-7,12],[-2,2],[-2,5],[-1,2],[0,2],[1,1],[2,0],[0,2],[-9,5],[-1,1],[-1,2],[1,1],[5,-1],[5,2],[3,1],[1,1],[3,2],[1,0],[3,-2]],[[1429,8233],[1,-18],[0,-6],[-2,-4],[-1,-7],[-2,-2],[-1,3],[0,7],[-1,5],[0,2],[1,10],[-1,-1],[-2,-4],[-2,0],[-3,4],[-2,4],[0,4],[-2,4],[-1,2],[1,2],[1,4],[1,3],[1,5],[1,3],[1,-1],[3,-2],[4,-3],[3,-4],[2,-10]],[[1412,8243],[-3,0],[-1,0],[0,2],[-1,2],[1,2],[2,4],[0,2],[0,1],[1,-3],[1,-2],[0,-8]],[[2779,8254],[0,-2],[-2,1],[-1,1],[0,1],[-1,1],[1,2],[2,-1],[1,-3]],[[1393,8246],[-1,0],[-1,1],[-6,9],[-5,4],[-3,5],[-3,3],[2,5],[2,-1],[5,-4],[5,-4],[2,-2],[6,-11],[-1,-2],[-2,-3]],[[1382,8292],[-1,-2],[-2,-4],[-1,-1],[-1,1],[-1,0],[-2,3],[-2,2],[-1,0],[0,-1],[0,-2],[0,-2],[0,-1],[-1,0],[0,1],[-1,2],[0,2],[0,1],[2,3],[4,4],[1,1],[2,0],[2,-2],[0,-1],[2,-4]],[[1315,8301],[3,-3],[6,2],[1,0],[1,-1],[1,-3],[2,-4],[0,-5],[-1,-2],[-1,-2],[-9,-7],[-1,-1],[1,-1],[2,0],[8,2],[0,1],[1,6],[1,3],[0,2],[-1,6],[0,2],[6,1],[3,2],[4,3],[0,-7],[-1,-2],[-3,-8],[-2,-7],[-1,-8],[0,-12],[-1,-4],[-1,-2],[-9,-5],[-5,1],[-5,4],[-2,2],[2,4],[1,0],[3,-1],[2,-1],[1,0],[0,1],[-6,6],[-5,3],[-2,3],[0,2],[0,2],[-4,8],[-1,4],[0,5],[0,4],[1,8],[0,1],[2,0],[2,-1],[7,-1]],[[1363,8322],[-1,0],[0,1],[0,2],[1,5],[1,1],[3,-1],[1,-1],[0,-2],[-2,-2],[-3,-3]],[[1373,8338],[2,4],[5,7],[3,4]],[[1383,8353],[0,-4],[-4,-8],[-5,-4],[-1,1]],[[3305,8412],[1,-2],[-5,1],[-1,1],[0,1],[0,1],[1,2],[2,1],[1,0],[2,-2],[0,-1],[-1,-2]],[[2810,8418],[-1,-1],[-1,0],[0,2],[1,4],[1,3],[0,3],[1,2],[1,3],[1,1],[1,0],[1,-7],[-1,-4],[-1,-2],[-1,-3],[-2,-1]],[[2778,8421],[-1,0],[-2,1],[1,4],[1,2],[4,1],[1,1],[1,1],[1,0],[2,2],[2,3],[1,0],[-1,-4],[-2,-4],[-8,-7]],[[2807,8425],[-2,-6],[-2,-6],[-3,-10],[-1,-1],[-1,3],[3,12],[1,2],[-1,1],[-1,2],[-1,-3],[-5,-13],[-1,-3],[-1,-1],[-1,0],[-3,0],[-4,-4],[7,17],[1,1],[-2,1],[0,-1],[-6,-10],[-4,-4],[-2,1],[-1,1],[0,1],[6,11],[6,7],[2,5],[1,5],[0,3],[0,3],[1,1],[0,-1],[0,-4],[-1,-8],[-1,-3],[-1,-4],[3,1],[1,4],[2,6],[1,5],[1,8],[0,-2],[1,-1],[2,-1],[1,-1],[0,-2],[1,-2],[2,-1],[1,0],[1,-3],[0,-2],[0,-1],[1,0],[-1,-3]],[[2791,8447],[-1,-1],[-1,0],[1,6],[-1,1],[0,1],[0,1],[1,0],[1,-1],[1,-2],[0,-2],[0,-1],[-1,-1],[0,-1]],[[2781,8454],[-1,-1],[-1,1],[0,3],[1,2],[1,0],[1,-1],[0,-2],[-1,-2]],[[3285,8499],[2,-2],[1,-6],[-5,0],[-5,4],[-1,4],[1,1],[1,-1],[1,1],[2,0],[3,-1]],[[2785,8497],[0,-1],[-1,1],[-1,-4],[0,-1],[-1,3],[1,2],[0,1],[0,1],[1,2],[1,1],[0,-3],[0,-2]],[[3079,8584],[-2,-4],[-2,1],[-1,-1],[-1,0],[1,4],[0,2],[0,3],[1,1],[3,1],[0,-4],[0,-1],[1,0],[0,-2]],[[2770,8618],[-1,0],[-1,1],[1,2],[1,0],[2,3],[1,-1],[-1,-2],[-1,-2],[-1,-1]],[[2776,8627],[-3,-1],[1,4],[1,1],[1,1],[3,1],[1,-2],[-1,-2],[-3,-2]],[[3211,8661],[-1,-4],[-4,1],[-5,3],[-2,2],[0,3],[0,3],[1,0],[4,0],[3,-4],[1,-1],[3,-3]],[[3104,8654],[-2,-1],[-1,1],[0,4],[0,2],[3,6],[3,6],[1,2],[3,-1],[2,-2],[2,-3],[1,-2],[-1,-4],[-2,-3],[-3,-2],[-6,-3]],[[2818,8682],[-4,-1],[0,1],[2,2],[6,2],[4,1],[-1,-2],[-2,-2],[-5,-1]],[[3199,8718],[-1,0],[-1,0],[-2,3],[-2,1],[-1,1],[-9,7],[-1,2],[0,3],[3,1],[6,1],[4,0],[5,-2],[1,-1],[2,-3],[0,-3],[0,-4],[-1,-1],[-2,-2],[-1,-3]],[[2415,8746],[-1,0],[-2,3],[-1,1],[3,1],[3,-2],[-1,-2],[-1,-1]],[[3193,8748],[1,-1],[1,1],[1,-2],[0,-1],[2,-2],[0,-1],[0,-1],[-1,-1],[-1,-1],[-6,4],[-2,4],[0,2],[0,2],[1,1],[2,0],[1,-1],[1,-3]],[[2790,8779],[2,-2],[4,-5],[1,-3],[1,-3],[-1,-5],[-1,-5],[-1,-3],[-3,-4],[-2,-5],[-2,-6],[-1,-4],[-2,-1],[-1,-1],[-1,0],[-3,2],[-3,4],[-2,2],[-3,2],[-2,2],[0,3],[0,7],[0,4],[0,3],[1,3],[2,3],[4,8],[3,3],[1,0],[4,0],[2,0],[2,1],[1,0]],[[3199,8787],[5,-1],[4,1],[1,-1],[1,-3],[-1,-4],[-2,-2],[-3,0],[-5,1],[-2,1],[-2,2],[1,2],[3,0],[0,1],[-1,1],[0,1],[1,1]],[[2944,8791],[-1,-1],[-6,1],[-7,2],[-3,3],[0,1],[1,0],[2,0],[3,-2],[8,-1],[3,-1],[0,-1],[0,-1]],[[3046,8787],[-2,-1],[-4,1],[-4,1],[-2,1],[-2,3],[0,3],[-4,5],[-4,2],[-3,3],[3,0],[3,0],[5,-2],[5,-2],[6,-4],[2,-4],[2,-3],[1,-2],[-1,-1],[-1,0]],[[2722,8810],[1,-2],[0,-2],[0,-3],[-1,-3],[-1,-3],[-2,-5],[-8,-7],[-3,-4],[-2,-3],[-12,-11],[-2,-1],[-1,1],[-4,1],[-3,1],[-9,-5],[-1,1],[0,5],[-1,2],[-4,6],[0,1],[0,2],[0,1],[5,6],[10,19],[2,1],[5,-2],[2,-1],[2,0],[7,4],[7,0],[6,2],[3,0],[3,0],[1,-1]],[[2836,8840],[3,-3],[2,0],[2,-2],[3,-6],[0,-1],[0,-2],[-2,-3],[-1,-1],[-4,-2],[-4,-1],[-3,1],[-6,6],[-6,7],[-2,4],[1,1],[2,2],[6,1],[8,-1],[1,0]],[[2870,8835],[-3,0],[-4,1],[-4,2],[-8,8],[6,6],[10,-6],[3,-4],[0,-7]],[[2843,8870],[-2,-3],[-6,1],[-1,1],[0,1],[1,1],[6,1],[3,0],[1,0],[0,-1],[-2,-1]],[[2641,8943],[1,-1],[1,0],[2,3],[4,8],[2,1],[1,0],[7,-5],[2,-3],[2,-4],[1,-2],[5,-2],[5,-1],[7,-2],[2,-1],[5,-8],[1,-1],[5,-3],[9,-7],[3,-1],[8,-2],[4,-2],[3,-3],[3,-5],[4,-7],[3,-13],[0,-2],[0,-2],[-1,-1],[-5,-5],[0,-1],[5,0],[10,3],[7,-2],[2,0],[1,0],[2,4],[2,-1],[4,-3],[3,-4],[1,-2],[-1,-1],[-2,-1],[6,-2],[5,-3],[-1,-3],[-5,-5],[-6,-4],[-7,-7],[-2,-1],[-1,0],[-3,1],[-6,3],[-16,8],[-5,1],[-7,1],[0,2],[-2,11],[-3,2],[-10,2],[-3,1],[0,3],[1,3],[-2,2],[-3,0],[-3,-1],[-6,-2],[-2,-3],[-1,-2],[-1,-6],[0,-2],[-2,-4],[-8,-8],[-4,-3],[-3,-1],[-1,-1],[-2,-3],[-4,-8],[-1,-2],[-2,-3],[-5,-3],[-4,-3],[-8,-3],[-4,-2],[-3,2],[-2,7],[-4,22],[-1,2],[-1,1],[-1,0],[-14,-3],[-7,1],[-8,-5],[-2,-1],[-3,0],[-3,1],[-1,1],[0,2],[0,2],[1,3],[3,6],[3,4],[1,2],[13,7],[3,2],[2,3],[0,3],[-1,3],[-2,8],[-1,7],[0,4],[1,5],[4,14],[1,6],[2,24],[1,6],[1,7],[2,3],[4,8],[3,3],[4,2],[1,-1],[1,0],[1,-4],[6,-2],[2,-3],[1,-3],[1,-4],[-1,-2],[-3,-3],[0,-1],[0,-1],[5,-4],[4,-10]],[[2648,8961],[-2,-1],[-1,1],[-2,1],[-1,3],[-1,2],[-4,3],[-1,1],[-1,4],[0,4],[-1,3],[0,2],[0,2],[4,1],[2,-1],[1,-1],[1,-1],[0,-2],[3,-5],[2,-4],[3,-7],[0,-2],[-1,-2],[-1,-1]],[[2674,8974],[4,-3],[3,-1],[6,-1],[1,0],[0,-1],[-1,-2],[-2,-2],[-1,0],[-4,1],[-1,1],[-1,2],[-1,0],[-1,-1],[1,-1],[-1,0],[-4,0],[0,1],[0,2],[3,2],[-3,1],[0,1],[-4,-2],[-2,0],[-3,1],[0,6],[-1,2],[-1,2],[-1,2],[-1,1],[-3,1],[-2,3],[-1,1],[1,1],[1,2],[8,-3],[5,-3],[4,-4],[3,-2],[0,-2],[-1,-2],[-1,-1],[1,-2]],[[2691,9002],[3,-1],[2,0],[0,-1],[-2,-3],[-1,0],[-3,2],[-2,2],[0,2],[0,1],[0,1],[3,-3]],[[1997,9043],[4,0],[4,0],[-1,-5],[-1,-2],[-2,-1],[0,1],[-3,4],[-1,3]],[[3259,9046],[-4,-1],[-2,1],[2,1],[1,2],[3,2],[1,2],[4,1],[2,0],[0,-1],[-2,-2],[-5,-5]],[[2003,9066],[-2,-5],[0,1],[-1,2],[-2,1],[-2,3],[0,5],[0,3],[0,3],[2,2],[2,-2],[1,-4],[-1,-3],[2,-2],[1,-2],[0,-2]],[[1967,9099],[4,0],[2,0],[2,-2],[0,-2],[0,-1],[-1,0],[-5,2],[-1,2],[-1,1]],[[2955,9088],[-14,0],[-7,0],[-3,1],[-3,2],[-3,4],[-2,5],[0,2],[1,1],[1,1],[9,2],[7,-2],[6,-2],[9,-1],[2,0],[1,-1],[1,-1],[1,-5],[0,-3],[0,-2],[-6,-1]],[[1963,9100],[-1,0],[-4,3],[1,3],[4,-3],[0,-2],[0,-1]],[[2594,9085],[-1,0],[-2,1],[-4,4],[-1,1],[0,2],[0,2],[0,2],[1,4],[-2,3],[-1,2],[0,1],[2,3],[0,1],[2,3],[3,4],[4,-1],[3,-4],[1,-2],[0,-3],[0,-3],[1,-5],[0,-4],[0,-2],[-2,-4],[-1,-2],[-1,-2],[-2,-1]],[[2898,9119],[14,-5],[2,-2],[0,-2],[1,-1],[0,-4],[-1,-2],[-1,-3],[0,-2],[1,-12],[0,-7],[-1,-5],[-2,-5],[-3,-3],[-3,-2],[-10,-5],[-8,-1],[-8,0],[-10,-2],[-4,1],[-3,0],[-1,1],[-2,3],[-3,5],[-1,6],[-3,10],[0,2],[2,8],[3,5],[5,9],[6,8],[1,1],[3,2],[6,2],[6,-1],[2,1],[3,1],[3,0],[6,-1]],[[2806,9112],[-2,-1],[-4,3],[0,2],[1,4],[6,1],[2,-3],[1,-2],[-4,-4]],[[2096,9124],[-2,0],[-3,1],[-4,2],[-3,2],[-2,2],[0,2],[1,1],[3,0],[5,0],[3,-1],[4,-4],[1,-1],[0,-2],[-1,-1],[-2,-1]],[[2920,9121],[-2,-1],[-4,4],[-6,4],[-3,3],[0,1],[0,2],[1,3],[2,3],[3,1],[3,-1],[3,-2],[3,-6],[1,-3],[1,-2],[-1,-1],[0,-1],[1,-1],[-1,-1],[0,-1],[-1,-1]],[[2171,9134],[-1,0],[-2,1],[-9,4],[-1,1],[1,1],[3,2],[2,2],[2,3],[5,-1],[2,-2],[1,-1],[0,-2],[0,-4],[-2,-1],[-1,-3]],[[2216,9147],[-1,-2],[-1,0],[-2,-3],[-1,0],[-1,2],[-1,2],[-1,0],[-2,-1],[-1,0],[0,1],[0,1],[0,3],[0,5],[0,1],[0,2],[0,1],[1,1],[2,0],[3,0],[2,-2],[1,-2],[2,-2],[1,-1],[-1,-6]],[[2222,9159],[0,-4],[-4,1],[-1,2],[-2,2],[0,1],[0,1],[2,3],[1,1],[2,-1],[1,-2],[1,-2],[0,-2]],[[2486,9171],[-2,-1],[-2,3],[-1,0],[0,2],[-3,0],[0,2],[1,2],[2,1],[2,-1],[2,-2],[1,-2],[0,-3],[0,-1]],[[2799,9149],[-1,0],[-3,1],[-1,2],[0,2],[0,1],[1,1],[2,2],[2,3],[2,2],[6,2],[1,1],[3,6],[1,1],[3,0],[0,1],[-1,1],[0,2],[1,1],[1,1],[4,2],[4,-1],[1,0],[0,-1],[2,-3],[-2,-3],[-4,-3],[-3,-3],[0,-1],[-1,-2],[0,-1],[-4,-4],[-2,-4],[-2,-2],[-5,-2],[-5,-2]],[[2494,9182],[1,-3],[-3,-5],[0,-1],[-1,0],[-1,0],[-3,4],[-1,2],[1,2],[2,1],[2,1],[2,-1],[0,1],[1,-1]],[[2861,9166],[-4,0],[-2,0],[-2,1],[-1,2],[-2,5],[1,2],[0,4],[0,1],[1,1],[4,1],[2,0],[3,-1],[7,-1],[2,-1],[0,-1],[0,-1],[0,-1],[-4,-4],[-2,-2],[-1,-3],[-2,-2]],[[2189,9181],[-2,-1],[0,1],[0,1],[0,1],[-1,1],[2,1],[0,1],[-3,2],[-1,1],[0,1],[2,1],[1,0],[4,-2],[2,-2],[1,-2],[-1,-1],[-1,0],[-1,-2],[-2,-1]],[[2347,9191],[3,-4],[0,-2],[0,-3],[-1,-2],[-2,-2],[-2,-1],[-3,0],[-1,1],[1,3],[0,2],[0,4],[-1,2],[-1,1],[-2,0],[0,-1],[1,-2],[-1,-3],[-1,-4],[-1,-2],[-2,1],[-1,2],[1,2],[-1,2],[1,2],[1,4],[2,2],[2,1],[2,0],[3,-1],[3,-2]],[[1138,9191],[-3,-2],[-3,2],[-1,2],[4,3],[2,-1],[4,-1],[1,-2],[-4,-1]],[[3113,9189],[-1,0],[-7,3],[0,2],[3,2],[3,1],[2,0],[3,0],[2,-3],[-3,-2],[-2,-3]],[[2832,9199],[2,-3],[0,-1],[-2,-2],[-7,-3],[-5,-3],[-2,-1],[-3,1],[-4,-1],[-2,0],[2,2],[6,7],[5,1],[1,1],[2,0],[1,1],[0,1],[1,2],[2,0],[3,-2]],[[2793,9203],[1,-3],[1,-1],[-1,-1],[-4,-4],[-9,-1],[-5,2],[2,-5],[1,-2],[-1,-1],[-2,1],[-3,1],[-2,1],[0,2],[-1,1],[-1,-1],[-1,0],[-2,3],[-1,1],[-9,1],[-1,1],[1,1],[1,2],[2,0],[6,0],[0,2],[1,1],[3,0],[3,0],[1,-1],[1,-2],[2,0],[2,0],[3,1],[4,2],[4,1],[4,-2]],[[2293,9195],[1,-1],[2,1],[1,2],[1,0],[1,0],[4,-3],[3,-4],[3,-3],[5,-2],[11,-7],[3,-5],[3,-8],[3,-6],[3,-4],[3,-3],[5,-3],[4,2],[1,1],[2,-1],[1,-3],[0,-1],[-2,-2],[-3,-1],[-4,-1],[-2,0],[-3,-3],[-3,-3],[-4,-2],[-6,-5],[-4,-2],[-6,-1],[-11,5],[-7,-1],[-6,1],[-6,5],[-5,2],[-10,4],[-1,1],[0,1],[0,2],[-1,1],[0,1],[-2,0],[-1,-1],[-3,-2],[-5,1],[-2,1],[-1,1],[-1,1],[0,2],[-1,1],[-1,1],[-1,0],[-3,-1],[-1,-1],[1,-1],[-1,-1],[-4,0],[-2,1],[-3,2],[-2,3],[-2,4],[0,1],[2,3],[1,2],[10,1],[5,1],[5,3],[7,5],[1,1],[0,1],[0,2],[-2,3],[-1,2],[1,1],[2,0],[-1,1],[-1,1],[-1,1],[0,2],[2,0],[3,0],[4,-5],[2,-1],[3,-1],[-3,4],[-3,6],[-1,3],[0,1],[1,4],[1,1],[1,1],[3,2],[6,2],[2,0],[3,-1],[3,-3],[5,-3],[1,-2],[0,-1],[-2,-1],[-1,-1],[1,-1]],[[2585,9222],[4,0],[3,0],[2,0],[1,-2],[1,-2],[1,-1],[-2,-2],[-5,-1],[-3,1],[-3,1],[-2,0],[-4,1],[-2,1],[-2,2],[0,2],[4,1],[2,1],[5,-2]],[[2213,9244],[-6,2],[-2,1],[-1,1],[-1,2],[0,3],[1,1],[3,0],[3,-1],[4,-3],[-1,-1],[0,-2],[1,-2],[-1,-1]],[[2924,7776],[-1,0],[-3,0],[-4,-2],[-5,-4],[-6,-7],[-11,-16],[0,-2],[-2,-3],[-4,-3],[-4,-3],[-1,-4],[-1,-2],[-6,-9],[-4,-7],[-3,-8],[-3,-9],[-7,0],[-6,0],[-9,0],[-8,0],[-9,0],[-7,0],[-7,0],[-3,-3],[-5,-3],[-4,-4],[2,-7],[1,-3],[-1,-10],[1,-1],[0,-2],[1,-2],[0,-2],[1,-1],[1,-1],[0,-1],[1,-2],[-1,-2],[-3,-4],[-4,-3],[-7,-6],[-9,-6],[-7,-6],[-6,-4],[-12,-4],[-10,-3],[-7,-2],[-6,-6],[-7,-7],[-6,-5],[-7,-7],[-6,-6],[-7,0],[-5,5],[-5,4],[-3,9],[0,9],[1,6],[1,3],[2,2],[4,3],[3,6],[3,4],[3,4],[1,7],[2,16],[1,3],[2,11],[4,12],[1,5],[-2,15],[-1,11],[-1,10],[-1,12],[-1,10],[-1,10],[-1,10],[-2,10],[0,7],[-1,8],[-6,6],[-5,4],[-7,6],[-6,6],[-5,5],[3,10],[0,2],[-1,2],[-3,3],[-1,0],[-3,0],[-4,-2],[-2,0],[-1,4],[-2,4],[-1,4],[0,5],[-1,4],[1,2],[0,1],[0,2],[-1,1],[-1,0],[-4,-2],[-2,0],[-1,-1],[-2,-2],[-1,0],[-3,5],[-3,5],[-2,7],[-1,8],[-5,5],[-6,4],[-5,5],[-5,5],[-6,4],[-5,5],[-6,4],[-5,5],[-2,2],[-5,4],[-7,5],[-8,7],[-8,6],[-7,6],[-4,4],[-2,2],[-5,4],[-6,4],[-7,-2],[-8,-7],[-4,-3],[-4,-3],[-2,-1],[-5,-2],[-3,1],[-6,0],[-3,-1],[-3,1],[-1,4],[-2,2],[-6,-1],[-8,1],[-4,0],[-1,1],[-2,4],[-2,1],[-3,-1],[-5,-5],[-5,-3],[-3,0],[-4,3],[-6,5],[-4,6],[-5,2],[-3,-1],[-1,-3],[-2,0],[-2,6],[-1,4],[-2,1],[-4,4],[-3,2],[-4,3],[-2,0],[-3,1],[-3,0],[-3,-1],[-2,-3],[-3,-2],[-4,0],[-3,1],[-1,4],[-6,2],[-10,3],[-6,2],[-1,2],[-1,2],[0,3],[-3,8],[-1,7],[0,8],[0,3],[-1,0],[-1,2],[-6,1],[-1,-9],[0,-12],[-6,0],[-12,0],[-12,0],[-12,0],[-12,0],[-11,0],[-12,0],[-12,0],[-12,0],[-12,0],[-12,0],[-11,0],[-12,0],[-12,0],[-12,0],[-12,0],[-12,0],[-11,0],[-12,0],[-12,0],[-12,0],[-12,0],[-12,0],[-12,0],[-11,0],[-12,0],[-12,0],[-12,0],[-12,0],[-12,0],[-11,0],[-12,0],[-12,0],[-12,0],[-12,0],[-12,0],[-12,0],[-11,0],[-12,0],[-12,0],[-12,0],[-12,0],[-12,0],[-11,0],[-12,0],[-12,0],[-12,0],[-12,0],[-12,0],[-11,0],[-12,0],[-12,0],[-12,0],[-12,0],[-12,0],[-12,0],[-11,0],[-12,0],[-12,0],[-12,0],[-12,0],[-12,0],[-11,0],[-12,0],[-12,0],[-3,0]],[[1589,8006],[-1,2],[-3,2],[-1,0],[-1,0],[-1,-2],[0,-2],[-1,-1],[0,1],[-1,3],[0,2],[1,2],[0,1],[-2,-1],[-1,1],[0,1],[0,4],[-1,2],[1,1],[3,1],[4,0],[1,2],[1,4],[-3,-4],[-1,0],[-5,1],[-3,0],[0,1],[0,1],[1,1],[0,3],[1,8],[1,3],[0,2],[-4,-6],[0,-1],[0,-2],[0,-3],[-2,-1],[-1,0],[-2,-3],[-1,0],[-9,5],[-1,1],[-1,2],[-2,4],[-1,3],[1,3],[1,2],[1,0],[1,-2],[2,-4],[0,-3],[3,0],[3,4],[1,1],[-3,-1],[-2,0],[-2,2],[-1,3],[-1,3],[0,11],[1,2],[1,1],[1,3],[0,1],[-1,2],[-1,2],[-2,1],[0,-1],[2,-4],[0,-2],[-2,-5],[-1,-1],[0,-4],[0,-1],[-2,-2],[-3,-3],[-3,-1],[-4,0],[-2,2],[-6,8],[-2,4],[0,3],[-5,11],[0,2],[-1,3],[-2,1],[0,3],[3,7],[2,5],[1,2],[0,3],[-1,6],[1,3],[-3,-4],[0,-2],[1,-3],[-1,-3],[-1,-4],[-2,-5],[-4,-2],[-8,1],[0,1],[-1,1],[0,7],[-1,-1],[-1,-3],[0,-5],[-1,-1],[-2,-1],[-1,1],[-1,2],[-2,0],[-3,-1],[-2,0],[-2,0],[-4,2],[-4,0],[-2,1],[0,3],[1,1],[5,1],[5,2],[5,1],[0,1],[-3,1],[-10,-3],[-4,0],[0,1],[-1,2],[2,3],[2,2],[0,2],[-1,1],[-2,-1],[-1,2],[1,5],[-1,6],[-1,-6],[-2,-3],[-9,-1],[-1,-1],[-2,0],[-5,2],[-3,2],[-2,3],[-4,5],[-4,4],[0,7],[1,4],[2,5],[5,10],[2,2],[2,1],[9,1],[6,1],[2,1],[-10,1],[-8,-1],[-3,-2],[-4,-6],[-1,-3],[-1,-2],[-2,1],[-1,3],[-2,3],[-1,4],[0,6],[0,3],[1,3],[3,7],[-4,-1],[1,6],[1,6],[3,3],[4,3],[3,3],[5,3],[2,-5],[5,-1],[1,-2],[2,-4],[2,-4],[2,-3],[1,-1],[-1,3],[-4,7],[0,2],[-1,3],[-5,3],[-1,2],[-1,3],[-1,3],[1,2],[5,7],[1,3],[0,2],[0,2],[-1,3],[0,-5],[0,-2],[-1,-2],[-1,-1],[-1,-2],[-11,-15],[-1,-1],[-5,-2],[-2,-1],[-1,-3],[-2,-5],[-3,-12],[-3,-9],[-2,12],[-5,9],[9,9],[0,2],[0,5],[0,1],[1,2],[2,3],[0,1],[-3,-1],[-4,-8],[-1,-2],[-1,0],[0,4],[2,11],[2,10],[0,3],[2,3],[-2,0],[-7,-5],[-2,3],[-2,16],[-4,6],[-6,4],[-6,3],[-1,4],[-1,5],[1,6],[3,3],[2,2],[3,-1],[0,-2],[-2,-6],[2,-1],[8,-7],[2,-1],[3,3],[2,0],[5,-2],[1,-3],[4,-6],[0,4],[-5,6],[-2,2],[-5,1],[-3,-1],[-1,0],[-2,2],[-2,2],[-3,7],[0,2],[0,3],[1,1],[0,2],[2,1],[3,1],[1,1],[-4,3],[-1,0],[-5,-5],[-1,0],[-1,1],[-2,-3],[-1,-1],[-4,-8],[-1,-3],[0,-6],[-1,-3],[0,-2],[-5,-3],[-3,-5],[-4,5],[-3,4],[-3,8],[-4,2],[-6,4],[-2,4],[3,8],[4,7],[1,7],[1,2],[7,2],[4,3],[-5,1],[-2,-1],[-6,-2],[-5,5],[-3,4],[-1,4],[1,4],[0,3],[0,5],[1,2],[1,2],[3,2],[2,6],[1,3],[4,11],[2,5],[3,7],[6,10],[-2,0],[-1,-1],[-1,0],[-1,1],[-1,2],[-1,4],[0,-2],[0,-6],[-1,-6],[-1,-4],[-3,-8],[-2,-3],[-1,3],[1,5],[2,4],[0,5],[-1,7],[-1,5],[-1,4],[0,4],[0,3],[1,4],[1,3],[0,1]],[[1388,8403],[0,3],[0,4],[-1,3],[-1,3],[-3,-2],[-6,2],[-1,7],[-5,1],[-3,5],[-5,2],[-4,2],[-4,2],[-3,3],[-4,3],[-3,3],[-2,0],[-5,-1],[0,6],[-2,3],[1,3],[-3,1],[-4,3],[1,5],[1,4],[-3,2],[-5,1],[1,4],[2,3],[-2,5],[-4,7],[-3,6],[-4,8],[-3,7],[-3,6],[-3,5],[-3,7],[-4,8],[-4,7],[0,4],[-4,6],[-3,5],[-4,6],[-4,3],[-3,2],[-4,3],[-3,3],[-1,3],[0,1],[-1,3],[-1,2],[-1,2],[-5,4],[-1,3],[-4,3],[-3,1],[-1,1],[-3,9],[0,3],[1,3],[-1,1],[-5,7],[-3,3],[-3,3],[-7,-4],[-6,-4],[-5,-1],[-6,-2],[2,-4],[-1,-3],[-2,-2],[-3,1],[0,-11],[-3,-7],[-6,0],[-4,-3],[-5,-4],[-4,-3],[-5,-4],[-2,0],[1,5],[-2,7],[-1,6],[-3,3],[-5,6],[-3,4],[-6,5],[-3,4],[-4,4],[-5,6],[-2,7],[-5,3],[-4,2],[-4,6],[1,5],[2,6],[0,4],[-5,-1],[-6,0],[-6,0],[-4,-5],[-4,-4],[-6,3],[-8,4],[-2,-5],[-6,3],[-7,2],[0,17],[0,17],[0,16],[0,17],[0,17],[0,17],[0,17],[0,17],[0,16],[0,17],[0,17],[0,17],[0,17],[0,17],[0,16],[0,17],[0,17],[0,17],[0,17],[0,17],[0,16],[0,17],[0,17],[0,17],[0,17],[0,17],[0,16],[0,17],[0,17],[0,17],[0,17],[0,17]],[[1083,9196],[4,-1],[13,-2],[12,1],[22,-6],[13,-12],[11,-5],[5,-4],[7,-4],[17,-7],[5,-1],[10,-3],[6,0],[11,-1],[7,-3],[14,-7],[3,-1],[-4,8],[-1,1],[-6,3],[-6,1],[-1,1],[-1,3],[0,1],[2,0],[5,0],[2,1],[1,1],[-2,0],[-3,1],[-3,2],[-1,2],[6,11],[2,-1],[3,3],[6,-2],[1,1],[0,6],[1,1],[2,1],[8,1],[10,-1],[1,1],[-1,3],[0,2],[0,4],[1,1],[1,1],[5,0],[1,-2],[2,-3],[2,-2],[4,-1],[1,-2],[-2,-4],[-2,-3],[-4,-6],[0,-1],[6,2],[7,4],[6,2],[5,1],[4,1],[2,2],[2,2],[3,7],[2,2],[9,-1],[2,0],[1,1],[0,1],[-2,1],[-3,0],[0,1],[1,1],[2,1],[4,0],[3,-2],[2,0],[6,2],[10,8],[4,2],[3,0],[3,-1],[2,0],[3,5],[1,2],[2,2],[7,4],[5,1],[3,-1],[3,-2],[3,0],[4,0],[2,0],[2,1],[4,5],[2,0],[1,-2],[3,-3],[0,-2],[-3,-4],[-23,-13],[-7,-5],[-3,-2],[-4,-2],[-7,0],[-3,-2],[-4,-1],[-11,-1],[-2,-1],[-1,-1],[-4,-7],[-2,-2],[-4,-3],[-4,-2],[-6,-1],[-4,-3],[-4,-6],[-3,-4],[-4,-4],[-4,-4],[-1,-3],[1,-3],[1,-1],[4,-2],[2,0],[-2,2],[-3,3],[-1,1],[1,0],[17,-2],[3,2],[1,2],[0,1],[-4,0],[-1,2],[-1,3],[0,2],[0,1],[1,3],[5,3],[5,2],[4,2],[2,2],[6,3],[3,2],[1,2],[0,1],[-1,1],[1,2],[4,2],[2,0],[6,-2],[2,-1],[-1,-3],[1,0],[2,4],[1,1],[2,1],[1,-1],[2,-1],[0,-4],[0,-6],[1,-3],[1,4],[1,3],[6,9],[4,5],[5,5],[6,4],[16,6],[8,1],[4,2],[3,1],[1,2],[2,2],[1,0],[-1,-4],[-1,-2],[-5,-2],[-1,-2],[1,-3],[1,-2],[1,-1],[2,1],[4,2],[4,4],[9,8],[0,2],[3,7],[5,3],[9,3],[2,3],[-8,2],[-2,1],[0,1],[2,2],[-4,2],[-1,1],[0,3],[1,3],[2,2],[2,1],[3,-2],[3,-2],[11,-8],[4,-4],[2,-4],[6,-10],[3,-6],[2,-6],[2,-4],[2,-3],[10,-11],[5,-4],[4,-3],[5,-2],[6,-2],[4,0],[6,5],[0,3],[-3,5],[-2,3],[0,2],[4,4],[-1,2],[1,4],[2,-1],[1,0],[2,2],[2,3],[2,2],[2,2],[1,1],[-3,1],[-1,0],[-1,0],[-1,1],[1,1],[6,2],[1,2],[2,2],[2,0],[1,0],[2,-2],[0,-3],[-1,-4],[0,-4],[2,-9],[2,-2],[6,-2],[0,-2],[-8,-9],[-1,-3],[-1,-1],[0,-2],[2,-1],[2,-1],[6,0],[2,1],[12,0],[3,1],[1,1],[3,5],[3,1],[1,1],[2,6],[1,6],[1,2],[1,2],[2,0],[5,0],[2,0],[9,0],[9,0],[9,-1],[6,-1],[5,-2],[11,-5],[4,-2],[14,-12],[5,-2],[8,-2],[27,-5],[3,-1],[8,-6],[5,-3],[5,-2],[8,-3],[14,-4],[3,-1],[2,0],[3,0],[13,-2],[4,0],[2,0],[3,-2],[5,0],[0,1],[-5,6],[0,1],[2,0],[6,-1],[2,1],[2,0],[5,0],[5,-2],[6,-3],[7,-3],[10,-6],[6,-5],[5,-6],[3,-4],[1,-2],[1,-2],[1,0],[1,-1],[-1,-5],[-1,-1],[-2,-1],[-4,-1],[-14,1],[-3,-4],[-7,-4],[-2,-1],[0,-2],[1,-3],[-1,-2],[-6,-4],[-1,-1],[4,-2],[5,-3],[3,-1],[4,1],[6,-1],[6,-3],[5,-1],[2,0],[4,0],[4,-1],[6,-1],[13,0],[4,-1],[5,0],[11,0],[2,0],[3,2],[2,1],[4,0],[11,2],[3,-1],[4,2],[4,2],[3,0],[1,-1],[2,-1],[3,0],[5,3],[12,7],[4,0],[3,2],[1,0],[1,-1],[3,-5],[1,-1],[2,0],[2,-3],[2,-4],[2,-1],[11,0],[4,-1],[1,-1],[1,-3],[1,-6],[0,-3],[2,-3],[1,-1],[1,1],[3,8],[1,2],[2,-1],[3,-6],[4,-5],[10,-8],[2,-3],[0,-3],[0,-2],[-2,-2],[-3,-1],[-3,-1],[-4,0],[-3,2],[-1,0],[1,-1],[7,-7],[1,-3],[2,-2],[1,-1],[2,-2],[1,-2],[5,-5],[2,-3],[6,-8],[3,-4],[2,-2],[1,0],[0,2],[-8,11],[-4,7],[-1,2],[0,2],[0,9],[0,1],[3,1],[4,-4],[1,0],[1,0],[0,1],[2,-1],[4,-3],[1,0],[-2,6],[-2,2],[-1,2],[2,3],[-1,1],[-5,4],[-2,5],[-2,6],[0,3],[0,2],[0,2],[-3,5],[-3,3],[-3,3],[0,2],[0,5],[2,2],[3,3],[1,3],[-1,3],[-1,2],[1,-1],[7,2],[2,-1],[3,1],[3,2],[3,1],[4,0],[2,0],[2,1],[1,1],[3,3],[1,1],[3,0],[3,-1],[1,0],[-1,5],[1,2],[4,4],[4,0],[2,1],[3,2],[2,2],[2,3],[1,4],[0,1],[-5,1],[-2,-1],[-6,-2],[-6,-4],[-3,-3],[0,-4],[-2,-2],[-4,2],[-2,0],[-3,-1],[-3,-2],[-2,-2],[-5,0],[-5,1],[-4,1],[-3,-3],[0,-2],[2,-3],[-2,-2],[-8,0],[-2,0],[-4,-1],[-2,0],[-1,2],[-9,5],[-1,2],[2,4],[8,13],[1,1],[15,2],[9,2],[17,7],[4,1],[10,4],[5,1],[4,0],[6,-3],[3,-2],[2,-2],[2,-4],[2,-8],[1,-7],[2,-3],[5,-4],[2,-2],[2,-1],[1,1],[1,0],[1,0],[1,-3],[4,0],[3,-1],[0,-1],[0,-4],[0,-2],[4,-3],[4,-1],[5,-1],[8,1],[6,1],[6,3],[4,-3],[8,-7],[5,-5],[4,-2],[9,-3],[2,-2],[3,0],[4,1],[5,0],[5,-2],[4,-1],[13,4],[1,0],[5,2],[3,0],[4,0],[3,1],[1,1],[7,0],[12,-1],[9,-2],[5,-2],[4,-1],[3,-1],[3,1],[3,1],[3,2],[7,1],[1,0],[0,1],[-1,2],[-4,3],[-3,4],[-1,2],[1,2],[0,1],[2,1],[3,-2],[3,-3],[10,-13],[2,-2],[1,-1],[9,-5],[5,-1],[5,3],[2,2],[1,2],[0,1],[0,3],[0,1],[-1,2],[-4,3],[-6,3],[-5,1],[-5,-1],[-6,-3],[-2,1],[-7,8],[-1,3],[0,1],[3,-1],[0,1],[-2,4],[-1,1],[-4,7],[-1,1],[3,1],[1,1],[2,0],[6,-4],[4,1],[8,3],[-3,3],[-1,4],[1,1],[2,0],[6,-3],[2,0],[2,1],[2,0],[2,-1],[2,-1],[4,-5],[1,-2],[2,-4],[1,-1],[10,0],[5,3],[0,-1],[-1,-3],[-7,-10],[0,-1],[4,0],[1,1],[1,1],[1,3],[1,1],[10,5],[3,1],[-2,-5],[-4,-19],[0,-7],[-1,-2],[-4,-7],[0,-3],[4,-6],[1,-1],[0,-5],[1,-1],[4,-1],[3,2],[5,1],[1,-1],[-3,-6],[4,1],[2,0],[1,0],[3,-3],[1,-2],[0,-4],[-1,-2],[-1,-2],[-1,0],[-2,-1],[-1,0],[-4,0],[-3,1],[-3,2],[-1,0],[-3,-1],[-3,0],[-4,4],[-1,0],[-1,-1],[0,-1],[2,-3],[13,-14],[2,-3],[1,-4],[1,4],[-1,2],[-6,8],[-1,3],[0,1],[2,1],[10,-2],[3,1],[3,1],[1,2],[1,10],[2,6],[-1,6],[-3,9],[-2,5],[-5,5],[0,2],[5,17],[1,1],[1,1],[4,0],[3,1],[5,-2],[3,0],[3,2],[7,6],[3,3],[4,4],[4,5],[5,5],[7,4],[5,3],[1,1],[-4,0],[-1,1],[-1,3],[0,6],[0,3],[0,3],[-1,2],[-2,2],[-1,2],[-1,0],[-1,0],[0,-1],[-2,-5],[-1,-4],[-2,-2],[-4,-2],[-8,-1],[-3,2],[0,2],[1,6],[2,3],[7,5],[4,4],[0,1],[-4,0],[0,1],[-1,5],[0,2],[1,2],[2,2],[9,2],[6,2],[0,-1],[-5,-7],[0,-1],[2,-2],[5,4],[3,4],[0,1],[-2,0],[-1,2],[1,2],[0,2],[-4,2],[-4,-1],[-3,-3],[-3,0],[-4,0],[-3,0],[-2,1],[-2,3],[-3,4],[-3,4],[-1,0],[-1,-1],[-2,-3],[-1,-1],[-13,6],[-6,2],[-2,3],[-4,1],[-4,0],[-3,1],[-2,2],[-2,2],[-2,3],[-2,4],[-7,8],[-1,5],[0,2],[0,5],[6,8],[1,2],[2,2],[3,1],[2,0],[4,-1],[-2,3],[-1,1],[3,5],[-8,-4],[-2,1],[-3,2],[-5,7],[0,5],[1,6],[1,4],[-1,4],[0,1],[2,0],[0,1],[0,4],[1,2],[4,4],[3,3],[2,1],[2,0],[2,-1],[2,-2],[4,-2],[2,0],[2,1],[3,7],[2,2],[-1,0],[-7,0],[-3,1],[-1,1],[-1,2],[1,2],[6,5],[3,5],[8,7],[9,4],[4,1],[4,0],[1,0],[2,-4],[0,-4],[5,-5],[4,0],[2,1],[8,-1],[2,-1],[0,-1],[-1,-3],[0,-2],[5,-4],[5,-3],[4,-3],[7,-7],[1,-2],[1,-3],[1,-8],[1,-3],[-1,-9],[0,-1],[-2,-2],[1,-1],[4,-2],[4,-5],[2,-1],[5,-3],[1,-1],[1,-1],[3,-7],[5,-6],[0,-1],[-1,-3],[1,-1],[2,-1],[1,1],[2,2],[1,0],[2,-1],[1,-1],[2,-4],[2,-3],[0,-1],[-1,-1],[-7,-1],[-4,1],[-3,1],[-3,2],[-2,3],[-1,-1],[-1,-2],[-2,-3],[-2,-2],[2,-2],[9,1],[2,-1],[2,-2],[-3,-3],[-6,-6],[-13,-10],[-3,-2],[0,-1],[2,0],[4,0],[4,1],[6,0],[2,-1],[-1,-1],[1,-2],[9,-4],[5,1],[5,4],[4,1],[5,0],[2,0],[-1,-1],[-3,-2],[-4,-3],[0,-1],[4,1],[9,-1],[5,-1],[3,1],[3,-1],[3,-2],[1,-1],[-3,0],[-2,0],[-2,-1],[-2,-2],[-1,-3],[-1,-3],[-2,-2],[-3,1],[-1,1],[0,1],[-1,0],[-2,0],[-2,-1],[-1,0],[14,-11],[4,-9],[3,-4],[1,-1],[-2,-2],[0,-2],[1,-6],[-1,-4],[-1,-8],[1,-3],[3,-2],[2,-3],[1,0],[1,-3],[1,-1],[1,-1],[1,1],[0,2],[2,2],[3,3],[3,6],[0,2],[0,4],[0,2],[3,6],[1,4],[1,7],[1,5],[3,4],[6,8],[2,2],[2,1],[4,-1],[3,-2],[4,-5],[5,-5],[9,-6],[2,-2],[5,-6],[2,-6],[2,-8],[1,-5],[1,-2],[1,-2],[-1,-4],[0,-2],[-1,-2],[-1,-1],[-2,-1],[-4,1],[-1,1],[-2,4],[-3,-3],[-1,-2],[1,-5],[0,-10],[1,-2],[3,-11],[5,-8],[14,-16],[1,-1],[1,-7],[1,-1],[1,-1],[1,0],[2,0],[5,5],[4,5],[3,3],[2,0],[2,1],[2,2],[1,2],[1,2],[1,7],[1,4],[2,5],[1,1],[10,13],[1,2],[5,14],[1,7],[1,4],[-1,4],[0,3],[1,2],[2,2],[2,1],[1,3],[1,0],[2,0],[2,-2],[2,0],[11,2],[0,1],[-6,3],[0,2],[0,2],[2,2],[3,1],[1,1],[0,2],[0,3],[0,1],[-7,5],[-3,-1],[-1,1],[-3,3],[-1,5],[0,2],[0,4],[0,1],[0,1],[-1,2],[0,2],[1,2],[0,2],[-2,2],[0,2],[1,5],[0,2],[-1,2],[-1,1],[1,1],[2,0],[3,-1],[4,-2],[4,0],[5,2],[5,1],[10,0],[2,-1],[9,-5],[7,-3],[3,1],[15,-1],[7,0],[4,0],[7,-3],[-1,-2],[-3,-4],[-4,-1],[-3,-1],[3,-3],[9,-2],[3,-5],[0,-2],[-1,-2],[1,-1],[2,0],[5,2],[6,-1],[9,-3],[1,-1],[2,-3],[0,-1],[-8,-7],[-4,-2],[-6,-3],[0,-2],[8,0],[6,-1],[2,-1],[2,-1],[1,-3],[1,-2],[0,-3],[-1,-2],[-7,-5],[-3,-2],[-5,-2],[-3,-2],[-2,0],[-3,2],[-3,1],[-5,-2],[-3,0],[-1,-1],[0,-1],[2,-3],[1,-2],[1,-1],[-1,-2],[1,-1],[5,-8],[1,-1],[1,1],[2,2],[1,1],[1,0],[0,-2],[-3,-7],[0,-1],[0,-2],[1,-4],[3,-3],[3,-4],[4,-4],[6,-5],[2,-3],[4,-5],[0,-3],[-1,-6],[-2,-9],[-2,-6],[0,-1],[-5,-4],[-2,-1],[-5,0],[-1,-1],[-2,-3],[-3,-5],[-3,-4],[-1,-1],[-3,-2],[-5,-5],[-3,-2],[-8,-2],[-7,-7],[-3,-2],[-3,-1],[-3,0],[-2,1],[-1,4],[-1,1],[-2,3],[-5,8],[-3,3],[-1,1],[-3,-1],[-1,1],[-4,2],[-1,2],[0,1],[3,1],[-1,1],[-5,4],[-1,2],[-1,0],[-4,3],[-4,1],[-5,-5],[-3,-2],[1,-1],[2,-1],[1,0],[2,3],[2,0],[3,0],[3,-2],[1,-1],[0,-1],[8,-9],[2,-1],[1,-2],[1,-4],[2,-3],[3,-6],[4,-8],[1,-3],[-2,-1],[-1,-1],[-3,2],[-8,3],[-1,0],[-2,-2],[-1,-4],[-1,0],[-4,1],[-8,4],[-5,3],[-3,3],[-3,4],[-4,5],[-4,2],[-5,-2],[-8,-1],[-16,1],[-2,-1],[-1,0],[2,-3],[-1,-1],[-1,-1],[0,-1],[2,-3],[3,-2],[7,-3],[6,-3],[3,-2],[1,-2],[0,-2],[-1,-4],[-1,-1],[-19,-21],[-7,-8],[-3,-5],[-3,-3],[-3,-2],[-4,-1],[-7,0],[-8,1],[-4,2],[-8,7],[-5,5],[-2,1],[-2,4],[-2,1],[-4,0],[-4,2],[-9,7],[-5,3],[-4,2],[-4,0],[-2,-1],[3,-3],[-1,0],[-3,1],[-3,0],[-6,2],[-6,0],[-3,0],[-5,2],[-5,0],[-9,0],[-2,0],[-1,-1],[4,-3],[7,-4],[-1,4],[0,1],[2,1],[11,-2],[12,-4],[3,-1],[4,-1],[4,-3],[5,-5],[10,-12],[3,-3],[4,-2],[22,-4],[7,0],[15,-1],[8,-2],[2,-2],[1,-5],[-1,-3],[-4,-8],[-3,-5],[-17,-25],[-2,-5],[-1,-4],[-3,-3],[-7,-6],[-8,-4],[-4,-1],[-4,1],[-3,1],[-4,5],[0,-1],[3,-7],[-1,-1],[-2,1],[-6,3],[-1,0],[-1,-1],[-2,0],[-2,1],[-3,3],[-1,1],[0,4],[-1,0],[-6,-2],[-1,-1],[2,-1],[1,-1],[3,-6],[0,-1],[-2,-1],[-6,2],[-1,0],[3,-6],[1,-3],[0,-1],[-4,-7],[-2,-3],[-3,-1],[-3,1],[-2,2],[-2,0],[-1,-3],[-2,-1],[-3,-1],[-4,0],[-4,2],[-12,6],[-4,1],[-7,1],[-1,1],[0,1],[1,1],[-1,1],[-2,-1],[-1,-1],[-3,-1],[-4,1],[-6,2],[-12,7],[-13,5],[-7,7],[3,-7],[0,-2],[-2,-1],[0,-2],[3,-5],[4,-1],[4,0],[0,1],[-2,1],[-1,1],[-1,3],[1,0],[3,-1],[3,-2],[18,-8],[5,-1],[4,-2],[1,-1],[-1,-2],[-8,-5],[0,-1],[5,1],[6,4],[3,2],[4,2],[4,-3],[5,-5],[5,-3],[6,-2],[4,-2],[6,-5],[1,-3],[1,-11],[-1,-3],[0,-2],[-2,-3],[-2,-2],[-4,0],[-3,-1],[-7,-6],[-2,-1],[-12,2],[-5,2],[-2,0],[-1,-2],[-1,0],[-5,-1],[-1,-1],[1,-2],[1,-2],[1,-1],[1,-2],[3,-1],[5,-1],[1,-3],[0,-1],[-2,-2],[-2,0],[-4,3],[-1,0],[-2,-2],[-2,0],[-3,0],[-1,-1],[0,-2],[-1,-2],[-3,-3],[-2,-2],[0,-2],[2,-1],[2,-3],[2,-4],[1,-2],[-2,0],[-2,2],[-2,3],[-4,3],[-8,3],[-1,0],[0,-1],[6,-4],[2,-2],[0,-2],[-4,-3],[-1,-2],[2,-1],[0,-1],[-2,-2],[-2,-1],[-5,0],[-1,-1],[2,-2],[1,-1],[-2,-2],[-1,0],[-6,1],[2,-4],[1,-2],[1,-2],[4,-2],[0,-1],[-1,-1],[-2,-2],[-8,-6],[-6,-7],[-1,-2],[2,-5],[0,-1],[-2,-2],[-3,1],[-1,-1],[1,-2],[0,-4],[0,-4],[-3,-6],[-4,-9],[-3,-8],[-2,-7],[-2,-4],[-3,0],[-3,-3],[2,-1],[1,-1],[1,-2],[-1,-7],[-2,-11],[-1,-9],[0,-27],[0,-12],[-1,-7],[-2,-4],[-2,-1],[3,-1],[2,-2],[1,-2],[1,-4],[1,-2],[1,0],[2,0],[1,-2],[3,-6],[4,-1],[0,-4],[-2,-18],[0,-2],[2,4],[2,15],[2,6],[2,1],[8,1],[8,-2],[3,0],[3,1],[2,-2],[1,-1],[1,-8],[1,-4],[5,-16],[2,-8],[3,-13],[1,-4],[6,-18],[1,-5],[0,-4],[0,-2],[-1,-4],[-2,-6],[-2,-4],[-2,-3],[-1,-2],[-2,-1],[0,-1],[2,1],[2,2],[4,3],[2,1],[4,1],[0,-2],[-2,-3],[3,2],[7,4],[25,10],[6,1],[8,-2],[7,-5],[8,-5],[8,-4],[12,-4],[4,-2],[7,-2],[3,-2],[4,-5],[7,-7],[5,-4],[5,-4],[6,-7],[9,-16],[2,-2],[5,-3],[10,-4],[15,-8],[7,-3],[4,-1],[5,-2],[4,-4],[3,-3],[2,-4],[2,-2],[4,-3],[2,-2],[0,-3],[-4,-12],[-1,-1],[5,9],[2,2],[2,1],[4,0],[6,-1],[5,0],[5,1],[3,1],[3,-1],[3,1],[1,1],[2,0],[7,-3],[2,0],[10,-3],[7,1],[1,0],[2,-4],[2,0],[3,0],[3,-1],[5,-4],[2,-4],[3,-9],[0,-2],[-4,-19],[-2,-7],[0,-7],[1,-3],[4,-7],[0,-1],[2,-9],[1,-4],[0,-5],[-1,-7],[0,-6],[1,-8],[0,-6],[-2,-3],[-1,-3],[-1,-6],[0,-2],[1,-4],[1,-2],[3,-3],[2,-3],[5,-10],[3,-5],[4,-7],[1,-4],[-1,-2],[-2,-2],[-3,-2],[-1,-2],[0,-1],[5,2],[2,0],[3,-2],[2,-4],[3,-3],[4,-2],[5,-5],[7,-10],[1,-2],[2,-5],[3,-8],[1,-6],[0,-2],[-1,-3],[-5,-4],[-5,-8],[1,0],[4,3],[5,7],[3,1],[3,0],[5,-2],[4,-3],[3,-4],[5,-9],[6,-8],[3,-6],[-1,4],[-2,5],[-5,7],[-3,4],[0,2],[0,2],[0,4],[1,5],[1,4],[2,2],[1,3],[1,2],[0,2],[5,4],[1,-1],[1,-4],[1,-1],[2,0],[2,-2],[1,-2],[1,-2],[1,-2],[1,-8],[1,-3],[0,4],[1,6],[1,3],[3,4],[0,2],[-2,2],[-5,10],[0,2],[1,1],[1,3],[1,4],[1,3],[4,4],[3,6],[1,4],[1,2],[2,1],[-2,2],[-1,1],[0,5],[0,5],[-2,3],[-3,5],[-1,2],[0,6],[0,3],[1,2],[0,3],[-4,4],[-1,4],[-1,9],[-1,12],[-2,9],[-2,5],[0,4],[1,1],[1,5],[1,1],[2,-1],[0,1],[-3,2],[-1,3],[0,1],[2,3],[0,1],[-2,2],[-4,3],[1,1],[1,2],[0,1],[-2,1],[-2,2],[-2,2],[-2,5],[-1,3],[-1,5],[-2,7],[-1,1],[-1,1],[-2,1],[0,1],[2,1],[21,11],[2,1],[10,6],[5,4],[4,4],[7,5],[3,3],[2,4],[11,12],[4,6],[3,5],[4,7],[4,7],[4,6],[1,6],[1,9],[1,8],[0,12],[0,11],[-1,16],[-1,6],[-2,6],[-3,12],[-1,4],[-2,6],[-8,15],[-9,10],[-2,2],[-3,3],[-6,4],[-3,2],[-10,11],[-3,1],[-1,3],[0,2],[0,5],[1,3],[0,3],[1,1],[5,8],[3,6],[2,4],[2,2],[4,4],[3,4],[-1,2],[-2,2],[0,2],[3,4],[0,2],[0,4],[1,1],[3,0],[6,-6],[1,0],[-2,2],[-2,5],[1,1],[4,5],[0,2],[-1,3],[-1,2],[3,6],[-1,1],[-6,1],[-1,2],[0,1],[3,1],[0,1],[-5,13],[-1,3],[2,5],[3,2],[0,1],[-4,0],[-2,1],[-2,4],[1,2],[0,1],[2,5],[2,1],[0,1],[-7,-2],[-4,2],[-3,-1],[-2,1],[1,2],[6,8],[3,5],[2,4],[1,3],[0,2],[-1,9],[0,2],[3,3],[4,4],[-6,4],[-3,4],[-2,2],[-1,2],[-3,4],[-1,5],[-2,11],[0,6],[0,4],[1,2],[1,2],[5,4],[8,7],[6,2],[5,-1],[9,-2],[7,-3],[23,-9],[4,-4],[-4,-3],[0,-1],[9,6],[2,2],[2,0],[6,-3],[3,0],[3,-2],[8,-6],[-2,3],[1,2],[6,4],[6,2],[5,3],[5,4],[3,2],[1,0],[2,-1],[6,-5],[4,-2],[3,-3],[4,-5],[1,-1],[3,-3],[4,0],[2,0],[0,-1],[1,-2],[0,-1],[0,-2],[-1,-4],[-3,-6],[2,0],[1,1],[3,3],[2,0],[4,-2],[3,-3],[2,-2],[1,-2],[1,-2],[2,-3],[-2,-2],[-4,-2],[1,-1],[5,2],[2,1],[1,2],[1,1],[7,-4],[1,-2],[-1,-1],[-1,-1],[-3,-1],[-2,-4],[0,-1],[1,-1],[5,-1],[0,-1],[-3,-1],[0,-2],[5,-7],[4,-4],[2,0],[5,0],[4,-1],[8,-5],[5,0],[5,1],[2,0],[3,-1],[1,-2],[0,-2],[0,-3],[2,-3],[2,-1],[3,0],[3,3],[2,0],[1,2],[1,4],[1,2],[2,1],[1,-1],[1,-2],[2,-5],[0,-2],[0,-3],[-1,-1],[-2,-2],[-2,-3],[-2,-3],[-2,-7],[-1,-4],[0,-3],[0,-3],[0,-3],[1,-3],[2,-4],[1,-1],[0,-3],[0,-1],[-2,-3],[-3,-3],[-5,0],[-15,0],[-4,0],[1,-2],[4,-1],[4,0],[15,-1],[2,-2],[1,-3],[2,-3],[1,-5],[0,-3],[-1,-3],[-1,-3],[-1,-5],[-1,-5],[1,-3],[8,0],[1,-2],[0,-2],[-2,-6],[-1,-1],[2,-4],[-1,-1],[0,-1],[-1,-3],[-1,-4],[-1,-3],[-2,-3],[-1,0],[-1,0],[-2,7],[-1,1],[-1,-1],[0,-1],[0,-1],[0,-2],[-1,-1],[-3,-2],[-5,-2],[0,-2],[3,-1],[5,-2],[2,-1],[4,2],[7,8],[4,1],[2,1],[3,0],[4,0],[6,1],[2,-1],[2,-2],[3,-2],[1,-2],[1,-3],[2,-8],[2,-2],[0,-2],[0,-3],[0,-4],[-2,-10],[-1,-4],[-3,-5],[-4,-2],[-6,-3],[-3,-1],[-3,-3],[0,-1],[7,4],[8,2],[2,2],[2,3],[2,5],[3,13],[2,4],[2,0],[1,-1],[3,-8],[0,-1],[-1,-2],[-4,-7],[2,0],[4,7],[1,2],[0,4],[2,2],[0,-1],[1,-8],[0,-6],[1,-2],[-1,-6],[1,-1],[1,5],[0,4],[1,2],[1,2],[5,5],[6,4],[4,3],[3,2],[5,2],[3,3],[2,5],[1,4],[1,2],[3,3],[2,0],[2,-1],[2,-3],[2,-4],[1,-3],[1,-2],[0,-8],[2,6],[0,2],[0,3],[0,2],[-2,5],[-1,3],[0,2],[2,1],[3,0],[1,1],[-2,2],[0,1],[2,4],[1,0],[3,-1],[-1,2],[0,1],[1,1],[4,-1],[1,1],[3,0],[0,2],[-3,1],[-3,1],[-1,1],[0,2],[-1,3],[0,1],[1,0],[1,-1],[1,2],[1,5],[1,1],[3,-2],[0,1],[-2,7],[0,1],[3,1],[3,-1],[5,-5],[1,0],[-1,2],[-3,3],[-2,2],[-2,1],[-2,1],[-2,5],[0,1],[0,3],[1,5],[1,1],[1,1],[2,0],[2,0],[5,-4],[0,1],[-2,2],[-1,2],[-1,2],[0,2],[2,5],[1,4],[4,11],[1,2],[1,1],[1,2],[3,0],[6,-4],[2,-2],[0,-3],[-3,-5],[-5,-3],[-1,-2],[1,0],[4,2],[5,1],[3,0],[3,-5],[0,-7],[-1,-6],[2,3],[2,1],[2,-3],[1,-4],[1,-3],[2,-4],[3,-3],[-3,-4],[-3,-2],[0,-2],[5,-2],[1,-2],[-1,-2],[1,0],[3,4],[3,-1],[3,-8],[-2,-4],[-4,-2],[-3,-1],[-5,0],[-1,-1],[1,-1],[4,0],[6,1],[5,2],[2,0],[2,-1],[0,-1],[-2,-1],[1,-2],[2,-4],[0,-1],[-2,-3],[3,0],[3,1],[1,-1],[3,-5],[1,-6],[-6,-7],[-3,-2],[-5,-3],[-1,-4],[-3,-3],[2,0],[4,6],[3,1],[2,0],[0,-1],[0,-2],[2,0],[6,4],[3,1],[4,0],[0,-1],[-2,-9],[-4,-7],[-7,-4],[-3,-3],[-3,-4],[2,0],[6,5],[5,2],[6,2],[3,-1],[5,-10],[3,-1],[2,0],[5,-3],[1,-2],[0,-3],[-2,-1],[0,-2],[1,-6],[-1,-3],[-3,-3],[-2,-1],[-3,-1],[-2,-2],[-1,-1],[-3,1],[1,-1],[1,-1],[3,-1],[3,1],[3,0],[5,-2],[2,-2],[0,-1],[-1,-1],[-2,-4],[-1,-2],[1,-1],[2,-2],[2,0],[2,0],[3,-1],[8,-9],[0,-6],[-2,-4],[1,-4],[0,-5],[-5,-2],[-14,3],[-9,3],[0,2],[2,2],[-2,0],[-2,-1],[-1,-1],[2,-4],[8,-3],[4,-5],[3,0],[2,-1],[2,-2],[-1,-1],[-4,-1],[-3,-3],[2,-1],[7,-2],[5,0],[2,-2],[-2,-2],[-5,-2],[-1,-3],[5,-2],[4,1],[1,0],[1,-8],[1,-2],[-4,-1],[0,-2],[2,-1],[5,-1],[2,-2],[0,-2],[1,-1],[2,-1],[3,3],[2,3],[2,-1],[1,-3],[2,-4],[2,0],[0,-5],[3,4],[2,-1],[2,0],[-1,-4],[-1,-4],[1,-2],[1,-3],[4,-5],[-1,-2],[-4,-4],[-2,-7],[0,-3],[-2,-4],[-3,-4],[2,1],[6,7],[3,2],[8,2],[2,2],[3,1],[1,-3],[1,-4],[2,-1],[2,1],[3,-1],[-2,-3],[-7,-11],[-2,-4],[0,-3],[2,4],[9,10],[1,1],[2,5],[2,2],[4,-1],[3,-2],[1,-5],[2,-6],[3,-7],[8,-3],[2,0],[5,2],[1,3],[4,1],[3,0],[1,-6],[2,-3],[3,-3],[3,-1],[4,-1],[2,-3],[0,-1],[-2,-3],[-2,-5],[-4,-3],[-5,0],[-8,-2],[0,-1],[-2,-2],[-3,-2],[-3,-2],[-3,-7],[-2,-3],[-2,-1],[-4,1],[-2,-1],[-2,-1],[-1,-2],[0,-1],[-5,-2],[-8,-5],[-4,-1],[-3,1],[-2,0],[-1,-2],[-4,-3],[-2,-1],[0,-2],[-1,-4],[0,-1],[-1,-1],[-3,1],[-4,2],[1,-2],[6,-5],[1,-2],[-1,-3],[-4,-3],[0,-2],[1,-1],[-1,-1],[-2,-2],[1,-1],[5,2],[4,5],[3,5],[2,2],[6,1],[3,3],[5,4],[5,5],[6,8],[7,6],[9,4],[7,2],[4,0],[1,1],[-4,1],[-3,1],[-4,-1],[-1,2],[0,1],[1,2],[3,1],[16,-2],[6,-2],[6,-13],[1,-5],[1,-3],[-1,-2],[-2,-2],[-7,-5],[-1,-1],[0,-1],[3,-1],[1,-1],[1,-5],[3,3],[6,8],[5,4],[4,1],[5,1],[1,0],[1,-3],[2,-6],[3,-1],[4,-1],[4,-6],[2,-5],[1,-3],[0,-1],[0,-2],[1,-2],[1,-2],[-1,-5],[-2,-7],[2,-7],[-1,-4],[0,-5],[1,-3],[1,-2],[-2,-1],[-9,-3],[-3,0],[-1,-2],[3,0],[5,0],[6,-2],[2,-2],[1,-2],[0,-3],[-2,-1],[-3,0],[-3,2],[0,-2],[5,-3],[1,-2],[3,-2],[0,-3],[0,-3],[-9,-12],[-8,-8],[-7,-6],[-12,-13],[-1,-1],[-2,0],[-6,2],[-4,-1],[-9,-2],[-2,-2],[-5,-4],[-2,-1],[-5,-1],[-5,1],[-2,-1],[-2,-2],[-1,-1],[0,-4],[-12,-17],[-3,-5],[-6,-6],[-6,-11],[-6,-4],[-2,-6],[-5,-4],[-10,-1],[-5,-1],[-5,2],[-5,-2],[-6,-1],[-3,0],[-12,-5],[-3,5],[-2,2],[-7,0],[-6,3],[-5,0],[-4,1],[-4,0],[-3,0],[-5,0],[-3,-3],[-10,1],[-4,2],[-3,1],[-5,-1],[-4,-2],[-9,3],[-10,-2],[-9,1],[-2,1],[-14,-3],[-5,2],[-5,-6],[-3,1],[-4,0],[-1,1],[-2,-1],[-2,-3],[-2,0],[-3,-6],[-6,-4],[-8,-22],[-1,-9],[-3,-6],[-2,-1],[-3,0],[-14,-4],[-6,-4],[2,-2],[-2,-2],[-4,-1],[-3,-3],[-3,-2],[-1,-4],[-7,-7],[-8,-14],[-4,-11],[-5,-8],[-4,-3],[-2,0],[-3,0],[-4,4],[-3,1],[-7,5],[-18,5],[3,-2],[2,-3],[5,-1],[4,0],[10,-6],[5,-3],[3,-2],[3,-4],[-2,-8],[-2,-7],[-3,-5],[-8,-14],[-4,-5],[-7,-16],[-8,-8],[-4,-4],[-4,-8],[-10,-5],[-4,-2],[-3,1],[-4,-5],[-5,-2],[-1,-5],[-12,-11],[-5,-2],[-4,-3],[-1,-5],[-3,-3],[-1,-2],[-3,-7],[-5,-10],[-7,-1],[-2,-4],[-3,-5],[-4,-3],[-8,1],[2,-2],[7,-3],[1,-5],[-4,-2],[-7,-6],[-10,-12]],[[2311,9385],[-4,-1],[-4,4],[0,4],[0,2],[0,2],[2,2],[4,1],[2,-1],[1,-2],[3,-2],[1,-1],[0,-2],[-1,-3],[-1,-2],[-1,-1],[-2,0]],[[1819,9365],[1,-1],[4,1],[4,2],[6,1],[8,2],[2,-2],[1,0],[2,3],[0,1],[0,2],[0,4],[1,3],[5,5],[2,1],[4,1],[9,0],[8,-3],[11,-3],[17,-7],[5,-3],[1,-3],[-3,-5],[-7,-8],[-6,-3],[-2,-2],[3,-1],[3,-2],[3,3],[3,3],[4,3],[1,0],[0,-2],[0,-1],[0,-1],[0,-1],[2,-1],[2,1],[5,4],[5,6],[7,3],[2,2],[7,2],[-1,1],[1,5],[-2,2],[-8,4],[-4,4],[1,4],[4,-1],[12,0],[2,0],[11,-7],[4,-4],[3,-1],[7,-3],[2,-3],[1,0],[1,-1],[-1,-1],[0,-3],[1,-1],[5,0],[1,-1],[1,-3],[2,-5],[2,-6],[3,-10],[5,-14],[2,-8],[1,-2],[1,-1],[3,-2],[3,-2],[3,-1],[1,1],[1,1],[1,4],[10,5],[0,1],[-1,2],[0,1],[2,1],[-6,7],[-5,7],[-2,9],[-1,3],[0,5],[-1,2],[-2,1],[0,2],[0,2],[0,2],[-2,3],[-7,27],[0,2],[1,2],[3,1],[3,0],[2,1],[-2,1],[-2,3],[-1,1],[2,3],[9,-2],[6,-2],[10,-5],[2,0],[1,3],[2,1],[3,0],[10,-4],[11,-7],[8,-4],[5,-5],[3,-4],[3,-4],[0,-1],[-1,-1],[1,-2],[1,-3],[1,-2],[1,-4],[1,-5],[1,-3],[10,-25],[1,-5],[2,-2],[7,-9],[3,-7],[1,-5],[0,-2],[0,-2],[0,-3],[-1,-2],[-1,-2],[-2,-3],[-2,-7],[0,-2],[2,-2],[9,-8],[6,-9],[3,-2],[7,-6],[8,-3],[3,-2],[3,-2],[1,0],[1,0],[1,1],[0,1],[-3,4],[0,2],[1,0],[9,-7],[4,-3],[6,-4],[11,-7],[1,0],[6,0],[1,0],[1,-1],[1,-1],[0,-4],[2,-3],[9,1],[2,0],[2,0],[1,-2],[2,-5],[2,-9],[0,-3],[-1,-6],[-1,-2],[-2,0],[-5,0],[-3,2],[-2,2],[-1,5],[-1,1],[-1,-1],[-1,-4],[-2,-2],[-1,-2],[-2,1],[-4,2],[-6,5],[-3,1],[-1,0],[-3,-2],[-5,-3],[-2,-3],[1,-1],[0,-2],[1,-2],[-1,-2],[0,-1],[-2,-1],[-3,0],[-5,1],[-4,1],[-7,5],[-1,1],[-2,-1],[-1,-2],[1,-2],[4,-2],[4,-4],[1,-1],[1,0],[0,-1],[1,-2],[0,-4],[-2,-7],[-1,-2],[1,0],[6,8],[3,2],[6,3],[3,3],[8,0],[3,-1],[2,-2],[0,-1],[-2,-3],[0,-1],[-1,-2],[1,-2],[0,-1],[2,-1],[2,0],[1,0],[1,-1],[1,-2],[0,-3],[-2,-7],[-3,-2],[-11,-3],[-3,-2],[-7,-2],[-3,-2],[-1,0],[-8,0],[-8,-1],[-10,2],[-7,1],[-8,4],[-3,-1],[-3,-2],[-15,3],[-2,2],[1,1],[4,4],[0,1],[0,1],[-7,1],[-8,2],[-7,1],[-6,0],[-4,0],[-3,2],[-2,2],[0,2],[-1,1],[1,4],[-1,2],[-1,2],[-4,2],[-3,-1],[-3,-1],[-2,-4],[-5,-9],[-3,-2],[-6,-7],[-3,-2],[-11,-3],[-14,-1],[-6,-2],[-4,-4],[-6,-4],[-15,-5],[-14,-2],[-14,-1],[-10,-2],[-3,1],[-5,-1],[-5,-2],[-6,-1],[-22,-1],[-10,-2],[-5,0],[-5,0],[-3,1],[-2,2],[-3,4],[-6,10],[-2,4],[0,7],[0,4],[-2,9],[-11,4],[-7,1],[-10,0],[-13,-1],[-13,1],[-7,2],[-6,2],[-12,5],[-1,2],[-1,3],[-3,3],[-8,9],[-3,4],[-1,2],[0,3],[-1,6],[-1,4],[1,2],[1,0],[16,5],[29,4],[26,4],[12,-1],[6,-1],[7,-1],[13,0],[16,-2],[3,0],[7,1],[2,2],[12,-1],[2,1],[2,1],[-3,3],[-10,5],[-29,10],[-7,2],[-10,2],[-6,1],[-7,-1],[-3,0],[-7,-2],[-7,-2],[-13,-1],[-19,-1],[-3,1],[-4,1],[-2,1],[-19,-2],[-16,2],[-19,15],[-3,4],[0,2],[3,2],[9,6],[3,1],[14,4],[14,3],[11,4],[5,1],[5,0],[5,1],[-1,1],[-4,2],[0,1],[2,1],[7,1],[7,-1],[4,0],[1,2],[-1,1],[-7,2],[-33,-6],[-16,-1],[-10,-2],[-6,0],[-7,2],[-1,1],[0,1],[2,4],[7,2],[4,5],[-4,0],[-13,-1],[-6,1],[-8,2],[-2,2],[-1,2],[-1,3],[1,6],[0,3],[1,1],[10,11],[6,2],[4,3],[0,1],[-1,2],[-4,3],[-1,2],[-1,2],[0,2],[3,4],[6,5],[17,12],[8,5],[8,2],[11,6],[28,9],[25,9],[10,-2],[2,-2],[2,-2],[1,-2],[1,-3],[1,-6],[0,-4],[0,-3],[-1,-3],[-1,-3],[-2,-3],[-3,-4],[-6,-6],[0,-2]],[[2075,9384],[-1,0],[-3,1],[-4,3],[-6,6],[-8,6],[-1,3],[-2,3],[-9,6],[-6,3],[-5,1],[-1,2],[3,5],[4,4],[2,2],[7,1],[24,3],[5,0],[6,-2],[8,-5],[3,-1],[2,-1],[2,-2],[0,-2],[1,-5],[-1,-6],[-1,-3],[-5,-8],[-5,-4],[-1,-3],[-2,-3],[-3,-3],[-3,-1]],[[2790,9426],[5,-1],[30,2],[6,-1],[19,-7],[5,-2],[3,-3],[2,-4],[1,-1],[7,-3],[2,-3],[1,-2],[2,-3],[3,-2],[3,-2],[2,-1],[-1,-5],[2,-2],[3,-3],[1,-1],[-2,-3],[-7,-1],[-17,1],[-22,4],[-14,-1],[-6,-2],[-16,-5],[-6,0],[-5,-1],[-9,4],[-3,3],[-1,1],[-2,5],[-2,6],[-1,5],[-1,3],[-3,2],[-9,1],[-3,2],[-1,2],[-1,2],[0,3],[0,3],[1,0],[1,0],[-2,3],[-1,4],[0,4],[0,3],[1,1],[1,1],[4,1],[6,0],[8,-4],[7,0],[9,-3]],[[2594,9274],[2,-1],[6,1],[5,2],[9,5],[5,1],[15,0],[3,-1],[-2,-2],[0,-1],[0,-1],[2,-2],[3,-2],[2,2],[0,4],[3,15],[1,5],[0,4],[0,4],[-1,3],[-4,1],[-5,0],[-3,0],[-3,1],[-3,1],[-1,2],[-4,5],[-2,3],[-6,5],[-3,2],[2,2],[5,3],[3,2],[4,6],[3,1],[8,-1],[12,-5],[7,-4],[2,-1],[0,1],[-2,2],[-8,6],[-4,4],[-2,3],[1,1],[4,1],[1,2],[-6,1],[-3,0],[-3,-1],[-3,0],[-5,2],[-1,1],[-3,4],[-2,4],[-1,2],[-1,1],[0,5],[0,3],[0,3],[2,2],[3,4],[2,1],[3,1],[8,-2],[20,-7],[0,2],[-23,10],[-8,2],[-2,4],[12,13],[11,3],[6,4],[9,0],[8,-3],[1,1],[-4,5],[0,1],[5,3],[9,3],[11,2],[2,2],[3,1],[5,1],[12,0],[7,0],[10,-2],[5,-4],[2,-2],[3,-7],[3,-9],[3,-4],[6,-3],[4,-2],[2,-3],[0,-3],[-1,-4],[1,-4],[3,-4],[2,-2],[4,-3],[0,-1],[-1,-2],[-3,-2],[-7,-7],[-9,-8],[-7,-6],[0,-2],[13,10],[5,0],[0,-2],[-3,-5],[-3,-4],[-4,-3],[1,-1],[6,-5],[-1,-1],[-3,0],[-1,0],[-1,-1],[-1,-1],[0,-2],[1,-3],[0,-2],[-1,-1],[1,0],[2,0],[1,1],[3,3],[9,9],[5,4],[2,0],[5,-2],[2,0],[-6,7],[-1,2],[2,3],[0,1],[4,2],[2,1],[2,-1],[2,-3],[1,-3],[2,-1],[4,1],[3,3],[4,-2],[5,-4],[0,-5],[0,-5],[0,-4],[7,-6],[4,-3],[1,0],[0,1],[-1,2],[-3,2],[-2,4],[-2,4],[1,9],[4,5],[3,-1],[4,-3],[4,0],[5,0],[11,-6],[5,0],[0,2],[-4,2],[-7,3],[-10,4],[-5,4],[0,2],[0,2],[0,2],[1,2],[2,1],[10,5],[7,3],[5,0],[9,0],[10,-1],[5,-1],[6,-4],[8,-3],[3,-1],[3,0],[4,1],[4,0],[11,-5],[3,-3],[2,-3],[1,-4],[1,-3],[0,-2],[-10,-11],[-4,-2],[-2,-4],[-4,-7],[-4,-5],[0,-1],[3,2],[3,6],[3,4],[4,4],[8,5],[7,2],[6,-1],[5,0],[4,-1],[2,-1],[1,-1],[1,-3],[0,-3],[-1,-2],[-2,-3],[-8,-3],[-5,-3],[-3,-1],[-8,-1],[0,-1],[7,-1],[7,0],[0,-1],[-4,-5],[-1,-4],[1,-3],[0,-2],[-3,-6],[-3,-4],[1,-1],[7,7],[2,7],[3,7],[3,4],[2,1],[7,1],[4,3],[4,2],[1,0],[3,-2],[0,-1],[-4,-7],[-9,-11],[3,1],[3,3],[3,2],[4,4],[3,-3],[4,-3],[2,-6],[4,-3],[2,-2],[0,3],[-4,8],[1,3],[3,2],[8,6],[5,-2],[4,-2],[1,1],[5,-1],[6,-1],[7,-1],[7,-3],[5,-3],[3,-3],[2,-3],[1,-1],[1,-4],[-1,-2],[-5,-5],[-2,-3],[-3,-1],[-7,1],[-3,0],[-2,-2],[-8,-7],[-4,-3],[-4,-2],[-1,-1],[9,0],[2,2],[3,4],[3,4],[8,2],[10,-4],[5,0],[4,4],[5,3],[1,1],[1,-1],[4,-3],[1,-2],[0,-6],[-1,-2],[-3,-5],[-7,-6],[-5,-3],[-5,-1],[-6,-3],[-2,-2],[-2,-2],[-2,-2],[-2,-1],[3,-3],[1,0],[1,2],[4,5],[2,2],[2,0],[1,0],[1,-1],[2,-1],[0,-5],[-4,-17],[3,5],[7,18],[2,3],[4,4],[8,5],[6,3],[7,2],[4,1],[4,0],[3,-3],[3,-1],[5,1],[3,0],[3,-1],[3,-2],[5,-3],[11,-4],[1,-1],[2,-2],[1,-2],[0,-3],[-2,-2],[-2,-1],[-2,-1],[-2,-1],[-4,-4],[-2,0],[-6,-2],[-6,0],[-4,-2],[-7,-3],[-10,-7],[0,-2],[4,-1],[3,1],[4,5],[5,2],[6,1],[9,2],[4,-1],[1,0],[0,-1],[1,-2],[-2,-2],[-2,-2],[-4,-6],[3,-1],[4,-1],[3,2],[2,3],[2,2],[3,1],[2,1],[2,1],[1,1],[-3,2],[0,1],[1,3],[2,3],[2,2],[2,0],[6,-2],[4,-4],[9,-10],[2,-2],[3,-8],[1,-4],[-1,-2],[-1,-2],[-1,0],[-2,0],[-13,3],[-6,-1],[-2,0],[-2,-2],[-2,-2],[-1,-2],[-3,-1],[-8,0],[-4,-1],[-8,-3],[-3,-1],[-1,-2],[5,0],[8,3],[8,0],[12,-5],[4,-1],[3,0],[2,1],[11,-1],[3,0],[5,-3],[8,-5],[1,-1],[1,-1],[1,-2],[-1,-4],[0,-1],[-3,-1],[-11,1],[-4,1],[-4,-1],[-3,0],[-5,2],[-4,2],[-8,-2],[-5,1],[-6,-1],[-12,-6],[1,-1],[16,5],[3,0],[5,-2],[8,-4],[3,-2],[0,-6],[-2,-4],[-2,-4],[-4,0],[-8,3],[-4,0],[-2,0],[-4,-2],[-1,0],[-14,4],[-3,0],[0,-1],[13,-6],[9,0],[6,-1],[3,-2],[2,-1],[0,-4],[3,-4],[3,-1],[1,0],[3,1],[3,0],[3,-1],[3,-2],[4,0],[3,-2],[2,0],[8,1],[3,-1],[1,-1],[-2,-1],[-6,-3],[-1,-3],[3,-3],[2,-3],[0,-2],[-2,-5],[0,-2],[5,4],[1,-1],[0,-5],[1,0],[2,5],[-1,6],[3,2],[8,2],[-1,-9],[0,-5],[-4,-8],[-3,-3],[2,-1],[1,0],[2,1],[3,6],[7,6],[1,1],[0,-3],[-1,-4],[3,-2],[3,2],[2,2],[3,-1],[2,0],[0,-2],[-1,-8],[0,-2],[4,-5],[0,3],[-1,6],[1,3],[3,3],[6,5],[3,1],[1,-1],[3,-2],[-1,-2],[-3,-1],[-2,-3],[-1,-4],[2,-2],[5,0],[5,3],[3,-1],[4,-4],[7,-7],[3,2],[5,-6],[-6,-4],[2,-8],[-9,0],[-4,0],[-3,0],[-4,0],[4,-2],[5,-1],[1,-2],[5,0],[3,0],[6,0],[1,3],[4,2],[2,2],[2,-1],[6,-2],[8,-6],[-4,-3],[-1,-3],[-1,-3],[0,-3],[-2,-1],[-11,-10],[2,0],[5,2],[9,4],[5,1],[3,-1],[2,0],[2,1],[3,-1],[6,-2],[7,9],[4,-2],[4,-5],[9,-9],[4,-5],[2,-2],[0,-3],[-4,-2],[-2,-1],[-6,5],[-5,2],[-3,0],[-3,-2],[1,-1],[12,-7],[2,-5],[0,-2],[-8,-4],[-2,0],[-6,2],[-3,3],[-3,1],[-4,0],[-1,0],[4,-6],[0,-1],[-2,-1],[-1,-3],[8,-4],[6,-5],[1,-2],[-4,-1],[-3,0],[-7,0],[-3,1],[-1,-1],[4,-2],[1,-2],[1,-2],[1,-2],[0,-2],[-3,-2],[-3,-5],[-2,-4],[-3,-1],[-1,1],[-4,-1],[-6,2],[-2,2],[-6,9],[0,-1],[1,-5],[0,-2],[-6,-2],[0,-1],[4,-2],[4,-1],[0,-4],[0,-18],[-1,-6],[-3,-6],[-3,-5],[-4,3],[-1,4],[-1,1],[-2,2],[-2,1],[-3,0],[-2,-3],[-3,2],[-3,4],[1,8],[1,5],[-2,-2],[-3,-7],[-3,-8],[-3,3],[-2,4],[-3,4],[-3,4],[-4,5],[-2,6],[-1,2],[-2,5],[-1,1],[0,1],[-2,3],[1,3],[2,4],[3,3],[4,3],[5,1],[2,4],[3,6],[3,5],[4,3],[-2,0],[-4,-2],[-3,-3],[-4,-6],[-3,-3],[-8,-4],[-3,-1],[-4,0],[-8,0],[-2,1],[1,4],[6,7],[-1,1],[-2,-3],[-3,-2],[-2,0],[-3,0],[-4,4],[-2,1],[-4,2],[-2,1],[-6,11],[-2,3],[-1,2],[-2,3],[-3,1],[-1,0],[1,-2],[0,-2],[-3,-1],[-3,0],[-3,2],[0,-3],[3,-5],[0,-6],[-1,-1],[-2,0],[-2,1],[-5,4],[-5,4],[-4,2],[0,-2],[2,-6],[3,-5],[4,-5],[7,-6],[3,-3],[-2,-4],[-2,-2],[-1,0],[-5,0],[-7,2],[-4,3],[-5,7],[-9,7],[-2,0],[-6,-3],[1,-1],[4,0],[3,-1],[7,-5],[0,-2],[-1,-3],[0,-3],[2,-4],[2,-3],[4,-1],[2,-1],[1,-1],[-3,-8],[0,-3],[1,-1],[6,4],[2,1],[2,0],[2,-1],[2,-2],[2,-3],[0,-2],[1,-1],[5,-3],[0,-1],[-5,-4],[-1,0],[1,-1],[4,-2],[3,-3],[2,-4],[0,-2],[0,-2],[0,-1],[2,-1],[1,1],[1,-1],[1,-3],[2,-9],[1,-3],[1,0],[0,9],[1,2],[3,-2],[5,-4],[3,-3],[1,-1],[-3,-3],[1,-1],[1,-2],[2,0],[1,4],[3,3],[2,2],[5,-2],[4,-5],[0,-1],[3,-2],[2,1],[4,-6],[-2,-2],[-4,-4],[-1,-1],[2,0],[8,0],[3,-1],[0,-3],[-4,-7],[-3,0],[-5,0],[-2,0],[0,-1],[6,-4],[2,-2],[3,-3],[1,-3],[0,-1],[-1,-2],[5,-1],[3,1],[3,0],[3,0],[0,-1],[0,-3],[-3,-3],[1,0],[3,0],[2,-1],[2,-6],[2,-5],[-1,-1],[-3,0],[1,-7],[1,-6],[0,-6],[0,-5],[-2,-1],[-3,0],[0,1],[-6,16],[-1,3],[-2,3],[-5,7],[0,-2],[1,-3],[2,-5],[1,-9],[1,-6],[0,-3],[-1,0],[-1,-1],[1,-2],[4,-6],[2,-4],[2,-4],[1,-3],[1,-1],[0,-1],[-2,-1],[-3,0],[-2,0],[-6,4],[0,-1],[3,-14],[0,-3],[-2,-1],[-2,1],[-2,4],[-4,4],[-5,5],[-4,4],[-2,-1],[0,-1],[-1,0],[-1,1],[-1,3],[-2,2],[-7,6],[-1,0],[1,-2],[1,-4],[-1,-1],[-2,0],[-3,2],[-2,4],[-3,7],[-2,3],[0,-2],[1,-7],[0,-2],[-2,0],[-1,0],[0,2],[-1,3],[-2,2],[-2,2],[-2,1],[0,3],[-1,1],[-4,-1],[-3,2],[-6,8],[-6,9],[-4,5],[-1,1],[2,-6],[2,-8],[1,-4],[-1,0],[-3,1],[-11,11],[-7,5],[-4,1],[-6,1],[-2,-3],[4,-6],[3,-5],[3,-3],[5,-6],[5,-8],[2,-3],[6,-3],[3,-1],[4,0],[0,-1],[-2,-3],[0,-1],[8,-3],[2,-2],[3,-4],[2,-1],[6,-8],[2,-1],[6,-3],[1,-1],[4,-6],[2,-2],[2,-7],[3,-3],[5,-3],[2,-1],[1,-1],[-1,-3],[0,-1],[-3,-2],[0,-3],[2,-5],[0,-3],[-2,-1],[-4,-2],[-2,0],[-2,2],[-4,2],[-7,5],[-10,3],[-4,2],[-2,2],[-2,1],[-26,4],[-4,2],[-3,1],[-2,2],[-10,5],[-1,1],[-7,9],[-5,10],[-2,1],[-5,1],[-5,0],[-3,-1],[-4,0],[-3,1],[-7,5],[-6,2],[-6,4],[-2,2],[0,1],[4,5],[-1,0],[-8,-4],[-2,1],[-4,4],[-4,3],[-6,10],[-4,3],[0,1],[5,1],[3,-1],[2,1],[5,4],[2,2],[0,2],[-4,0],[-1,1],[0,2],[-2,2],[-3,2],[-3,1],[-10,-1],[-2,1],[0,2],[2,5],[1,2],[0,1],[-2,0],[-6,-4],[-1,0],[-3,4],[-1,5],[-1,2],[-2,1],[-5,5],[-7,9],[-3,3],[-3,3],[-2,1],[1,1],[4,8],[0,2],[-4,-1],[-5,2],[-3,-2],[-2,0],[-2,1],[-1,-1],[-1,-6],[-1,-2],[-2,-1],[-1,1],[-1,1],[0,1],[0,8],[-3,1],[-5,1],[-2,0],[-1,2],[-1,2],[-1,4],[-1,3],[-2,0],[-1,0],[-1,-1],[-1,-1],[-3,0],[0,-2],[2,-3],[3,-4],[2,-5],[-1,-3],[-6,-2],[-4,-1],[-5,1],[-3,1],[-4,3],[-6,-1],[-2,-7],[-1,-1],[-6,0],[-3,0],[-8,-4],[-2,-1],[-2,0],[-2,-1],[-2,-2],[-4,0],[-5,2],[-4,1],[-3,-1],[-3,1],[-4,3],[-3,1],[-3,0],[-1,0],[-6,6],[-1,2],[-4,7],[0,2],[-1,3],[1,2],[1,4],[1,7],[2,3],[1,2],[3,3],[12,5],[3,2],[0,1],[-3,7],[0,1],[1,1],[2,4],[1,1],[2,0],[4,-1],[4,-1],[5,0],[8,-3],[12,-5],[6,-3],[5,-5],[4,-5],[0,-3],[-1,-3],[-1,-1],[0,-2],[1,-1],[3,-2],[1,0],[-1,3],[1,2],[1,2],[0,2],[-1,3],[-1,2],[-2,2],[-7,8],[-1,2],[3,1],[11,-2],[4,0],[1,3],[2,2],[2,1],[4,0],[5,-1],[2,0],[2,0],[3,2],[5,5],[2,1],[4,0],[4,1],[5,-2],[4,0],[-1,3],[-2,6],[-3,7],[-2,2],[-6,4],[-7,8],[-3,5],[-1,2],[1,2],[1,2],[12,9],[10,8],[4,5],[2,3],[2,2],[2,2],[5,1],[1,2],[1,4],[0,3],[5,9],[3,2],[5,2],[4,2],[4,7],[-1,1],[-2,2],[-1,2],[-6,18],[-4,9],[-5,7],[-5,10],[-7,9],[0,2],[1,3],[-1,1],[-7,-4],[-2,-1],[-3,2],[-2,2],[-1,4],[0,2],[1,2],[1,5],[0,2],[0,2],[-1,2],[-1,1],[-2,0],[-4,1],[-1,-1],[4,-7],[-1,-2],[-5,-1],[-2,1],[-3,1],[-2,1],[-6,7],[-1,3],[0,2],[0,1],[-2,-1],[-1,0],[-3,1],[0,1],[4,4],[1,1],[-3,1],[-3,1],[0,1],[1,1],[4,2],[1,2],[-2,1],[-2,0],[-2,-2],[-5,-5],[-3,-2],[-4,2],[-2,1],[-2,-1],[-3,-3],[-6,-3],[-11,-7],[-5,-2],[-5,1],[-1,1],[0,2],[1,2],[0,2],[1,1],[-1,8],[1,2],[2,1],[3,1],[8,-1],[4,0],[3,2],[2,2],[3,3],[0,3],[-2,5],[-1,1],[-8,4],[-4,2],[-3,0],[-3,1],[-1,2],[-2,3],[0,2],[0,2],[2,2],[6,2],[-5,2],[-3,-1],[-2,-1],[-2,-4],[-2,-1],[-5,2],[-3,1],[-2,1],[-1,1],[1,1],[2,1],[4,3],[1,2],[-3,3],[-2,0],[-6,1],[-7,-1],[-3,1],[-1,3],[-1,4],[0,4],[-1,8],[-2,3],[-2,1],[-8,-2],[-2,0],[-2,1],[-6,5],[-2,2],[-1,0],[-4,5],[-2,1],[-2,3],[-2,4],[-3,1],[-2,-1],[-3,-3],[-2,-3],[-2,-2],[0,-2],[2,-2],[9,-3],[2,-1],[2,-3],[2,-4],[1,-4],[-1,-4],[-1,-2],[-2,-2],[-5,-3],[-6,-1],[-6,-1],[-3,1],[-15,5],[-3,1],[-3,0],[-8,3],[-4,0],[-8,2],[-13,1],[-2,-1],[3,-3],[3,-1],[3,0],[3,-2],[5,-5],[3,-3],[2,-3],[0,-1],[-2,-3],[-18,12],[-11,-4],[-5,-1],[-4,-1],[-6,2],[-12,6],[-4,2],[-2,0],[-11,-2],[-9,0],[-18,2],[-7,2],[-2,1],[-2,1],[-4,0],[-10,2],[-10,-4],[-12,4],[-3,2],[-1,2],[-4,6],[0,4],[1,3],[1,2],[1,1],[-6,-3],[-3,-1],[-3,0],[-8,1],[-2,0],[1,-2],[2,-1],[0,-2],[-5,0],[-7,0],[-3,0],[-2,0],[-3,-3],[-1,-1],[-2,0],[-8,7],[-6,4],[-7,2],[-3,1],[-2,2],[-10,13],[-2,3],[-3,11],[-1,2],[-1,2],[2,0],[10,-1],[9,0],[5,-1],[6,-3],[7,-2],[6,0],[8,1],[10,2],[1,1],[-6,2],[-6,3],[-5,5],[-3,1],[-5,1],[-15,1],[-14,3],[-9,4],[-8,4],[-3,2],[-1,2],[-1,5],[-1,9],[-2,6],[-1,3],[0,3],[3,6],[7,6],[0,1],[-1,0],[-3,2],[-1,2],[-1,4],[0,3],[1,3],[1,3],[3,6],[5,7],[5,6],[0,2],[1,6],[1,4],[0,3],[1,3],[3,4],[4,4],[6,3],[1,2],[0,2],[0,1],[1,1],[15,11],[6,4],[6,3],[7,2],[20,5],[10,1],[12,-1],[24,-2],[2,-2],[1,-1],[1,-2],[-1,-1],[-6,-6],[-8,-4],[-5,-4],[-9,-9],[-3,-3],[-11,-17],[-2,-3],[-2,-2],[-1,-6],[1,-2],[1,-4],[6,-8],[2,-4],[0,-3],[-1,-8],[0,-4],[0,-4],[2,-6],[2,-7],[5,-7],[8,-8],[6,-5],[6,-3],[6,-6],[2,-2],[-3,-3],[-8,-5],[-9,-2],[-6,-1],[-6,-4],[-8,-3],[-4,-2]],[[2222,9443],[23,-12],[4,1],[7,0],[7,2],[10,2],[7,2],[2,1],[5,1],[2,0],[7,-2],[3,-1],[2,-1],[1,-2],[3,-5],[0,-2],[-2,-3],[-2,-1],[-4,-2],[-3,0],[-2,-2],[-3,0],[-1,-2],[0,-1],[1,0],[2,0],[1,1],[4,-1],[1,-1],[2,-2],[-1,-2],[-6,-3],[-9,-3],[-10,-10],[-6,-4],[-1,-1],[-1,-2],[1,-2],[0,-1],[1,0],[6,3],[3,2],[3,1],[6,0],[3,-1],[4,-2],[4,-3],[1,-1],[0,-1],[-2,-2],[4,-2],[4,-4],[0,-3],[-2,-2],[0,-2],[1,-1],[2,1],[5,2],[5,2],[3,0],[1,-1],[2,-4],[1,-4],[0,-4],[-1,-3],[-1,-2],[-4,-3],[-3,-2],[-1,0],[4,-2],[1,-2],[1,-2],[-1,-2],[0,-2],[-4,-5],[0,-1],[1,-1],[3,-3],[0,-8],[-9,-2],[-2,-2],[-3,-3],[-3,-2],[-6,-2],[-4,0],[-16,1],[-2,2],[-1,2],[-1,2],[0,3],[0,1],[0,1],[-2,-1],[-2,-3],[1,-3],[5,-10],[1,-3],[0,-2],[0,-1],[-6,-6],[-3,-1],[-4,-1],[-3,0],[-3,3],[-3,1],[-5,-1],[-1,2],[-2,2],[-3,7],[-5,6],[-5,6],[-10,9],[-6,5],[-8,9],[-3,2],[-2,0],[-5,1],[-1,1],[-2,3],[-4,2],[-1,0],[-2,0],[-5,-2],[-6,2],[-1,2],[-1,2],[-1,1],[-2,2],[-2,3],[-12,6],[-7,7],[-1,3],[0,1],[0,3],[2,4],[2,4],[1,2],[5,3],[4,1],[5,0],[3,-1],[2,-2],[1,-3],[1,-2],[4,-2],[2,-1],[3,-4],[2,-4],[3,-2],[5,0],[5,1],[12,2],[0,1],[1,1],[1,10],[1,0],[4,-4],[1,-1],[1,1],[1,2],[0,1],[-2,6],[-2,2],[-1,1],[-1,1],[-3,-1],[-3,1],[0,2],[0,2],[1,2],[2,1],[3,1],[3,-1],[4,-2],[3,-1],[4,1],[-5,1],[-7,6],[-3,1],[-4,-2],[-2,-1],[-5,-1],[-4,-1],[-15,9],[-1,1],[-1,2],[0,2],[1,1],[4,2],[6,2],[4,0],[3,-2],[5,-4],[5,-3],[0,1],[-1,3],[-2,4],[-1,1],[-4,1],[-3,2],[-1,2],[-1,2],[0,3],[0,1],[2,1],[12,2],[8,-2],[5,-1],[2,3],[0,1],[-3,-1],[-3,0],[-2,2],[0,1],[2,2],[4,1]],[[2270,9439],[-8,-2],[-4,1],[-2,-2],[-1,0],[-4,-1],[-9,3],[-3,1],[-1,1],[1,1],[1,1],[7,1],[3,1],[1,1],[1,1],[3,1],[6,1],[15,4],[7,1],[3,-1],[1,-1],[0,-1],[0,-1],[-3,-3],[-3,-2],[-8,-4],[-3,-1]],[[2412,9455],[11,-2],[5,-2],[3,-1],[4,-4],[3,-2],[10,3],[6,1],[16,-1],[12,-4],[5,-2],[3,-2],[-1,-3],[-2,-4],[-3,-4],[-5,-6],[-5,-3],[-1,-2],[-1,-2],[-2,-3],[-5,-6],[-1,-1],[-7,-3],[2,-1],[1,-1],[-1,-3],[-4,-7],[-5,-6],[-3,-4],[-6,-6],[-3,-1],[-5,-1],[-26,5],[-7,0],[-17,-3],[1,-1],[7,-2],[4,-2],[6,-6],[0,-2],[1,-1],[-1,-4],[0,-1],[-9,-10],[-3,-7],[-1,-5],[-3,-2],[-10,2],[-3,0],[-11,-1],[-5,0],[0,9],[0,10],[-2,9],[-8,16],[-1,3],[-1,3],[0,3],[0,3],[0,7],[1,4],[-1,8],[-1,14],[0,4],[0,2],[0,2],[2,1],[3,2],[2,0],[11,-4],[5,-1],[3,0],[-2,1],[-3,2],[-5,5],[-2,4],[0,2],[0,1],[0,2],[1,1],[2,2],[2,1],[6,3],[7,2],[15,1],[5,-1],[6,3],[4,0],[7,-1]],[[1674,9453],[0,-1],[7,6],[5,0],[3,-1],[1,0],[0,-1],[0,-3],[1,-5],[0,-1],[1,0],[2,2],[7,8],[4,2],[2,1],[10,1],[6,0],[7,0],[6,-2],[8,-3],[7,-4],[7,-4],[21,-16],[9,-5],[3,-3],[2,-2],[1,-2],[0,-3],[0,-2],[-1,-1],[-2,-2],[-13,-5],[-7,-2],[-7,-2],[-16,-8],[-11,-4],[-14,-8],[-28,-13],[-3,-2],[-1,-2],[-8,-14],[-3,-4],[-7,-3],[-9,-1],[-2,-1],[-1,-5],[-3,-8],[-2,-6],[-2,-14],[0,-2],[-2,-3],[-3,-3],[-8,-3],[-7,-2],[-8,-1],[-2,1],[-3,2],[-2,0],[-1,0],[-11,-10],[-11,-5],[-5,-3],[-3,-2],[-3,-1],[-4,1],[-4,1],[-3,3],[-2,3],[-5,12],[-3,4],[-2,2],[-5,7],[-2,1],[-21,9],[-10,5],[-2,2],[-3,1],[-13,0],[-1,0],[-1,1],[2,2],[0,2],[1,2],[-1,2],[0,1],[5,2],[0,1],[-1,1],[0,2],[0,1],[2,0],[1,3],[2,4],[2,2],[2,2],[4,4],[3,2],[2,2],[0,1],[-1,0],[0,2],[0,5],[0,3],[1,2],[0,1],[2,2],[9,3],[1,1],[0,1],[0,2],[-1,1],[-1,1],[-3,0],[-2,2],[-1,1],[1,3],[4,4],[2,2],[5,11],[8,6],[3,7],[6,7],[0,1],[-2,2],[-6,2],[-3,2],[-2,3],[-9,17],[-1,2],[-1,2],[-1,1],[0,1],[34,5],[24,2],[24,4],[7,0],[5,0],[5,-3],[7,-4],[9,-4],[17,-5],[11,-2],[-5,-4],[0,-1],[0,-1]],[[2295,9476],[-8,-3],[-2,1],[-1,1],[7,6],[3,1],[2,-1],[1,-2],[0,-1],[-2,-2]],[[2352,9475],[-1,0],[-2,0],[-10,3],[-1,1],[-1,1],[2,1],[1,1],[3,1],[4,0],[4,-3],[2,-3],[0,-1],[-1,-1]],[[2108,9506],[-6,-1],[-9,2],[-5,4],[-2,1],[0,1],[1,1],[2,2],[3,6],[1,2],[5,3],[3,1],[8,0],[4,-2],[2,-1],[1,-1],[2,-4],[0,-2],[2,-2],[1,-2],[0,-1],[-1,-1],[-1,-2],[-3,-2],[-8,-2]],[[2401,9505],[2,-4],[0,-2],[1,-4],[-1,-4],[-1,-1],[0,-1],[-1,-1],[0,-2],[0,-1],[-2,-1],[-10,-1],[-6,0],[-9,0],[-5,0],[-3,1],[-4,2],[-9,6],[-5,0],[-11,2],[-7,6],[-2,1],[-2,-2],[-1,0],[-1,2],[0,2],[-2,1],[-4,-1],[-1,1],[-1,2],[1,1],[0,2],[5,7],[3,0],[3,2],[2,3],[0,3],[4,5],[3,2],[5,3],[18,5],[4,1],[7,0],[6,-2],[5,-3],[9,-7],[5,-4],[2,-5],[2,-2],[3,-5],[-1,-3],[-1,-2],[0,-2]],[[2331,9533],[-2,-2],[-2,0],[-3,2],[-4,-1],[-4,-3],[-2,-3],[-1,0],[-4,-1],[-1,1],[-2,1],[-1,4],[1,2],[3,2],[10,2],[2,2],[1,1],[0,1],[1,0],[6,-2],[3,-2],[2,-1],[0,-1],[-3,-2]],[[1637,9547],[-3,-1],[-2,1],[1,1],[5,4],[0,2],[0,1],[0,1],[1,1],[2,1],[1,-1],[0,-1],[0,-4],[-1,-1],[-1,-2],[-1,-1],[-2,-1]],[[2374,9547],[-3,0],[-3,1],[-1,1],[-1,2],[0,2],[-1,2],[-1,1],[0,1],[0,1],[1,1],[3,0],[6,2],[1,0],[1,-1],[0,-3],[1,-2],[2,-4],[1,-2],[0,-1],[-6,-1]],[[1713,9537],[-8,-4],[-6,1],[-7,2],[-6,1],[-2,1],[-1,1],[2,3],[3,2],[6,4],[11,8],[7,3],[6,2],[7,5],[4,2],[3,0],[4,-1],[0,-1],[-4,-7],[-2,-2],[-5,-7],[-9,-11],[-3,-2]],[[2804,9557],[0,-3],[-2,0],[-7,-2],[-5,-1],[-2,1],[-2,3],[4,4],[5,3],[5,5],[5,3],[2,-1],[3,-2],[-3,-4],[-3,-3],[0,-3]],[[2160,9562],[6,-3],[0,-1],[-1,-1],[-7,-2],[-3,-1],[-3,-4],[-2,-1],[-10,-1],[-10,0],[2,3],[6,6],[-5,2],[-16,-4],[-6,2],[5,6],[-5,1],[-7,0],[-4,4],[1,4],[10,2],[12,2],[13,3],[10,0],[4,-1],[2,-5],[1,-6],[2,-1],[5,-4]],[[2110,9595],[2,0],[4,1],[3,0],[3,-2],[0,-2],[11,-3],[4,-2],[1,-1],[-2,-1],[-3,-2],[-3,-2],[-4,-1],[-23,0],[-2,1],[-1,1],[-3,7],[-2,3],[-1,3],[1,1],[2,2],[8,2],[4,0],[2,-1],[1,-1],[0,-1],[-2,-2]],[[2286,9588],[0,-2],[0,-2],[-1,-2],[0,-1],[1,-2],[3,-5],[2,-2],[0,-3],[0,-1],[-3,-4],[-1,-4],[0,-2],[2,-4],[0,-1],[-3,-3],[-5,-3],[0,-1],[12,-3],[1,-1],[0,-7],[2,-7],[-1,0],[-3,2],[-5,3],[-6,-5],[1,-9],[4,-4],[1,-3],[0,-1],[-4,-1],[-1,1],[-4,2],[-2,2],[-1,-1],[0,-2],[3,-2],[1,-3],[-1,-1],[-4,0],[-5,0],[-7,-2],[-4,0],[-4,1],[-4,0],[-5,0],[-2,0],[-2,2],[-3,-1],[-6,-3],[-9,1],[-8,0],[-1,1],[-2,3],[-3,7],[0,1],[9,1],[0,1],[-6,2],[-7,2],[-3,2],[0,2],[0,1],[12,3],[9,6],[5,3],[1,1],[4,1],[11,1],[0,2],[-20,-1],[-27,-4],[-9,-1],[-7,1],[-30,-6],[-1,0],[-3,2],[-3,3],[2,2],[9,5],[4,3],[0,2],[3,4],[6,1],[10,-3],[5,-3],[4,-2],[4,1],[4,2],[-1,0],[-7,-1],[-1,0],[-3,3],[-2,2],[-1,3],[0,1],[2,3],[-8,1],[-3,2],[-1,2],[0,1],[3,3],[7,4],[-1,1],[-10,0],[-2,0],[-4,3],[1,2],[3,4],[3,3],[2,0],[3,0],[8,-1],[2,-1],[5,-4],[2,-2],[0,-2],[1,-2],[4,-2],[19,-11],[3,-3],[2,-1],[5,-1],[2,0],[2,1],[1,1],[-8,4],[-2,2],[-2,3],[1,1],[2,0],[6,0],[7,1],[-8,1],[-5,2],[-5,0],[-6,2],[-1,1],[2,1],[9,1],[1,1],[1,0],[-3,2],[-3,1],[-13,2],[-5,2],[-1,2],[-1,1],[2,2],[7,4],[5,2],[9,1],[7,0],[4,-1],[10,-6],[4,-4],[8,1],[-2,4],[-2,5],[2,1],[7,3],[5,-1],[7,-4],[1,-2],[7,-2],[5,-1],[2,-1],[1,-2]],[[2188,9595],[-7,-1],[-4,1],[0,1],[3,1],[10,3],[5,4],[2,0],[8,1],[4,-1],[6,0],[-14,-5],[-13,-4]],[[1992,9565],[3,-1],[4,1],[5,0],[2,-2],[1,-2],[1,-1],[-1,-1],[0,-1],[-6,-6],[-2,-2],[2,0],[1,0],[6,4],[5,2],[3,0],[6,-1],[2,-1],[1,-1],[1,-1],[2,-4],[2,-5],[0,3],[1,3],[5,1],[0,1],[-2,1],[-1,2],[-2,3],[1,1],[1,2],[4,3],[4,1],[3,1],[14,-3],[5,-3],[3,-1],[0,-1],[1,-3],[3,-7],[0,-3],[-1,-4],[-5,-7],[0,-6],[-5,-12],[-3,-4],[-3,-2],[-14,-4],[-10,-5],[-3,0],[-3,-1],[-8,2],[-10,3],[-6,-1],[-5,-2],[-4,-1],[-3,1],[-4,0],[-4,2],[2,1],[1,1],[-1,1],[-4,1],[-5,-3],[-14,-7],[-19,-3],[-5,-1],[-5,-2],[-2,-2],[-4,-3],[-5,-3],[-10,-3],[-12,-5],[-22,-5],[-14,-1],[-13,2],[-5,1],[-4,2],[-10,5],[-2,2],[-3,4],[1,2],[5,3],[8,3],[15,3],[13,6],[5,1],[13,1],[7,0],[5,0],[3,1],[5,2],[6,4],[5,4],[2,2],[-2,1],[-3,1],[-8,-4],[-4,-2],[-4,0],[-6,-1],[-6,-1],[-1,0],[-7,4],[-3,1],[-1,-1],[-2,-1],[-3,-2],[-1,-1],[-3,-1],[-11,-1],[-10,-1],[-2,1],[-2,1],[0,1],[0,3],[-1,2],[1,3],[1,2],[2,1],[7,5],[1,1],[-3,-1],[-8,-2],[-2,1],[-1,2],[-1,1],[-1,-1],[-1,-2],[-1,-6],[-2,-3],[-3,1],[-4,2],[-1,0],[-1,0],[0,-1],[4,-5],[0,-2],[-2,-3],[-12,-5],[-4,-2],[-2,1],[-1,1],[-1,2],[-3,4],[-2,0],[-2,0],[-2,0],[-2,-2],[-1,-1],[-1,-3],[-2,-2],[-1,0],[-11,4],[-10,8],[-10,-2],[-4,1],[-14,2],[-2,2],[-1,2],[0,2],[1,1],[2,2],[3,4],[2,1],[2,1],[3,1],[7,0],[19,0],[3,1],[21,7],[2,1],[3,3],[1,1],[-25,-5],[-11,-2],[-17,1],[-3,1],[-1,2],[4,4],[2,2],[4,1],[12,2],[15,2],[10,0],[9,2],[5,1],[-17,0],[-21,-1],[-3,1],[-6,2],[0,2],[2,2],[1,1],[-1,4],[0,1],[4,3],[7,2],[4,1],[8,-1],[23,-1],[5,0],[-3,2],[-4,0],[-18,2],[-4,1],[0,1],[-1,1],[0,2],[2,2],[5,4],[16,4],[7,0],[6,0],[7,-1],[3,-2],[1,-1],[1,-2],[0,-3],[0,-1],[2,-1],[3,-5],[3,-1],[13,3],[5,0],[6,-1],[7,-2],[10,-8],[13,-7],[0,-2],[-5,-2],[-1,-2],[1,0],[5,-1],[5,1],[4,-1],[1,-1],[2,-2],[2,-5],[3,-4],[3,-2],[3,-2],[5,0],[4,1],[7,0],[39,-3],[2,0],[1,2],[1,2],[1,3],[-1,3],[0,1],[-24,9],[-2,4],[11,6],[1,1],[0,1],[0,3],[-1,2],[-7,4],[-5,0],[-8,4],[-2,1],[-1,1],[0,3],[0,1],[1,1],[8,4],[3,2],[10,10],[5,4],[3,2],[3,1],[8,1],[7,-4],[2,0],[1,-1],[0,-2],[-1,-2],[-3,-2],[-1,-2],[0,-1],[2,-3],[1,-2],[0,-3],[1,0],[4,-3],[4,-4],[2,-5],[-1,-2],[-4,-3],[-2,-2],[0,-2],[0,-1],[3,0]],[[2507,9591],[-1,-1],[-4,0],[-2,-1],[-2,1],[-3,1],[-3,4],[-4,4],[-4,5],[0,1],[1,2],[3,1],[8,1],[5,0],[5,-3],[1,-1],[1,-1],[0,-1],[0,-1],[-2,-3],[-1,-1],[0,-2],[0,-2],[1,-2],[1,-1]],[[1845,9604],[-4,-2],[-29,3],[-1,1],[-1,1],[5,3],[6,2],[15,1],[5,-1],[4,-2],[2,-1],[0,-3],[-2,-2]],[[2380,9614],[6,-1],[4,1],[4,0],[6,-2],[5,-4],[4,-2],[1,0],[1,-1],[0,-3],[0,-1],[0,-1],[-2,-3],[-1,-3],[-3,-2],[-2,-2],[-1,-3],[3,2],[12,8],[7,-1],[12,1],[14,3],[7,1],[7,-1],[5,-1],[10,-4],[4,-2],[1,-2],[1,-1],[-3,-2],[-6,1],[-11,1],[-2,1],[-2,0],[-1,-1],[0,-2],[3,-1],[13,-1],[44,-7],[1,-3],[0,-1],[-2,-1],[-3,-2],[-25,-2],[-14,2],[-12,3],[-4,-1],[3,-4],[7,-1],[6,-2],[3,-1],[13,-2],[2,-1],[4,-3],[3,-1],[3,-2],[3,-4],[1,-1],[4,1],[7,-4],[2,-1],[0,-2],[-2,-2],[-3,-3],[-7,-4],[0,-1],[8,1],[2,-1],[10,-6],[1,0],[1,0],[1,3],[0,2],[-2,3],[1,2],[2,1],[1,1],[2,0],[2,-1],[11,-8],[13,4],[2,-2],[2,-3],[1,0],[5,6],[3,1],[12,-7],[8,-2],[3,-1],[5,-2],[8,-1],[2,3],[-5,4],[3,1],[10,3],[6,0],[11,4],[7,0],[4,0],[13,7],[3,1],[2,2],[5,-1],[15,-3],[4,0],[15,4],[5,1],[6,0],[14,-3],[10,-2],[4,-1],[-2,-3],[1,-1],[1,0],[4,-1],[13,0],[6,-1],[4,-3],[1,-1],[0,-1],[-4,-3],[0,-1],[5,0],[10,-1],[2,0],[2,-4],[2,-5],[0,-2],[-3,-4],[-10,-4],[-10,-4],[-1,-1],[3,-2],[4,-1],[2,0],[9,2],[2,0],[4,-2],[1,-2],[2,-2],[-3,-2],[-12,-3],[-7,4],[-3,0],[-1,0],[1,-1],[3,-3],[1,-2],[-1,-1],[0,-2],[0,-2],[-1,-3],[-1,-4],[-27,-1],[-3,-1],[-7,-3],[-6,-1],[-3,-1],[-4,1],[-10,3],[-6,-1],[-2,1],[-6,2],[-1,1],[-2,2],[-2,4],[0,2],[1,3],[-1,2],[-1,0],[-2,1],[-5,3],[-3,1],[-1,-1],[1,-2],[1,-1],[3,-2],[1,-2],[-2,-5],[0,-1],[-4,-4],[-2,-1],[-7,0],[-10,-3],[-5,-1],[-7,1],[-4,1],[-3,2],[-3,2],[-1,0],[-1,-5],[-1,0],[-2,0],[-4,1],[-3,4],[-1,0],[0,-2],[-1,-2],[-8,-2],[-4,0],[-4,2],[-3,0],[-4,-1],[-8,2],[-2,0],[1,-4],[-3,0],[-6,0],[-10,1],[-6,-2],[-12,1],[-11,1],[-3,0],[-1,2],[0,2],[0,2],[2,3],[3,5],[1,2],[-3,1],[-1,2],[-2,0],[-4,-2],[-2,-5],[-2,-1],[-1,1],[-1,3],[-1,2],[-1,-1],[-1,0],[-1,-2],[-2,0],[-2,0],[-1,-1],[1,-2],[0,-2],[0,-1],[-2,-2],[-5,-2],[-3,-1],[-8,0],[-5,0],[-9,3],[-6,0],[-6,5],[-5,1],[0,2],[2,3],[0,1],[-7,-5],[-1,-1],[1,-3],[-1,-1],[-4,2],[-5,-1],[-1,0],[-4,2],[-5,3],[-3,3],[-4,9],[-2,6],[1,1],[3,1],[-1,2],[-4,3],[-3,3],[-2,2],[0,2],[-1,3],[0,2],[1,1],[2,4],[6,8],[1,1],[0,2],[-1,4],[-1,4],[-1,2],[-3,4],[-5,5],[-6,7],[-5,6],[-6,8],[-3,0],[-3,0],[-7,-3],[-2,-1],[-1,-1],[-5,0],[-15,1],[-6,0],[-4,0],[-7,-2],[-8,1],[-5,5],[-10,3],[-4,2],[-2,2],[1,2],[6,1],[3,2],[1,1],[-6,-1],[-3,0],[-19,8],[-5,1],[-1,1],[-1,1],[0,1],[1,2],[5,-3],[3,0],[4,1],[1,1],[-1,1],[-6,3],[-3,1],[-1,2],[1,2],[0,1],[2,1],[4,0],[5,1],[8,3],[6,1],[6,0],[14,-3],[15,-4],[8,-2]],[[1790,9640],[2,-2],[0,-1],[-1,-1],[-3,-2],[-16,-5],[-4,-2],[2,-2],[6,-4],[6,-4],[1,-2],[-3,-1],[-5,0],[-2,0],[-2,-1],[0,-1],[6,-6],[2,-2],[0,-2],[-1,-1],[-3,-2],[-4,-3],[-6,-1],[-15,-3],[-1,-2],[0,-2],[0,-3],[0,-2],[-2,-3],[-1,-2],[-3,-1],[-3,0],[-4,0],[-7,3],[-3,1],[-4,4],[-1,2],[1,3],[1,4],[2,5],[2,5],[1,2],[-1,2],[-2,0],[-5,-2],[-4,-1],[-2,-1],[-2,-2],[-1,-3],[-1,-4],[-1,-2],[-3,-1],[-4,0],[-2,-1],[-1,-2],[1,-1],[4,-3],[1,-3],[-1,-1],[-4,-4],[-2,-1],[-2,-5],[-2,-1],[-2,-2],[-2,1],[-3,1],[-3,4],[-2,3],[-1,3],[-1,1],[-2,-1],[-2,-3],[0,-2],[1,-3],[0,-2],[-3,-2],[0,-1],[5,-3],[1,-1],[0,-2],[-1,-1],[-2,0],[-1,-2],[-2,-2],[-5,-3],[-7,0],[-6,-2],[-1,0],[-1,3],[-2,5],[-1,3],[-2,1],[-3,6],[-1,2],[-1,1],[-1,0],[-1,-1],[-4,-9],[-5,-2],[-3,0],[-3,0],[-8,2],[-5,1],[-5,-1],[-6,-3],[-3,-1],[-4,0],[-1,2],[-2,2],[0,1],[1,1],[2,2],[0,1],[-2,1],[0,1],[1,1],[-1,1],[-2,0],[-6,-2],[1,2],[2,3],[8,8],[2,2],[2,0],[21,3],[1,0],[10,10],[3,2],[3,2],[14,6],[1,1],[3,4],[1,1],[3,2],[10,8],[10,6],[4,4],[7,3],[7,2],[23,3],[16,-4],[4,0],[2,1],[2,2],[2,-1],[6,-1],[2,1],[2,2],[-2,1],[-7,2],[0,1],[0,1],[2,2],[3,1],[9,1],[5,0],[4,-1],[5,-4],[13,-5]],[[2504,9634],[-7,-3],[-4,0],[-21,7],[-4,3],[-1,2],[0,4],[0,4],[1,3],[1,1],[2,1],[5,1],[5,-1],[7,-1],[7,-2],[9,-6],[4,-3],[0,-3],[0,-3],[0,-1],[-1,-1],[-3,-2]],[[2095,9627],[-4,-1],[-8,2],[-6,1],[-4,5],[-5,5],[-4,6],[-2,4],[-2,2],[-1,4],[-5,6],[5,1],[8,-1],[3,-2],[5,-3],[6,-6],[2,-2],[0,-3],[1,-2],[6,0],[6,-5],[1,-1],[1,-4],[0,-1],[-1,-4],[-2,-1]],[[2347,9664],[7,-2],[8,1],[8,1],[18,-1],[12,0],[3,0],[5,-2],[3,-1],[2,-3],[-6,-2],[-5,-9],[-1,0],[-5,0],[-3,-1],[-16,1],[-44,1],[-1,1],[-6,5],[-1,2],[1,3],[2,1],[1,1],[13,4],[5,0]],[[2175,9659],[-4,-1],[-7,1],[-8,2],[-2,2],[-1,4],[0,2],[1,1],[5,0],[10,1],[7,-1],[9,-2],[4,-1],[2,-1],[2,-2],[1,-1],[0,-2],[-11,0],[-5,-1],[-3,-1]],[[1838,9662],[-8,-2],[-5,0],[-9,3],[-10,9],[-1,3],[3,0],[3,1],[2,1],[3,2],[8,2],[1,-1],[0,-2],[0,-1],[3,-1],[3,-1],[5,-3],[4,-1],[1,-1],[1,-1],[2,-2],[0,-1],[-3,-2],[-3,-2]],[[1932,9682],[22,-1],[1,0],[0,-1],[-2,-4],[-2,-2],[-12,-3],[-16,-3],[-3,-1],[0,-1],[2,-1],[2,-1],[12,0],[3,0],[1,-1],[1,-1],[0,-2],[0,-5],[-1,-3],[-1,-3],[-5,-2],[-9,-2],[-6,-2],[-4,1],[-5,0],[-20,-5],[-6,0],[-6,1],[-7,4],[-8,2],[-3,2],[-4,1],[-1,2],[0,1],[1,1],[1,1],[1,1],[-2,3],[0,2],[-3,4],[0,2],[0,1],[0,1],[2,3],[1,0],[4,1],[6,1],[14,4],[31,5],[9,-1],[4,1],[8,0]],[[2139,9685],[-4,-1],[-3,0],[-1,1],[0,1],[0,1],[5,4],[3,1],[3,0],[2,-1],[1,-2],[-6,-4]],[[1949,9714],[5,-3],[2,0],[2,-1],[1,-1],[3,-4],[1,-2],[0,-3],[-1,-2],[-1,-2],[-2,-1],[-7,-1],[-8,1],[-8,-1],[-3,-1],[-10,1],[-2,1],[-5,3],[-4,1],[-2,-1],[-2,-2],[-4,-3],[-2,-1],[-7,1],[-10,5],[-12,-2],[-12,-3],[-5,0],[-1,1],[-2,2],[0,1],[4,3],[8,3],[6,2],[12,3],[14,2],[5,1],[3,3],[9,3],[6,2],[7,1],[6,0],[7,-3],[6,-1],[3,-2]],[[2327,9707],[7,-1],[11,0],[4,-1],[11,-4],[3,-2],[1,-2],[0,-1],[-4,-2],[-7,-2],[-1,-3],[6,-2],[3,-3],[2,-1],[0,-2],[-5,-5],[-3,-1],[-4,0],[-3,-1],[-6,-2],[-9,-2],[-13,-1],[-4,-1],[-6,-2],[-4,-1],[-2,2],[0,1],[0,2],[1,1],[-2,2],[-10,2],[-5,4],[-1,2],[0,1],[12,0],[5,1],[2,1],[1,1],[-2,1],[-9,2],[-13,2],[-1,2],[-6,3],[0,4],[-2,1],[-4,1],[0,1],[-1,2],[0,1],[0,1],[7,3],[-1,1],[-5,6],[-2,4],[0,1],[4,2],[4,0],[13,-1],[6,0],[6,-2],[6,-2],[10,-2],[3,-1],[6,-4],[0,-2],[0,-1],[1,-1]],[[2127,9752],[6,-1],[8,-4],[7,-7],[1,-1],[0,-2],[-1,-1],[-1,-2],[-1,-2],[4,-1],[0,-1],[0,-2],[0,-1],[3,1],[2,2],[0,1],[1,4],[5,1],[6,3],[3,0],[5,0],[11,-6],[4,0],[2,-1],[1,-1],[0,-2],[-2,-3],[-1,-2],[1,-1],[6,-1],[13,2],[12,-6],[6,-6],[5,-2],[1,-1],[-2,-1],[-1,-3],[-4,-2],[-1,-1],[2,-3],[0,-2],[0,-2],[1,-1],[5,-1],[12,-10],[2,-2],[2,-4],[0,-1],[-2,-2],[-2,-5],[-1,-1],[-5,-1],[-9,-1],[-8,-1],[-9,2],[-8,3],[-3,2],[-2,3],[-1,1],[0,5],[-1,1],[-4,2],[-3,4],[-6,0],[-15,4],[-6,1],[-6,-1],[-9,-1],[-2,0],[-2,1],[-1,2],[0,1],[1,3],[-26,-3],[-8,-4],[-10,1],[-5,1],[-7,4],[-4,3],[-2,3],[-1,3],[3,2],[2,1],[3,1],[14,-2],[12,-2],[6,2],[2,3],[-3,1],[-12,1],[3,2],[10,1],[5,3],[-1,1],[-3,1],[-13,-1],[-5,1],[0,1],[1,1],[7,5],[0,1],[-3,2],[-3,2],[-1,0],[-7,-1],[-10,-8],[-2,-1],[-2,0],[-2,1],[0,2],[2,2],[4,6],[0,2],[-4,1],[-11,-1],[-7,0],[-1,2],[0,3],[0,3],[2,4],[2,3],[1,2],[15,-1],[25,2],[7,0],[8,-2]],[[2256,9791],[0,-8],[0,-4],[-2,-2],[-1,-1],[-2,0],[-7,2],[-3,1],[0,1],[0,2],[-6,3],[-9,0],[-4,0],[-2,1],[-1,1],[0,5],[0,1],[1,3],[1,1],[6,3],[2,0],[9,-1],[8,0],[3,-1],[4,-2],[2,-2],[1,-3]],[[2447,9857],[4,-5],[13,-11],[6,-5],[11,-5],[1,-2],[0,-3],[3,-1],[9,-2],[10,-3],[1,1],[4,1],[4,1],[5,-1],[3,-1],[2,-2],[1,-1],[0,-1],[-2,-2],[0,-1],[1,-1],[0,-1],[-2,-4],[1,-1],[5,-4],[4,-2],[9,-2],[6,0],[4,-1],[0,1],[-2,2],[-3,4],[-7,1],[-1,2],[0,4],[0,2],[4,2],[3,0],[8,0],[4,0],[8,-3],[1,-1],[1,-3],[0,-5],[0,-2],[-7,-3],[-2,-2],[2,0],[6,-1],[9,-2],[3,0],[4,-4],[3,-4],[-2,-6],[-3,-8],[-2,-2],[-2,-3],[1,0],[9,1],[2,1],[6,2],[8,0],[3,-1],[2,-1],[2,-3],[3,-4],[1,0],[4,5],[2,1],[2,2],[1,-1],[4,-4],[9,-9],[3,-3],[0,-3],[-3,-2],[-3,-2],[-23,-6],[-10,-4],[-5,-2],[-2,-1],[-6,0],[-1,0],[-1,-5],[-2,-2],[-5,-3],[-6,-5],[-4,-3],[-7,2],[-2,3],[0,6],[-1,2],[1,1],[0,2],[3,5],[0,1],[-1,-1],[-5,-2],[-2,-1],[-1,-3],[-1,-4],[1,-7],[-1,-2],[-2,-2],[1,-1],[5,-1],[1,-1],[1,-1],[0,-2],[0,-2],[-2,-2],[-3,-1],[-4,1],[-8,6],[-3,0],[-1,-1],[0,-2],[3,-5],[0,-4],[-1,-3],[-2,-6],[-2,-2],[-1,-1],[-4,0],[-3,2],[-11,9],[-5,4],[-7,7],[-2,2],[-1,0],[-1,-3],[2,-3],[6,-7],[5,-5],[2,-5],[1,-2],[-1,0],[-2,0],[-2,2],[-6,2],[-2,2],[-2,1],[-3,2],[-5,0],[-4,1],[-5,-1],[0,-1],[5,-2],[1,-1],[2,-2],[1,-2],[-2,-1],[-6,-1],[-9,1],[-13,1],[-14,3],[-13,4],[-9,5],[-3,2],[-1,2],[3,2],[12,1],[12,2],[-2,1],[-22,2],[-7,1],[-4,-1],[-4,1],[-3,1],[-5,4],[-2,3],[0,1],[2,0],[10,0],[1,0],[-5,2],[-16,4],[-6,3],[-1,1],[0,2],[0,1],[6,2],[18,6],[7,1],[6,0],[4,2],[4,5],[19,2],[14,3],[2,1],[-11,-1],[-16,1],[-6,3],[-5,1],[-5,0],[-5,-1],[-10,-4],[-5,-1],[-10,-3],[-3,0],[-2,1],[2,3],[2,1],[0,1],[-4,0],[-5,0],[-4,0],[-12,-4],[-5,-2],[-2,0],[-6,4],[-9,2],[-2,1],[1,6],[3,2],[7,1],[22,6],[1,1],[2,2],[-4,0],[-11,-3],[-9,-1],[-7,0],[-6,0],[-3,1],[-4,2],[-13,8],[-3,4],[-1,3],[-1,3],[-3,6],[27,-4],[11,0],[21,-1],[1,1],[0,1],[0,2],[0,1],[0,1],[8,2],[1,1],[-9,0],[-16,-4],[-6,0],[-7,6],[-7,-1],[-4,0],[-5,2],[-2,1],[-2,2],[-1,1],[0,1],[2,1],[6,2],[3,0],[7,-1],[6,0],[-2,1],[-8,5],[-7,5],[0,7],[6,2],[6,0],[6,-2],[8,0],[5,-2],[4,-4],[4,0],[7,-1],[16,0],[-3,1],[-5,2],[-11,2],[-5,6],[-12,3],[-8,2],[0,1],[6,8],[8,3],[13,-1],[9,2],[10,2],[11,-1],[3,0],[1,1],[2,2],[0,1],[-2,2],[-3,1],[-13,1],[-6,0],[-3,1],[0,2],[-1,1],[0,1],[1,1],[1,1],[3,0],[13,0],[7,1],[8,-1],[18,-4],[5,-2],[6,-3],[3,-3]],[[3069,9965],[23,-1],[7,1],[9,-3],[5,0],[8,0],[6,0],[23,-1],[5,-1],[0,-1],[-5,-3],[-7,-2],[-42,-8],[-3,-1],[8,-1],[12,0],[10,1],[11,3],[3,0],[7,2],[14,3],[11,2],[5,0],[4,-2],[3,0],[1,1],[3,3],[1,1],[4,1],[2,0],[3,-2],[4,-3],[4,-2],[2,0],[8,2],[4,1],[10,-1],[4,-1],[1,-2],[-3,-1],[-2,-1],[0,-1],[1,-1],[6,-2],[8,-6],[0,-1],[-4,-4],[0,-1],[21,4],[22,-2],[6,-1],[2,-2],[3,-2],[2,-3],[-1,-4],[-10,-6],[-10,-4],[-5,-4],[-9,-2],[-31,-9],[-15,-3],[-8,-3],[-4,0],[-18,0],[-5,-2],[-3,-2],[-5,-2],[-9,0],[-17,-1],[-4,-3],[-1,-2],[-2,-2],[-1,-1],[-49,-11],[-1,-2],[5,0],[6,0],[72,14],[13,1],[13,-1],[-1,-3],[-18,-9],[-23,-8],[-12,-6],[-29,-11],[-24,-10],[-9,-6],[-12,-9],[-4,-2],[-5,-1],[-6,0],[-6,2],[-7,3],[-6,4],[-3,1],[2,-2],[12,-13],[-1,-3],[-23,-3],[-11,-2],[-5,0],[-4,0],[-3,0],[-4,-1],[0,-1],[3,-1],[9,-1],[21,3],[3,0],[5,-2],[1,-1],[-6,-4],[-16,-5],[2,-1],[5,-1],[-1,-2],[-5,-4],[-2,-1],[-16,-4],[-7,0],[-6,0],[-29,8],[-9,1],[-10,2],[-7,-1],[-7,-2],[3,-1],[14,-2],[11,-1],[5,0],[2,-2],[5,-5],[0,-3],[-1,-2],[-1,-2],[-2,-1],[-3,0],[-11,0],[-4,-1],[-5,-1],[-6,-1],[-11,0],[-13,-2],[-7,0],[-7,1],[-8,2],[-9,2],[-14,1],[1,-2],[5,0],[10,-4],[5,-5],[5,-1],[10,-4],[7,-1],[7,-1],[10,2],[7,-1],[-2,-10],[-3,-1],[-16,0],[-8,2],[-3,1],[-8,2],[-7,-1],[-6,0],[-4,-1],[-7,0],[-17,-2],[-9,0],[-7,1],[-8,1],[-9,-1],[1,-1],[3,0],[6,-2],[5,-3],[4,-1],[5,0],[6,2],[19,2],[8,0],[7,-1],[5,-1],[4,-1],[4,-4],[11,-1],[9,-1],[13,-6],[4,0],[1,-2],[-3,-4],[0,-2],[-9,-4],[-15,-1],[-15,0],[-12,-1],[-1,0],[8,-1],[18,-5],[7,-3],[1,-2],[-10,-6],[-9,-12],[-3,-1],[-3,0],[-7,0],[-10,-3],[-7,-1],[-14,1],[-15,0],[-2,-2],[0,-3],[0,-6],[1,-8],[-1,-5],[-3,-4],[-3,-2],[-6,-3],[-6,-1],[-4,-1],[-8,0],[-21,-2],[-10,0],[-8,1],[-9,3],[-14,7],[-4,1],[-4,1],[1,-1],[4,-4],[3,-3],[3,-1],[-1,-1],[-6,-2],[-7,-1],[-8,0],[0,-1],[3,-2],[3,-2],[3,0],[6,0],[7,3],[4,0],[9,0],[4,-1],[11,-5],[1,-1],[9,3],[11,0],[5,-2],[1,-4],[1,-4],[-2,-2],[3,-3],[7,-2],[5,-1],[4,2],[5,3],[3,1],[2,0],[3,-3],[5,-5],[1,-5],[-4,-7],[-5,-4],[-18,-7],[-5,-2],[-5,-3],[-6,-3],[-12,-3],[-7,-1],[-14,-4],[-3,0],[-4,1],[-1,2],[1,3],[1,3],[2,3],[0,2],[-4,3],[-2,2],[-3,1],[-5,-1],[-3,-1],[-4,0],[-3,1],[-3,1],[-6,7],[-2,0],[-3,0],[-3,1],[-2,2],[-4,2],[1,-2],[4,-3],[3,-4],[1,-3],[-1,-3],[-32,-1],[-13,0],[-3,3],[-7,10],[-1,-18],[-24,-3],[-6,0],[-9,2],[-12,5],[-5,4],[-2,3],[-2,2],[-1,0],[-3,-4],[-3,-8],[-8,2],[-11,2],[-4,8],[0,-11],[-17,1],[-8,0],[-2,10],[0,11],[-4,-7],[2,-6],[0,-7],[-7,2],[-16,1],[-5,1],[0,9],[2,10],[20,9],[6,5],[4,2],[7,1],[9,1],[6,-1],[7,1],[8,1],[6,1],[1,1],[-1,0],[-7,7],[-2,1],[-2,1],[-5,0],[-4,3],[-3,2],[-3,3],[-4,6],[-4,7],[2,4],[7,3],[7,2],[8,1],[6,0],[7,-1],[10,-4],[6,-3],[7,-8],[5,-6],[4,-3],[18,-5],[6,0],[7,0],[14,1],[7,2],[3,1],[2,3],[2,1],[6,5],[10,8],[5,7],[1,2],[2,3],[0,3],[-3,-2],[-16,-16],[-4,-3],[-9,-5],[-5,-1],[-6,0],[-9,2],[-10,-3],[-7,1],[-5,2],[0,12],[-8,9],[8,5],[7,3],[11,8],[3,0],[8,-1],[-4,1],[-5,3],[-10,-1],[4,17],[-7,-13],[-7,-6],[-4,-3],[-5,-2],[-17,-2],[4,6],[4,9],[-4,-3],[-10,-5],[-7,-3],[-7,-1],[-11,0],[-6,3],[1,6],[0,8],[4,3],[6,5],[5,6],[4,6],[16,3],[15,1],[13,3],[7,1],[6,-2],[24,-2],[10,-2],[4,-2],[4,0],[3,2],[4,2],[16,0],[4,0],[4,1],[4,2],[6,3],[1,2],[-4,0],[-4,-1],[-6,-2],[-5,-1],[-6,0],[-11,2],[-20,0],[-11,1],[-4,1],[-3,1],[-2,2],[-2,2],[1,2],[4,1],[3,0],[6,-1],[6,-3],[7,0],[-2,2],[-9,4],[-6,4],[-5,4],[-4,5],[-9,7],[-7,6],[-5,3],[-5,2],[-16,2],[-3,1],[-8,6],[-2,10],[-3,6],[3,8],[5,3],[32,-3],[14,1],[17,-1],[9,-2],[11,-5],[9,-5],[9,-4],[8,-5],[10,-7],[5,-3],[5,-2],[6,-2],[12,-3],[10,0],[5,0],[6,2],[4,2],[-4,0],[-12,0],[-9,1],[-4,2],[-5,3],[-8,6],[-6,4],[-13,6],[-10,7],[-8,6],[0,2],[5,2],[7,1],[43,4],[26,5],[11,6],[1,1],[34,8],[25,3],[9,0],[9,1],[0,1],[-7,1],[-8,1],[-17,0],[-15,1],[-5,1],[1,3],[2,3],[4,4],[5,3],[21,9],[14,3],[4,3],[-30,-6],[-11,-4],[-10,-6],[-6,-2],[-4,1],[-3,-1],[-3,-2],[-3,-3],[-2,-4],[-2,-3],[-2,-2],[-4,-2],[-10,-4],[-24,-7],[-9,-1],[-7,0],[-22,-4],[-7,0],[-8,1],[4,3],[12,6],[3,2],[-8,0],[-8,-2],[-17,-1],[-7,-3],[-6,-4],[-6,-2],[-4,-1],[-5,-1],[-20,0],[-5,0],[-12,3],[-10,-1],[-4,0],[-8,3],[-2,1],[0,2],[5,4],[5,3],[17,8],[11,4],[16,3],[36,3],[2,3],[-37,-3],[-32,-4],[-5,-1],[-8,-4],[-23,-12],[-7,-4],[-11,-1],[-8,2],[-6,1],[-11,4],[-8,2],[-4,1],[-2,2],[-2,1],[-2,2],[3,2],[21,3],[28,0],[13,0],[13,2],[18,5],[20,7],[4,3],[-7,0],[-6,0],[-13,-3],[-20,-7],[-19,-2],[-44,-1],[-15,-2],[-6,0],[-4,2],[-6,3],[1,3],[11,3],[8,1],[2,1],[-12,3],[-1,1],[7,4],[15,5],[7,1],[14,1],[14,0],[0,1],[-14,1],[-10,1],[-14,-2],[-37,-8],[-3,1],[-5,1],[1,2],[20,9],[1,1],[-14,0],[-5,0],[-4,1],[-5,-1],[-8,-3],[-5,-1],[-3,1],[-8,3],[1,3],[6,3],[6,3],[8,2],[12,3],[9,1],[15,0],[7,1],[6,2],[8,4],[9,2],[14,2],[11,0],[7,-2],[5,-3],[6,-3],[0,2],[5,3],[5,1],[7,-1],[6,-1],[8,-3],[7,-1],[3,0],[3,2],[10,0],[0,1],[-3,1],[-4,1],[-35,9],[-1,1],[12,2],[7,2],[4,1],[8,4],[6,2],[10,3],[5,-1],[5,-2],[5,-2],[15,-1],[7,-1],[11,-8],[5,-3],[6,-3],[4,-1],[8,0],[1,1],[-9,4],[-3,2],[1,2],[2,1],[3,0],[7,-2],[19,-5],[29,-7],[11,-1],[7,-3],[6,-3],[6,-2],[1,0],[-5,5],[-14,6],[-37,9],[-15,5],[-7,3],[-5,4],[-1,1],[5,3],[7,1],[9,1],[1,1],[-8,2],[-4,3],[0,1],[9,1],[6,0],[10,-3],[10,-1],[1,1],[-9,7],[-1,2],[1,1],[3,1],[10,-1],[16,-3],[29,-2],[8,0],[-1,1],[-11,2],[-13,3],[-5,2],[-4,2],[-4,2],[-1,1],[8,2],[19,0],[18,-3],[16,1],[10,-1],[4,0],[7,-3],[22,-9],[2,-2],[3,-2],[3,-3],[3,-1],[8,2],[5,2],[-2,2],[-13,5],[-3,2],[-6,3],[-14,6],[-3,3],[-3,2],[39,2],[37,-2],[6,-1],[4,-2],[3,-3],[6,-3],[12,-5],[17,-3],[-3,2],[-13,5],[-5,4],[0,2],[1,2],[2,1],[14,5],[21,2],[2,-1],[16,-7],[8,-3],[5,-1],[-7,4],[-6,2],[0,1],[9,3],[6,1],[25,1],[3,0],[2,-1],[6,-4],[2,-1]],[[5264,7907],[-1,-6],[0,-4],[0,-2],[3,-1]],[[5290,7883],[-1,-7],[-1,-4],[1,-3],[1,-2],[-1,-2],[-2,0],[-2,1],[-2,3],[-2,0],[-1,-1],[-1,-3],[-1,-4],[1,-2],[1,-1],[0,-4],[1,-4],[0,-2],[0,-1],[-2,-1],[-1,1],[-2,5],[0,2],[-2,1],[-3,-2],[-4,-3],[-1,0],[-2,1],[-1,2],[-1,5],[-1,3],[-3,1],[-1,-1],[0,-5],[-1,-6],[-1,-4],[-4,-7],[-1,-3],[0,-2],[-1,-2],[1,-3],[1,-3],[-1,-2],[-2,0],[-1,1],[-1,4],[-3,4],[2,4],[-1,1],[-4,2],[-3,3],[-3,4],[0,3],[0,7],[0,1],[-1,1],[-1,0],[-2,-2],[-2,-4],[-4,-4],[0,-1],[1,-4],[0,-1],[-3,-7],[0,-2],[-4,-4],[-2,-1],[-6,3],[-1,0],[-3,-2],[-3,-2],[-5,-2],[-3,2],[0,1]],[[5195,7829],[-1,2],[-1,3],[-2,2],[-1,2],[-1,3],[-1,2],[1,6],[-1,2],[-1,4],[1,2],[-1,0],[-5,2],[-4,-1],[-3,-2],[-2,-4],[-1,0],[1,-1],[1,-3],[-2,-4],[-3,-2],[-3,0],[-1,0],[0,4],[2,1],[2,2],[0,4],[1,2],[-2,3],[0,2],[1,3],[1,3],[1,3],[3,4],[4,4],[0,4],[0,6],[1,1],[5,3],[1,1],[0,2],[4,6],[4,6],[0,2],[1,2],[-1,1],[-1,1],[-1,2],[2,3],[2,2],[3,0],[1,-1],[0,-1],[1,-1],[1,-1],[2,1],[3,1],[1,3],[1,2],[3,3]],[[5211,7925],[2,-1],[7,-1],[4,1],[3,2],[4,0],[2,-1],[1,0],[1,1],[2,1],[1,1],[-1,0],[0,1],[-3,-1],[-1,1],[0,2],[1,2],[2,2],[2,1],[1,-1],[3,-4],[1,0],[0,1],[1,0],[1,-1],[1,-2],[7,1],[2,0],[4,-5],[5,-4]],[[3123,1965],[-1,0],[-3,1],[-4,0],[0,1],[0,1],[2,1],[6,-1],[1,0],[0,-1],[-1,-2]],[[3131,1971],[-1,0],[-1,1],[-1,1],[-5,1],[0,1],[0,2],[1,1],[2,1],[2,3],[1,-1],[1,-5],[1,-3],[0,-1],[0,-1]],[[3153,2003],[-2,-3],[-2,0],[0,1],[0,1],[0,2],[1,1],[1,1],[1,0],[2,-1],[-1,-2]],[[3136,2007],[0,-2],[-2,-3],[-3,-2],[-2,-1],[-2,1],[0,2],[-1,2],[0,1],[-1,1],[-1,0],[-2,-1],[-3,-3],[-1,-1],[-1,0],[-8,2],[-1,1],[-1,2],[-1,6],[-4,5],[6,3],[6,0],[13,-2],[5,-1],[4,-5],[0,-3],[0,-2]],[[3064,2021],[22,-6],[7,3],[5,0],[2,-5],[-6,-5],[0,-1],[1,-1],[5,-1],[2,-2],[1,-2],[-1,-3],[0,-1],[0,-2],[5,-4],[1,-3],[1,-2],[1,-4],[-1,-3],[0,-1],[-3,1],[-2,2],[-1,5],[-2,1],[-3,1],[-4,2],[-2,0],[-3,1],[-2,-1],[-1,1],[-1,4],[0,1],[1,5],[0,1],[-1,0],[-2,-1],[-1,1],[-3,3],[-1,1],[-3,0],[-2,-6],[0,-1],[2,-4],[3,-6],[-2,-1],[-4,2],[-2,1],[-1,4],[-3,1],[-1,1],[0,2],[0,4],[-1,0],[-4,-1],[-1,1],[0,2],[-1,1],[-2,1],[0,1],[1,1],[0,3],[1,11],[6,-2]],[[3028,2023],[1,-3],[0,-1],[4,-1],[1,1],[4,0],[2,1],[4,1],[3,-9],[0,-3],[-3,-3],[-2,0],[-2,1],[0,1],[0,1],[-1,2],[-2,0],[-1,-1],[-1,0],[-2,1],[-4,1],[-1,2],[0,1],[0,1],[-4,3],[-2,3],[-2,0],[-1,0],[-1,-1],[-1,-1],[-1,0],[0,1],[-1,1],[1,3],[1,0],[5,0],[3,-1],[3,-1]],[[3017,2072],[6,-5],[4,0],[0,-3],[0,-5],[0,-2],[-2,-2],[-1,-3],[-5,3],[-5,5],[-2,-1],[-3,2],[-3,-1],[-1,-2],[-4,-2],[-1,6],[-3,5],[-3,4],[2,6],[2,1],[2,2],[8,-2],[4,-2],[5,-4]],[[2974,2103],[1,-4],[0,-1],[2,1],[4,0],[5,-2],[1,0],[2,-6],[2,-2],[3,-4],[-3,-4],[-1,-4],[-1,-2],[-1,-2],[-1,-1],[-3,-3],[-3,0],[-3,-1],[-2,-2],[-1,1],[-2,1],[0,2],[2,1],[3,5],[0,5],[-3,1],[-1,0],[-2,0],[-1,1],[-1,-2],[0,-3],[0,-3],[0,-1],[-1,-1],[-3,1],[-3,3],[0,1],[1,5],[0,2],[-1,4],[-1,0],[-3,0],[-3,4],[-2,5],[-6,2],[5,6],[7,1],[2,-3],[7,-2],[0,3],[0,2],[1,1],[1,-1],[2,0],[0,-1],[1,-3]],[[2933,2136],[1,-1],[1,0],[2,-1],[5,-1],[6,-3],[2,-2],[4,-1],[3,-3],[1,-1],[1,0],[4,-6],[1,-1],[4,-5],[-2,-1],[-5,3],[-3,0],[-2,0],[0,1],[-1,3],[0,1],[-5,6],[-2,2],[-4,1],[-4,-1],[-2,1],[-1,-1],[-4,5],[-4,5],[-2,5],[-3,3],[0,2],[2,0],[2,-2],[3,-3],[1,-2],[1,-3]],[[3093,2024],[-5,0],[-1,-1],[-6,-2],[-11,3],[-3,3],[-4,5],[-1,-1],[-4,-3],[-4,-1],[-3,-1],[-2,3],[-1,1],[-1,0],[-6,-3],[-6,3],[-5,2],[-9,2],[-6,4],[-11,-1],[-2,2],[0,4],[0,2],[3,1],[0,2],[3,0],[3,-3],[1,0],[2,3],[3,2],[1,1],[5,-3],[2,0],[3,1],[1,2],[0,2],[1,1],[3,1],[3,-2],[0,-3],[0,-4],[3,-2],[5,1],[3,-2],[0,3],[-5,6],[-2,4],[-2,2],[-4,2],[-3,7],[0,7],[0,6],[6,4],[-1,5],[2,4],[2,2],[3,-15],[2,-6],[-3,-1],[-4,0],[2,-7],[5,-3],[3,-5],[0,-5],[3,-1],[5,0],[3,0],[2,3],[1,1],[4,-3],[5,-3],[2,-2],[1,-3],[0,-3],[0,-1],[2,0],[2,5],[1,1],[2,1],[1,1],[0,1],[-4,3],[-22,14],[-3,6],[-2,7],[0,7],[2,3],[4,2],[7,4],[8,6],[1,1],[0,4],[-1,3],[-3,1],[-4,1],[-3,0],[-3,-1],[-6,-4],[-4,0],[-3,2],[-2,5],[-2,5],[0,4],[1,3],[1,4],[2,1],[2,0],[2,1],[1,1],[1,1],[-1,2],[0,1],[-3,2],[-1,3],[-2,3],[1,1],[4,1],[3,-3],[2,-3],[2,0],[1,2],[4,4],[3,4],[2,6],[2,3],[3,1],[6,-11],[3,0],[8,5],[1,0],[2,-3],[1,-1]],[[2940,2193],[-1,-1],[-3,1],[-1,2],[-3,3],[0,3],[-1,3],[1,1],[2,-2],[1,-1],[1,-2],[4,-4],[1,-1],[0,-1],[-1,-1]],[[2921,2210],[1,-11],[1,-2],[3,-1],[3,-5],[0,-2],[-3,-10],[-1,-6],[-5,0],[-1,7],[-3,7],[-1,7],[-2,7],[3,4],[3,-1],[0,5],[2,1]],[[2929,2230],[0,-5],[-1,-1],[-1,-1],[-2,2],[-1,0],[-2,-2],[-2,-2],[-2,1],[-3,1],[-3,-7],[-1,-2],[-3,-4],[0,4],[2,6],[1,4],[1,6],[3,-2],[5,2],[4,4],[3,0],[1,-2],[1,-2]],[[2908,2265],[-1,-6],[-2,1],[-1,1],[0,4],[-1,1],[1,4],[1,3],[0,3],[3,0],[4,-1],[1,-1],[-1,-2],[-1,-2],[-3,0],[0,-5]],[[2915,2287],[-6,-5],[-1,2],[-4,0],[1,5],[0,4],[1,1],[0,3],[1,6],[4,-2],[2,0],[3,-2],[4,-1],[1,-5],[-4,-3],[-2,-3]],[[2913,2371],[0,-5],[-4,-8],[-3,-6],[-4,-4],[-2,0],[-1,2],[1,3],[3,4],[-1,4],[-1,1],[-1,1],[-1,2],[0,3],[1,2],[2,1],[1,-1],[5,2],[2,2],[3,1],[0,-4]],[[2931,2353],[0,-8],[0,-9],[-1,-10],[0,-3],[1,0],[0,-1],[0,-6],[-1,-4],[-1,-3],[-1,-5],[0,-1],[-3,0],[-2,0],[-1,5],[-1,3],[0,4],[-1,5],[0,2],[0,3],[2,2],[0,5],[0,1],[2,2],[0,1],[0,1],[-1,0],[-6,-6],[0,-2],[0,-2],[0,-9],[-1,-5],[-1,-1],[-3,0],[-4,1],[-4,4],[-3,-1],[0,5],[1,5],[5,-1],[1,8],[-2,2],[-2,3],[-1,3],[1,2],[3,3],[2,0],[1,-1],[4,1],[0,5],[-3,2],[0,4],[4,3],[3,4],[0,4],[-1,4],[0,1],[2,4],[3,1],[1,0],[3,-2],[2,0],[1,-1],[0,-3],[2,-19]],[[2902,2375],[-3,0],[-1,10],[4,15],[0,6],[-1,4],[0,4],[0,1],[5,3],[1,-3],[2,-9],[3,-11],[0,-12],[-2,-3],[-6,-2],[-2,-3]],[[2928,2385],[0,-1],[-4,0],[-5,-1],[-3,5],[-1,9],[-1,1],[-1,5],[-1,3],[-2,5],[0,5],[0,2],[1,3],[6,3],[2,4],[2,0],[0,-10],[1,-3],[2,-3],[0,-1],[1,-4],[1,-5],[1,-3],[0,-1],[0,-2],[0,-1],[1,-10]],[[2913,2428],[-2,0],[0,2],[-2,3],[2,2],[3,2],[2,0],[2,-2],[1,-2],[-4,-2],[-1,-2],[-1,-1]],[[2935,2552],[-1,-3],[-3,-1],[-2,2],[-4,-1],[0,5],[1,3],[3,5],[1,5],[0,8],[2,2],[0,3],[4,2],[0,-6],[-1,-11],[2,-6],[1,-2],[-1,-3],[-2,-2]],[[2915,2598],[0,-1],[-1,1],[-1,1],[-1,3],[1,2],[1,0],[1,-2],[0,-3],[0,-1]],[[2954,2602],[-1,-1],[0,1],[-1,2],[0,2],[-2,4],[-1,2],[0,2],[1,3],[2,1],[1,0],[1,-4],[0,-4],[1,-4],[-1,-4]],[[2972,2605],[-6,-5],[-4,1],[-1,4],[-1,3],[0,5],[1,2],[2,4],[1,2],[1,3],[-1,3],[1,2],[1,1],[5,-3],[5,-4],[2,-3],[0,-2],[-2,-5],[-1,-5],[-3,-3]],[[2952,2627],[-2,-3],[-2,0],[-3,-3],[-1,-3],[0,-3],[2,-3],[2,-5],[1,-6],[1,-6],[0,-2],[0,-3],[2,-5],[0,-2],[0,-2],[-1,-4],[0,-1],[-2,0],[0,-3],[-1,-1],[-4,0],[-3,1],[1,8],[-3,3],[-2,4],[-3,9],[-1,3],[-3,6],[-3,6],[4,4],[-1,6],[2,2],[4,3],[2,-2],[2,1],[1,1],[0,7],[1,5],[2,2],[3,1],[1,-3],[1,-3],[3,-2],[0,-3],[0,-4]],[[2949,2659],[1,-2],[-1,-1],[-2,1],[-1,-3],[-1,0],[-4,2],[-1,1],[0,3],[5,0],[3,2],[1,0],[0,-3]],[[2926,2672],[-4,-1],[-1,2],[0,1],[0,1],[2,1],[2,-1],[0,-1],[1,-1],[0,-1]],[[2950,2687],[-2,-1],[-2,0],[-2,1],[-3,-1],[-3,3],[-4,3],[-1,2],[1,2],[2,6],[2,12],[2,17],[-1,6],[0,3],[0,3],[1,3],[-1,3],[1,3],[2,7],[1,2],[0,4],[1,6],[-1,2],[-1,2],[1,1],[9,-4],[5,-1],[1,-5],[1,-4],[0,-7],[1,-1],[0,-5],[-3,-2],[0,-5],[2,-4],[-2,-2],[-3,-1],[0,-1],[-2,-1],[-2,-2],[1,-2],[2,-5],[3,-3],[2,-5],[2,-5],[-1,-4],[-2,-4],[-3,-3],[-3,-2],[0,-8],[-1,-3]],[[2811,3246],[-5,-1],[0,1],[1,2],[1,2],[1,0],[1,-1],[1,-1],[1,-1],[0,-1],[-1,0]],[[1964,3621],[-4,-2],[0,3],[1,3],[3,-2],[2,0],[-2,-2]],[[3098,2168],[-15,6],[-4,3],[-3,0],[-5,-4],[-4,-9],[-1,-2],[-4,-2],[-4,-1],[-14,-8],[-4,-1],[-4,-2],[-3,-4],[-1,-7],[0,-4],[-3,-15],[-1,-8],[0,-5],[1,-7],[-1,-12],[-3,-2],[-6,-4],[-4,3],[-7,2],[-5,4],[-6,4],[-2,2],[-6,9],[0,3],[-1,4],[3,5],[2,1],[4,0],[4,1],[3,-3],[0,-7],[-1,-3],[-1,-2],[1,-2],[2,2],[2,15],[9,7],[3,4],[3,7],[1,2],[0,2],[-2,2],[-4,3],[-14,-14],[-7,-4],[-4,-4],[-5,-7],[-1,-2],[-1,-4],[-1,-5],[-4,2],[-8,7],[-2,3],[2,4],[2,3],[0,11],[1,3],[2,3],[2,4],[2,1],[1,-2],[0,-2],[5,0],[9,9],[4,0],[5,-2],[6,2],[1,1],[1,2],[-4,2],[-4,2],[-12,1],[-2,-1],[-3,-5],[-2,1],[0,2],[-4,2],[-2,0],[-2,-3],[0,-3],[-1,-4],[-3,-4],[-3,-7],[0,-5],[0,-2],[-1,-2],[-1,-1],[-6,1],[-4,5],[-1,4],[-4,3],[8,5],[3,3],[3,6],[2,4],[-2,3],[-1,0],[0,-5],[-2,-3],[-4,1],[-5,-5],[-4,2],[-5,-2],[-3,3],[-1,3],[1,4],[-1,6],[-1,2],[-2,0],[-1,3],[-1,7],[-1,2],[-1,3],[1,1],[2,-1],[1,-2],[3,0],[6,-5],[2,1],[1,1],[1,4],[0,3],[1,0],[3,-4],[2,0],[4,-1],[2,1],[3,1],[5,5],[3,5],[2,1],[1,-1],[1,-1],[0,-4],[2,-3],[1,-3],[1,-3],[-1,-3],[-3,-4],[0,-2],[1,-1],[1,0],[2,2],[1,3],[0,2],[0,2],[0,3],[-2,8],[-1,1],[0,4],[3,3],[1,2],[0,5],[-1,4],[-6,7],[-11,8],[-1,-1],[-1,-1],[1,-1],[2,-1],[9,-6],[2,-4],[2,-1],[2,-2],[-1,-4],[-9,-3],[-7,-8],[-6,-4],[-3,1],[-2,5],[-2,6],[-3,3],[-2,0],[-1,1],[-1,2],[-2,-2],[-5,4],[-1,2],[3,6],[4,-2],[1,16],[-1,4],[-5,4],[-3,-1],[-3,1],[-2,2],[-3,1],[-2,1],[-3,2],[-3,2],[-5,10],[-2,6],[-1,6],[7,0],[4,1],[1,2],[-1,5],[-2,4],[1,3],[2,3],[2,-1],[6,-6],[1,-4],[4,-13],[1,-1],[0,-1],[8,-7],[2,0],[-1,6],[2,8],[3,2],[1,0],[0,2],[-2,3],[1,5],[-1,0],[-2,-3],[-4,-14],[-2,-3],[-4,7],[-1,4],[-1,2],[0,7],[7,-2],[-3,3],[-7,4],[-2,2],[-2,1],[-2,5],[-3,4],[5,7],[3,5],[9,-2],[1,1],[-1,4],[-2,-1],[-3,2],[-4,7],[0,4],[1,7],[2,1],[3,1],[4,-2],[2,-1],[2,0],[-2,5],[-3,2],[-2,4],[0,4],[1,3],[1,3],[0,5],[0,4],[1,2],[1,1],[0,1],[-3,0],[-1,-5],[0,-4],[-2,-4],[-1,-4],[0,-5],[-1,-5],[-2,2],[-2,2],[0,1],[0,3],[0,18],[0,14],[1,12],[3,4],[1,2],[2,-1],[2,0],[1,2],[-5,2],[-2,-1],[-2,-2],[-4,1],[-1,6],[-2,5],[0,7],[0,9],[5,-1],[4,-2],[11,1],[9,-9],[4,1],[0,2],[-3,2],[-2,5],[-1,1],[-1,3],[0,4],[-2,13],[-1,0],[-1,-5],[-2,-7],[-2,-4],[-4,-1],[-4,-1],[-4,1],[0,3],[0,4],[-2,2],[-4,1],[-1,1],[-1,3],[2,5],[1,3],[2,-1],[2,-1],[2,-4],[2,0],[3,3],[0,2],[-1,1],[-2,0],[-2,2],[-4,6],[2,6],[5,7],[2,1],[-2,6],[2,6],[-2,5],[-3,6],[-3,1],[-1,-2],[0,-2],[0,-2],[0,-1],[-1,0],[-5,2],[-3,3],[-6,4],[0,2],[-1,4],[2,7],[-1,0],[-4,-5],[-5,-3],[-4,-1],[-2,-2],[0,-2],[1,-1],[2,0],[2,-6],[-1,-3],[-1,-2],[-1,0],[-4,5],[-2,5],[0,4],[1,5],[6,7],[2,4],[4,3],[4,8],[4,4],[-2,4],[-2,5],[1,7],[8,3],[4,-1],[4,0],[3,2],[2,1],[4,2],[1,3],[1,2],[0,2],[-1,2],[0,6],[0,2],[2,3],[2,1],[1,-1],[3,-2],[-1,-3],[-1,-4],[-2,-15],[-1,-4],[-2,-3],[2,-6],[-2,-4],[-8,-5],[-1,0],[1,-2],[4,0],[4,1],[3,4],[1,6],[2,12],[1,2],[3,0],[1,-3],[-1,-6],[0,-6],[-3,-17],[-3,-8],[0,-1],[0,-3],[2,1],[3,3],[1,5],[2,7],[-1,5],[1,3],[0,10],[1,5],[0,7],[-1,3],[-3,1],[-1,5],[2,8],[5,0],[4,6],[4,2],[1,-1],[7,-5],[1,0],[0,2],[-1,1],[-3,2],[-4,6],[-6,1],[1,8],[1,7],[3,1],[5,2],[9,11],[2,8],[0,9],[-4,3],[-5,6],[-4,3],[-3,4],[0,6],[1,9],[4,2],[2,14],[-3,10],[1,7],[4,7],[0,4],[1,5],[4,1],[0,2],[-1,5],[-2,6],[0,8],[2,10],[4,-1],[-2,6],[-2,6],[0,3],[2,2],[2,1],[2,-3],[4,-10],[0,2],[-1,11],[-1,13],[-4,-2],[-3,1],[-1,2],[-1,3],[1,3],[1,3],[2,3],[5,2],[4,4],[1,9],[-1,-1],[-2,-8],[-3,-3],[-2,1],[-2,1],[-4,7],[-2,1],[-2,1],[-1,-2],[-5,-12],[-2,-2],[-8,-1],[-2,2],[-3,1],[0,3],[1,3],[2,2],[0,2],[-3,0],[-3,3],[-1,5],[0,7],[-3,11],[0,9],[1,6],[4,23],[1,12],[2,10],[0,7],[6,6],[2,4],[4,21],[1,12],[-7,34],[-2,7],[0,8],[2,14],[0,5],[-1,7],[-4,12],[-1,7],[2,6],[-1,8],[0,5],[1,4],[7,-2],[2,1],[2,2],[1,7],[1,10],[0,4],[1,7],[3,2],[1,6],[2,9],[3,23],[3,6],[2,7],[-1,10],[2,5],[2,3],[1,6],[2,6],[4,8],[2,10],[3,18],[1,11],[1,8],[0,7],[2,9],[2,7],[0,4],[5,9],[1,8],[-2,5],[0,8],[-1,12],[3,4],[1,3],[4,18],[0,7],[1,8],[-3,11],[0,23],[-2,18],[-2,18],[0,11],[-1,13],[0,8],[1,17],[7,11],[2,12],[1,16],[-1,12],[0,5],[-4,9],[-1,16],[1,4],[3,4],[2,6],[1,10],[2,7],[1,18],[2,15],[1,5],[3,6],[1,2],[0,5],[0,11],[0,7],[3,13],[0,7],[3,14],[0,10],[1,5],[0,6],[1,14],[-2,7],[-1,5],[3,13],[1,4],[3,6],[1,7],[0,5],[-3,23],[-1,7],[1,18],[1,12],[0,9],[0,5],[1,6],[2,7],[0,5],[0,3],[-3,2],[-2,7],[0,6],[0,5],[1,7],[3,1],[1,4],[2,7],[2,17],[1,21],[1,12],[1,6],[1,13],[1,9],[0,8],[0,6],[-3,30],[0,11],[1,18],[0,24],[0,6],[-1,5],[-1,7],[-1,13],[-2,25],[0,14],[-1,11],[-1,3]],[[3044,4127],[1,1],[2,0],[3,0],[4,3],[3,4],[3,7],[1,6],[0,5],[-1,6],[-1,5],[2,2],[3,1],[3,5],[2,3]],[[8079,6335],[2,-2],[1,-4],[0,-7],[1,-6],[-3,-4],[-2,-2],[-5,-15],[-1,-5],[-1,-2],[-1,-2],[0,-2],[-1,-8],[-1,-9],[-1,-3],[-1,-3],[-2,-2],[-1,0],[-1,-1],[-3,-5],[-3,-3],[1,-2],[0,-2],[-2,-1],[-1,0],[-4,-2],[-2,-2],[-2,-6],[-3,-1],[-2,-1],[-3,4],[-2,1],[-4,1],[-4,3],[-3,3],[-6,6],[-1,13],[-1,6],[0,3],[0,20],[1,3],[0,2],[3,4],[3,4],[5,8],[3,3],[3,5],[-2,0],[-1,0],[1,5],[1,2],[2,1],[3,-1],[2,1],[2,4],[2,1],[7,-1],[5,1],[3,4],[1,0],[3,-1],[2,-4],[0,3],[0,2],[5,-5],[0,6],[0,1],[2,3],[1,0],[1,-5],[2,-2],[2,-2]],[[8065,6399],[1,-2],[3,1],[1,-2],[0,-2],[-1,-2],[-3,2],[-2,-1],[-1,0],[-1,2],[1,3],[2,1]],[[8128,6430],[-3,-1],[1,3],[2,2],[0,-4]],[[8132,6428],[0,-1],[-1,2],[0,3],[-1,2],[1,2],[1,2],[2,-1],[-1,-3],[0,-1],[-1,-5]],[[8154,6497],[0,-2],[-2,4],[-1,0],[-1,1],[-1,3],[2,0],[2,-3],[1,-3]],[[8282,6595],[-1,-4],[-2,1],[0,2],[0,1],[1,2],[0,1],[2,-2],[0,-1]],[[8328,6650],[-3,-3],[-1,2],[0,3],[1,3],[-1,3],[1,3],[1,0],[1,-1],[1,-1],[0,-1],[0,-2],[-1,-3],[1,-2],[0,-1]],[[8367,6802],[-2,-2],[-1,0],[0,4],[2,4],[1,-1],[0,-2],[0,-3]],[[8393,6893],[0,-1],[-3,4],[-1,1],[1,2],[1,0],[2,-4],[0,-2]],[[8399,6906],[0,-3],[-1,0],[-1,5],[1,1],[1,0],[0,-3]],[[8396,6910],[0,-1],[-4,3],[-3,1],[-2,2],[0,5],[4,0],[5,-4],[1,-2],[-1,-4]],[[8384,6998],[-2,-2],[-7,5],[-5,5],[-3,7],[-1,3],[4,-1],[3,-2],[1,-4],[1,-1],[1,-2],[7,-5],[1,-1],[0,-2]],[[8625,7634],[-1,2],[-1,0],[-3,3],[-2,3],[-1,4],[0,7],[0,1],[-3,2],[0,2],[-1,1],[-2,-1],[-1,1],[-1,1],[-2,0],[-1,-1],[0,-5],[-2,-6],[0,-4],[-1,-6],[-1,-8],[0,-1],[-2,0],[-1,-1],[-1,-2],[-1,-1],[-1,2],[-2,1],[-1,0],[-2,-1],[-2,-3],[0,-3],[-1,-2],[0,-3],[-2,-3],[-1,-2],[-4,-4],[-1,-2],[-2,0],[-2,0],[-4,-1],[-5,0],[-4,0],[-4,0],[-3,-2],[0,-2],[0,-3],[0,-2],[1,-1],[1,-4],[2,-4],[2,-3],[1,-3],[0,-2],[-1,-3],[-2,-5],[-1,-2],[-1,0],[-2,1],[-1,2],[-3,1],[-6,-1],[-3,1],[-2,1],[-2,0],[-5,2],[-2,1],[-1,1],[-1,3],[-1,2],[0,3],[-2,3],[-1,2],[-2,0],[-1,-2],[-2,-1],[-1,0],[-1,0],[0,-2],[-3,-3],[-1,-2],[-1,-6],[-1,-6],[0,-2],[-1,0],[-1,-2],[-3,-6],[-2,-5],[-3,-3],[-1,-3],[-1,-3],[-2,-4],[-3,-1],[-3,-1],[-1,0],[-2,-2],[0,-2],[-1,-1],[-1,0],[-2,-2],[-3,-5],[-3,-1],[-3,-3],[-4,-3],[-1,-1],[0,-2],[-1,-1],[-1,-1],[-2,0],[-3,-4],[-2,-4],[-6,-8],[-3,-4],[0,-6]],[[8454,7488],[-1,0],[-2,-5],[-4,-4],[-10,-1],[-3,3],[-1,-2],[-1,-4],[-3,-1],[-4,0],[-2,-2],[-1,-2],[-5,-1],[-2,-3],[-4,-1],[-14,-14],[-3,-5],[-3,-7],[-2,-3],[-1,-3],[-2,-1],[-2,-2],[-1,0],[-2,1],[-2,-1],[-1,-2],[1,-4],[-1,-2],[-3,-2],[-6,-1],[-2,-2],[-1,-2],[-1,0],[-1,4],[-1,7],[3,1],[2,1],[11,8],[-1,7],[1,3],[2,4],[2,2],[-1,1],[-7,-1],[-5,0],[-2,0],[1,4],[-1,4],[0,2],[4,4],[1,1],[2,0],[0,3],[-2,4],[2,5],[8,6],[1,5],[4,6],[5,12],[1,3],[1,6],[1,2],[-3,3],[-1,5],[-8,9],[-1,8],[-1,-6],[-1,-2],[-4,0],[-2,2],[-10,2],[-2,-4],[-3,-5],[-2,-4],[-2,-2],[-2,-3],[-8,-21],[-3,-2],[-15,-12],[-7,-5],[-5,-9],[-2,-5],[-2,-6],[-1,-8],[-5,-11],[-2,-2],[-2,-1],[-2,0],[-2,-1],[-4,1],[-4,-3],[-5,-3],[-4,7],[-3,2],[-5,-2],[-2,-3],[-5,-16],[-1,-10],[0,-3],[2,-12],[3,-7],[7,-7],[15,-5],[3,2],[4,0],[4,-5],[2,-8],[1,-5],[0,-2],[1,-2],[0,-3],[-1,-2],[-2,-1],[-1,-9],[0,-9],[2,-3],[3,-4],[5,-4],[4,-1],[9,2],[3,6],[0,2],[0,3],[8,8],[4,8],[-1,2],[0,1],[0,1],[3,0],[10,8],[9,-6],[4,-7],[5,-2],[3,-3],[4,-4],[5,0],[4,0],[1,2],[2,2],[1,0],[2,-4],[4,-3],[5,0],[3,2],[2,-2],[-3,-5],[0,-8],[-2,-2],[-2,-4],[2,-3],[1,-1],[-1,-3],[-1,-2],[-3,-5],[-2,0],[-1,1],[-1,2],[0,3],[-1,2],[-4,0],[-3,0],[-7,-7],[-7,-6],[-8,-5],[-2,-2],[-2,-1],[-3,2],[-2,0],[0,-2],[2,-4],[1,-3],[-1,-2],[-1,-1],[-2,2],[-2,-3],[-1,-4],[0,-10],[-1,-2],[-3,-1],[-4,-4],[-1,2],[0,2],[0,4],[0,2],[-2,0],[-2,-1],[-2,-3],[-1,-2],[3,-6],[2,0],[0,-2],[-1,-2],[-5,-5],[-1,-3],[-1,-4],[-2,-2],[-1,-3],[-2,-2],[-2,-1],[-3,-7],[-3,-7],[-2,-3],[-2,-11],[-4,-6],[-2,-9],[1,-6],[4,0],[3,-2],[4,-7],[5,-5],[5,-3],[7,-7],[2,-3],[1,-6],[3,-18],[2,-8],[1,-5],[3,-8],[3,-15],[4,-13],[0,-9],[-1,-5],[0,-6],[4,-5],[8,-7],[2,-2],[1,-3],[0,-9],[2,-3],[1,-2],[5,-4],[2,-3],[2,-6],[1,-5],[0,-6],[-3,0],[-2,0],[-9,9],[-2,0],[-4,-1],[-4,1],[-6,10],[-3,3],[-4,1],[-9,-8],[-3,1],[0,-1],[-1,-2],[4,-1],[4,2],[4,4],[6,-2],[1,-3],[1,-6],[5,-4],[3,-2],[4,-5],[4,-9],[9,-9],[3,-9],[1,-6],[2,-8],[-3,-3],[-3,0],[-4,-2],[-3,-3],[-3,-5],[-9,-8],[-1,-5],[-2,-5],[-2,-2],[-5,2],[-5,0],[-6,-6],[-1,-2],[1,0],[1,1],[2,-1],[4,3],[4,-10],[8,2],[7,8],[2,0],[3,-1],[2,-3],[7,-14],[4,-2],[4,-3],[2,-1],[1,-1],[-5,-5],[-6,-11],[-3,-3],[-2,-3],[5,2],[4,5],[2,1],[1,-1],[1,-7],[-1,-20],[-2,0],[-2,5],[-2,2],[-2,-1],[-3,0],[-1,-3],[-1,-3],[2,-1],[4,-6],[0,-4],[-1,-2],[-3,1],[4,-4],[-1,-5],[-1,-2],[-2,-1],[-2,-5],[2,-6],[2,-9],[0,-5],[-3,2],[-4,-5],[-2,-1],[-2,7],[-2,-1],[-1,-2],[-2,-7],[-2,-7],[-2,-2],[-2,0],[-2,0],[1,-2],[2,-2],[0,-3],[-4,-8],[-1,-3],[0,-3],[-2,-4],[1,-5],[-1,-4],[-2,-6],[-1,-3],[-3,-6],[-3,-3],[-4,-13],[-1,-6],[0,-6],[-1,-2],[-2,-3],[-3,2],[0,4],[-1,0],[0,3],[-1,3],[1,3],[-1,-1],[-1,-3],[-2,-3],[-1,1],[-2,3],[0,-4],[1,-3],[0,-3],[3,-1],[2,-3],[1,-6],[0,-2],[1,-2],[0,-2],[-2,-2],[-3,-4],[-4,-6],[-2,-4],[-3,-1],[-2,1],[-2,2],[-2,1],[3,-8],[2,-2],[2,1],[3,3],[3,0],[1,-5],[-1,-6],[-2,-7],[0,-6],[2,-9],[0,-3],[-1,-1],[-2,2],[-3,3],[-2,-1],[-2,2],[-2,-1],[-1,-2],[0,-4],[2,-3],[2,-4],[-2,-1],[-6,1],[-1,-1],[-2,-5],[1,-7],[-1,-4],[-2,-1],[-3,-4],[-2,-1],[0,-1],[1,-2],[1,-2],[-2,-7],[-2,-2],[-5,1],[-3,-2],[-3,3],[-3,0],[-2,-4],[0,-4],[-2,-1],[-1,1],[-1,-1],[0,-2],[1,-2],[4,-1],[0,-3],[1,-5],[-5,-8],[-2,-5],[-2,0],[-2,-4],[-1,-6],[-2,1],[-3,-1],[-1,-3],[1,-1],[0,-2],[-1,-7],[-2,-2],[0,3],[-1,4],[-1,1],[-2,-4],[-2,-3],[-2,-1],[-1,2],[-3,2],[-2,-11],[-2,-4],[-2,-2],[-2,0],[1,-2],[1,-2],[-1,-3],[-2,-1],[-2,-2],[0,-10],[-2,-4],[-3,0],[-3,2],[0,-1],[-1,-2],[-1,-2],[-3,0],[-6,-5],[-2,1],[-4,2],[-2,-2],[-1,-3],[-1,-3],[-3,0],[-2,4],[-3,2],[-3,-2],[-2,-4],[-3,-2],[0,-2],[-1,-2],[-3,1],[-1,7],[-2,0],[-2,-3],[0,-2],[-1,-2],[0,-6],[-1,0],[-2,4],[-3,0],[-2,-3]],[[8173,6482],[-1,1],[-1,1],[-2,0],[0,-1],[-2,-1],[-1,-1],[0,-1]],[[8166,6480],[-2,2],[-3,4],[-2,7],[-3,4],[-1,4],[0,6],[-1,3],[1,3],[0,3],[-2,-2],[-3,-2],[1,-4],[-1,-3],[-3,-2],[0,-1],[1,-1],[2,-5],[1,-3],[1,-2],[1,-6],[0,-11],[1,-3],[0,-3],[-1,-4],[0,1]],[[8153,6465],[-1,0],[-1,-2],[0,-1]],[[8151,6462],[-1,-1],[-2,-1],[-1,-1],[-2,-3],[-3,-1],[-1,8],[-3,-5],[0,-11],[-1,-1],[-2,-2],[-2,4],[-3,-3],[-1,-2],[-1,-2],[-1,-3],[-3,3],[-2,3],[1,3],[-1,2],[-1,1],[-1,0],[1,-4],[0,-6],[-1,-2],[-1,-2],[-3,1],[-2,3],[-3,2],[-2,0],[-1,-4],[-1,-3],[-2,-1],[-1,1],[-2,-4],[-1,-3],[-2,-2],[-6,-2],[-2,-3],[-2,1],[-2,-1],[-2,0],[-1,2],[-1,0],[-1,-5],[-3,-2],[-3,0],[-3,-7],[-2,-3],[-2,-1],[-2,2],[0,5],[-1,1],[0,-5],[-1,-5],[-1,-2],[-4,-5],[-1,-6],[1,-5],[5,-1],[1,-3],[-1,-2],[-1,-2],[-1,-3],[6,-8],[0,-4],[-1,-2],[-1,-4],[-3,-3],[-6,-2],[-5,2],[-2,4],[1,3],[1,-1],[1,0],[0,3],[-1,1],[-2,2],[-2,7],[0,5],[-1,4],[-1,3],[-1,2],[-1,3],[2,7],[-1,5],[2,6],[1,6],[4,2],[0,6],[-3,0],[-2,5],[0,-2],[-2,0],[-3,8],[0,1],[-2,0],[1,-9],[-3,-3],[-2,-1],[-4,-1],[-2,-1],[-2,1],[1,2],[1,4],[-1,2],[-2,2],[-3,0],[-2,1],[-2,0],[-1,1],[-2,4],[-2,3],[0,2],[0,3],[0,2],[-3,0],[0,-4],[0,-5],[1,-4],[-1,-2],[-1,-2],[-2,4],[-1,2],[-1,-1],[0,-4],[-2,-3],[-3,0],[-2,-2],[-3,-1]],[[7998,6423],[-1,3],[-3,5],[-1,0],[-4,-2],[-4,-1],[-2,2],[-2,-2],[-2,6],[-3,1],[-3,4],[-1,2],[0,4],[-1,2],[-2,-1],[-1,2],[-2,2],[-2,1],[-1,-1],[-1,0],[0,2],[0,7],[0,6],[-1,3],[-1,2],[-1,1],[0,3],[0,6],[1,4],[1,1],[2,3],[1,4],[1,4],[-4,5],[-2,2],[-3,-1],[-3,-1],[-2,-1],[0,1],[-2,5],[-1,1],[-2,0],[-2,0],[-1,-2],[-2,-1],[-2,0],[-1,3],[-3,3],[-4,3],[0,3],[-1,3],[-2,3],[-2,4],[-2,2],[-1,-1],[-2,-2],[-5,-5],[-3,-2],[-1,-2],[-1,-2],[0,-5],[-1,-6],[-1,-2],[-2,-3],[-1,0],[-2,0],[-1,-1],[-5,-5],[-2,0],[-1,3],[-1,3],[-2,-1],[-2,-3],[-2,-5],[0,-4],[-1,-2],[-1,-1],[-8,13],[0,1],[-2,-3],[-1,-7],[-1,-1],[-1,0],[-3,9],[-1,1],[-1,-3],[-2,-4],[-2,-3],[0,-3],[-2,-2],[-2,-3],[-1,1],[-2,3],[-1,4],[-3,3],[-4,3],[-2,3],[-1,0],[-2,-1],[0,-1],[-1,-4],[-2,-6],[-2,-4],[-2,-3],[-1,-2]],[[7836,6473],[-1,2],[-2,1],[-2,0],[-3,-3],[-2,6],[-1,0],[-1,0],[-1,-1],[0,-4],[-1,-4],[-1,-3],[-2,-1],[1,-3],[0,-3],[0,-2],[1,-4],[1,-4],[2,-6],[1,-3],[0,-3],[1,-10],[-1,-4],[0,-8],[0,-4],[1,-3],[1,-2],[0,-1],[0,-1],[-2,-3],[-1,0],[-1,1],[-1,1],[-1,1],[-1,2],[-3,0],[-4,-3],[-1,1],[-1,1],[0,3],[0,4],[-1,2],[0,2],[0,6],[-1,3]],[[7809,6426],[0,1],[-1,7],[0,2],[-1,1],[-2,-1],[-5,-5],[-4,-9],[-2,-1],[-2,-1],[-3,1],[-2,1],[-4,-2],[-2,1],[-1,2],[-1,3],[1,3],[0,2],[-2,2],[-2,1],[-1,3],[0,4],[0,4],[1,5],[-1,3],[-3,1],[-6,2],[-6,1],[-2,0],[-2,0],[-1,1],[-1,2],[0,2],[1,5],[1,5],[3,8],[0,5],[0,6],[1,7],[2,6],[1,2],[0,3],[-1,2],[-1,2],[-2,1],[-4,1],[-4,1],[-6,4],[1,6],[0,4],[-1,4],[-1,2],[0,3],[1,6],[-2,6],[-1,3],[-2,3],[0,4],[1,3],[4,7],[0,2],[-1,0],[-1,0],[-5,-3],[-1,2],[-2,1],[-3,0],[-5,0],[-5,-3],[-5,-5],[-2,-3],[-2,-2],[-2,0],[-2,1],[0,4],[4,9],[0,5],[-1,5],[0,4],[-1,3],[-2,1],[-1,2],[0,9],[2,8],[2,2],[2,2],[0,1],[-1,6],[1,4],[1,7],[1,5],[3,-1],[1,2],[2,2],[1,3],[1,4],[1,9],[1,1],[4,-1],[1,1],[2,5],[1,6],[3,2],[2,0],[1,3],[0,3],[-2,5],[-1,4],[0,2],[3,1],[0,3],[0,7],[1,7],[1,9],[0,7],[0,5],[0,5],[-1,10],[-1,8],[0,3],[0,10],[0,9],[-2,1],[-3,3],[-1,1],[-1,-1],[-1,-3],[-1,-3],[-1,1],[-1,2],[-1,4],[-3,18],[0,5],[-1,5],[-1,2],[-1,2],[-2,6],[-2,2],[-2,0],[-1,0],[-1,3],[-1,4],[-1,1],[-2,1],[-1,0],[-1,-3],[-1,-2],[-1,-4],[-2,-6],[-1,-2]],[[7703,6809],[-1,1],[-4,6],[-2,2],[-3,-2],[-4,1],[-2,1],[-3,4],[-1,1],[-5,-3],[-1,-2],[-1,0],[-1,1],[-1,1],[0,1],[1,3],[0,1],[0,2],[2,4],[5,10],[-1,3],[-2,8],[0,3],[-1,2],[-2,-1],[-6,-7],[0,1],[0,2],[-1,7],[2,2],[2,2],[2,3],[1,3],[-1,0],[-3,-1],[-1,2],[-2,6],[-1,3],[-1,1],[-4,-3],[-5,-5],[-6,-6],[0,-3],[0,-1],[-1,-2],[-1,-3],[-1,-1],[-1,0],[-2,1],[-4,3],[-4,3],[-1,-1],[-5,2],[0,2],[-1,3],[-2,2],[-1,1],[-5,-5],[-4,-5],[-3,-4],[-3,-5],[-2,-1],[0,-3],[-1,-3],[-2,-3],[-4,-4],[-3,-3],[-8,-2],[-3,-1],[-2,-2],[-1,-6],[-1,-5],[-2,-5],[-5,-5],[-5,-5],[-1,-3],[0,-2],[0,-1],[1,-1],[0,-2],[-1,-2],[-3,-4],[-2,-2],[-2,-2],[-2,0],[-2,1],[-1,0],[-2,-1],[-1,-1],[-4,-4],[-2,0],[-2,1],[-3,1],[-2,0]],[[7468,6757],[-1,3],[-2,4],[0,5],[2,14],[0,6],[0,2],[-1,6],[-1,2],[-4,3],[-1,0],[-2,-2],[-1,-1],[-1,-2],[-5,-2],[-3,-1],[-1,-1],[-1,-2],[1,-2]],[[7447,6789],[-3,1],[-2,0],[-2,0],[-5,-4],[-2,0],[-2,0],[-2,0],[-5,0],[-4,1],[-4,5],[-2,3],[-2,2],[-3,1],[-1,3],[-1,1],[-2,0],[-1,-1],[-1,-7],[-1,-1],[-2,-1],[-3,2],[-3,4],[-1,4],[-1,1],[-2,-2],[0,-5],[0,-3],[-2,-2],[-1,1],[-1,4],[-2,8],[-3,5],[-2,4],[-7,-1],[-6,1],[-2,2],[-1,3],[1,6],[1,5],[0,2],[-1,0],[-2,1],[-6,-4],[-1,1],[-1,1],[-2,1],[-1,1],[0,3],[-5,5],[-2,3],[-3,4],[-2,2],[-2,7],[-1,7],[-1,4],[-2,2],[-2,1],[-4,-3],[-4,-2],[-2,0],[-3,7],[-3,7],[-4,7],[-2,3],[-4,1],[-4,4],[-6,8],[-4,6],[-8,7],[-2,3],[0,3],[-1,5],[-2,5],[-5,2],[-6,1],[-6,-3],[-5,-14],[-2,-3],[-2,0],[-1,3],[-1,4]],[[7250,6921],[-1,4],[-3,3],[-4,5],[-2,3],[-2,2],[-1,0],[-4,3],[-4,3],[-2,0],[0,3],[0,4],[0,4],[-1,2],[-2,0]],[[7224,6957],[-5,6]],[[7219,6963],[0,0]],[[7219,6963],[-1,2],[-2,3],[-4,-1],[-3,-1],[-2,3],[-2,4],[-1,1]],[[7204,6974],[-1,1]],[[7203,6975],[-3,8],[-3,10],[-2,1],[-1,-1],[-1,-5],[-1,1],[-1,-1],[-2,-1],[-1,-1],[-1,1],[0,1],[0,6],[-1,3],[1,4],[1,4],[-1,3],[-2,4],[0,4],[1,4]],[[7186,7020],[0,5],[0,1],[-1,2],[-5,11],[-1,2],[0,3],[-1,6],[0,4],[-1,3],[0,1],[0,1],[4,1],[2,0],[2,1],[1,-2],[1,-3],[0,-2],[2,-3],[2,-3],[3,0],[2,1],[1,5],[1,2],[2,0]],[[7200,7056],[0,3]],[[7200,7059],[0,8],[0,4],[-1,3],[1,3],[-1,4],[-1,4],[-1,1],[0,2],[0,3],[0,3]],[[7197,7094],[0,3],[0,1]],[[7197,7098],[-1,1],[-2,2],[-2,4],[-1,2],[-1,2],[-2,4],[0,9],[0,9],[-1,5],[-1,7],[0,2],[1,2],[5,6],[1,2],[0,2],[0,3],[-1,2],[-2,3],[-3,3],[-2,4],[-5,2],[-5,3],[-1,3],[-1,6],[-3,11],[-2,11],[-2,6],[0,3],[1,9],[0,1],[-1,1],[-2,-1],[-1,-1],[-1,0],[-1,2]],[[7161,7228],[-1,0]],[[7160,7228],[-2,-1],[-4,0],[-1,0],[-2,0],[-5,2],[-5,3],[-6,3],[-3,3]],[[7132,7238],[-1,1],[-3,3],[-2,2],[0,7],[-2,-1],[-3,-2],[-4,-2],[-2,0],[0,1],[-2,7],[-1,2],[-1,1],[-2,1],[-1,2],[0,2],[1,3],[1,2],[0,12],[-1,5],[0,3],[-2,5],[-1,3],[-2,2],[-3,3],[-2,1],[-4,-2],[-1,1],[-1,8],[-1,2],[-5,3],[-3,1],[-3,-1],[-1,-1],[-2,2],[-2,2],[-2,1],[-2,0],[-2,-1]],[[7080,7328],[0,1],[3,3],[2,3],[1,2],[-1,4],[-3,4],[-2,3],[0,2],[0,5],[1,4],[-1,2],[0,2],[0,5],[-2,7],[-1,4],[-1,5],[0,4],[2,8],[-1,3],[-1,3],[-7,5],[-6,4],[-3,-1],[-1,1],[-2,-3],[-1,-4],[-2,-1],[-3,2],[-2,2],[-1,6],[-1,7],[-1,2],[1,2],[0,1],[2,2],[0,1],[0,2],[-1,3],[-2,3],[-2,7],[0,4],[1,6],[0,3]],[[7045,7456],[2,1],[3,1],[1,3],[1,2],[0,2],[0,6],[-2,3],[0,2],[1,2],[1,3],[1,6],[2,3],[0,1],[2,1],[5,1],[4,3],[6,7],[2,3],[2,1],[2,0],[0,1],[-1,4],[0,2],[1,2],[1,0],[4,-2],[3,0],[3,1],[8,9],[1,0],[1,-1],[1,-6],[1,-10],[0,-2],[6,0],[4,4],[1,1],[3,-1],[1,2],[2,2],[1,-5],[2,2],[3,4],[1,3],[1,4],[2,5],[0,4],[1,3],[1,2],[3,9],[3,3],[2,1],[5,-2],[3,0],[8,-1],[4,2],[3,2],[4,-1],[4,2],[7,12],[0,2],[0,3],[2,2],[3,3],[6,6],[11,9],[4,3],[2,0],[4,3],[7,4],[2,6],[2,1],[9,1],[0,1],[0,4],[-1,4]],[[7227,7614],[1,1],[1,1],[0,3],[-2,7],[-1,7],[0,6],[0,2],[1,4],[1,4],[5,3],[3,1],[1,2],[-3,2],[-2,2],[0,1],[0,2],[0,1],[4,2],[3,3],[3,-2],[1,1],[0,3],[0,2],[-1,4],[-2,2],[0,3],[1,4],[-1,8],[-2,7],[-3,12],[-2,3],[-1,6],[-1,3],[0,4],[1,3],[-1,6],[0,6],[0,7],[1,4],[0,2],[1,1],[1,1],[1,1],[-1,2],[-2,1],[-3,3],[-4,-1],[-4,0],[-1,2],[-2,2],[0,1],[2,4],[3,3],[5,2],[5,2],[3,2],[3,1],[4,1],[2,-1],[5,2],[9,5],[7,4],[3,2],[1,-2],[1,-5],[2,-3],[3,-1],[1,0],[3,2],[4,1],[2,0],[2,-3],[2,-2],[2,0],[1,2],[1,3],[0,5],[0,4],[0,3],[-1,1],[-3,2],[-4,3],[0,2],[0,2],[1,4],[2,8],[2,12],[1,8],[4,14],[3,13],[5,20],[1,4],[0,6],[1,3],[1,1],[3,-1],[7,-5],[5,-4],[3,-1],[3,-1],[5,-2],[3,1],[3,1],[3,0],[5,-1],[2,-1],[2,0],[2,-2],[0,-4],[1,-2],[2,1],[5,4],[2,3],[4,4],[3,1],[4,1],[1,2],[1,5],[3,4],[0,4],[-1,4],[-1,5],[0,4],[-1,11],[-1,10],[1,8],[2,8],[0,3],[2,3],[1,5],[2,1],[7,1],[6,2],[3,2],[3,1],[1,1],[4,6],[1,4],[1,9],[-1,5],[1,4],[2,2],[2,2],[1,1],[3,0],[5,0],[3,-1]],[[7425,8011],[3,0],[1,0],[1,2],[2,1],[2,1],[3,1],[2,-1]],[[7439,8015],[0,-2],[0,-2],[0,-3],[1,-2],[0,-2],[-2,-1],[-1,-2],[0,-2],[1,-2],[1,-3],[3,-1],[2,-2],[1,-2],[0,-2],[-1,-2],[-1,-2],[0,-1],[0,-2],[2,0],[3,-2],[4,-2],[3,-4],[3,-1],[1,-4],[1,-6],[3,-3],[4,-4],[2,0],[2,-3],[2,-2],[2,-1],[2,-1],[4,3],[4,0],[2,-1],[2,-6],[2,-1],[1,-2],[1,-1],[2,-1],[2,2],[1,2],[2,-1],[1,-1],[0,-3],[1,-3],[3,-3],[3,-1],[0,-1],[1,-4],[1,-2],[1,-3],[1,-6],[0,-4],[1,-3],[2,-4],[2,-6],[2,-6],[2,-1],[2,-2],[2,-4],[2,-8],[0,-5],[0,-3],[1,-2],[0,-2],[-2,-8],[-1,-4],[0,-3],[1,-5],[1,-5],[0,-4],[-1,-3],[-2,-3],[-1,-2],[-2,-2],[-2,-7],[-1,-8],[0,-4],[1,-3],[1,-3],[0,-3],[3,-6],[1,-4],[1,0],[1,1],[2,0],[3,-1],[2,-3],[3,-1],[3,0],[2,-2],[2,-1],[5,0],[3,0],[5,0],[4,-2],[7,-2],[4,0],[6,2],[3,-1],[11,-2],[6,-2],[4,-3],[3,-4],[3,-6],[2,-3],[7,-2],[4,-7],[4,-3],[6,-7],[4,-2],[6,-3],[8,1],[0,-1],[0,-4],[-1,-5],[0,-4],[1,-2],[3,-1],[2,-2],[1,-3],[1,-2],[2,-11],[5,-16],[0,-7],[1,-4],[5,-6],[3,-5],[3,-5],[1,-4],[1,-6],[1,-2],[6,2],[6,1],[10,1],[15,-3],[14,-3],[13,-2],[7,-2],[14,-2],[8,3],[7,3],[2,0],[12,-4],[7,-1],[9,-2],[6,-1],[6,0],[2,-1],[2,-1],[2,-2],[4,-10],[3,-5],[5,-3],[12,-4],[6,-2],[7,-3],[5,-4],[6,-4],[7,-6],[8,2],[9,3],[5,2],[0,-13],[8,-1],[2,0],[3,-2],[2,1],[2,3],[2,4],[4,2],[5,5],[2,1],[8,7],[12,8],[6,4],[2,1],[3,2],[2,2],[4,1],[5,0],[6,2],[12,3],[2,0],[7,2],[3,1],[4,-1],[6,0],[4,-1],[5,0],[8,1],[5,0],[3,1],[5,3],[2,3],[5,3],[5,3],[4,3],[3,2],[3,1],[1,3],[1,2],[1,2],[3,6],[2,5],[2,2],[2,5],[2,3],[3,5],[2,2],[3,1],[7,5],[2,1],[1,0],[2,4],[3,3],[1,3],[3,1],[1,2],[1,2],[-1,3],[-1,4],[-1,3],[-4,6],[-3,4],[-2,5],[-1,5],[-2,3],[0,2],[0,3],[2,6],[1,3],[1,6],[2,9],[1,4],[2,4],[4,5],[4,1],[2,-1],[5,0],[4,0],[2,-3],[3,-5],[3,-2],[9,-4],[5,-1],[2,0],[5,-2],[1,0],[2,-1],[2,1],[3,4],[3,4],[2,1],[3,1],[1,2],[3,5],[3,3],[3,5],[2,4],[1,3],[0,3],[1,1],[3,2],[2,0],[5,-2],[7,0],[2,1],[6,1],[3,1],[4,1],[3,5],[4,5],[3,3],[1,0],[3,3],[1,4],[0,2],[-1,3],[2,4],[2,8],[3,3],[2,3],[1,5],[2,1],[2,1],[2,3],[2,1],[4,-2],[5,0],[3,0],[1,0],[1,2],[0,2],[1,6],[0,2],[1,1],[3,0],[2,-2],[2,-2],[2,0],[2,1],[2,5],[5,3],[2,0],[5,3],[2,-1],[5,-1],[2,1],[2,-1],[2,3],[1,1],[4,-1],[2,-3],[3,-3],[5,-1],[4,0],[4,-1],[2,0],[1,1],[4,3],[1,4],[-1,3],[1,4],[-1,3],[-2,4],[-1,2],[0,4],[-2,4],[-3,4],[-2,2],[-4,7],[-1,2],[-1,1],[0,2],[-2,1],[-2,2],[-1,2],[-1,3],[0,3],[-2,1],[-2,1],[-2,2],[-3,2],[-2,3],[-3,7],[-2,3],[-7,0],[-3,2],[-3,0],[-2,-1],[-3,0],[-2,-1],[-3,-5],[-3,-6],[-3,-3],[-2,-4],[-1,-2],[-2,1],[-2,5],[-4,3],[-3,2],[-2,1],[-3,1],[-3,0],[-4,-2],[-4,1],[-2,0],[-2,0],[-5,-4],[-2,-4],[-2,-2],[-3,3],[-3,4],[-2,4],[-2,4],[-1,11],[3,3],[4,4],[1,5],[0,7],[0,7],[4,6],[2,6],[0,3],[2,5],[2,6],[2,8],[5,14],[5,16],[2,8]],[[8240,8054],[6,-5],[4,-3],[6,-4],[6,-1],[7,-4],[3,-1],[1,0],[9,10],[7,9],[9,7],[6,1],[5,1],[3,4],[2,5],[0,7],[-1,4],[-3,2],[-1,1],[2,2],[1,3],[1,4],[1,4],[3,4],[2,5],[0,4],[2,5],[3,5],[1,5],[1,4],[1,5],[5,9],[2,10],[5,7],[8,7],[4,7],[2,7],[0,7],[-2,5],[0,6],[1,5],[-1,5],[-4,2],[-4,1],[-6,-1],[-3,1],[0,5],[1,4],[4,3],[5,8],[8,11],[8,7],[12,2],[9,4],[10,4],[6,1],[2,-1],[3,0],[7,1],[6,1],[5,3],[4,1],[4,-2],[1,0],[2,0],[2,1],[3,-2],[7,-6],[5,-3],[2,1],[2,-2],[2,-4],[3,-2],[4,-1],[5,-5],[2,0],[1,2],[2,2],[2,0],[5,-2],[5,-5],[4,-2],[1,1],[1,-1],[2,-2],[0,-3],[-1,-1],[2,-3],[1,0],[3,-1],[2,-4],[1,-2],[1,-1],[1,-2],[0,-1],[-1,-1],[0,-2],[0,-2],[0,-2],[4,-2],[1,-1],[0,-2],[1,-2],[2,-3],[1,-2],[-1,-2],[1,-1],[1,-2],[0,-4],[0,-2],[2,-3],[0,-5],[1,-6],[4,-9],[2,-4],[-1,-6],[1,-2],[2,-1],[1,-3],[-1,-3],[1,-2],[1,-2],[-1,-4],[1,-3],[1,-1],[0,-4],[1,-4],[2,-6],[5,-10],[3,-7],[2,-4],[0,-5],[-2,-3],[0,-2],[1,-2],[1,-2],[-1,-2],[2,-3],[5,-5],[-2,-8],[0,-6],[0,-6],[1,-4],[3,-2],[1,-3],[1,-2],[3,-3],[5,-3],[6,-1],[8,2],[5,1],[2,-2],[1,-2],[-1,-2],[1,-2],[4,-1],[2,-2],[1,-2],[2,-1],[2,1],[1,0],[2,-1],[1,0],[1,2],[2,0],[1,0],[1,-4],[2,-2],[2,-1],[3,-4],[7,-13],[5,-5],[4,-2],[6,0],[1,-5],[-1,-5],[0,-5],[1,-1],[2,-6],[2,-3],[0,-2],[2,-3],[-1,-5],[-2,-7],[1,-6],[3,-6],[2,-5],[0,-4],[1,-3],[1,-1],[3,0],[6,2],[4,0],[2,-3],[7,0],[10,2],[6,1],[3,-1],[2,3],[2,7],[2,3],[2,0],[3,2],[4,5],[4,3],[4,-1],[5,0],[3,2],[2,4],[5,4],[10,5],[3,1],[1,0],[3,-1],[3,-2],[3,-4],[0,-2],[0,-4],[-1,-2],[-1,-2],[-1,-3],[1,-3],[1,-6],[2,-4],[1,-5],[0,-2],[-1,-3],[-3,-6],[-2,-2],[-1,-2],[-3,-1],[-1,0],[-2,-1],[0,-2],[-1,-2],[-2,-3],[0,-2],[1,-4],[0,-4],[-2,-3],[-1,-5],[-1,-2],[0,-4],[-1,-1],[0,-9],[-2,-5],[-2,-7],[0,-4],[1,-4],[-1,-1],[0,-2],[0,-3],[-1,-2],[-3,-2],[-1,-3],[0,-4],[0,-3],[-1,-3],[-2,-2],[-1,-2],[-1,-1],[-1,-4],[0,-3],[-1,-3],[1,-3],[-1,-2],[-3,-2],[-1,-1],[-1,-1],[-2,-3],[-2,-10],[-1,-6],[1,-5],[-3,-3],[-2,-3],[-2,1],[-1,1],[-3,1],[-2,1],[-3,2],[-5,2],[-5,2],[-3,2],[-3,1],[-2,1],[-1,4],[-2,-2],[-1,-3],[-3,-2],[-1,-4],[-1,-3],[-2,-5],[-2,-1],[-5,-3],[-1,-1],[-4,0],[-1,-2],[-1,-2],[-1,-3],[1,-2],[2,-6],[0,-4],[2,-7],[3,-23],[-1,-4],[-1,-17],[0,-3],[0,-5],[0,-3],[1,-1],[1,-1],[0,-3],[0,-3],[0,-2],[-1,-5],[-1,-6],[-1,-3],[-1,-2],[-1,-1],[0,-5],[0,-3],[-2,-1],[-2,-2],[-2,1],[-1,-1],[-3,-1],[-4,-1],[-2,-2],[-1,-2],[-1,-1],[0,-2],[0,-1],[3,0],[1,-3],[0,-3],[-1,-2]],[[4914,5479],[-1,-2]],[[4913,5477],[-4,1],[1,2],[4,-1]],[[4925,5730],[0,-3],[-1,-5],[0,-2],[1,-2],[0,-3],[-2,-7],[0,-3],[2,-1],[1,-4],[1,-7],[0,-2],[0,-2],[1,-16],[2,-16],[-1,-3],[-1,0],[-1,-1],[0,-1],[0,-3],[0,-2],[-2,-1],[-3,-5],[0,-2],[-1,-5],[-1,-3],[-1,-5],[-2,-13],[0,-11],[0,-3],[-1,-3],[-1,-3],[-4,-9],[-1,-8],[0,-3],[0,-4],[-1,-2],[1,-7],[0,-5],[1,-6],[2,-15],[2,-9],[0,-7],[1,-5],[1,-2],[0,-2],[4,-2],[1,-1],[1,-9],[0,-5],[-1,-1],[0,-4],[0,-5],[-1,-1],[-2,-1],[-1,-1],[-2,0]],[[4916,5479],[-1,1],[-1,1],[-3,2],[1,9],[-1,0],[-1,-1],[-2,-10],[-1,-2],[-15,6],[-3,4],[-4,1],[-7,-1],[-5,-1],[-2,-3],[14,2],[2,0],[0,-2],[-17,-3],[-7,-2],[-2,0],[-1,4],[-7,0],[-2,-1],[-1,-3],[3,1],[5,0],[1,-2],[-14,-2],[-10,-5],[-4,-3],[-13,-11],[-9,-5],[-2,-2],[-4,-5],[-4,-4],[-6,-6],[-3,-2]],[[4790,5434],[-1,2],[0,11],[0,15],[0,5],[0,5],[0,4],[2,2],[0,2],[1,5],[1,5],[0,9],[1,2],[0,3],[-1,5],[-1,11],[0,1],[0,-1],[-1,0],[-4,4],[-2,1],[-2,3],[0,4],[-1,2],[-1,4],[-1,5],[-2,3],[-3,1],[-1,-1],[-2,0],[-3,2],[-1,2],[-2,3],[-1,3],[-1,0],[-2,0],[-1,2],[0,1],[5,11],[2,6],[0,3],[0,3],[1,4],[0,5],[-3,20],[-1,6],[-1,1],[0,1]],[[4764,5619],[1,3],[3,-1],[3,-2],[1,2],[2,10],[0,3],[0,3],[1,7],[1,2],[1,3],[0,4],[-1,1],[-1,0],[-2,1],[-2,2],[-1,2],[1,9],[0,3],[0,1],[2,1],[3,0],[3,-1],[2,0],[1,0],[1,-3],[2,-3],[1,0],[0,2],[0,9],[-1,5],[-2,4],[-4,4],[0,5],[0,6],[1,2],[3,4],[0,2],[-1,2],[-2,2],[0,7],[0,6],[-2,-1],[-2,0],[-1,2],[-1,4],[-1,10],[0,12],[0,5],[1,3],[1,3],[2,3],[1,2]],[[4778,5769],[3,1],[1,3],[2,6],[3,5],[2,0],[1,1],[1,0],[1,-3],[2,-3],[1,-4],[5,-2],[2,-1],[2,-4],[1,0],[0,1],[1,1],[0,1],[-1,3],[1,3],[0,3],[2,0],[2,0],[2,0],[2,0],[0,2],[0,7],[0,4],[0,3],[1,2],[2,-4],[2,-2],[2,0],[1,1],[-1,4],[0,1],[1,1],[1,1],[3,1],[0,-7],[0,-2],[1,-5],[1,-4],[0,-2],[-1,-3],[-1,-2],[0,-1],[1,-2],[3,-2],[2,0],[1,3],[2,2],[0,1],[1,3],[1,2],[4,3],[4,0],[1,-1]],[[5449,5315],[0,-1],[0,-3],[-2,-2],[-1,-4],[0,-5],[0,-6],[2,-7],[0,-4],[-1,0],[-1,-2],[0,-1],[-3,5],[-2,3],[-4,6],[-4,2],[-5,1],[-2,-1],[-2,2],[-2,2],[-1,1],[-2,-2],[-1,0],[-2,1],[-3,0],[0,3],[0,1],[-3,-1],[-1,3],[-1,0],[-1,1],[-3,3],[-2,-2],[-6,0],[-7,0],[-7,0],[-7,0],[-6,0]],[[5369,5308],[-1,4],[-1,2],[-3,0],[-7,-1],[-6,1],[-1,0],[-2,1],[-5,1],[-6,-1],[-1,1],[-5,-1],[-10,1],[-6,0],[0,-2],[-1,-2],[0,-3]],[[5314,5309],[-6,0],[-9,0],[-8,0],[-5,0],[-9,0],[-3,2],[-1,2],[0,2],[-1,1],[0,1]],[[5272,5317],[0,13],[2,11],[0,11],[2,9],[-1,9],[-1,4],[-6,14],[3,5],[-4,-1],[0,5],[-2,6],[1,0],[1,4],[3,-1],[0,1],[-3,5],[1,3],[1,2],[-1,2],[-2,-3],[-1,0],[-1,2],[-1,0],[0,-4],[-1,-3],[-1,-1],[-1,0],[-2,1],[0,2],[-2,1],[-3,3],[-4,2],[0,8],[-1,4],[-1,4],[0,4],[0,7],[-1,1],[-1,1],[-1,-1],[-1,1],[-2,3],[-1,2],[1,-7],[-1,-2],[-2,1],[-1,2],[0,2],[1,9],[-1,0]],[[5237,5458],[1,4],[1,6],[3,6],[2,9],[2,16],[1,9],[1,9],[1,8],[2,5],[5,10],[4,8],[2,3],[1,3],[2,2],[3,4],[2,7],[1,6],[1,2],[2,1],[4,6],[3,5],[1,-2],[0,-3],[1,-1],[2,-1],[4,0],[2,1],[1,2],[1,6],[0,1],[1,1],[4,-5],[3,-6],[3,-6],[1,-2],[1,-2],[1,-11],[1,-3],[1,-1],[3,0],[2,2],[2,3],[2,4],[2,3],[0,3],[1,9],[0,2],[2,3],[4,6],[2,4],[0,1],[-2,4],[-1,4],[2,4],[1,3],[4,11],[0,4],[1,4],[3,12],[2,17],[0,3],[2,8],[3,10],[5,2],[2,2],[2,5],[2,4],[0,4],[1,7],[1,9],[0,8],[2,7],[2,3],[4,3],[1,2],[1,4],[0,10],[0,6],[1,2],[0,5],[4,8],[2,12],[1,13],[5,15],[5,15],[3,5],[2,1],[2,1],[2,1],[6,7],[2,3],[2,3],[0,2],[1,3],[-1,8],[1,6],[1,9],[0,7],[0,3],[-1,3],[-1,1],[-1,4],[-3,3],[-4,1],[-2,1],[-1,4],[0,2],[0,2],[0,5],[-3,27]],[[5390,5937],[5,0],[6,-3],[2,-3],[0,-9],[3,-5],[3,-4],[3,-9],[1,-14],[2,-8],[0,-1],[3,-11],[0,-4],[1,-7],[-1,-5],[2,-5],[-2,-10],[-1,-6],[0,-9],[1,-15],[2,-12],[2,-9],[2,-8],[3,-8],[4,-7],[3,-5],[-3,-3],[-6,0],[-4,2],[-1,0],[-2,-1],[-6,-2],[-7,1],[-6,2],[-4,0],[-3,-5],[-2,-7],[-2,-5],[0,-6],[2,-3],[3,-7],[3,-7],[2,-5],[5,-10],[6,-10],[1,-1],[1,-2],[1,0],[3,-6],[4,-8],[4,-14],[3,-14],[2,-13],[2,-2],[1,-2],[1,-3],[-1,-4],[0,-3],[-2,-5]],[[5761,5478],[1,-4],[1,-4],[5,-7],[1,-4],[2,-4],[0,-4],[2,-2],[2,-2],[2,-2],[1,-3],[1,-3],[4,-5],[1,0],[2,0],[1,-1],[2,0],[3,3],[3,4],[2,3],[6,-1],[4,-2],[2,-3],[2,0],[5,6],[2,6],[2,2],[4,-3],[3,-6],[2,-9],[2,-3],[2,-6],[5,-11],[6,-5],[3,-3],[1,-3],[0,-4],[0,-4],[1,-1],[2,0],[1,1],[2,-1],[1,-3],[0,-3],[1,-2]],[[5856,5385],[2,-2],[0,-3],[-1,-4],[-1,-3],[-2,-7],[0,-7],[1,-2],[1,-2],[0,-2],[0,-3],[0,-2],[-2,-10],[-1,-8],[0,-5],[3,-3],[3,0],[2,-2],[1,-3],[1,-1],[1,0],[1,-1],[1,-3],[1,-2],[1,-3],[0,-3],[0,-2],[-3,-7],[-6,-14],[-13,-26],[-4,-3],[-3,-5],[-1,-7],[-4,-6],[-3,-3],[0,-2],[0,-6],[0,-10],[-1,-5],[-2,-9],[-1,-6],[-1,-1],[-1,-3],[-1,-9],[0,-3],[-1,-19],[0,-5],[-1,-9],[0,-5],[-1,-6],[0,-5],[0,-9],[0,-13],[0,-2]],[[5821,5104],[-1,-1],[-2,-4],[-2,-2],[-1,-1],[-3,-6],[-2,-5],[-1,-6],[0,-2],[0,-8],[0,-8],[0,-4],[-1,-2],[-3,-4],[-2,-4],[-1,-1],[-1,-3],[1,-6],[0,-5],[1,-3],[2,-2]],[[5816,4928],[0,-3],[-1,-10],[-1,-10],[0,-3],[1,-5],[2,-11],[1,-8],[1,-5],[1,-6],[1,-9],[1,-4],[0,-3],[-3,-11],[-1,-3],[1,-9],[1,-8],[1,-5],[4,-12],[2,-5],[5,-6],[4,-6],[1,-4],[2,-4],[2,-9],[2,-8],[1,-7],[2,-10],[2,-8],[3,-11],[2,-8],[1,-5]],[[5854,4712],[-5,-2],[-7,-2],[-8,-2],[-8,-3],[-8,-2],[-7,-3],[-7,-2],[-2,-1],[1,-6],[0,-6],[-2,-5],[-2,-6],[-1,-3],[-2,-4],[-2,-4],[-3,-5],[-3,-4],[0,-2],[4,-14],[2,-10],[1,-8],[0,-6],[0,-10],[-1,-12],[0,-5],[1,-9],[0,-7],[-3,-7],[0,-8],[-2,-10],[-2,-14],[-1,-8],[1,-4],[1,-4],[0,-4],[2,-7],[1,-3],[1,-2],[6,-8],[2,-4],[3,-8],[3,-5],[3,-2],[5,-2],[2,-1],[1,1],[1,1],[0,4],[0,3],[0,2],[2,2],[3,0],[2,2],[1,1],[0,-9],[0,-8],[0,-10],[0,-12],[0,-10],[0,-10],[0,-11],[0,-2],[0,-2],[-2,-1],[-2,2],[0,3],[-1,4],[0,2],[-2,1],[-2,-1],[-2,-4],[-4,-2],[-1,-2],[-3,0],[-3,2],[-2,3],[0,6],[-2,5],[-2,8],[-2,3],[-1,4],[-2,0],[-1,1],[-2,6],[-1,7],[0,2],[-1,4],[-2,2],[-3,3],[-5,3],[-6,5],[-3,0],[-3,1],[-2,3],[-1,1],[-1,7],[-2,8],[-5,9],[-1,10],[-1,2],[-2,-1],[-1,-1],[-1,-3],[-1,-9],[-1,-5],[0,-1],[-2,-1],[-1,-1],[-3,-1],[-4,0],[-4,2],[-3,1],[-7,1],[-2,1],[-2,2],[-2,2],[-7,4],[-3,0],[-1,3],[-2,1],[-1,3],[-1,4],[-1,9],[0,4],[1,6],[-1,1],[-1,0],[-2,-2],[-3,-1],[-6,-2],[-1,-1],[-3,-1],[-1,-1],[-4,-5],[-2,-1],[-2,2],[-2,3],[2,3],[0,4],[-1,7],[-1,3],[-4,2],[-1,1],[-1,4],[-1,3],[-2,1],[-1,1]],[[5362,4846],[-1,2],[-4,-1],[-2,-2],[-3,-5],[-5,-2],[-2,0],[-1,1],[-2,5],[-3,5],[0,3]],[[5363,4917],[0,2],[1,0],[1,-1],[0,-2],[2,-3],[2,-4],[2,-3],[1,-1],[2,2],[2,3],[3,2],[1,2],[0,4],[0,4],[0,5],[1,1],[1,0],[2,-1],[1,-2],[2,0],[1,2],[2,2],[2,1],[3,3],[2,3],[1,0],[2,-4],[1,-3],[0,-1],[-1,-4],[-1,-4],[1,-6],[0,-5],[0,-3],[1,-2],[1,0],[2,0],[2,-2],[2,1],[2,2],[4,8],[5,14],[5,9],[3,3],[2,5],[2,4],[2,4],[4,2],[3,3],[4,10],[4,17],[1,16],[1,9],[0,33],[-1,11],[1,5],[2,4],[4,9],[3,7],[2,8],[5,19],[1,6],[1,2],[3,5],[4,4],[4,4],[8,13],[6,13],[-1,16],[1,13],[3,16],[1,18],[-1,18],[1,15],[3,18],[1,6],[0,11],[0,17],[4,23],[4,14],[4,15],[2,10],[2,12],[-1,10]],[[5333,4896],[0,1],[-1,1],[-2,6],[-2,6],[-1,3],[0,1],[0,7],[-3,7],[-8,14],[-1,4],[-6,12]],[[5309,4958],[1,9],[2,4],[1,3],[6,7],[1,0],[4,-9],[1,-1],[2,0],[2,0],[0,2],[1,2],[-2,3],[0,2],[1,3],[1,4],[1,4],[0,2],[-1,2],[-3,3],[-2,3],[-1,3],[1,3],[1,3],[0,2],[-1,3],[-1,3],[-1,1],[-3,1],[1,4],[1,6],[0,4],[-1,12],[0,2],[1,1],[2,-1],[1,-2],[5,2],[1,1],[2,-2],[2,-2],[10,5],[0,4],[1,5],[0,3],[0,2],[-1,2],[0,3],[0,4],[1,1],[3,5],[1,-1],[3,-2],[2,-3],[2,-8],[1,-7],[2,-7],[5,-4],[6,-2],[2,1],[5,7],[2,5],[1,3],[1,-2],[2,-7],[1,-2],[0,-3],[0,-3],[0,-2],[3,-2],[3,2],[1,3],[2,3],[0,3],[-1,2],[0,3],[1,2],[1,6],[0,5],[1,2],[2,2],[1,2],[1,10],[0,4],[0,3],[1,4],[0,6],[-1,11],[0,7],[0,8],[1,10],[1,10],[0,3],[-2,3],[-2,3],[-4,2],[-2,4],[-1,4],[-1,1],[-4,2],[-2,2],[1,7],[0,9],[0,7],[1,5],[1,4],[2,4],[1,5],[1,2],[4,1],[1,2],[1,2],[1,3],[1,4],[1,4],[1,2],[-1,3],[-1,6],[-1,5],[-1,1],[-2,12],[-2,3],[-3,1],[-6,2],[-3,-3],[-6,-3],[-4,-3],[-3,-2],[-1,1],[-1,1],[1,2],[0,4],[0,5],[-1,4],[-1,7],[0,8],[1,7],[3,10],[0,4]],[[563,3960],[-1,0],[-1,0],[-1,1],[0,2],[1,0],[1,0],[1,-1],[0,-2]],[[2830,5330],[-1,-1],[-1,2],[-1,3],[1,2],[1,0],[1,-2],[0,-4]],[[3019,5867],[-1,-1],[-2,-1],[-3,-3],[-6,-3],[-6,-3],[-2,-4],[-6,-23],[-6,-5],[-2,-4],[-1,-4],[-3,-8],[-2,-6],[-3,-14],[-2,-17],[-1,-10],[-1,-13],[-2,-7],[-2,-7],[-2,-6],[-2,-7],[-2,-6],[0,-2],[1,-1],[4,1],[1,2],[2,2],[2,-1],[1,-6],[2,-1],[1,1],[2,-2],[2,-15],[1,-12],[4,-8],[3,-6],[1,-6],[1,-8],[0,-3],[-1,-3],[-2,-4],[0,-9],[0,-3],[-1,-9],[1,-5],[0,-4],[2,-2],[2,-1],[3,-2],[1,-7],[2,-8],[3,-4],[3,-3],[2,1],[5,2],[5,0],[6,-3],[3,0],[3,1],[6,4],[2,1],[2,0],[3,-3],[2,-2],[2,-2],[4,-1],[2,0],[2,0],[1,-1],[5,-13],[5,-12],[4,-10],[4,-11],[2,1],[1,-1],[2,-2],[2,1],[3,4],[4,1],[5,-3],[8,0],[9,3],[6,2],[2,3],[3,0],[5,-3],[2,-3],[0,-4],[1,-5],[-1,-6],[-2,-5],[-2,-7],[0,-9],[-2,-6],[-2,-5],[-1,-6],[0,-8],[0,-11],[-1,-15],[0,-10],[1,-3],[0,-4],[0,-5],[1,-5],[1,-7],[2,-13],[2,-5],[1,-2],[2,-3],[4,-13],[1,-2],[0,-3],[-1,-2],[0,-1],[-5,-8],[-9,-17],[0,-2],[0,-3],[2,2],[3,-2],[1,0],[1,-2],[1,-4],[1,-1],[1,-2],[3,-5],[2,-5],[2,-2],[1,-3],[0,-3],[0,-3],[1,-8],[1,-2],[0,-3],[0,-3],[1,-3],[1,-7],[2,-8],[0,-5],[1,-2],[0,-6],[2,-6],[-1,-4],[1,-4]],[[3056,4940],[-1,4],[-2,4],[-2,3],[-1,3],[-1,6],[-2,2],[-1,2],[-1,0],[-1,-2],[-2,-1],[-1,0],[-5,5],[-1,0],[3,10],[6,18],[3,12],[4,13],[2,6],[0,2],[0,1],[0,3],[-2,1],[-3,2],[-1,3],[-2,1],[-1,2],[-3,3],[-2,2],[-2,0],[-1,4],[-6,7],[-2,1],[-1,-1],[-3,-2],[-2,-3],[-3,-2],[-3,0],[-1,3],[-1,1],[-2,3],[-3,2],[-2,2],[-2,-1],[-2,-4],[-1,-3],[-2,-2],[-2,0],[-2,-3],[-2,-1],[-3,-1],[-2,-1],[-3,2],[-3,2],[-1,0],[-1,0],[-1,-2],[-3,-1],[-2,0],[-1,1],[-2,3],[-2,2],[-2,2],[-1,4],[0,3],[1,4],[0,4],[-1,7],[-1,3],[0,3],[-1,1],[-3,-1],[-2,3],[-2,2],[-1,3],[1,6],[-1,5],[-1,3],[-1,5],[-2,4],[-2,2],[-1,0],[-2,1],[-2,4],[-1,2],[-2,4],[-4,1],[-2,2],[-1,2],[-1,5],[0,2],[-1,3],[0,4],[-1,6],[-2,4],[-1,3],[-1,2],[-2,3],[-2,2],[-2,3],[-1,3],[0,2],[-1,0],[-2,0],[-1,1],[-2,2],[-1,2],[-2,4],[-2,0],[-1,0],[-2,-3]],[[2908,5178],[-5,4],[-4,5],[-4,2],[-3,3],[-3,6],[-1,4],[-1,2],[-6,5],[-1,1],[-2,-3],[-1,-1],[0,-5],[0,-2],[-2,-2],[-3,1],[-2,1],[-2,0],[0,-1],[-1,0],[-1,0],[-3,1],[-2,2],[-3,3],[-2,0],[-3,1],[-3,1],[-1,2],[-1,12],[-1,1],[-1,1],[-2,2],[-1,1],[-1,4],[-1,3],[-3,-1],[-6,5],[-4,4],[-4,4],[-5,9],[-2,2],[-3,3],[-1,4],[-3,4],[-1,2]],[[2809,5268],[-1,4],[-3,5],[1,8],[5,5],[6,-4],[1,9],[-2,7],[0,15],[1,3],[1,3],[2,3],[1,1],[3,-1],[1,2],[5,-1],[1,1],[1,2],[1,2],[2,3],[1,4],[1,2],[1,-1],[0,2],[1,2],[3,6],[0,2],[-1,5],[1,2],[1,1],[2,1],[1,5],[2,4],[1,6],[2,1],[1,7],[2,6],[5,19],[-2,0],[-1,-3],[-1,1],[-1,1],[0,9],[-1,1],[-2,-7],[-2,7],[0,4],[1,4],[-1,2],[-3,-2],[1,3],[1,3],[1,2],[2,3],[1,5],[0,6],[1,8],[-1,3],[-1,3],[0,14],[0,8],[-1,6],[0,6],[-4,7],[6,8],[2,6],[-3,12],[-3,11],[0,6],[1,-1],[1,0],[1,13],[0,5],[-2,6],[-3,0],[-2,9],[-1,1],[-1,6],[-3,10],[-3,5]],[[2836,5600],[2,12],[2,3],[0,3],[-1,7],[1,2],[0,1],[1,-1],[2,-3],[1,-4],[1,-2],[1,2],[5,8],[0,2],[0,5],[2,4],[2,2],[0,2],[0,4],[-2,8],[-2,5],[-1,5],[0,4],[-2,4],[0,4],[2,5],[0,1]],[[2850,5683],[1,-2],[3,-8],[3,-5],[4,-9],[2,-6],[1,-1],[1,-2],[-1,-2],[-1,-1],[0,-4],[1,-2],[1,-1],[2,1],[1,4],[-1,17],[-1,9],[-2,3],[-1,4],[1,2],[2,1],[3,4],[12,17],[4,15],[3,6],[3,4],[4,-1],[4,2],[1,5],[-1,7],[-2,4],[2,6],[1,9],[0,8],[1,5],[0,1],[-2,-3],[-2,-2],[1,3],[3,8],[2,11],[1,5],[5,7],[0,3],[4,5],[6,11],[2,3],[11,-7],[3,0],[-1,-1],[-1,-1],[-3,-1],[0,-5],[1,-4],[2,-1],[1,3],[2,8],[2,8],[1,10],[1,3],[3,1],[4,-2],[3,-2],[3,0],[10,1],[17,24],[7,6],[5,5],[3,9],[1,8],[2,3],[3,0],[1,2],[0,2],[6,6],[3,1],[3,0],[6,-6],[3,-10],[1,-6],[-4,-8],[-1,-3]],[[6216,4475],[2,-4],[-6,2],[-1,3],[0,2],[2,0],[3,-3]],[[6235,4488],[1,-8],[0,-6],[0,-2],[-2,1],[-2,5],[-4,5],[2,0],[1,0],[1,0],[1,3],[0,1],[1,2],[1,-1]],[[6207,4498],[-1,0],[-2,3],[-2,1],[-2,5],[1,18],[1,3],[0,1],[1,0],[2,-2],[-1,-12],[2,-8],[1,-6],[0,-3]],[[4324,6039],[-2,-2],[-1,1],[-2,3],[0,3],[0,3],[3,3],[2,-1],[1,-5],[-1,-5]],[[4356,6056],[-1,-1],[-1,3],[0,4],[0,1],[1,3],[2,0],[0,-3],[0,-6],[-1,-1]],[[4348,6048],[-1,-5],[-4,0],[-2,3],[-2,6],[0,5],[1,5],[0,4],[0,1],[1,-1],[0,-3],[4,-6],[1,-1],[2,-8]],[[4363,6119],[2,-1],[1,0],[2,0],[1,-3],[1,-3],[-1,-4],[-3,-3],[-2,0],[-2,3],[1,6],[0,5]],[[4330,6141],[2,-1],[0,-2],[-2,0],[-4,2],[-1,-1],[-1,-5],[-2,7],[0,3],[3,-1],[5,-2]],[[4364,6143],[-1,-3],[-1,5],[-1,1],[0,6],[2,2],[0,-6],[1,-5]],[[4308,6152],[-2,-1],[-1,0],[-2,2],[0,3],[2,2],[2,0],[1,-4],[0,-2]],[[4300,6160],[-2,-1],[-1,0],[-1,5],[0,3],[0,1],[6,6],[2,-1],[2,-5],[-1,-2],[-5,-6]],[[2676,5813],[1,-3],[1,-3],[0,-5],[4,-15],[3,-9],[6,-16],[2,-3],[5,-12],[1,-3],[1,-3],[5,-3],[1,-3]],[[2706,5735],[0,-1],[0,-1],[-1,-1],[-1,-1],[-2,3],[-2,2],[-1,-1],[-1,-3],[-1,-2],[-1,-1],[0,-1],[0,-11],[0,-11],[1,-1],[3,-3],[1,-3],[1,-2],[-1,-1],[-2,-2],[-2,-3],[-1,-4],[2,-6],[1,-4],[-1,-4],[0,-2],[-4,-5],[-1,-2],[1,-1],[2,-4],[1,-3],[0,-4],[1,-3]],[[2698,5649],[-2,6],[-3,6],[-2,4],[0,9],[-1,4],[-4,5],[-3,3],[-2,-1],[1,-5],[4,-6],[0,-3],[0,-3],[-2,0],[-2,2],[-3,0],[-2,2],[-3,8],[2,7],[1,4],[0,9],[-1,4],[-2,7],[-5,7],[-6,6],[-3,5],[-7,3],[-3,3],[-2,4],[0,4],[1,5],[-2,6],[-9,12],[-5,5],[-1,3],[-1,1],[1,-9],[2,-5],[6,-5],[1,-3],[1,-4],[-3,-7],[-2,-1],[-1,-4],[-1,-1],[-1,2],[-4,11],[-9,5],[-1,3],[-3,10],[-2,10],[1,6],[3,9],[1,4],[0,3],[0,4],[-1,2],[-4,4],[-2,2],[1,2],[4,4],[0,3],[0,1]],[[2618,5821],[1,0],[0,1],[0,1],[1,3],[1,2],[1,0],[2,-1],[4,-3],[6,-4],[7,-6],[3,4],[3,2],[2,0],[4,-3],[2,-1],[2,0],[2,-4],[2,-4],[0,-2],[1,-1],[2,-1],[5,-2],[3,1],[2,2],[2,3],[0,5]],[[2706,6426],[-2,-3],[-6,-4],[-3,0],[-3,1],[-2,4],[-1,4],[0,1],[2,-3],[2,-1],[1,1],[1,1],[-3,12],[0,2],[2,7],[7,-2],[1,-1],[1,-4],[1,-3],[2,-9],[0,-3]],[[2842,6448],[-1,-2],[-1,3],[-1,0],[-1,1],[-2,3],[-1,3],[2,0],[2,0],[4,-2],[0,-3],[-1,-3]],[[2836,6458],[-1,0],[-2,3],[-1,2],[1,2],[0,3],[1,-3],[2,-2],[1,-3],[-1,-2]],[[2832,6467],[0,-1],[-2,3],[-2,1],[-1,3],[-1,1],[-1,1],[2,1],[2,0],[1,-3],[1,-4],[1,-2]],[[2816,6483],[3,-1],[2,0],[1,0],[1,0],[2,-5],[-1,0],[-2,0],[-1,0],[-3,1],[-2,1],[-2,1],[0,2],[2,1]],[[2796,6489],[0,-1],[-5,4],[-2,4],[-1,1],[1,0],[6,-7],[1,-1]],[[2726,6518],[8,-3],[6,1],[2,2],[0,-2],[3,-4],[1,0],[4,2],[9,1],[1,-2],[2,-3],[3,-3],[2,-2],[3,0],[3,1],[2,-1],[4,-4],[1,0],[2,1],[0,-3],[4,-5],[4,-10],[3,-4],[2,-3],[3,-3],[2,-1],[8,1],[2,-1],[2,-1],[1,0],[1,0],[15,-15],[5,-8],[3,-4],[6,-6],[3,-1],[1,1],[0,1],[-2,3],[0,2],[2,-1],[4,-7],[2,-3],[2,-2],[2,-2],[-1,-2],[-2,0],[-3,1],[2,-5],[1,-3],[1,0],[2,3],[1,3],[5,-7],[2,-4],[0,-2],[0,-2],[2,2],[1,0],[1,-1],[2,-3],[2,-1],[3,0],[5,-3],[6,-5],[4,-1],[5,0],[3,-3],[1,-4],[-1,-3],[-1,-2],[2,-4],[-4,-1],[-1,-3],[0,-2],[1,-1],[3,1],[3,-1],[5,-1],[3,1],[7,-2],[3,-2],[4,-4],[2,-3],[4,-8],[3,-3],[4,-1],[1,1],[1,-1],[1,-1],[0,-4],[0,-4],[-2,-2],[-1,-3],[-4,0],[-6,-1],[-6,-3],[-3,-3],[-2,-1],[-3,-2],[0,1],[0,2],[-1,3],[-1,-3],[-1,-2],[-2,-1],[-7,-1],[-3,3],[-3,1],[-11,2],[-2,0],[-8,-2],[-7,-1],[-3,-1],[-3,-1],[-6,0],[-7,-2],[-7,-1],[4,13],[10,13],[2,3],[1,3],[0,3],[0,2],[-2,4],[-1,3],[-1,2],[-3,1],[-3,1],[-4,1],[-7,1],[-4,0],[-3,3],[-6,9],[-2,3],[-2,2],[-1,2],[-1,14],[-1,7],[-2,6],[-2,5],[-3,1],[-10,-4],[-2,1],[-3,1],[-15,9],[-6,5],[-3,3],[-2,3],[-2,6],[-3,5],[0,-2],[0,-1],[-13,-1],[-2,1],[-2,2],[-1,2],[0,4],[-1,3],[-1,-3],[0,-4],[-2,-2],[-2,0],[-3,5],[-10,0],[-1,1],[-3,5],[-3,5],[3,2],[6,3],[1,2],[1,2],[-1,3],[-1,2],[-1,2],[-2,1],[-1,0],[-24,1],[-1,-2],[-2,-4],[-4,-4],[-3,-5],[-1,-3],[-1,-2],[-3,-3],[-2,-4],[-3,-2],[-2,1],[-2,0],[-1,-1],[-1,-1],[-6,0],[-1,-1],[-1,-4],[-1,-6],[0,-2],[-3,-1],[-3,-2],[-6,-6],[-2,-1],[1,5],[-1,4],[-1,0],[-2,-1],[-2,-1],[-2,-3],[-2,-1],[-1,2],[0,2],[10,8],[1,0],[1,0],[2,0],[1,2],[-1,11],[0,7],[3,5],[4,9],[2,2],[22,18],[2,1],[14,3],[3,1],[6,5],[7,3],[7,-2]],[[3090,5878],[-2,0],[-5,5],[-4,9],[0,5],[1,-1],[1,-1],[2,-7],[5,-4],[2,-6]],[[2739,6298],[1,-1],[1,1],[1,1],[4,-1],[1,-2],[-4,0],[-1,-2],[-1,0],[-3,0],[0,6],[1,0],[0,-2]],[[2778,6319],[-1,0],[-2,-2],[-1,0],[1,1],[0,1],[1,0],[1,1],[1,0],[0,-1]],[[2782,6319],[-1,-1],[-1,1],[2,2],[1,1],[1,0],[1,0],[0,-1],[-3,-2]],[[5944,7204],[-1,-1],[-2,2],[-1,0],[-1,-1],[-1,-1],[-1,-1],[-1,0],[-1,-1],[-2,0],[-2,1],[-2,-2],[0,6],[-1,2],[-1,1],[-2,0],[-2,0],[-2,1],[-3,-2],[-2,-2],[-2,-1],[-2,0],[-2,1],[-2,2],[0,2]],[[5908,7210],[2,-1],[3,1],[1,6],[0,6],[6,-2],[5,-1],[4,0],[4,1],[13,7],[3,4],[2,2],[4,3],[4,2],[-2,-4],[-15,-17],[-1,-6],[1,-3],[2,-4]],[[5944,7204],[1,-2],[0,-3],[-3,-1],[-3,0],[-2,0],[-1,0],[-6,-9],[-2,-4],[-4,-2],[-3,-1],[-2,0],[-1,-1],[-1,-2],[0,-2],[-1,-2],[-2,0],[0,4],[-2,1],[-3,-1],[-1,1],[-6,3],[-1,1],[-1,3],[-3,10],[0,8],[2,-2],[2,2],[3,4],[2,1],[2,0]],[[5411,8113],[2,0],[3,2],[0,2],[0,5],[4,-1],[3,-2],[1,-4],[1,-3],[1,-2],[1,0],[2,-1],[5,-2],[2,-1],[3,-1],[2,-2],[1,-1],[1,-2],[1,-1],[2,1],[6,1],[2,-1],[1,-3],[1,0],[-1,-2],[-1,-2],[-2,-1],[-1,-2],[-1,-2],[0,-2],[2,-1],[1,0],[1,-1],[3,-6],[3,-7],[2,-1],[1,-1],[1,1],[2,3],[1,1],[2,1],[2,2],[0,2],[-2,5],[-1,4],[3,0],[5,-2],[7,-8],[2,0],[2,1],[3,1],[1,1],[1,0],[0,-4],[-1,-2],[-3,-2],[0,-1],[1,-2],[2,0],[1,-3],[2,-3],[1,-1],[1,-1],[3,2],[1,1],[0,1],[1,0],[1,-2],[0,-1],[3,-1],[2,-2],[1,-1],[1,1],[5,-2],[1,-1],[0,-2],[0,-2],[1,-3],[6,-9],[0,-4],[1,-1]],[[5523,8036],[-1,-1],[-2,0],[-2,-1],[-2,0],[-2,-1],[-1,-3],[-2,-1],[-1,-2],[0,-2],[-6,-4],[-1,-2],[0,-3],[-1,-3],[0,-3],[-1,-2],[-3,-1],[-1,-1],[-1,-2],[-1,-2],[-2,-2],[-4,-3],[-4,-1],[-5,1],[-3,1],[-2,-1],[-2,-4],[-2,-5],[-1,-5]],[[5383,7993],[-1,3],[-2,3],[-4,5],[-3,0],[-1,1],[-1,2],[-1,3],[-1,2],[-2,1],[-3,2],[-3,6],[-3,4],[-3,0],[-1,2],[-2,3],[-2,3],[-2,6],[-1,4],[-2,2],[-1,2],[0,2],[1,3],[1,2],[1,1],[0,2],[0,1],[-1,3],[-3,3],[-3,2],[-1,3],[-1,3],[0,2],[-2,2],[-1,3],[0,2],[1,1],[1,0],[1,-2],[1,-2],[2,-4],[0,2],[2,3],[2,5],[3,2],[2,1],[2,0],[2,2],[3,-1],[2,-1],[1,1],[0,2],[1,2],[5,1],[1,4],[1,0],[1,0],[1,2],[1,1],[1,-1],[1,-1],[1,1],[1,5],[1,0],[4,1],[6,3],[2,2],[3,1],[3,2],[5,2],[0,1],[-2,3],[-1,1],[-1,1],[1,2],[1,0],[2,0],[3,-1],[2,-1],[0,-2],[1,-2],[1,-1],[-1,-3],[2,-1],[1,-1],[2,0],[1,1],[0,1]],[[5394,8287],[-1,0],[-3,-1],[-4,1],[0,4],[0,3],[-1,2],[-1,2],[-1,1],[1,2],[5,-5],[5,-5]],[[5394,8291],[0,-2],[0,-2]],[[5313,8318],[-4,0],[-2,2],[-2,1],[1,3],[1,1],[5,-2],[1,-4],[0,-1]],[[5380,8316],[1,-4],[-1,-2],[-3,4],[-3,0],[-2,-6],[-1,0],[-5,5],[-1,2],[0,2],[1,6],[-1,2],[2,3],[0,3],[3,3],[2,0],[1,-2],[1,-2],[4,-3],[1,-1],[0,-1],[-2,-3],[0,-1],[0,-2],[3,-3]],[[5238,8335],[-1,-1],[-3,0],[-1,1],[0,2],[2,1],[1,0],[2,-1],[0,-2]],[[5270,8342],[0,-1],[4,-2],[2,-2],[2,-4],[0,-5],[-2,-4],[-2,-3],[7,1],[1,-2],[1,-2],[4,1],[11,-7],[6,4],[1,0],[2,-6],[-2,-5],[-5,-7],[1,-3],[2,-1],[5,1],[8,-4],[2,1],[6,9],[3,1],[9,2],[1,3],[4,3],[2,4],[6,7],[5,-1],[4,-2],[3,0],[4,-8],[8,-8],[8,1],[2,-8],[2,-9],[2,-3],[2,-2],[6,-2],[1,0]],[[5396,8279],[0,-2],[0,-4],[1,-4],[3,-16],[0,-4],[0,-1],[-1,-5],[-3,-5],[-2,-3],[-2,-2],[0,-3],[3,-6],[8,-8],[3,-7],[-2,-5],[0,-4],[0,-3],[1,-2],[2,-2],[1,-2],[0,-3],[0,-3],[1,-1],[0,-1],[-1,-2],[0,-5],[-1,-3],[-2,-4],[1,-3],[1,-4],[1,-3],[1,-2],[-1,-4],[0,-2],[6,-3],[0,-2],[1,-3],[2,-7],[-2,-9],[-1,-5],[-3,-8],[0,-1]],[[5211,7925],[-1,1],[-1,4],[0,5],[1,8],[1,6],[-1,3],[1,6],[3,7],[1,7],[1,8],[1,5],[3,4],[5,10],[1,1],[-1,5],[-1,0],[-2,2],[-6,2],[-5,1],[-2,1],[-3,4],[-1,0],[-2,-1],[-4,-1],[-2,0],[-1,0],[-1,0],[-1,3],[-1,1],[-2,1],[-1,0],[-1,-2],[-1,-1],[-1,0],[-4,8],[-1,2],[0,1],[-1,3],[-2,3],[-2,1],[-1,-1]],[[5176,8032],[0,4],[1,5],[0,2],[2,2],[1,2],[0,3],[0,2],[-2,1],[-3,1],[-2,2],[-1,3],[-2,3],[-1,4],[0,3],[0,2]],[[5166,8107],[2,9],[-2,2],[-1,2],[-2,0],[-1,2],[0,1],[0,1],[2,0],[1,1],[5,5],[0,1],[-1,0],[-1,1],[0,1],[0,1],[3,8],[1,3],[0,2],[0,2],[-2,4],[-1,3],[0,2],[-1,1],[-3,6],[0,3],[1,1],[3,2],[2,1],[3,-2],[2,-1],[2,2],[3,0],[6,3],[1,1],[0,2],[0,1],[-2,3],[0,1],[0,2],[1,1],[1,0],[2,2],[3,4],[1,3],[1,4],[0,3],[-1,2],[-1,1],[-1,0],[-3,0],[-2,2],[-1,2],[-1,1],[1,2],[0,1],[0,1],[0,2],[1,0],[7,0],[1,1],[0,6],[2,8],[2,5],[0,1],[0,11],[0,6]],[[5199,8253],[-1,2],[-3,3],[1,6],[1,5],[3,5],[2,2],[9,1],[11,-1],[4,-8],[-1,-5],[2,-2],[2,1],[0,4],[1,4],[1,1],[3,-3],[1,-2],[0,-7],[2,10],[-1,6],[0,7],[2,3],[1,2],[8,-2],[8,1],[3,-3],[8,-12],[2,-2],[3,-1],[-4,3],[-9,15],[-3,2],[-4,0],[-2,2],[-2,2],[0,2],[0,15],[-2,2],[-2,1],[-1,-1],[-2,0],[-1,4],[1,2],[5,2],[3,2],[0,4],[-2,3],[-2,6],[-3,6],[-1,6]],[[5240,8346],[6,0],[1,0],[8,-3],[2,-2],[2,0],[4,2],[4,0],[1,-1],[2,0]],[[5230,8339],[0,-1],[0,8],[3,9],[1,0],[-1,-2],[0,-2],[-1,-3],[0,-2],[7,-1],[-1,-1],[-7,-1],[-1,-4]],[[6201,5846],[-3,-8],[-3,-9],[-3,-12]],[[6192,5817],[-2,0],[-2,1],[-1,2],[-3,2],[-2,0],[-3,-2],[-4,-2],[-4,-1],[-3,-1],[-3,-2],[-2,1],[-3,1],[0,12],[0,13],[0,10],[0,6],[1,2],[4,8],[1,3],[4,13],[4,11],[3,8]],[[6177,5902],[0,1],[2,2],[6,-8],[1,0],[1,2],[2,9],[1,3],[1,0],[3,2],[3,3]],[[6197,5916],[0,-3],[5,-11],[2,-6],[1,-10],[-1,-6],[-1,-3],[-2,-4],[-6,-8],[-7,-5],[-4,-10],[-3,0],[0,-4],[1,0],[2,1],[4,3],[3,1],[4,0],[3,-1],[3,-4]],[[3297,6062],[-2,-1],[-1,10],[-2,7],[0,5],[1,1],[3,-3],[2,-3],[0,-9],[-1,-7]],[[5315,8345],[5,-3],[3,0],[3,-1],[0,-3],[0,-5],[-2,-1],[-3,0],[-3,-2],[-12,9],[0,7],[1,2],[5,1],[3,-4]],[[5291,8343],[-2,-1],[-2,2],[-4,4],[0,2],[2,-1],[2,-3],[2,0],[2,-2],[0,-1]],[[5348,8350],[-1,-1],[-4,1],[-5,-4],[-2,1],[1,2],[0,1],[2,1],[1,2],[0,2],[1,-1],[3,0],[2,-1],[1,-1],[1,-2]],[[5279,8345],[-3,-1],[-1,2],[-3,0],[-1,9],[0,1],[2,-1],[4,-4],[2,-5],[0,-1]],[[5298,8337],[-2,0],[-1,5],[0,1],[1,3],[2,4],[3,5],[2,6],[1,0],[-1,-6],[-4,-15],[-1,-3]],[[5419,8353],[-1,-1],[-5,2],[-6,4],[1,7],[2,4],[10,-9],[0,-3],[-1,-4]],[[5295,8387],[1,-3],[2,-7],[2,-7],[-1,-3],[1,-4],[-1,-4],[-4,-4],[-5,0],[-6,2],[-7,4],[-1,3],[-1,1],[-2,7],[0,9],[4,2],[8,4],[2,-1],[2,-2],[2,0],[4,3]],[[5351,8386],[-2,-2],[-1,0],[-1,3],[2,2],[0,2],[1,0],[1,-2],[0,-3]],[[5294,8397],[0,-1],[-2,1],[0,4],[0,3],[0,3],[0,2],[3,-5],[1,-2],[-1,-2],[-1,-3]],[[5349,8397],[0,-6],[-1,-2],[-1,-1],[-3,-1],[-2,-1],[-2,-3],[-1,-4],[1,-3],[4,-2],[0,-6],[-2,-3],[-7,-2],[0,-7],[0,-6],[0,-4],[-1,-5],[-5,-2],[-3,8],[0,3],[-1,4],[-1,3],[-1,5],[-5,2],[-2,0],[-2,-1],[-1,0],[-3,8],[0,8],[-1,4],[-1,1],[0,2],[-1,2],[-2,1],[-1,4],[2,1],[5,0],[2,0],[1,1],[4,7],[0,2],[0,2],[4,1],[2,-3],[0,-5],[0,-5],[3,-2],[1,0],[1,4],[1,2],[1,1],[0,4],[-1,3],[-1,1],[5,5],[5,4],[3,0],[3,-1],[2,-1],[2,-1],[1,-2],[-2,-4],[-1,-2],[2,-8]],[[5306,8481],[-1,-1],[-3,2],[1,3],[4,1],[3,0],[-3,-3],[-1,-2]],[[5240,8346],[0,5],[-1,3],[-1,5],[2,2],[0,10],[-1,5],[-8,5],[-6,5],[2,18],[0,4],[-2,9],[0,11],[1,16],[2,1],[2,0],[5,-3],[2,0],[2,-3],[1,-1],[2,3],[0,4],[4,7],[3,2],[2,1],[2,-2],[2,-3],[0,6],[2,12],[-4,1],[-4,-1],[-3,-8],[-3,-9],[-5,-1],[-3,-2],[-4,2],[-2,3],[0,3],[1,2],[4,8],[5,7],[5,0],[4,3],[2,0],[8,-1],[4,2],[3,3],[7,14],[4,6],[8,2],[8,7],[2,0],[-3,-5],[-1,-2],[0,-3],[2,-6],[0,-4],[0,-8],[-3,-4],[-2,-9],[-2,-1],[0,-10],[0,-3],[0,-9],[3,-4],[3,-2],[10,0],[1,-1],[1,-3],[-1,-5],[-1,-4],[-3,-3],[-3,-2],[-3,0],[-3,4],[-1,-1],[-2,-2],[-2,-12],[-2,-8],[0,-1],[-2,1],[-2,0],[-3,-2],[1,-1],[2,-3],[-1,-2],[-3,-2],[-2,-3],[-1,-2],[-3,-3],[-2,-4],[1,-4],[0,-4],[1,-5],[-1,-3],[-3,-6],[-2,-4],[3,0],[2,-1],[2,-1],[1,-2],[-1,-2],[1,-6]],[[3006,6223],[0,9],[1,4],[-1,4],[-3,5],[-2,5],[-1,5],[0,1],[3,0],[2,2],[2,5],[0,4],[0,3],[-1,4],[-1,3],[2,4],[2,5],[1,2],[0,1],[-3,6],[0,2],[1,5],[0,4],[-2,12],[0,2]],[[3006,6320],[1,1],[1,3],[1,3],[1,2],[2,1],[3,0],[5,-3],[1,0],[4,2],[4,2],[3,-2],[1,-2],[3,-3],[2,-1],[4,0],[1,0],[4,-6],[3,-2],[2,0],[3,2],[1,0],[2,-5],[1,-7],[1,-6],[2,-4],[12,2],[3,-3],[-1,-3],[-2,-1],[-5,0],[-3,0],[0,-3],[0,-2],[3,-1],[3,-1],[3,-2],[4,-1],[3,-1],[4,-1],[6,-5],[6,-11],[2,-3],[1,-3],[0,-4],[-3,-7],[-1,-3],[-2,-1],[-1,-3],[-1,-5],[-1,0],[-1,0],[-2,3],[-1,4],[-3,4],[-4,0],[-6,2],[-3,-1],[-3,0],[-4,1],[-3,0],[-4,-1],[-3,-3],[-2,-2],[-2,-3],[-1,-2],[-8,-2],[-2,3],[-3,4],[-3,0],[-4,-3],[-3,-1],[-1,-1],[-1,-2],[0,-5],[0,-3],[-5,-13],[-2,-9],[-2,-3],[-1,0],[-2,5],[-1,2],[-2,1],[-1,2],[0,4],[0,4],[-1,3],[-2,2]],[[5238,7311],[0,-3],[0,-3],[-2,-2],[-2,-2],[-2,-7],[-4,-5],[-1,-2],[1,-1],[2,-2],[1,-3],[0,-2],[-1,-11],[-1,-8],[0,-10],[0,-4],[1,-5],[1,-4],[0,-4],[-1,-10],[2,-6],[1,-6],[-3,-6],[-1,-6],[0,-9],[0,-6],[-2,-5],[-2,-4],[-2,-3],[-3,-3],[-3,-3],[-2,-9],[-6,-8],[-1,-2],[0,-6],[0,-9],[1,-6],[2,-10],[3,-11],[0,-5],[1,-2],[3,-4],[6,-4],[1,-2],[3,-8],[2,-13],[1,-9],[5,-7],[5,-6],[4,-6],[5,-6],[1,-2],[1,-13],[2,-13],[2,-14],[1,-14],[3,-17],[1,-10],[1,-11],[2,-14]],[[5264,6925],[-3,-3],[-3,-4],[2,-7],[5,-11],[2,-9],[1,-4],[2,-12],[2,-11],[0,-3],[1,-9],[-1,-23],[1,-30],[2,-15],[-3,-13],[-2,-13],[0,-6],[2,-10],[1,-8],[1,-4],[0,-12],[-1,-5],[-4,-6],[-6,-6],[-1,-6],[-1,-5],[1,-5],[4,-10],[5,-15],[6,-17],[1,-4],[0,-12],[3,-15],[2,-7],[1,-5],[2,-3],[2,-3],[1,0],[7,4],[12,-7],[11,-7],[1,-1],[2,-9],[4,-14],[3,-11],[3,-11]],[[5332,6538],[-14,-17],[-15,-18],[-14,-17],[-15,-18],[-14,-18],[-14,-17],[-15,-18],[-14,-17],[-10,-12],[-6,-10],[-7,-13],[-8,-13],[-5,-10],[-8,-13],[-3,-7],[-8,-14],[-3,-3],[-11,-4],[-10,-4],[-9,-4],[-6,-2],[-6,-3]],[[5117,6286],[-9,-3],[-6,-2],[-7,-3],[-1,0],[-1,-1],[-1,1],[-2,1],[-2,3],[-2,2],[0,3],[1,3],[1,4],[0,2],[1,2],[1,2],[0,2],[-1,3],[-1,5],[0,10],[0,3],[0,1],[-2,3],[-3,4],[-4,2],[-2,1],[-3,1],[-6,3],[-2,1],[-3,9],[-2,2],[-8,1],[-3,2],[-2,2],[-2,3],[-1,4],[0,4],[-1,2],[-9,9],[-2,3],[-1,3],[0,4],[0,5],[0,5],[-1,2],[-4,6],[-9,12],[-9,12],[-9,13],[-9,12],[-9,12],[-9,13],[-9,12],[-10,12],[-9,13],[-9,12],[-9,12],[-9,13],[-9,12],[-9,12],[-9,13],[-9,12],[-8,10],[-8,12]],[[4866,6624],[-7,8],[-6,8],[-7,8],[-4,6],[-5,6],[-6,6],[-5,7],[-5,6],[-5,6],[-5,7],[-6,6],[-5,6],[-5,7],[-5,6],[-6,7],[-5,6],[-5,6],[-5,7],[-5,6],[-6,6]],[[4758,6755],[0,12],[0,10]],[[4758,6777],[0,14],[0,12],[0,12],[0,9],[0,8],[0,4],[1,2],[3,3],[4,6],[2,3],[2,3],[7,9],[2,2],[7,10],[2,2],[4,1],[1,2],[2,4],[4,4],[2,2],[0,1],[1,0],[7,-1],[3,-1],[3,-1],[1,1],[1,1],[1,3],[1,4],[0,3],[0,2],[1,0],[1,0],[2,0],[4,0],[1,0],[5,1],[6,2],[5,3],[4,2],[4,6],[4,6],[3,10],[3,8],[5,5],[4,3],[3,1],[5,4],[5,6],[5,6],[3,1],[5,1],[1,1],[1,2],[0,4],[-1,3],[-2,1],[-1,2],[-1,0],[-1,2],[0,3],[1,3],[0,3],[0,5],[-1,4],[0,3],[0,3],[0,2],[2,2],[2,1],[2,-1],[5,1],[12,7],[1,3],[0,5],[1,4],[1,2],[1,0],[4,1],[5,2],[3,0],[6,0],[4,0],[7,-1],[5,0],[4,-1],[6,0],[1,1],[0,3],[-1,7],[1,3],[2,4],[3,4],[-1,5],[-2,3],[-4,4],[-1,1],[-3,5],[-1,5],[-2,12],[-2,6],[-1,8],[1,14],[-2,9],[0,4],[0,4],[0,8],[0,10],[-2,11],[1,4],[0,2],[0,2],[-2,3],[-1,3],[1,3],[1,4],[0,1],[-4,5],[-6,8],[-1,3],[-1,5]],[[4938,7206],[5,-1],[3,0],[7,5],[5,7],[4,4],[4,7],[3,5],[5,5],[14,11],[2,0],[4,-2],[4,1],[3,4],[3,9],[4,6],[6,5],[7,6],[5,5],[8,4],[20,3],[11,2],[7,0],[7,8],[3,3],[15,0],[7,6],[28,0],[3,-2],[3,-3],[6,-8],[3,-1],[3,1],[9,7],[9,4],[5,4],[2,7],[5,2],[2,-5],[10,-5],[6,2],[3,1],[-1,7],[6,-2],[5,-3],[5,-7],[3,-1],[6,3],[13,1]],[[2774,5013],[-1,-3],[-2,1],[-1,0],[0,3],[1,8],[0,3],[2,3],[2,2],[3,0],[2,-3],[-3,-6],[-1,0],[-1,-1],[-1,-7]],[[2488,5107],[-1,0],[-2,2],[2,4],[1,-1],[1,-1],[0,-2],[-1,-2]],[[2516,5131],[-3,-2],[-2,1],[0,1],[0,2],[1,3],[2,2],[2,4],[3,3],[1,-1],[0,-1],[0,-1],[-1,-3],[-1,-3],[-2,-5]],[[2490,5139],[-1,0],[-4,6],[0,5],[2,4],[5,2],[3,-4],[-1,-6],[-1,-5],[-2,-1],[-1,-1]],[[2460,5157],[-3,-1],[-2,2],[-1,3],[0,5],[0,1],[5,2],[2,-4],[0,-5],[-1,-3]],[[2484,5165],[-1,-2],[-6,2],[-1,3],[1,5],[1,2],[3,-2],[3,-5],[0,-3]],[[2464,5185],[2,-3],[1,-11],[6,-11],[0,-6],[0,-3],[0,-1],[3,-5],[2,-5],[-3,-10],[-7,-5],[-6,0],[-2,1],[-1,5],[-1,3],[1,4],[4,5],[5,5],[1,4],[-2,3],[-2,7],[-3,5],[-2,15],[-1,1],[-2,-2],[-1,2],[-1,1],[3,3],[0,3],[4,1],[1,-2],[1,-4]],[[2808,5256],[-2,0],[0,2],[1,3],[1,1],[0,-6]],[[2908,5178],[-1,-2],[-2,-1],[-2,0],[-3,2],[-1,0],[0,-2],[2,-3],[2,-3],[0,-4],[2,-5],[2,-5],[2,-3],[0,-2],[0,-4],[0,-3],[0,-14],[0,-1],[-1,0],[-1,0],[-1,2],[-1,1],[0,-3],[-1,-6],[-2,-14],[-1,-12],[-2,-5],[-3,-7],[-4,-9],[-6,-14],[-4,-6],[-3,-5],[-4,-6],[-5,-8],[-6,-4],[-8,-6],[-5,-4],[-4,-3],[-4,-3],[-6,-4],[-2,-4],[-4,-9],[-2,-4],[-1,-4],[0,-2],[0,-1],[1,-2],[0,-2],[-1,-1],[-1,0],[-1,1],[0,2],[-1,2],[-1,1],[-1,-1],[0,-2],[-1,-9],[0,-5],[-1,-2],[0,-4],[-1,-4],[-1,-3],[0,-3],[-1,-2],[-1,-3],[-1,-7],[-1,-5],[-1,-4],[0,-4],[1,-2],[0,-2],[-1,-3],[0,-3],[-2,-2],[-3,-4],[-1,-3],[-1,-3],[1,-3],[0,-2],[-2,-1],[-1,-2],[-1,-3],[-1,-2],[-3,2],[-2,0],[-2,2],[-2,5],[-1,4],[-2,6],[0,7],[-2,3],[-1,2],[-2,-1],[-3,0],[-1,2],[-3,3],[-3,4],[-2,1],[-2,-1],[-1,-2],[-2,-4],[-2,-2],[-1,0],[-2,2],[0,2],[1,3],[3,7],[-3,1],[-1,2],[0,3],[-1,2],[1,4],[1,2],[3,-2],[1,0],[1,3],[1,2],[1,1],[1,1],[-2,6],[0,2],[0,2],[0,3],[0,3],[0,2],[0,3],[-1,2],[0,1],[0,3],[-1,1],[-1,1]],[[2768,4989],[1,0],[4,3],[2,3],[2,3],[2,4],[1,4],[2,18],[3,11],[0,6],[-3,7],[0,11],[0,3],[0,3],[-2,-5],[1,-16],[-1,-7],[-2,-2],[-1,2],[0,11],[-1,-2],[-2,-8],[-3,-6],[-1,-2],[0,-2],[-3,2],[-2,3],[-7,13],[-4,3],[-2,4],[-1,2],[0,3],[2,2],[3,4],[0,8],[0,7],[-2,11],[1,14],[0,6],[-3,12],[2,6],[6,4],[2,3],[1,9],[2,6],[3,-2],[2,0],[-3,2],[-3,9],[0,4],[5,11],[2,3],[3,6],[2,10],[1,14],[-1,11],[-1,11],[2,3],[3,1],[3,4],[2,3],[3,0],[4,5],[7,2],[9,6],[2,5],[-1,10]],[[5949,6988],[1,-2],[1,-5]],[[5951,6981],[2,-12],[2,-10],[2,-13],[1,-5],[1,-4],[3,-14],[2,-12],[2,-10],[2,-14],[1,-5]],[[5969,6882],[-2,-3],[-3,-9],[-3,-30],[-5,-23],[0,-14],[-1,-6],[-2,-7],[-3,-7],[-5,4],[-8,12],[-4,12],[-5,8],[-5,10],[-1,8],[0,4],[-2,12],[-2,5],[-6,13],[-1,6],[-1,3],[-2,4],[-2,16],[-2,10],[-3,-3],[1,-4],[-2,-6],[-2,-7],[1,-5],[5,-9],[1,-3],[1,-8],[0,-11],[1,-4],[3,-8],[1,-5],[1,-4],[1,-4],[4,-7],[5,-13],[4,-10],[4,-4],[1,-4],[1,-12],[-1,-5],[3,-10],[1,-5],[3,-5],[2,-4],[1,-8],[2,-23],[2,-6],[8,-30],[7,-19],[3,-15],[5,-17],[9,-38],[6,-12],[2,-7],[4,-5],[4,-7],[-4,0],[-1,0],[-1,-1],[-1,-5],[0,-4],[0,-19],[1,-10],[4,-19],[3,-5],[1,-4],[2,-2],[9,-7],[5,-13],[11,-17],[2,-5],[0,-1]],[[6024,6451],[-10,0],[-9,0],[-9,0],[-9,0],[-9,0],[-9,0],[-9,0],[-9,0],[-9,0],[-10,0],[-9,0],[-9,0],[-9,0],[-9,0],[-9,0],[-9,0],[-5,0],[0,5],[1,3],[-1,3],[-1,1],[-2,-1],[-2,-11],[-2,0],[-3,0],[-11,0],[-10,0],[-11,0],[-10,0],[-11,0],[-11,0],[-10,0],[-11,0],[-10,0],[-11,0],[-11,0],[-10,0],[-11,0],[-10,0],[-11,0],[-11,0]],[[5693,6451],[0,13],[0,13],[0,13],[0,12],[0,13],[0,13],[0,13],[0,13],[0,13],[0,13],[0,13],[0,13],[0,13],[0,13],[0,13],[0,13],[0,13],[0,13],[0,12],[0,13],[0,13],[0,13],[0,13],[0,13],[0,13],[0,13],[0,13],[0,13],[0,13],[0,13],[0,13],[0,13],[0,2],[-1,9],[-2,11],[-1,14],[-1,4],[-2,14],[0,4],[0,3],[4,12],[2,6],[1,7],[0,5],[-1,9],[-2,8],[0,8],[0,8],[2,5],[3,5],[0,3],[2,3],[1,2]],[[5698,7007],[2,-7],[4,-1],[15,6],[15,-6],[9,-3],[13,-5],[8,-9],[3,-2],[5,1],[4,-6],[16,-3],[8,-6],[4,-5],[3,-1],[2,0],[4,2],[4,3],[4,5],[10,12],[3,3],[2,-1],[3,0],[1,4],[1,2],[1,3],[2,3],[5,1],[9,5],[-1,-3],[-9,-6],[4,0],[4,2],[5,1],[0,3],[1,4],[1,1],[3,-1],[9,-7],[2,0],[7,4],[1,1],[2,-3],[5,-9],[-2,0],[-5,8],[0,-4],[-3,-7],[4,-3],[3,-1],[1,-4],[1,-3],[3,1],[2,5],[-1,3],[-1,2],[1,0],[2,-2],[6,-9],[2,-2],[2,1],[5,2],[1,0],[7,3],[0,-2],[1,-3],[6,3],[8,0],[6,3],[8,7],[0,1]],[[6114,6088],[2,-3],[1,1],[0,2],[5,-4],[0,-3],[-3,0],[-3,1],[-3,0],[-3,1],[-1,5],[2,-2],[1,0],[0,1],[-1,3],[-2,1],[0,2],[1,1],[1,1],[-2,4],[3,-1],[1,-2],[1,-2],[0,-6]],[[6113,6110],[1,-5],[-3,2],[-1,1],[2,2],[0,1],[1,-1]],[[6072,6221],[8,-33],[4,-20],[3,-21],[2,-30],[2,-16],[3,-8],[3,-15],[2,0],[1,-4],[3,-14],[2,-5],[0,4],[0,3],[0,4],[0,6],[2,3],[3,-5],[2,-3],[0,-7],[1,-3],[3,-8],[3,-3],[4,0],[3,-2],[2,-3],[5,-8],[10,-7],[9,-22],[5,-15],[16,-23],[3,-10],[1,-11],[4,0],[5,-11],[2,-9],[5,-3],[1,5],[2,-5],[1,-6]],[[6177,5902],[-3,6],[-2,5],[-2,6],[-3,3],[-2,4],[-3,8],[-2,9],[-4,8],[-8,10],[-6,14],[-5,14],[-4,8],[-1,1],[-7,5],[-5,7],[-3,5],[-3,1],[-2,1],[-4,-1],[-4,3],[-2,0],[-2,1],[-2,1],[-3,-1],[-5,-3],[-2,1],[-1,3],[-1,3],[-1,2],[-2,0],[0,-2],[-5,-6],[-9,-3],[-2,0],[-2,2],[-4,11],[-1,1],[-1,0],[-2,2],[-2,2],[-2,4],[-1,2],[-2,-8],[-3,-14],[-2,-8],[-2,-10],[-1,-1],[-1,1],[-4,13],[-3,4],[-2,0],[-1,-2],[-1,-5],[-1,-2],[-1,-1],[-2,0],[-4,2],[-4,0],[-4,-3]],[[6014,6005],[-1,17],[-1,11],[0,11],[-1,11],[3,7],[1,7],[3,21],[2,4],[2,11],[0,3],[3,14],[0,10],[-1,9],[1,6],[2,4],[0,4],[0,9],[0,2],[2,1],[3,-2],[2,1],[3,0],[2,1],[1,2],[1,11],[1,2],[1,0],[2,2],[2,3],[2,2],[0,1],[2,0],[2,1],[1,2],[2,1],[2,-1],[1,2],[1,0],[1,0],[1,2],[0,1],[1,2],[2,2],[0,2],[1,2],[0,2],[1,2],[2,7],[3,4]],[[4503,6786],[-3,-10],[-3,4],[-1,1],[-1,2],[3,0],[4,5],[1,-2]],[[4572,6805],[0,-4],[0,-5],[0,-7],[-1,-3],[-4,-4],[-2,1],[-2,1],[-3,6],[0,6],[3,4],[1,5],[6,-1],[1,1],[0,1],[1,-1]],[[4522,6798],[-1,-1],[-1,2],[-2,4],[1,4],[1,1],[1,0],[3,-2],[0,-3],[1,-2],[-3,-3]],[[4546,6818],[-3,-13],[-2,-5],[-1,-2],[-3,-1],[-4,8],[-2,8],[-1,3],[2,2],[2,0],[6,2],[1,0],[5,9],[6,1],[0,-3],[-6,-9]],[[4605,6806],[-4,-6],[-3,1],[-1,1],[4,2],[3,5],[2,11],[4,12],[1,5],[1,2],[2,0],[1,0],[0,-3],[0,-6],[-1,-10],[-1,-9],[-8,-5]],[[4504,6825],[-1,0],[0,4],[-3,11],[2,5],[3,0],[2,-3],[0,-4],[-1,-2],[1,-4],[-1,-3],[-2,-4]],[[4619,6849],[-2,-4],[-2,2],[1,8],[1,2],[3,4],[4,1],[1,4],[1,2],[1,-2],[-1,-3],[-1,-8],[-2,-3],[-4,-3]],[[5044,7411],[-1,-1],[-2,1],[-2,0],[-1,3],[1,1],[0,2],[2,-3],[3,-1],[0,-2]],[[5040,7425],[-1,-3],[-5,1],[-1,2],[1,4],[2,0],[0,3],[1,3],[6,2],[1,-2],[1,-3],[-4,-6],[-1,-1]],[[5087,7476],[3,-2],[2,1],[2,0],[1,-1],[1,-4],[-2,-4],[-1,-4],[-2,-4],[-1,-6],[-3,-3],[-2,-2],[-5,4],[-3,1],[-1,2],[0,6],[-1,1],[-2,1],[-2,-1],[-2,-3],[-1,3],[-2,0],[-1,2],[0,2],[12,14],[3,3],[7,4],[1,-1],[-1,-2],[0,-1],[1,-1],[0,-1],[-1,-2],[0,-2]],[[5119,7479],[-1,-1],[-8,7],[-3,0],[-1,1],[0,4],[1,1],[5,1],[5,-2],[2,-7],[1,-1],[-1,-3]],[[4950,7684],[0,-2],[1,-3],[1,-1],[2,-1],[2,0],[3,-1],[1,-2],[0,-2],[0,-3],[-1,-2],[-1,-2],[1,-1],[1,-1],[1,-1],[0,1],[1,1],[1,2],[0,-1],[1,-1],[3,-2],[7,-4],[2,0],[2,-1],[1,-2],[4,-6],[1,0],[2,0],[2,0],[2,2],[1,-1],[1,-1],[2,-1],[2,-2],[1,-3],[1,0],[7,1],[2,-1],[1,0],[2,0],[4,-1],[3,1],[1,6],[0,2],[1,1],[2,-1],[7,-3],[2,-2],[3,-2],[2,0],[2,-1],[2,-6]],[[5047,7632],[4,-3],[2,-2],[1,-1],[1,-2],[1,-1],[2,2],[3,2],[4,-2],[6,-2],[2,0],[0,1],[1,2],[1,0],[1,1],[2,1],[2,1],[2,1],[2,-1],[3,-1],[2,0]],[[5089,7628],[0,-4],[2,-1],[0,-3],[-2,-2],[-2,0],[0,-6],[1,-1],[1,-2],[0,-1],[1,-8],[-3,-5],[-4,-5],[-19,-18],[-5,-8],[-2,-2],[-14,-5],[-10,-6],[-5,-2],[-6,-10],[-3,-4],[3,-1],[2,-5],[-1,-2],[-3,-3],[-2,-1],[-1,1],[-1,-1],[-6,-17],[-6,-12],[-3,-5],[-4,-8],[-7,-21],[0,-6],[4,-20],[2,-6],[3,-4],[5,-4],[1,-4],[-2,-3],[-5,-7],[-9,-8],[-4,-7],[-1,-7],[-2,-3],[-1,-9],[-2,-6],[0,-2],[-2,-5],[0,-3],[2,-5],[-1,-2],[-1,-1],[-4,0],[-10,-1],[-9,-10],[-4,-9],[-4,-16],[-5,-10],[-2,-2],[-4,5],[-4,0],[-4,-1],[-2,-4],[-3,-1],[-3,1],[-7,1],[-3,0],[-5,-3],[-4,2],[-7,1],[-15,-2],[-2,-1],[-2,-4],[-4,-7],[-8,-1],[-6,-4],[-2,-3],[-3,-8],[0,-6],[-1,0],[-1,1],[-1,0],[0,-4],[-3,-2],[-2,-1],[-5,3],[-4,6],[-2,0],[-4,9],[-1,5],[-2,6],[1,2],[-1,2],[-3,2],[-1,5],[3,7],[2,3],[1,1],[-3,0],[-2,-5],[-3,7],[-11,14],[1,3],[0,2],[-2,-4],[-1,-1],[-6,1],[-6,-2]],[[4794,7325],[-2,15],[-1,5],[0,4],[2,8],[2,3],[2,7],[3,6],[3,1],[1,1],[2,5],[0,3],[0,1],[-4,-1],[-6,16],[0,2],[1,4],[0,5],[0,4],[2,3],[3,3],[2,5],[1,4],[0,4],[-1,3],[-4,2],[-3,12],[-1,7],[-1,1],[-2,3],[-2,6],[-1,1],[2,1],[10,0],[2,2],[2,5],[2,8],[0,5],[-1,2],[-3,5],[0,1],[1,3],[2,2],[2,3],[1,2],[0,2],[-1,2],[0,2],[1,3],[0,7],[0,2],[0,8],[-1,5],[-2,8],[0,2],[1,1],[3,3],[3,6],[3,5],[5,4],[3,5],[1,3],[1,1],[0,2],[-1,2],[-2,2],[-2,2],[-3,0],[-1,0],[-1,2],[1,5],[-1,5],[0,2],[-1,2],[-3,-1],[-2,2],[-1,0],[-1,-1],[-5,0],[-2,1],[-1,1],[-1,-1],[0,-1],[0,-1],[-1,-2],[-1,-2],[-4,-2],[-3,0],[-3,2],[-1,1],[-1,1],[-6,-2],[0,1],[-2,-2],[-3,-2],[-2,0],[-1,1],[0,1],[-1,3],[0,2],[3,5],[-1,1],[-1,2],[0,2],[-1,2],[-1,0],[-2,-1],[-6,-3],[-1,-1],[-3,-3],[-2,-3]],[[4756,7600],[-2,-1],[-1,1],[0,9],[3,6],[2,4],[-1,0],[-2,0],[0,3],[1,2],[1,3],[-1,1],[-1,2],[0,5],[0,2],[0,3],[-5,-3],[-1,0],[0,4],[2,6],[1,2],[-4,1],[-2,3],[-1,2],[-2,4],[0,4],[2,8],[2,2],[2,1],[4,6],[6,-1],[3,1],[4,3],[1,0],[3,3],[0,3],[-1,3],[1,2],[3,3],[4,4],[4,0],[5,4],[3,-3],[2,1],[3,-2],[4,-6],[5,-3],[5,2],[8,1],[4,-1],[7,1],[4,0],[6,3],[5,-4],[10,-2],[6,-3],[16,-5],[6,0],[8,3],[3,2],[4,-1],[4,2],[3,0],[3,-3],[10,-5],[3,4],[2,1],[7,-3],[8,-5],[3,0],[6,1],[5,4],[1,0]],[[5628,8560],[2,-1],[1,0],[2,1],[4,-1],[9,-7],[1,-2],[-5,0],[-1,-3],[-2,-1],[-1,-1],[-3,-3],[-3,-2],[-1,-2],[-7,0],[-3,-1],[-3,-3],[-1,-7],[-2,-4],[-2,-2],[-3,0],[0,1],[0,2],[5,7],[1,2],[-3,1],[-1,3],[-5,3],[0,2],[1,0],[0,1],[2,2],[0,2],[-3,6],[1,1],[3,0],[2,-2],[2,2],[1,1],[2,-1],[2,4],[4,1],[2,2],[2,-1]],[[5648,8556],[-2,0],[-6,4],[1,2],[2,2],[5,-2],[0,-4],[0,-2]],[[5636,8572],[-2,-3],[-1,1],[-1,2],[-3,-7],[-3,-1],[-2,2],[0,2],[-2,6],[-3,2],[-4,0],[-3,3],[11,2],[2,3],[2,3],[2,0],[1,-1],[0,-2],[1,-1],[5,-1],[2,-5],[1,-4],[-3,-1]],[[5778,8610],[1,-2],[2,-3],[0,-1],[0,-1],[-2,-1],[-1,-1],[0,-2],[-3,0],[-1,-1],[-1,-5],[-3,-8],[-3,-6],[-3,-3],[-2,-3],[-1,-3],[0,-3],[3,-17],[0,-4],[-1,-3],[0,-3],[0,-3],[2,-5],[2,-7],[1,-4],[1,-2],[2,-1],[0,-1],[0,-1],[-1,-1],[-6,-2],[0,-2],[-1,-2],[-2,-4],[-1,-3],[-1,-3],[0,-2]],[[5759,8497],[-4,1],[-5,2],[-2,2],[-1,0],[-3,-1],[-8,-4],[-2,1],[-4,4],[-2,3],[-6,7],[0,2],[-1,1],[-5,2],[-2,3],[-2,0],[-2,1],[-7,6],[-1,0],[-1,-1],[0,-1],[0,-1],[-1,0],[-1,2],[-2,2],[-6,-3],[-2,-1],[-1,0],[-9,-5],[-3,-2],[-1,0]],[[5675,8517],[0,2],[4,12],[1,9],[1,1],[0,1],[0,3],[-4,2],[-2,-1],[-1,-3],[-1,-2],[-4,-1],[-3,2],[-6,3],[-2,4],[0,5],[-4,4],[-2,4],[1,4],[3,2],[1,2],[-4,0],[-1,0],[0,2],[-2,6],[2,2],[1,2],[-2,2],[1,2],[1,2],[-1,5],[4,3],[4,2],[8,1],[0,5],[3,0],[6,5],[5,-1],[8,4],[16,0],[2,2],[0,3],[0,2],[3,-1],[5,1],[18,-5],[5,0],[6,-5],[4,-1],[10,0],[15,-2],[3,3],[1,1]],[[6192,5817],[-1,-2],[-1,-3],[-1,-3],[-2,-4],[-3,-9],[0,-2],[1,-2],[1,-4],[2,-7],[1,-6],[0,-4],[2,-3],[3,-7],[2,-5],[3,-3],[1,-6],[2,-10],[3,-7],[2,-6],[3,-2],[1,0],[6,-11],[4,-8],[1,-2],[8,-5],[9,-6],[7,-5],[10,-6],[9,-7],[8,-6],[12,-8],[10,-7],[8,-5],[1,-2],[9,0],[10,0],[9,0]],[[6332,5644],[-7,-13],[-7,-16],[-9,-16],[-5,-11],[-8,-16],[-7,-14],[-7,-15],[-7,-14],[-8,-19],[-5,-12],[-9,-19],[-5,-12],[-1,-1],[-8,1],[-7,1],[-10,1],[-1,0],[-2,-1],[-2,-1],[-7,-4],[-1,0],[-6,-6],[-6,-6],[-3,-4],[-2,-7],[-1,-5],[-1,-2],[-2,-2],[-12,-5],[-4,0],[-5,-4],[-3,-6],[-1,-3]],[[6163,5413],[-4,0],[-7,-1],[-3,-1],[-2,0],[-3,0],[-2,1],[-1,2],[-2,4],[-4,7],[-3,5],[-7,-6],[-6,-5],[-8,-8],[-5,-5],[-1,-6],[-4,-10],[-3,-6],[-2,-1],[-7,1],[-3,1],[-4,2],[-6,2],[-4,2],[-5,0],[-6,1],[-4,2],[-4,6],[-5,6],[-5,7],[-5,8],[-7,8],[-6,9],[-2,1],[-1,0],[-7,0],[-8,1],[-5,0],[-2,1],[-1,2],[-2,7],[-2,5],[-2,6],[0,8],[0,9],[1,3],[0,3],[0,4],[-2,4],[-7,4],[-2,0],[-1,-2],[-1,-1],[-1,1],[-1,2],[0,2],[0,2]],[[5979,5500],[0,1],[-3,4],[-2,6],[-1,5],[-2,5],[-1,11],[-1,7],[-2,8],[-2,15],[-1,5],[-2,4],[-3,3],[-2,7],[-5,6],[-3,5],[-3,8],[-1,4],[-1,4],[-1,4],[-2,4],[-6,10],[-2,1],[-3,1],[-3,1],[-5,2],[-4,3],[-2,3],[0,2],[0,3],[2,5],[3,12],[2,8],[1,3],[3,0],[4,0],[3,0],[4,-1],[5,1],[1,3],[2,3],[0,2],[1,6],[0,4],[-1,17],[0,10],[0,11],[0,3]],[[5946,5729],[0,3],[1,12],[1,7],[1,4],[3,12],[0,4],[1,3],[-1,16],[1,8],[3,7],[2,3],[2,2],[1,0],[2,-4],[2,-3],[2,1],[1,2],[2,4],[0,5],[1,12],[0,6],[1,9],[1,11],[1,7],[1,4],[4,9],[3,11],[2,8],[4,14],[2,5],[2,2],[2,1],[5,2],[3,1],[1,2],[0,2],[0,6],[1,11],[1,10],[2,8],[1,3],[1,4],[1,6],[2,12],[0,9],[2,15]],[[5600,8646],[-2,-1],[-2,2],[1,1],[2,2],[1,-1],[1,-1],[-1,-2]],[[5606,8648],[-3,-2],[-1,0],[0,4],[2,1],[3,0],[-1,-3]],[[5615,8661],[4,-1],[1,0],[2,-3],[-3,-2],[0,-2],[1,-2],[1,-2],[-3,0],[-2,2],[0,2],[-2,2],[-1,1],[1,2],[0,2],[1,1]],[[5610,8659],[-2,0],[-2,3],[-1,1],[1,0],[0,3],[0,1],[2,-2],[1,-2],[-1,-1],[2,-2],[0,-1]],[[5595,8670],[0,-2],[-2,0],[-2,-1],[-1,3],[-1,4],[0,1],[1,1],[1,-2],[4,-4]],[[5589,8826],[0,-1],[2,1],[2,2],[2,-1],[-1,-3],[-1,0],[-1,-1],[-1,-1],[-1,-1],[-3,3],[-2,4],[4,0],[0,-1],[0,-1]],[[5690,8927],[-4,-2],[-4,1],[0,4],[2,2],[4,1],[5,-2],[1,-1],[-3,-1],[-1,-2]],[[5804,9159],[-2,0],[-6,-3],[-3,-2],[-4,-1],[1,-2],[7,-1],[1,0],[1,-1],[0,-2],[-1,-2],[-7,-14],[-1,-2],[3,-8],[3,-10],[11,-4],[8,-3],[5,-8],[8,-10],[4,-3],[0,-2],[-1,-7],[-5,-7],[-5,-5],[-5,-8],[-4,-6],[-5,-7],[0,-2],[0,-2],[1,-3],[5,-9],[2,-4],[3,-5],[2,-5],[1,-5],[3,-5],[1,-2],[2,-4],[3,-4],[1,-4],[4,-14],[1,-3],[-1,-3],[-1,-1],[-5,0],[-4,-2],[3,-4],[-3,-5],[0,-8],[-3,-4],[0,-1],[0,-1],[5,-2],[1,-1],[0,-2],[0,-2],[-3,-2],[-3,-2],[0,-2],[0,-2],[1,-3],[1,-4],[3,-3],[8,-2],[1,-2],[0,-2],[0,-3],[-4,-5],[0,-2],[2,-4],[2,-5],[8,-5],[2,-2],[1,-2],[0,-4],[0,-3],[0,-4],[-3,-4],[-5,-8],[-6,-3],[0,-1],[1,-3],[10,-10],[7,-5],[9,-7],[6,-6],[1,-3],[3,-5],[3,-3],[2,-3],[0,-2],[0,-2],[-2,-6],[-2,-5],[-3,-7],[-2,-5],[-7,-9],[-11,-12],[-2,-3],[-5,-6],[-8,-12],[-2,-3],[-7,-9],[-3,-3],[-2,-3],[-7,-9],[-7,-7],[-7,-6],[-2,-4],[-3,-2],[-3,-2],[-1,-2],[-8,-8],[-9,-12]],[[5772,8671],[-1,-1],[-3,-2],[-4,0],[-2,-2],[-6,5],[-1,0],[-3,-1],[-4,-3],[-6,-1],[-3,-1],[-2,-2],[-1,4],[1,4],[1,3],[0,2],[-1,0],[-2,-5],[-1,-4],[-2,-3],[-5,-1],[-4,4],[-3,0],[2,-3],[1,-3],[0,-2],[-3,1],[-3,-2],[-2,-3],[-1,0],[-2,4],[-3,-2],[-2,-2],[-6,-1],[-3,-3],[-5,-2],[-3,0],[-7,-3],[-3,-4],[-2,-1],[-2,1],[-9,-2],[-9,-2],[-3,0],[-4,1],[-4,-4],[-4,-4],[-4,-2],[-2,1],[2,2],[3,3],[2,3],[0,3],[-2,1],[-1,0],[-3,3],[-2,7],[-1,0],[-1,-2],[-1,-4],[0,-2],[-2,-1],[-1,-1],[-1,-1],[-6,0],[0,3],[0,1],[1,3],[-1,1],[1,2],[1,0],[1,1],[1,1],[0,1],[-2,1],[0,1],[2,4],[0,2],[-1,0],[-1,-1],[-7,2],[-9,6],[-2,0],[-2,5],[-2,-1],[-3,-3],[-3,3],[-2,1],[-1,2],[0,4],[0,4],[-1,5],[0,6],[0,6],[2,4],[1,2],[1,7],[0,7],[0,3],[0,1],[1,0],[0,2],[-1,0],[0,2],[0,1],[2,0],[0,1],[1,0],[-2,5],[0,2],[-2,6],[-3,6],[-3,4],[1,7],[2,7],[-1,3],[0,4],[-5,4],[0,6],[-1,6],[0,4],[1,3],[1,2],[7,10],[1,4],[5,1],[-2,4],[-1,2],[0,3],[7,2],[3,-1],[6,2],[5,3],[0,2],[-1,2],[-1,4],[1,1],[2,-1],[-1,2],[0,2],[3,-1],[3,5],[0,4],[7,2],[7,8],[3,2],[3,2],[7,8],[3,0],[1,6],[6,7],[2,1],[3,6],[7,8],[4,9],[3,4],[1,3],[2,1],[3,2],[5,2],[6,0],[2,-2],[2,1],[0,3],[-2,2],[1,2],[3,1],[0,3],[-1,2],[-2,3],[1,6],[0,6],[2,7],[-3,4],[-12,7],[-2,0],[-2,0],[-3,5],[1,5],[1,1],[-1,0],[-2,-2],[-4,-2],[-4,1],[-3,0]],[[5670,8974],[-3,11],[-1,4],[-2,5],[-5,2],[-1,2],[0,2],[0,3],[-1,4],[0,4],[1,2],[2,1],[2,5],[1,2],[0,5],[1,4],[2,2],[-1,2],[-1,2],[-2,3],[-3,4],[-2,4],[-1,3],[0,3],[0,3],[1,2],[2,3],[1,1],[-1,5],[-2,1],[-4,1],[-2,0],[0,1],[0,3],[1,2],[1,2],[0,1],[-1,5],[0,6],[0,4],[4,4],[0,1],[-4,3],[-4,5],[-1,2],[-4,0],[-2,7],[-3,4],[-4,3],[-2,1],[-11,4],[-5,1],[-6,2],[-4,4],[-3,2],[-3,2],[-4,2],[-1,2],[-5,4],[-2,2],[-7,5],[-1,2],[0,1],[0,1],[-8,3]],[[5572,9160],[2,2],[6,0],[5,-2],[1,1],[0,2],[-2,6],[1,1],[2,2],[3,2],[6,0],[3,0],[1,0],[6,-7],[4,-7],[3,-2],[6,-8],[2,-5],[1,-3],[2,0],[9,-1],[7,-2],[2,-1],[5,0],[4,2],[7,2],[2,2],[2,3],[4,-1],[4,-2],[5,-3],[5,-1],[6,-2],[2,-3],[4,0],[4,2],[3,8],[2,3],[3,2],[3,1],[3,1],[2,1],[3,5],[0,4],[0,9],[0,3],[2,5],[4,13],[1,4],[2,2],[2,1],[4,4],[6,8],[2,0],[4,1],[6,0],[4,-2],[1,0],[2,1],[4,2],[7,5],[4,1],[4,0],[5,-5],[6,-6],[4,-3],[10,-5],[10,-3],[5,-12],[-2,-4],[-2,-2],[-4,-4],[-5,-7],[-1,-3],[2,-3],[2,-3]],[[9850,3934],[-1,0],[0,1],[0,1],[1,-1],[0,-1]],[[36,3993],[-1,0],[0,1],[0,1],[1,-1],[0,-1]],[[41,4080],[-1,-1],[0,1],[-1,1],[0,1],[0,1],[1,0],[0,-1],[0,-1],[1,-1]],[[9957,4091],[0,-3],[-4,-1],[-1,2],[-1,0],[-2,-3],[0,-2],[0,-1],[-1,-1],[-4,-1],[-2,1],[1,2],[2,2],[1,0],[2,2],[1,3],[2,1],[2,1],[2,-1],[2,-1]],[[6,4093],[0,-2],[-1,0],[0,1],[-1,0],[0,-1],[0,-1],[0,-1],[0,1],[0,1],[0,2],[1,1],[1,-1]],[[34,4134],[0,-2],[-1,2],[-1,1],[2,1],[0,-2]],[[9981,4141],[-3,4],[0,2],[1,2],[1,1],[1,-2],[0,-5],[0,-2]],[[28,4148],[-1,0],[-1,1],[0,1],[0,2],[2,-2],[0,-2]],[[49,4150],[-2,-1],[-1,3],[1,2],[1,0],[0,-3],[1,-1]],[[9966,4163],[-1,-1],[-1,3],[1,4],[2,0],[0,-4],[-1,-2]],[[9951,4183],[0,-2],[1,-1],[1,-1],[2,-4],[3,-5],[2,-3],[0,-3],[-1,-3],[1,-5],[1,-5],[1,-9],[-2,-1],[-3,0],[-1,-2],[-1,1],[-2,-1],[-3,-3],[-2,-3],[-3,0],[-3,-1],[-3,0],[-2,2],[-4,3],[-5,1],[-2,2],[-1,3],[-2,6],[0,3],[0,3],[1,1],[2,1],[0,2],[0,2],[1,0],[0,1],[0,3],[0,3],[3,6],[3,4],[5,4],[4,0],[5,3],[2,2],[1,-1],[1,-3]],[[9983,4184],[-1,-2],[0,8],[1,0],[0,-1],[1,-2],[-1,-3]],[[29,4189],[-1,-2],[0,1],[0,3],[1,1],[-2,2],[0,1],[1,1],[1,-2],[1,-1],[0,-1],[0,-2],[-1,-1]],[[9922,4196],[-1,-1],[1,5],[0,1],[1,1],[1,0],[-1,-3],[-1,-3]],[[9999,4207],[-2,-2],[-1,2],[1,5],[-9997,5],[9999,-10]],[[0,4217],[3,5],[1,1],[1,-5],[-1,-5],[-3,-4],[-1,-2],[0,10]],[[9999,4231],[0,1],[-9999,2],[2,3],[1,0],[-1,-2],[0,-2],[-2,-2],[9999,0]],[[9999,4253],[-4,-8],[-2,-4],[-1,-4],[-4,-5],[-1,-6],[0,-7],[4,7],[4,5],[1,1],[1,0],[0,-2],[-1,-1],[0,-5],[1,-5],[-3,1],[-3,-1],[-3,-2],[-4,-1],[-1,0],[-1,1],[-1,1],[-1,3],[-3,0],[-4,-6],[-2,-5],[-1,0],[-2,1],[-2,-4],[-3,-1],[-1,3],[-1,4],[-1,3],[-3,1],[1,3],[1,2],[0,2],[1,2],[1,-1],[2,-1],[1,2],[2,0],[2,5],[2,3],[4,3],[3,2],[2,0],[2,1],[3,5],[3,3],[2,1],[2,1],[2,-1],[2,1],[-9995,3],[1,2],[1,0],[-1,-1],[-1,-1],[9999,0]],[[9919,4464],[-1,-1],[-2,0],[0,1],[0,1],[2,0],[1,0],[0,-1]],[[3342,2175],[-2,-1],[0,1],[-1,2],[0,3],[0,1],[1,0],[2,-3],[0,-3]],[[3376,2188],[1,-5],[-3,2],[0,2],[1,2],[1,0],[0,-1]],[[3305,2201],[2,-1],[2,1],[-1,-6],[-1,-3],[-3,0],[-2,4],[-1,2],[3,1],[1,2]],[[3325,2220],[4,-1],[4,4],[2,1],[2,-1],[2,-2],[2,0],[6,2],[1,0],[2,3],[2,-2],[1,-2],[0,-3],[-2,-2],[-1,-3],[-1,-2],[-3,-2],[-1,-3],[-4,-7],[-6,-10],[-2,0],[-4,-1],[-1,1],[-2,-1],[-1,-5],[-2,-3],[-1,-1],[-2,-1],[-1,-2],[-5,1],[-4,2],[-4,5],[6,7],[5,-1],[4,5],[3,2],[1,2],[1,2],[0,2],[-1,1],[-1,0],[-2,-1],[-3,-1],[-2,2],[1,1],[2,0],[5,2],[1,1],[-1,4],[-4,2],[-2,3],[-1,2],[1,2],[-2,4],[2,0],[2,-3],[4,-3]],[[3330,2223],[-4,0],[-1,2],[0,5],[3,1],[3,-2],[0,-2],[-1,-4]],[[3365,2231],[4,-4],[5,2],[3,-1],[1,-3],[-1,-3],[-1,1],[-2,-1],[0,-4],[1,-1],[6,-4],[1,0],[0,2],[-1,2],[0,3],[0,2],[2,1],[6,1],[2,-1],[3,-7],[-3,0],[-1,-3],[2,-2],[2,-1],[-1,-3],[0,-2],[-5,-2],[-4,-1],[-1,-3],[-4,-2],[-9,-5],[1,-3],[0,-2],[-1,-4],[-13,5],[-2,0],[4,-9],[-3,-2],[-2,1],[-3,-1],[-1,-6],[-4,4],[-3,6],[0,3],[3,6],[-1,3],[7,8],[2,3],[2,1],[2,1],[1,1],[0,2],[-1,3],[0,6],[6,8],[-1,5],[2,0]],[[6549,3955],[-4,-2],[-2,1],[-6,4],[-1,4],[-2,9],[0,3],[2,6],[4,2],[4,-1],[2,-1],[2,-7],[2,-7],[0,-8],[-1,-3]],[[6254,4436],[-1,0],[-1,1],[-1,4],[1,4],[0,2],[-1,5],[1,3],[1,-3],[1,0],[2,-3],[-1,-4],[0,-1],[-1,-4],[0,-4]],[[3483,5318],[1,1],[1,0],[1,4],[2,3],[5,14],[1,6],[0,3],[1,7],[-1,9],[0,2],[4,10],[1,5],[0,5],[1,4],[-1,1],[0,1],[-2,4],[0,4],[-3,4],[-1,3],[-3,9],[0,5],[-1,2],[0,2],[0,2],[-1,6],[-1,5],[0,3],[1,6],[-1,6],[0,3],[-1,5],[1,5],[0,2],[0,4],[3,10],[3,5],[2,4]],[[3495,5492],[2,4],[3,15],[2,5],[2,1],[11,-13],[5,-1],[10,-7],[4,-8],[9,-15],[4,-5],[0,-3],[-1,-6],[3,5],[5,-8],[1,-5],[1,-7],[0,-5],[-1,-3],[0,-2],[1,3],[1,2],[0,5],[2,7],[1,0],[1,-4],[3,-16],[0,-4],[1,-5],[0,-2],[0,-2]],[[3310,6019],[0,-4],[-1,0],[-1,2],[-5,0],[0,3],[0,1],[2,4],[-3,1],[-1,2],[-2,9],[0,2],[1,1],[2,1],[2,-3],[3,-4],[0,-1],[0,-3],[1,-3],[1,-1],[1,-7]],[[3299,6099],[-2,0],[-1,4],[2,2],[0,1],[1,-3],[1,-2],[-1,-2]],[[3289,6106],[-2,-3],[-1,1],[-2,5],[-1,14],[1,2],[0,1],[3,-2],[2,-2],[1,-1],[-1,-3],[1,-10],[-1,-2]],[[3296,6119],[-3,-1],[-2,1],[-1,4],[1,3],[0,4],[0,3],[1,2],[2,-3],[0,-3],[1,-3],[5,-6],[-4,-1]],[[5263,7649],[-1,-8],[1,-3],[1,-1],[0,-2],[1,-23],[0,-2],[-4,-9],[0,-2],[-1,-12],[0,-3],[-1,-3],[-2,-9],[-2,-4],[-5,5],[-3,2],[-2,3],[-1,1],[1,2],[1,3],[0,2],[-3,2],[-1,1],[0,3],[1,3],[-1,4],[-2,-1],[-1,1],[0,2],[1,2],[1,2],[0,3],[-1,2],[-2,2],[-1,4],[2,2],[1,1],[-1,4],[-1,0],[-1,1],[1,1],[1,3],[3,7],[2,3],[5,2],[2,1],[1,3],[1,1],[2,0],[2,-1],[0,-1],[1,1],[1,3],[-1,3],[1,7],[1,5],[1,0],[1,-3],[0,-2],[1,-5],[0,-3]],[[4967,7828],[-1,-5],[-2,4],[-3,4],[0,4],[0,1],[3,-3],[3,-5]],[[5160,8037],[1,-2],[2,-1],[1,0],[1,-2],[1,0],[2,0],[1,2],[2,1],[2,0],[1,-1],[2,-2]],[[5195,7829],[-3,-3],[-4,-3],[0,-2],[0,-3],[1,-1],[2,-3],[2,-5],[1,-4],[3,-5],[1,-1],[0,-1],[-1,-2],[-1,-6],[-1,-1],[-2,-1],[-3,-4],[-2,0],[-3,0],[-1,-1],[0,-3],[1,-3],[1,-3],[1,-3],[1,-2],[3,-1],[1,0],[1,-1],[1,-1],[1,-7],[-1,-1],[-1,-1],[-1,-2],[-2,-4],[0,-3],[1,-3],[0,-2],[-1,-2],[1,-4],[2,-3],[5,-4],[5,-4],[1,-1],[7,3],[1,0],[0,-3],[1,-2],[-1,-3],[-2,-4],[-2,-3],[-1,-3],[1,-2],[0,-3]],[[5208,7705],[-2,-1]],[[5206,7704],[-1,1],[-1,-1],[0,-1]],[[5204,7703],[-3,-2],[-2,-3],[-9,-12],[-4,-4],[-1,-2],[-1,-4],[-2,-4],[-2,-2],[-5,-1],[-6,-4],[-2,1],[-6,0],[-4,5],[-7,3],[-3,6],[-3,1],[-2,0],[-2,1],[0,2],[0,2],[-2,-1],[-2,0],[-1,-1],[-1,-1],[-1,1],[-1,0],[1,-2],[-3,0],[-2,1],[-6,3],[-1,1],[-4,1],[-2,2],[-1,3],[-1,1],[-1,1],[-4,-2],[-1,-3],[-2,-3],[-15,-15],[-3,-7],[-3,-9],[0,-5],[1,-14],[3,-8],[1,-1]],[[4950,7684],[4,2],[4,7],[4,26],[3,31],[2,6],[3,2],[-3,4],[-1,-2],[0,-2],[-1,-1],[1,28],[2,10],[1,11],[4,-4],[4,-4],[1,-4],[2,-13],[2,-3],[2,-2],[-1,3],[-1,2],[-3,17],[-1,5],[-3,4],[-8,8],[-1,2],[0,3],[3,0],[2,-2],[0,2],[-1,2],[-1,7],[-1,16],[0,3],[0,3],[-3,1],[-2,0],[-2,1],[-11,10],[-4,10],[-4,7],[-1,3],[0,3],[2,7],[-1,4],[-2,1],[-2,2],[2,4],[1,2],[2,1],[3,-1],[3,-2],[2,-1],[-6,6],[-11,-2],[-2,1],[-2,1],[-1,4],[2,2],[1,3],[-1,2],[-2,1],[-4,0],[-2,0],[-1,1],[2,4],[-2,1],[-2,-1],[-3,0],[-3,1],[-2,4],[-2,0],[-1,-1],[-2,2],[-2,0],[-1,0],[-2,2],[-11,5],[-5,1],[-4,-2],[-2,0],[-2,3],[-1,6],[-7,4],[1,2],[3,1],[4,2],[1,2],[-3,3],[-2,1],[-1,1],[-1,2],[2,1],[1,0],[2,-1],[5,1],[-2,3],[-2,0],[-1,1],[-3,0],[-2,-1],[-4,0],[0,3],[-1,2],[1,6],[6,4],[13,5],[5,0],[4,0],[5,4],[2,2],[7,2],[6,-3],[6,-11],[3,-4],[7,7],[10,0],[2,-4],[1,3],[2,4],[1,-2],[1,-2],[11,0],[1,1],[-3,3],[-2,6],[0,23],[-3,6],[-4,10],[-1,6],[-1,2],[1,4],[4,-1],[3,0],[7,2],[3,-2],[-1,-4],[1,-6],[1,-3],[2,-4],[5,1],[5,-2],[7,0],[10,-4],[4,2],[4,4],[8,3],[1,1],[-5,0],[-4,2],[0,3],[0,3],[2,6],[12,9],[8,3],[9,5],[5,5],[3,7],[1,1],[1,1],[-1,3],[0,25],[1,5],[2,4],[3,3],[4,3],[14,4],[3,2]],[[4813,8723],[1,-2],[-1,0],[-2,2],[-3,5],[-1,4],[0,2],[1,0],[0,-2],[3,-1],[1,-1],[0,-2],[1,-2],[0,-3]],[[4816,8744],[-1,-2],[-1,0],[-2,2],[-2,2],[-1,1],[-1,2],[1,0],[2,0],[3,-2],[1,-2],[1,-1]],[[4800,8763],[2,-2],[1,-2],[-1,-1],[-2,-1],[-2,1],[-3,1],[-2,4],[3,0],[3,1],[1,-1]],[[4815,8768],[0,-8],[-1,0],[-3,2],[-1,1],[0,-1],[0,-2],[3,-6],[0,-1],[0,-1],[-3,2],[-5,6],[-5,11],[6,2],[5,-3],[4,-2]],[[4822,8770],[-2,-4],[-2,0],[0,1],[-1,1],[1,3],[-1,4],[3,-3],[2,-2]],[[9526,5491],[1,-3],[-2,1],[0,1],[1,1]],[[9397,5576],[-2,-1],[-2,1],[-1,4],[0,1],[0,3],[1,2],[3,-2],[1,-3],[0,-2],[0,-3]],[[9212,5607],[-1,-1],[-1,0],[-1,1],[1,0],[0,1],[0,1],[1,0],[1,-1],[0,-1]],[[9218,5612],[-1,0],[0,1],[1,1],[1,-1],[-1,-1]],[[8836,5731],[-2,-5],[0,2],[1,3],[1,3],[1,2],[1,0],[0,-2],[0,-3],[-2,0]],[[5309,4958],[-3,5],[-2,10],[-3,6],[-6,9],[-1,7],[-7,15],[-10,16],[-6,13],[-1,3],[1,-1],[6,-6],[1,0],[1,2],[-3,3],[-3,3],[-2,2],[-3,0],[-1,2],[-1,5],[-1,3],[-1,4],[-3,8],[-1,3],[-2,4],[1,1],[4,-4],[0,1],[0,3],[-4,3],[-2,1],[-1,2],[1,3],[-3,12],[-3,8],[-1,4],[8,-18],[1,-1],[2,1],[3,2],[-1,2],[-1,3],[-1,-1],[-2,-1],[-1,2],[-1,1],[2,9],[-1,0],[0,-2],[-1,0],[-2,-1],[-4,5],[-3,13],[-1,3],[-1,4],[-1,2],[-4,19],[2,-2],[2,-5],[3,1],[1,3],[2,0],[1,1],[1,3],[5,13],[1,16],[0,10],[-1,10],[1,4],[1,-3],[0,-3],[1,-3],[1,-2],[3,-1],[5,-3],[2,-3],[0,5],[5,4],[-1,1],[-5,-1],[-6,6],[-2,4],[-2,7],[-2,4],[0,3],[4,3],[1,0],[1,-4],[1,-1],[1,0],[0,3],[0,9],[-2,12],[1,2]],[[5266,5243],[1,1],[1,2],[1,0],[2,0],[0,-3],[1,-2],[1,0],[2,-2],[1,1],[1,1],[1,1],[4,0],[4,0],[8,0],[7,-1],[8,0],[5,0],[0,7],[0,11],[0,13],[0,12],[0,11],[0,14]],[[4970,8103],[-2,-2],[-1,-2],[-1,-1],[-1,0],[-2,0],[-6,4],[-1,0],[1,2],[4,2],[2,2],[5,-2],[2,-3]],[[4883,8255],[1,-1],[3,0],[-1,-2],[-3,-3],[-2,-3],[-3,-2],[-1,3],[-2,0],[-2,5],[0,7],[3,2],[4,0],[3,-6]],[[4827,8299],[-3,1],[-1,-1],[-1,-1],[-1,0],[-3,-1],[-3,0],[-1,2],[1,5],[-1,1],[-2,0],[-1,1],[-2,4],[0,1],[-1,2],[-1,3],[-2,2],[-1,0],[-3,-3],[-2,-4],[1,-1],[1,-2],[-1,-2],[-3,-3],[-1,-1],[-1,-1],[-1,1],[-4,0],[-2,0],[-2,3],[-5,2],[0,3],[-1,1],[-6,7],[-1,2],[1,2],[2,2],[7,3],[1,1],[0,2],[-2,1],[-2,1],[0,1],[0,1],[1,1],[2,1],[2,-1],[1,1],[2,1],[2,1],[1,4],[2,3],[0,1],[1,6],[1,1],[4,4]],[[4799,8357],[1,-2],[2,-1],[2,2],[3,6],[1,1],[2,-1],[3,1],[7,3],[2,0],[4,-2],[3,0],[3,-4],[1,-7],[3,-6],[5,-6],[0,-3],[-2,-2],[-3,-2],[0,-3],[2,1],[2,1],[4,-1],[2,-2],[1,-4],[1,-3],[-1,-3],[-1,1],[-1,3],[-1,1],[-2,1],[1,-4],[-1,-6],[1,0],[2,-1],[-1,-5],[-3,-2],[-3,0],[-1,-2],[-1,-3],[-1,-4],[-3,-2],[-2,1],[-3,1]],[[4858,8378],[-4,0],[-1,0],[-2,1],[-1,8],[0,3],[1,1],[1,2],[2,0],[1,-1],[1,-2],[2,-5],[0,-5],[0,-2]],[[4829,8405],[1,-7],[1,-5],[0,-1],[-1,-2],[-4,-3],[-2,0],[1,3],[-1,4],[1,2],[-1,1],[0,-1],[-4,-4],[-1,0],[0,1],[1,3],[0,2],[0,2],[1,1],[1,1],[1,0],[1,-1],[3,3],[2,1]],[[4834,8399],[-1,-1],[-1,0],[-1,1],[0,2],[0,2],[1,2],[3,3],[-1,1],[0,1],[1,2],[3,4],[1,0],[1,0],[-2,-6],[-4,-11]],[[4839,8429],[-11,-3],[-4,0],[0,2],[1,1],[3,1],[1,8],[-5,3],[0,1],[0,2],[1,1],[3,1],[1,1],[1,-1],[2,-2],[2,-4],[3,-1],[2,-1],[0,-9]],[[4816,8443],[-2,0],[0,1],[3,3],[2,1],[-1,-3],[-2,-2]],[[4794,8465],[-3,-1],[-1,1],[1,2],[1,1],[2,-1],[0,-1],[0,-1]],[[4825,8465],[-1,-1],[-1,0],[-1,1],[-1,3],[3,2],[1,-1],[1,-2],[0,-1],[-1,-1]],[[4798,8474],[-1,-1],[-2,1],[-1,0],[0,4],[-1,2],[1,4],[0,5],[3,0],[1,-1],[0,-14]],[[4829,8496],[0,-3],[-1,-3],[1,-3],[0,-2],[1,-1],[1,-1],[5,-1],[5,0],[1,-1],[0,-1],[-1,-2],[-2,-3],[-4,-4],[-1,-1],[-1,-1],[-1,1],[0,8],[-4,-1],[-3,1],[-1,1],[-1,2],[-2,5],[-7,2],[-2,3],[0,1],[0,1],[1,2],[2,0],[1,0],[1,1],[0,1],[-1,2],[6,3],[1,3],[1,1],[2,-2],[2,-3],[1,-5]],[[4799,8506],[4,-3],[-3,-5],[-4,0],[-5,4],[0,2],[1,0],[1,1],[1,-1],[2,1],[2,0],[1,1]],[[4827,8545],[-3,-10],[-2,0],[-1,-2],[-4,-3],[4,0],[1,-1],[0,-2],[-1,-1],[-4,-5],[-3,-2],[-3,-4],[-2,0],[-1,-4],[-2,-1],[-1,1],[-2,3],[3,3],[1,1],[2,2],[0,1],[-4,2],[-2,2],[1,1],[1,1],[0,1],[-1,1],[-1,0],[0,1],[-1,2],[1,3],[1,1],[0,1],[1,1],[1,-1],[2,-2],[2,1],[3,-1],[0,1],[-2,5],[0,1],[1,1],[6,4],[7,6],[1,0],[1,0],[0,-3],[0,-5]],[[4913,8554],[0,-5],[0,-1],[-1,-2],[-2,-3],[-5,-5],[-10,-10],[-6,-6],[-1,-2],[-1,-4],[4,-1],[1,-1],[0,-2],[-6,-6],[-1,-6],[4,0],[3,1],[7,4],[6,3],[3,0],[6,-2],[1,0],[3,1],[2,0],[17,-1],[5,1],[3,-1],[3,-4],[2,-7],[0,-1],[-1,-3],[-3,-4],[-3,-5],[0,-3],[-1,-3],[-1,-3],[-4,-14],[-5,-8],[-2,-5],[-3,-4],[-2,-3],[-3,-2],[-7,-2],[-2,-1],[-3,-3],[-2,-1],[3,0],[3,2],[5,0],[7,-4],[-1,-4],[-2,-3],[-6,-1],[-6,-6],[-2,-2],[-3,-1],[-3,0],[-6,2],[-3,2],[3,-3],[2,-2],[16,-3],[1,0],[5,4],[6,0],[13,-7],[3,-6],[6,-8],[2,-3],[3,-2],[1,-5],[2,-13],[3,-14],[4,-14],[1,-4],[2,-3],[11,-7],[3,-2],[4,-6],[4,-7],[4,-5],[4,-4],[-2,-2],[-1,-4],[1,-4],[1,-5],[4,-7],[3,-7],[-1,1],[-1,0],[-2,0],[-2,1],[-2,2],[-3,3],[-5,-1],[-3,0],[-3,0],[5,-1],[5,-1],[12,-13],[4,-7],[2,-10],[-1,-5],[-3,-3],[-2,-3],[-2,-4],[6,-6],[2,1],[1,0],[1,2],[3,5],[1,2],[4,0],[3,0],[4,-1],[3,0],[6,-2],[3,-2],[8,-8],[1,-4],[1,-6],[0,-6],[-1,-6],[-2,-5],[-1,-7],[0,-2],[-1,-2],[-4,-5],[-3,-3],[-1,1],[-1,0],[0,-1],[1,-3],[0,-3],[-2,-2],[-3,-1],[-4,1],[-6,-5],[4,-2],[1,-2],[-1,-5],[-2,-2],[-3,-1],[-3,0],[-2,-1],[-3,-2],[3,1],[2,-1],[1,-3],[2,-1],[5,-2],[4,0],[6,1],[4,0],[1,-1],[0,-3],[-1,-7],[-1,-2],[-8,-6],[-2,-4],[-1,-3],[-5,1],[-2,-3],[-5,-2],[-3,-2],[-3,-3],[-3,0],[-11,3],[-7,-1],[-9,-2],[-3,0],[-3,3],[-4,1],[-4,1],[-4,2],[2,-4],[-5,-4],[-2,-1],[-2,0],[-5,-1],[-5,1],[1,-4],[1,-2],[-1,-1],[-1,-1],[-9,2],[-1,0],[-1,-2],[-3,1],[-3,3],[-4,2],[-3,1],[-3,0],[-11,-5],[-2,-5],[-1,-7],[-2,-6],[-3,-4],[-3,-1],[-3,3],[-5,4],[-2,2],[-1,0],[-1,0],[-2,-2],[-2,0],[-4,-1],[-6,-3],[-2,-2],[-6,-5],[-1,-2],[-2,-5],[-3,-1],[-2,3],[-3,2],[-4,-1],[-2,-2],[-1,1],[0,3],[3,4],[6,3],[6,7],[2,5],[2,2],[1,2],[2,0],[0,3],[8,11],[1,3],[0,5],[1,4],[6,3],[3,9],[1,1],[9,2],[6,-1],[7,-1],[3,0],[3,0],[3,3],[4,9],[3,4],[3,3],[3,4],[4,8],[-3,-3],[-4,-4],[-2,-2],[-6,-3],[-3,-2],[-5,-6],[-1,0],[-7,1],[-6,7],[-4,3],[-1,1],[-2,-1],[-3,-1],[-3,0],[2,3],[2,2],[-5,2],[-2,1],[-1,2],[-4,0],[-2,0],[-4,-3],[-5,-4],[-6,5],[-1,2],[0,4],[-1,3],[-2,1],[3,4],[2,3],[6,2],[9,7],[5,2],[4,5],[2,3],[2,4],[1,4],[2,4],[-2,1],[-1,3],[0,3],[1,2],[0,4],[-2,3],[0,3],[1,3],[-4,-1],[-3,0],[-4,-2],[-3,-3],[-3,-1],[0,3],[2,2],[3,4],[3,3],[1,3],[1,3],[2,2],[4,4],[9,5],[1,0],[3,0],[3,0],[3,2],[3,1],[6,-5],[-1,7],[2,2],[4,-7],[2,-1],[3,1],[-1,2],[-2,0],[-1,1],[-2,2],[-3,7],[1,4],[1,5],[2,4],[-1,1],[-2,1],[0,4],[0,4],[4,3],[1,5],[0,5],[0,2],[-4,0],[-1,-1],[-2,-2],[-1,0],[-5,6],[-2,5],[-5,9],[0,6],[3,12],[6,7],[6,3],[-1,1],[-10,0],[-3,-1],[-3,-3],[-2,-1],[-2,-1],[-1,-1],[-2,-3],[-1,-1],[-4,0],[-1,0],[-1,1],[-1,2],[-2,1],[-1,-1],[-3,-3],[-3,-1],[-4,2],[-4,3],[-1,-1],[-1,-3],[-1,-5],[-3,4],[-3,6],[-1,3],[0,4],[1,1],[2,-1],[3,9],[5,12],[1,4],[2,5],[-1,3],[-1,2],[-4,6],[0,5],[0,5],[1,3],[1,1],[6,0],[-2,1],[-5,5],[0,2],[1,4],[-1,-2],[-2,-5],[-2,-1],[-3,-1],[-1,-3],[0,-1],[-2,0],[0,-2],[-1,0],[0,2],[0,4],[0,4],[2,3],[5,7],[-3,-2],[-5,-7],[-3,-4],[-1,-1],[0,-1],[0,-1],[1,-8],[0,-3],[-5,-22],[-1,-2],[-1,-1],[-3,0],[-1,2],[0,1],[1,3],[2,11],[1,3],[1,2],[3,5],[-2,-1],[-1,1],[-1,1],[1,13],[1,5],[1,7],[1,5],[2,5],[1,5],[1,2],[1,4],[2,4],[1,4],[-10,-11],[-2,-2],[-4,0],[-2,2],[-2,2],[-1,5],[-3,0],[-2,1],[0,1],[3,2],[4,1],[4,4],[-3,3],[0,1],[3,3],[4,8],[1,7],[-2,4],[-1,2],[-3,3],[-1,3],[0,2],[2,2],[2,1],[2,1],[-2,2],[-1,2],[-1,2],[0,1],[1,7],[1,2],[2,4],[7,-1],[1,2],[1,0],[3,-1],[0,1],[-6,8],[-1,2],[2,4],[0,2],[0,2],[0,1],[2,1],[6,0],[1,1],[0,2],[-2,2],[0,3],[0,2],[1,4],[0,1],[1,3],[1,1],[2,0],[3,0],[1,-2],[2,-2],[1,0],[4,3],[1,0],[1,-3],[7,3],[9,1],[6,1],[6,1],[5,2],[6,-1],[0,-1],[0,-2],[-2,-4]],[[4918,8567],[-1,1],[-2,4],[3,1],[1,-1],[0,-1],[-1,-4]],[[4912,8570],[-2,-1],[-2,1],[-2,3],[-1,2],[0,2],[1,0],[3,0],[1,-3],[0,-2],[0,-1],[2,0],[0,-1]],[[4915,8584],[-1,-2],[2,0],[3,-1],[2,0],[2,-1],[-1,-3],[-1,-1],[-1,0],[-4,3],[-4,-2],[-1,1],[-1,1],[0,1],[0,2],[-1,0],[-1,-2],[-1,0],[0,1],[-1,2],[1,3],[1,4],[1,0],[3,0],[3,-2],[1,-2],[0,-1],[-1,-1]],[[4929,8595],[-3,0],[1,4],[2,1],[4,-1],[-1,-1],[-3,-3]],[[4924,8593],[-3,-2],[-1,2],[0,3],[-3,2],[-1,1],[-1,2],[2,1],[3,-3],[1,-3],[3,-1],[0,-2]],[[4963,8671],[1,-4],[1,1],[2,-4],[1,0],[2,1],[0,-3],[-2,-10],[-1,-2],[0,-3],[0,-1],[-1,-6],[-1,-2],[-1,-5],[-1,0],[-1,2],[1,7],[1,4],[0,3],[-1,2],[-3,0],[-2,-1],[0,1],[0,1],[-1,1],[-2,0],[-1,0],[-1,2],[0,1],[3,1],[2,0],[3,2],[-2,8],[-3,0],[0,1],[0,2],[2,0],[2,4],[2,1],[1,0],[0,-4]],[[4971,8669],[-1,0],[-3,5],[2,7],[3,0],[0,-2],[0,-1],[-2,-1],[1,-3],[0,-4],[0,-1]],[[4978,8686],[-1,-5],[0,-2],[-3,0],[0,1],[-1,3],[1,3],[1,1],[0,-1],[2,2],[1,-2]],[[6206,7552],[0,1],[0,1],[-1,2],[-1,0],[-2,0],[-2,1],[-2,2],[0,2],[1,1],[-1,1],[-3,3],[-4,6],[-2,2],[-1,4],[-1,1],[-2,0],[-2,0],[-1,-1],[-2,-6],[-1,-1],[-3,0],[-2,2],[-2,0],[-4,1],[-4,0],[-3,-4],[-1,1],[-2,1],[-4,2],[-2,1]],[[6152,7575],[6,11],[1,6],[0,4],[0,5],[-2,10],[-3,15],[-2,15],[-2,4],[-8,6],[-2,6],[-6,7],[-9,4],[-2,1],[-7,10],[-6,6]],[[6110,7685],[1,3],[2,4],[2,1],[5,-1],[5,-2],[4,1],[4,-3],[4,-3],[4,-3],[7,-2],[3,-4],[3,-3],[13,-2],[1,1],[1,0],[5,2],[4,-1],[4,-4],[2,1],[3,0],[4,-2],[3,-2],[0,-3],[2,-3],[7,-5],[6,-3],[2,-3],[5,-3],[0,-1],[0,-2],[-1,-2],[-1,-3],[1,-1],[2,-1],[3,0],[2,1],[2,1],[3,3],[4,2],[5,3],[2,0],[2,-1],[1,-1],[2,-6],[2,8],[1,1],[2,-2],[3,-2],[3,-1],[1,-2],[4,-7],[6,1],[3,-1],[1,-1],[1,-2],[-2,-6],[-1,-8],[0,-1],[3,-3],[3,-3],[2,-2],[1,-2],[3,-2],[3,-1],[1,0],[2,-1],[4,-4]],[[4930,8035],[-1,-4],[-3,1],[0,1],[3,2],[1,0]],[[4998,5824],[1,-3],[1,-2],[-1,-8],[-1,-5],[-1,-5],[0,-2],[1,-3],[3,-4],[1,-2],[2,-4],[2,-4],[3,-5],[1,0],[0,-2],[0,-2],[-1,-18],[0,-4],[0,-3],[0,-6],[-1,-1],[-1,0],[0,-2],[0,-1],[2,-1],[0,-1],[-2,-1],[-1,-2],[1,-2],[-1,-2],[0,-1],[1,-1],[1,0],[2,3],[1,0],[1,0],[2,-5],[0,-2],[-1,-8],[-1,-6],[0,-8],[1,-5],[0,-2],[-1,-3],[-2,-3],[0,-2],[1,-4],[2,-4],[4,-6],[2,-7],[0,-3],[-2,-3],[-1,-2],[0,-4],[0,-24],[-3,-11],[0,-2],[1,-4],[0,-2],[2,-1],[1,-2],[0,-7],[-1,-7],[0,-4],[0,-2],[-2,-1],[0,-3],[0,-2],[0,-3],[1,-2],[1,-4],[2,-8],[1,-1],[0,-2],[0,-2],[1,-4],[2,-3],[3,-4],[2,0],[0,-3],[2,-4],[1,-2],[1,-1],[1,0],[0,-3]],[[5032,5535],[-2,-3],[-1,-3],[-1,-5],[-2,-6],[-6,-2],[-2,0],[-11,-1],[-11,-10],[-6,-4],[-4,-7],[-5,-4],[-4,-5],[-7,-3],[-12,-8],[-4,-3],[-4,-6],[-6,-7],[-3,0],[-4,7],[-4,3],[-9,5],[-7,1],[-3,3],[-1,0]],[[4914,5479],[2,0]],[[4683,5898],[-1,-1],[0,-4],[-1,-4],[-1,-3],[0,-1],[2,-4],[4,-5],[1,-1],[1,1],[2,4],[2,5],[2,2],[2,0],[1,-3],[2,-7],[2,-6],[0,-1],[1,-1],[1,0],[1,2],[1,1],[0,2],[4,9],[2,2],[1,1],[2,1],[3,-2],[4,-3],[6,-5],[2,0],[1,0],[1,6],[2,2],[3,3],[2,2],[2,0],[0,1],[0,3],[0,2],[-1,4],[0,2],[0,1],[2,0],[3,0],[2,-2],[2,-3],[2,-3],[1,-7],[1,-7],[3,-10],[0,-7],[-1,-8],[2,-1],[1,-1],[1,-1],[1,-6],[1,-2],[2,0],[2,-4],[2,-1],[0,-2],[0,-1],[-1,-2],[-1,-1],[-1,-3],[-1,-3],[-3,-9],[0,-1],[0,-1],[1,0],[2,0],[2,3],[2,-1],[2,-2],[1,-3],[0,-3],[-1,-4],[0,-4],[1,-8],[1,-7],[1,-3],[6,-7],[1,-2],[0,-3],[0,-4]],[[4764,5619],[-1,2],[-1,2],[-1,3],[-1,1],[-1,0],[-1,-2],[-1,-3],[0,-4],[0,-2],[-1,-2],[-2,-4],[0,-4],[-1,-4],[-2,0],[0,1],[-1,-1],[-2,-2],[-2,-1],[0,2],[-1,2],[-1,3],[-2,3],[-2,2],[-1,-1],[-2,0],[0,1],[0,1],[1,4],[1,4],[0,4],[0,4],[0,5],[-2,4],[0,2],[0,4],[0,3],[0,2],[-1,3],[0,3],[-1,1],[0,5],[0,5],[-1,1],[-1,2],[-1,2],[-1,2],[-1,0],[0,-1],[-1,0],[-1,4],[0,1],[-1,-2],[-7,-5],[0,2],[-1,3],[-1,1],[-3,-2],[-1,0]],[[4714,5673],[-2,0],[-1,-1],[-3,-7],[-2,-2],[-1,0],[-1,1],[-1,-1],[-1,1],[0,2],[1,2],[1,7],[4,8],[0,1],[-2,5],[-1,6],[0,6],[0,5],[-3,1],[-1,1],[0,1],[1,4],[1,4],[0,2],[0,1],[-2,4],[-3,8],[-3,8],[-2,7],[-2,4],[-2,4],[-1,4],[-2,1],[-5,0],[-7,-1],[-5,0],[-1,-4],[-6,-2],[-4,3],[-4,-2],[-2,-2],[0,-4],[-1,-5],[-1,-2],[-1,-2],[0,-2],[-1,-2],[-1,-5],[-2,-6],[-2,-4],[-3,-3],[-2,-6],[0,-3],[-2,-2],[-1,-1],[-2,1],[-1,0],[-2,-1]],[[4630,5705],[0,2],[1,5],[-1,3],[-3,5],[0,3],[-1,3],[-3,7],[-4,0],[1,6],[0,8],[-1,4],[0,5],[0,-1],[-2,-3],[-1,1],[-4,5],[-2,5],[0,3],[-1,2],[-1,-1],[-2,0],[-7,7],[-5,17],[0,4],[0,7],[0,2],[-2,-5],[-1,3],[-1,7],[-1,4],[-2,2],[-1,1],[-1,-2],[-1,-8],[-1,0],[-2,2],[1,6]],[[4582,5814],[1,3],[1,5],[5,19],[2,4],[1,2],[2,0],[4,2],[4,5],[1,1],[4,0],[5,1],[6,4],[0,5],[0,8],[0,3],[-2,2],[-2,2],[-1,3],[-1,2],[0,2],[2,2],[1,1],[2,0],[1,1],[1,2],[0,5],[1,5],[-2,6],[0,5]],[[4618,5914],[9,-1],[1,0],[4,-1],[3,0],[1,-1],[1,-1],[0,-2],[-1,-2],[1,-3],[1,-1],[1,1],[1,2],[0,1],[2,-1],[2,-4],[2,-1],[3,-2],[2,-1],[3,0],[1,-2],[3,-1],[4,3],[3,1],[4,0],[3,-1],[6,3],[3,-1],[2,-1]],[[4534,5936],[0,5],[-2,11],[2,5],[3,3],[1,-2],[0,-5],[2,-3],[4,-2],[4,2],[2,-1],[0,2],[1,4],[4,1],[6,1],[5,2],[4,0],[1,1],[-4,1],[-8,-2],[-8,-1],[-6,-6],[-2,1],[-3,6],[-1,7]],[[4539,5966],[8,1],[8,0],[9,-1],[5,0],[2,8],[4,4],[5,1],[2,0],[3,-1],[4,-7],[3,-1],[3,-2],[2,-3],[2,-3],[3,-1],[1,0],[2,1],[2,1],[4,1],[4,-4],[0,-4],[0,-4],[-5,-2],[-6,-4],[-6,2],[-6,5],[-4,3],[-1,2],[-3,2],[-2,2],[-2,2],[-1,1],[-1,-2],[-1,-2],[-1,-4],[-1,-2],[-6,-1],[-4,-1],[-3,-1],[-2,-1],[0,-9],[-6,0],[-5,0],[-6,0],[-6,-1],[-1,-2],[-2,-3]],[[4558,5822],[0,-1],[-2,0],[0,1],[0,1],[1,5],[1,-1],[0,-1],[0,-4]],[[4552,5821],[-2,-1],[-1,3],[0,1],[1,1],[1,2],[1,1],[1,1],[1,-5],[-1,-2],[-1,-1]],[[4563,5830],[0,-3],[-1,1],[-1,1],[1,4],[1,2],[1,-1],[1,0],[-1,-2],[0,-1],[-1,-1]],[[4558,5844],[-1,-2],[-2,1],[-1,2],[1,3],[1,4],[1,-1],[1,-7]],[[4568,5848],[-1,-1],[-1,1],[2,5],[1,1],[0,-4],[-1,-1],[0,-1]],[[4555,5868],[-1,-7],[-2,1],[-1,4],[0,2],[3,0],[1,0]],[[4582,5814],[-2,4],[1,8],[-1,-1],[-2,-6],[-1,0],[0,7],[-1,1],[-2,-1],[-2,4],[0,3],[0,4],[1,2],[0,1],[-1,1],[-2,-1],[0,1],[1,5],[5,4],[2,1],[3,1],[-2,3],[-3,2],[-2,-1],[-1,-3],[-2,0],[-2,6],[0,3],[1,4],[1,2],[6,0],[2,2],[1,0],[1,2],[0,1],[-1,0],[-2,-2],[-7,1],[-2,-2],[-4,-5],[-5,-4],[-3,2],[1,7],[-1,1],[-1,2],[-5,-3],[-4,4],[-1,4],[0,5],[2,4],[0,2],[-2,0],[-3,-2],[-8,8]],[[4535,5895],[2,1],[4,-1],[3,1],[2,2],[2,3],[3,0],[9,-1],[7,3],[5,6],[5,5],[7,0],[7,0],[10,0],[8,0],[9,0]],[[5266,5243],[0,2],[-2,3],[-2,0],[-2,1],[2,9],[1,8],[3,7],[1,1],[0,3],[2,10],[3,8],[-1,8],[1,14]],[[5242,5400],[1,0],[4,0],[1,-3],[0,-4],[-4,-13],[-1,-6],[-2,-5],[-1,0],[-5,3],[-1,2],[0,2],[0,5],[1,2],[2,1],[1,0],[1,6],[0,5],[1,4],[2,1]],[[5662,7231],[2,-1],[2,0],[1,1],[2,3],[2,0],[1,-3],[-2,-2],[-1,-1],[1,0],[1,-2],[2,1],[0,-3],[1,-2],[1,-1],[1,-1],[2,1],[3,1],[3,1],[2,1],[8,-1],[3,-3],[5,-1],[5,-2],[3,2],[4,1],[1,-1],[-1,-9],[1,-2],[1,-1],[1,0],[2,3],[3,2],[4,0],[4,6],[1,0],[-1,-3],[-1,-6],[0,-4],[-1,-3],[-2,-1],[-3,0],[-6,0],[-6,-1],[-11,-3],[-12,-1],[-1,1],[0,4],[0,2],[-1,2],[-4,1],[-3,3],[-13,4],[-3,1],[-5,-1],[-2,0],[-1,2],[-1,2],[0,7],[0,7],[1,1],[1,-2],[1,-1],[1,2],[0,4],[1,3],[1,-2],[0,-4],[2,-1]],[[5754,7227],[-1,-4],[-1,3],[1,3],[-2,5],[3,8],[0,3],[2,2],[-1,-6],[-1,-5],[1,-4],[1,-5],[-2,0]],[[5640,7268],[0,-2],[-3,1],[-1,3],[0,6],[0,3],[1,0],[1,-3],[3,-4],[-1,-4]],[[5773,7253],[-2,-1],[-1,0],[-1,3],[1,6],[-1,4],[0,2],[2,3],[1,3],[3,4],[7,5],[2,0],[0,-3],[-3,-10],[-2,-4],[1,-4],[-4,-1],[-3,-7]],[[5707,7280],[-1,-3],[-2,1],[1,1],[0,2],[0,2],[0,1],[0,1],[2,-3],[0,-2]],[[5734,7291],[-2,-1],[-1,-3],[-2,2],[0,3],[2,-1],[1,1],[0,2],[1,-1],[1,-2]],[[5773,7289],[0,-1],[-2,3],[0,1],[2,2],[1,-1],[0,-2],[-1,-2]],[[5681,7301],[0,-3],[0,-1],[-6,-2],[1,4],[0,1],[2,-2],[1,1],[0,1],[2,1]],[[5704,7296],[0,-1],[-2,4],[-1,2],[1,2],[3,-4],[-1,-3]],[[5748,7299],[-1,0],[1,3],[3,4],[4,3],[2,0],[2,-2],[-4,-3],[-1,-2],[-4,0],[-2,-3]],[[5718,7303],[-3,-1],[0,1],[1,1],[1,1],[1,1],[2,2],[2,3],[1,-2],[-2,-1],[-3,-5]],[[5686,7310],[-1,3],[0,2],[0,1],[1,0],[1,-4],[-1,-2]],[[5750,7313],[-3,-1],[1,4],[-2,4],[3,-2],[1,-3],[1,0],[-1,-1],[0,-1]],[[5702,7319],[-3,-5],[-1,1],[-1,2],[1,4],[2,2],[2,0],[-1,-3],[1,-1]],[[5709,7313],[-2,-2],[-2,3],[-1,5],[4,7],[2,0],[0,-2],[0,-7],[-1,-4]],[[5681,7322],[-1,-1],[-2,2],[0,3],[2,1],[1,-1],[0,-1],[0,-3]],[[5678,7335],[-1,-2],[0,4],[-1,2],[1,2],[1,1],[1,-1],[0,-3],[-1,-3]],[[5692,7343],[0,-6],[-1,0],[0,1],[0,3],[0,3],[1,-1]],[[5705,7339],[-3,0],[1,4],[1,1],[3,-2],[0,-1],[-2,-2]],[[5722,7345],[-1,0],[1,3],[2,4],[4,0],[3,2],[-1,-3],[-3,-3],[-5,-3]],[[5701,7349],[-1,-3],[-2,0],[-3,4],[-1,2],[0,2],[1,0],[1,-2],[4,-1],[1,-2]],[[5676,7348],[-2,-3],[0,5],[1,4],[2,0],[0,-2],[-1,-4]],[[5745,7362],[3,-2],[1,0],[2,-1],[0,-3],[-2,-1],[-4,-3],[-1,1],[-2,3],[-3,0],[-1,1],[1,3],[3,2],[3,0]],[[5580,7361],[3,-5],[-3,1],[-2,-4],[-3,5],[-2,4],[-1,2],[2,4],[2,-4],[2,-1],[2,-2]],[[5694,7359],[-1,-4],[-2,4],[-3,3],[-1,3],[-1,2],[0,3],[1,2],[1,0],[2,-4],[3,-1],[-1,-3],[1,-3],[1,-2]],[[5654,7368],[-1,-1],[-2,0],[-1,0],[0,2],[1,0],[0,2],[1,1],[1,0],[0,-1],[1,-3]],[[5572,7395],[0,-7],[2,-1],[3,-6],[0,-3],[-1,-1],[-4,2],[-1,-1],[-1,1],[-1,3],[0,1],[-1,2],[0,1],[-2,-3],[-1,0],[0,2],[1,7],[1,1],[1,-2],[1,1],[1,3],[0,4],[1,1],[1,-5]],[[5576,7392],[-1,-1],[-2,5],[-1,4],[1,0],[1,0],[0,-1],[0,-2],[1,-1],[1,-2],[0,-2]],[[5724,7385],[-2,-3],[-3,5],[-1,1],[2,2],[1,3],[0,4],[-3,5],[-1,4],[5,1],[3,-3],[1,0],[0,-3],[0,-1],[0,-10],[-1,-1],[0,-3],[-1,-1]],[[5574,7408],[-1,-1],[-1,0],[-1,0],[-1,-1],[1,5],[0,5],[2,4],[1,1],[1,-2],[0,-10],[-1,-1]],[[5685,7419],[-3,-1],[-1,0],[1,2],[-3,4],[0,4],[1,1],[2,-2],[0,-4],[3,-4]],[[5650,7428],[1,-6],[2,-3],[3,-2],[1,0],[6,-5],[6,-1],[1,-1],[0,-4],[2,-2],[0,-2],[-1,-3],[1,-7],[2,-7],[2,-3],[3,-1],[3,0],[0,-1],[0,-6],[-1,-3],[-1,0],[-1,0],[-1,2],[-2,1],[-1,2],[-3,3],[-1,2],[0,3],[-1,3],[-1,4],[-1,1],[-1,2],[0,1],[-4,1],[-4,0],[-3,2],[-1,6],[-1,2],[-2,2],[-1,2],[-3,5],[-3,4],[-3,2],[-3,2],[-2,-2],[-2,0],[0,2],[3,2],[4,5],[4,2],[1,0],[3,-4]],[[5660,7437],[-1,-2],[-2,1],[-2,6],[5,-5]],[[5663,7439],[-1,0],[1,4],[2,3],[-1,-4],[-1,-3]],[[5733,7449],[0,-3],[3,-6],[2,-4],[0,-3],[0,-1],[-2,2],[-1,0],[1,-2],[1,-2],[-2,-1],[-3,0],[-6,3],[-1,3],[3,5],[1,2],[-2,-1],[-3,-5],[-5,2],[-1,2],[-1,2],[2,5],[3,0],[2,1],[2,1],[0,3],[5,0],[2,-3]],[[5557,7455],[1,-3],[-4,2],[-2,3],[-2,7],[-5,8],[0,2],[2,2],[4,1],[1,-1],[1,-1],[0,-2],[-2,-3],[0,-1],[1,-3],[0,-1],[1,-6],[1,-2],[2,-1],[1,-1]],[[5706,7487],[-1,-2],[-1,-4],[0,-4],[-2,0],[-1,1],[0,1],[0,3],[-1,0],[0,-3],[-1,-1],[-2,0],[-1,1],[0,4],[-1,3],[0,2],[5,0],[2,-3],[2,2],[0,2],[2,1],[0,-3]],[[5713,7512],[-3,-1],[-4,5],[4,1],[1,-1],[1,-2],[1,-2]],[[5688,7523],[-4,-2],[-4,4],[0,2],[2,5],[1,1],[3,0],[2,-3],[0,-2],[-1,-2],[1,-3]],[[5723,7530],[-1,2],[-4,4],[-10,3],[-5,3],[-2,-1],[-4,4],[-3,-2],[-6,-6],[-3,1],[-3,4],[-3,0],[-2,-2],[-4,-7],[-5,-4],[-3,2],[-5,0],[-1,-4],[1,-3],[3,-5],[-2,-4],[1,-3],[2,-1],[3,0],[5,-4],[2,-5],[2,-6],[-3,4],[-2,4],[-3,1],[-4,3],[-3,1],[-2,-2],[-1,-3],[3,-4],[3,-3],[1,-3],[1,-5],[0,-2],[-1,-1],[-3,3],[-5,12],[-7,2],[-1,-2],[1,-7],[1,-2],[6,-7],[0,-1],[-1,-1],[-7,4],[-2,6],[0,7],[-6,5],[-6,6],[-1,5],[1,2],[1,4],[-3,-1],[-2,-2],[-3,-3],[0,-4],[0,-3],[-1,-5],[-1,-9],[1,-5],[7,-14],[2,-10],[2,-3],[3,-5],[4,-7],[1,-4],[1,-7],[-3,-4],[-1,0],[-1,2],[1,4],[0,3],[-5,4],[-2,-1],[-2,-3],[1,-5],[2,-3],[0,-5],[3,0],[-4,-5],[-3,-3],[-4,0],[-2,0],[-1,-1],[2,-1],[2,-1],[2,-2],[7,-4],[3,-4],[3,0],[4,-8],[5,-2],[3,-8],[5,-2],[3,-3],[1,-2],[1,-5],[0,-11],[1,-8],[0,-2],[0,-4],[-1,-2],[-2,0],[-2,6],[-4,6],[-5,7],[-1,1],[-1,1],[-2,-3],[-6,-2],[-3,-2],[-1,-1],[-1,-1],[2,-2],[1,-3],[0,-5],[2,-5],[2,-2],[2,0],[1,-1],[1,-2],[1,-2],[1,-2],[0,-2],[-7,-3],[-1,-2],[-1,-1],[-2,2],[0,4],[-2,3],[-2,2],[-3,1],[-2,3],[-1,-3],[1,-8],[2,-6],[4,-16],[2,-9],[0,-5],[-1,-8],[2,-5],[2,-6],[-2,0],[-1,2],[-2,3],[-4,9],[-2,6],[-2,0],[-3,-1],[-3,-12],[0,-7],[-2,2],[-1,2],[0,8],[0,3],[-4,10],[-2,1],[-1,4],[-1,4],[-2,-1],[-2,-2],[0,-5],[0,-5],[-1,-4],[-5,7],[-4,13],[0,6],[3,7],[0,4],[-3,9],[-5,6],[-2,1],[-1,7],[-3,3],[-1,1],[-1,2],[1,2],[4,6],[3,10],[1,0],[3,-2],[3,1],[3,5],[2,3],[3,0],[8,-8],[9,-4],[4,-4],[3,-4],[1,0],[2,-1],[0,3],[-1,2],[2,2],[5,0],[1,1],[0,2],[-1,3],[-1,1],[-2,0],[-1,1],[-2,-1],[-2,2],[-2,2],[-1,1],[-4,3],[-5,6],[-1,-3],[-2,-2],[-2,0],[-7,3],[-5,-2],[-2,-1],[-2,0],[-2,-1],[-3,-1],[-2,5],[-1,4],[-1,1],[0,-4],[-1,-3],[-3,-2],[-2,3],[-2,7],[-1,8],[-4,7],[-2,2],[-1,4],[1,3],[3,1],[5,-3],[1,0],[1,2],[0,3],[-1,3],[-1,0],[-1,0],[-3,0],[-4,-1],[-2,1],[-1,2],[-3,5],[-3,6],[-5,4],[-3,13],[-2,5],[-3,4]],[[5582,7537],[4,0],[1,0],[5,1],[2,2],[2,0],[3,-2],[1,1],[4,3],[5,10],[1,1],[4,0],[2,1],[1,0],[5,-2],[2,0],[3,1],[4,3],[1,7],[0,1],[2,1],[2,0]],[[5731,7587],[2,-2],[2,-1],[0,-2],[2,-2],[1,0],[1,-5],[0,-7],[-1,-2],[-1,-1],[-6,-6],[0,-5],[0,-3],[0,-2],[0,-2],[0,-2],[0,-2],[-3,-4],[-1,-4],[-2,-4],[-1,-1],[-1,0]],[[3285,5876],[-1,-1],[0,3],[0,3],[1,5],[2,3],[1,-1],[0,-10],[-3,-2]],[[3714,8685],[-3,-7],[-3,1],[-2,3],[-3,2],[-3,-1],[0,2],[11,7],[5,2],[0,-3],[-1,-3],[-1,-3]],[[3971,8958],[-4,0],[-2,5],[1,5],[5,1],[2,-3],[-1,-5],[-1,-3]],[[3583,9190],[-5,-2],[-1,0],[-1,2],[-2,7],[0,3],[0,4],[-1,3],[4,4],[3,0],[5,-1],[7,-3],[-1,-1],[-1,-2],[-5,-2],[-1,-6],[0,-2],[0,-2],[-1,-2]],[[3535,9213],[9,-5],[10,-3],[1,-2],[1,-2],[0,-1],[0,-1],[-1,-1],[1,-2],[2,-1],[0,-2],[-2,-3],[-4,-4],[-18,-7],[-7,-1],[-16,-5],[-5,0],[-1,0],[-3,2],[-4,3],[-2,1],[-1,2],[0,2],[3,0],[5,0],[6,2],[-2,1],[-1,1],[-1,2],[-3,0],[-2,1],[-4,1],[-10,0],[-7,2],[-2,1],[-1,2],[-2,3],[2,11],[2,3],[3,1],[9,-3],[1,1],[-9,4],[-4,3],[-1,2],[0,2],[0,2],[0,2],[1,1],[2,2],[9,4],[10,-1],[18,-5],[2,0],[6,-4],[10,-11]],[[3564,9265],[-3,0],[-9,1],[-1,1],[0,1],[1,3],[4,1],[5,-2],[4,-3],[1,-1],[-2,-1]],[[4293,9269],[1,-4],[0,-1],[0,-2],[-1,-1],[-1,0],[3,-3],[0,-1],[1,-1],[-2,-3],[-11,-3],[-3,-1],[-4,-4],[-5,-3],[-1,0],[-2,3],[-7,3],[-14,-2],[-17,-3],[-5,-1],[-3,1],[-1,1],[0,1],[2,5],[0,1],[4,2],[3,4],[-1,4],[1,6],[2,1],[7,-2],[4,0],[7,-1],[10,1],[8,3],[14,7],[3,0],[2,-3],[1,-1],[4,-2],[1,-1]],[[3513,9276],[-3,-1],[-7,3],[-2,1],[0,2],[0,1],[2,3],[5,5],[3,0],[2,-2],[2,-4],[0,-2],[0,-2],[0,-2],[-1,-1],[-1,-1]],[[3471,9376],[-4,-3],[-3,-3],[-7,-6],[-1,-1],[-2,1],[-1,2],[-3,0],[-1,2],[-1,1],[-2,0],[-3,0],[-3,0],[-2,3],[4,2],[2,2],[9,1],[3,-1],[2,0],[2,0],[5,2],[1,1],[5,-1],[0,-2]],[[4500,9527],[2,-6],[1,-6],[3,-3],[8,0],[2,-6],[-5,-3],[-21,1],[-9,0],[-6,4],[0,7],[1,7],[6,4],[5,-3],[6,2],[7,2]],[[4483,9564],[-3,-2],[-11,24],[0,9],[1,6],[5,1],[4,-4],[2,-13],[2,-21]],[[3009,9638],[-10,-1],[-10,2],[-3,2],[0,3],[2,1],[5,1],[4,0],[3,-1],[7,-1],[5,-2],[3,0],[0,-3],[-6,-1]],[[4501,9656],[-6,0],[-2,1],[2,3],[7,9],[3,0],[3,-1],[2,-4],[-3,-4],[-6,-4]],[[4472,9675],[-4,-2],[-2,6],[-2,8],[-1,9],[6,5],[3,1],[2,-1],[-1,-4],[0,-8],[2,-6],[-3,-8]],[[4510,9782],[-11,-7],[-18,1],[-10,3],[-3,4],[4,5],[12,4],[16,3],[14,-2],[2,-5],[-6,-6]],[[4481,9898],[-3,-2],[-7,1],[-9,5],[-7,4],[0,5],[3,3],[5,0],[7,-4],[7,-6],[4,-6]],[[3753,9912],[-5,-1],[-12,6],[-19,6],[-16,4],[-15,11],[-2,3],[3,4],[13,0],[11,2],[27,-7],[14,-5],[5,-5],[-1,-9],[-3,-9]],[[4168,9997],[26,-3],[14,-4],[3,0],[19,-2],[19,-2],[30,-5],[4,-1],[-3,-2],[-8,-1],[-38,-1],[-70,-2],[-40,-4],[-13,-1],[-1,-5],[5,-1],[9,1],[32,6],[11,1],[22,-1],[29,-2],[11,1],[21,-1],[23,2],[29,4],[7,-8],[11,-9],[8,1],[7,0],[3,-3],[3,-1],[8,1],[25,-3],[17,-4],[6,-2],[3,-3],[2,-2],[-3,-3],[-10,-4],[-14,-5],[-18,-3],[-20,-3],[-159,-7],[-5,-2],[-4,-4],[3,-6],[7,-1],[17,4],[30,3],[22,0],[53,-3],[16,-7],[8,-10],[18,2],[4,2],[3,3],[2,3],[2,4],[2,2],[2,2],[4,1],[11,1],[27,1],[7,0],[5,-5],[1,-3],[0,-4],[0,-4],[-1,-6],[-2,-5],[-8,-10],[-6,-5],[-6,-3],[-13,-9],[-4,-2],[-14,-10],[-4,-5],[0,-3],[2,-1],[4,4],[2,2],[3,2],[20,6],[4,2],[14,8],[8,2],[7,3],[4,2],[21,15],[10,4],[12,0],[2,-7],[13,-1],[6,0],[9,-2],[4,-1],[7,-1],[8,-2],[6,2],[2,1],[6,6],[8,4],[8,6],[3,2],[4,1],[4,1],[11,2],[3,0],[7,0],[27,-1],[15,-1],[21,-4],[14,-2],[7,-2],[10,-4],[7,-5],[4,-1],[0,-1],[-3,-2],[-19,-7],[-7,-4],[-18,-9],[-9,-3],[-10,-1],[-11,0],[-7,-1],[-1,-1],[5,-4],[2,-2],[0,-2],[-5,-4],[-2,0],[-20,-3],[-9,-4],[-13,0],[-9,0],[-12,-4],[5,-4],[4,-1],[14,-4],[0,-2],[-7,-3],[-8,-5],[-11,-3],[-4,0],[-5,0],[-5,0],[-10,-1],[-9,0],[-18,2],[-9,2],[-5,1],[-6,0],[-3,-1],[-9,-6],[-5,-4],[-3,-4],[-1,-4],[0,-5],[1,-3],[2,-1],[2,-1],[4,-1],[9,1],[4,-1],[1,-1],[2,-3],[0,-2],[-2,-4],[-1,-5],[-1,-5],[0,-3],[4,0],[2,0],[2,-1],[2,-2],[1,-2],[2,-3],[-1,-2],[-2,-1],[-6,-2],[-12,-3],[-2,-1],[-1,-2],[0,-3],[-2,-3],[-2,-3],[-2,-1],[-5,-1],[-5,0],[-6,-1],[-14,-9],[-1,-1],[6,-2],[-1,-3],[-6,-10],[-2,-5],[-1,-7],[-3,-5],[-3,-5],[-3,-5],[-4,-7],[1,-4],[4,-4],[6,3],[7,9],[7,3],[8,-1],[7,-1],[9,-4],[8,-2],[6,-3],[3,-2],[3,-3],[0,-2],[-5,-2],[-2,1],[-12,5],[-5,2],[-8,-2],[-7,-2],[6,-10],[7,-5],[11,-2],[6,-2],[5,-3],[3,-1],[5,0],[6,3],[9,0],[4,-1],[3,-3],[1,-4],[0,-7],[-1,-6],[-1,-3],[-4,-5],[-2,-1],[-4,0],[-3,1],[-4,2],[-5,1],[-9,2],[-10,3],[-6,1],[-12,-1],[-12,-2],[-1,-2],[-18,-9],[-4,0],[-5,3],[-7,3],[-4,0],[-6,-4],[-1,-1],[0,-2],[4,-3],[2,0],[2,-1],[8,-1],[4,-1],[3,-10],[5,-6],[3,-1],[2,-1],[6,1],[8,2],[3,-2],[6,-2],[4,0],[4,0],[5,-1],[7,-6],[-3,-7],[4,-6],[7,-6],[2,-2],[0,-4],[0,-2],[1,-3],[1,-2],[1,-4],[1,-6],[-1,-5],[-1,-4],[-3,-3],[-4,-2],[-3,1],[-3,2],[-4,3],[-5,3],[-7,1],[-12,-9],[-5,-1],[-5,-1],[-4,-4],[-7,-2],[-6,1],[-10,5],[4,-3],[5,-4],[3,-2],[3,0],[3,0],[4,2],[8,4],[3,0],[2,0],[1,-1],[2,-4],[2,-6],[0,-4],[-3,-5],[-2,-2],[-2,-1],[0,-1],[5,-1],[7,5],[2,7],[3,7],[6,3],[6,-3],[6,-7],[7,-13],[3,-1],[4,-3],[2,-4],[-1,-5],[-1,-3],[-1,-2],[-1,-2],[-3,0],[-5,-1],[-11,1],[-6,0],[1,-4],[-12,-4],[-13,-2],[-13,3],[-10,5],[3,7],[2,7],[-5,5],[-1,0],[2,-8],[-2,-2],[-5,-4],[-4,-1],[-1,-1],[2,-1],[1,-2],[1,-2],[-1,-2],[-2,-3],[-1,-2],[0,-1],[2,-2],[4,-2],[4,-2],[19,0],[8,-1],[18,-6],[1,-1],[-3,-10],[-2,-9],[-4,-2],[-19,0],[-6,-2],[-9,-4],[-9,-5],[-4,0],[-18,4],[-7,3],[-14,9],[-11,13],[-6,-6],[-3,-2],[-3,-2],[-3,0],[-3,1],[-3,2],[-6,5],[-7,4],[-4,3],[-1,-1],[3,-3],[4,-3],[11,-9],[3,-2],[0,-2],[-7,-2],[-8,-3],[-3,-2],[-6,-6],[-2,-1],[-9,-1],[-3,0],[-7,4],[-10,2],[-6,1],[-8,4],[3,-4],[16,-5],[1,-2],[-3,-3],[-2,-2],[-4,0],[-5,1],[-6,0],[-6,-1],[-2,-2],[1,-1],[1,-1],[2,-2],[2,0],[4,4],[4,0],[8,-1],[9,3],[7,2],[5,0],[17,4],[4,5],[6,2],[13,2],[12,-1],[7,-1],[5,-4],[7,-4],[6,-3],[7,-2],[4,-5],[11,-5],[7,-2],[4,-2],[1,-12],[0,-5],[-2,-13],[-5,-3],[1,-7],[-2,-6],[-5,2],[-6,4],[-14,6],[-13,3],[-5,4],[-6,3],[-8,10],[-5,14],[-3,7],[-4,0],[-6,-2],[-5,-2],[-2,-3],[-17,-4],[-6,-3],[-3,0],[-13,-5],[5,-2],[2,0],[6,1],[3,1],[11,5],[9,1],[4,1],[7,3],[4,1],[1,-1],[0,-1],[4,-17],[-2,-4],[-3,-2],[-8,-3],[-3,-1],[3,-3],[7,2],[5,3],[3,-1],[4,-4],[5,-2],[13,-7],[5,-3],[9,-3],[9,-5],[2,-2],[9,-2],[2,-1],[3,-8],[3,-1],[9,-1],[-2,-3],[-8,-7],[-4,-2],[-2,-2],[1,-2],[0,-5],[2,-7],[2,7],[1,3],[2,1],[2,0],[6,4],[5,-2],[2,-8],[1,-8],[-1,-6],[1,-11],[-1,-3],[2,-3],[1,-12],[2,-4],[-3,-3],[-9,-2],[-3,2],[-9,-1],[0,3],[-1,4],[0,2],[0,2],[-1,12],[-2,-3],[0,-2],[-1,-3],[-1,-13],[-3,-3],[-7,1],[-7,-1],[-3,1],[-13,6],[-5,5],[-5,8],[-2,8],[-1,7],[-4,6],[-5,4],[-6,4],[-7,3],[-6,3],[-5,4],[-6,4],[-6,2],[-10,1],[-13,0],[-9,3],[-2,-1],[-2,-1],[2,-4],[10,-2],[8,0],[10,0],[7,-1],[2,-2],[2,-4],[1,-6],[-2,-5],[-8,-5],[-4,-3],[-12,-5],[-4,-1],[-9,0],[-8,1],[-10,2],[-5,0],[-12,1],[-2,-1],[3,-3],[5,-1],[3,-2],[0,-3],[-1,-5],[-1,-3],[-2,-3],[-8,-4],[-3,-2],[-14,-5],[-1,-1],[3,0],[9,2],[3,0],[14,-4],[12,0],[24,4],[2,0],[1,-1],[2,-1],[1,-2],[-2,-3],[-5,-2],[-8,-2],[-4,-2],[-4,-2],[-6,-5],[-2,-6],[7,-2],[3,3],[4,6],[3,3],[7,3],[10,-2],[7,2],[15,6],[2,0],[22,-3],[20,-7],[10,-2],[14,-2],[25,1],[2,-1],[-1,-2],[-2,-2],[-4,-3],[-5,-2],[-3,0],[-2,-2],[-6,-1],[-2,-1],[2,-5],[-1,0],[-5,0],[-9,-3],[-7,0],[-1,0],[1,-2],[1,-2],[2,-3],[-1,-2],[-3,-1],[-3,-1],[-8,2],[-1,0],[1,-2],[1,-2],[0,-2],[-2,-3],[-5,-1],[-8,-6],[-3,-1],[-8,-1],[-1,-1],[3,-4],[0,-1],[-5,-5],[-8,-2],[-1,-2],[-1,-4],[0,-1],[-2,-2],[-7,-4],[-5,-3],[-3,-1],[-3,-3],[-4,-2],[-5,0],[-4,-1],[-8,-3],[-5,-1],[-16,-5],[-8,-1],[-6,-2],[-14,-5],[-6,-1],[-5,-2],[-5,-1],[-8,1],[-4,0],[-3,0],[-2,-2],[-4,-4],[-4,0],[-11,3],[0,-2],[3,-3],[0,-3],[-6,-2],[-4,-1],[-5,1],[-7,3],[-9,6],[-11,9],[-5,3],[0,-3],[1,-3],[2,-3],[1,-2],[-2,-1],[-1,-1],[-2,0],[3,-4],[2,-5],[0,-4],[-3,-4],[-3,-2],[-2,-1],[-13,-10],[-3,-1],[-2,-1],[-1,-2],[-4,-8],[-2,-3],[-3,-3],[-1,0],[0,-2],[0,-2],[-1,-3],[-2,-5],[-8,-13],[-6,-13],[-2,-4],[-2,-2],[-2,1],[-3,0],[-1,-3],[-1,-4],[-2,-3],[-1,-2],[-13,-9],[-3,-1],[-3,1],[-3,-1],[-7,5],[-1,2],[-5,4],[0,-2],[1,-1],[1,-2],[1,-2],[4,-11],[-3,-2],[-2,-2],[-7,-4],[-6,-7],[-3,-2],[0,5],[0,2],[-4,3],[0,-2],[0,-2],[-3,-8],[-1,-1],[-1,0],[-3,-1],[-3,1],[-3,3],[-1,2],[-5,-5],[-2,0],[0,-4],[-3,-3],[-3,-2],[-4,0],[-2,-2],[-6,2],[-1,5],[4,6],[2,2],[-1,3],[1,4],[8,13],[6,6],[0,1],[-8,1],[-7,2],[-6,1],[-3,0],[4,-4],[7,-4],[-3,-3],[-3,-4],[-3,-9],[-2,-4],[-7,4],[-3,2],[2,-5],[6,-5],[0,-2],[0,-5],[-12,-5],[-12,-1],[-9,-2],[-15,-1],[-6,0],[-1,-2],[15,-9],[2,-2],[-2,-3],[-3,-2],[-5,-6],[-2,-2],[-7,-3],[-11,3],[-6,-2],[-6,2],[0,-4],[2,-3],[2,-7],[3,1],[5,2],[4,-5],[2,-9],[5,-5],[2,-3],[0,-3],[-2,-3],[-6,-5],[-6,-1],[0,-4],[-2,-2],[-6,1],[-2,1],[-3,1],[-11,1],[11,-7],[4,-3],[2,2],[4,0],[5,-1],[-1,-12],[3,-10],[0,-2],[-6,-5],[0,-6],[-4,-1],[-4,0],[0,-6],[-2,-3],[0,-3],[1,-2],[-3,-3],[-2,-5],[-3,-4],[-2,0],[-5,0],[-6,1],[-5,5],[-2,1],[-2,2],[1,-4],[1,-2],[5,-3],[8,-5],[0,-3],[-2,-2],[-6,-9],[-1,0],[-3,-2],[-7,1],[-3,1],[-9,-1],[-3,1],[-2,-1],[2,-2],[5,-2],[6,-3],[9,-1],[-1,-4],[-2,-2],[1,-4],[-1,-3],[0,-3],[-2,-8],[2,-6],[3,-2],[0,-4],[1,-5],[-4,-5],[-3,0],[-5,-1],[-1,-2],[7,-2],[-1,-4],[-2,-5],[-2,-10],[-4,-17],[-2,-17],[-9,-14],[-3,-1],[-1,0],[-4,1],[-7,3],[-6,1],[-3,0],[-1,-2],[3,-2],[5,-1],[3,-2],[7,-2],[2,-3],[2,-3],[0,-2],[0,-2],[1,-12],[-3,-4],[-3,-3],[-8,0],[-1,1],[-8,4],[0,-2],[6,-5],[2,-2],[-1,-1],[-3,0],[-3,-2],[-6,1],[0,3],[2,2],[-3,0],[-3,-1],[-2,0],[-1,0],[-1,1],[-1,6],[1,2],[5,7],[2,4],[-2,1],[-3,-3],[-4,-7],[-1,-4],[-3,0],[-5,2],[-16,8],[1,6],[-1,4],[5,1],[3,2],[3,2],[4,4],[3,7],[-1,1],[-9,-9],[-5,-3],[-3,-1],[-1,2],[-5,3],[-3,1],[-6,2],[-1,1],[-2,1],[-3,9],[3,12],[3,3],[1,4],[1,5],[-1,2],[-2,-1],[0,-2],[0,-2],[-1,-2],[-8,-4],[-8,-4],[-4,-3],[-3,-3],[-1,-2],[-3,0],[-4,-1],[-3,-1],[-4,1],[-3,2],[-3,1],[-4,-2],[-2,0],[0,-1],[2,-4],[-3,-1],[-5,0],[-3,1],[-2,2],[-1,2],[1,3],[8,5],[4,3],[-3,1],[-8,-1],[-1,1],[-5,0],[0,7],[-1,2],[-1,1],[-1,2],[-2,1],[-1,1],[-9,1],[-1,5],[-1,4],[-2,5],[-4,2],[-2,2],[1,3],[1,3],[-2,1],[-1,2],[0,2],[-2,4],[0,3],[2,2],[5,4],[2,1],[0,1],[6,2],[-5,2],[-3,0],[-2,0],[-2,-3],[-2,-3],[-8,0],[-1,1],[0,4],[0,4],[3,4],[-4,3],[-3,0],[-4,3],[-3,2],[-3,3],[-3,3],[-1,0],[1,3],[1,3],[0,6],[-2,2],[3,5],[4,6],[8,8],[-9,-4],[-7,-8],[-1,-1],[-1,2],[-2,5],[-2,2],[-1,2],[-4,2],[-2,3],[-2,4],[-3,5],[-5,11],[-8,11],[-2,7],[2,9],[-2,5],[7,3],[11,3],[5,3],[4,0],[6,1],[3,2],[-4,0],[-3,0],[0,1],[1,2],[1,3],[-2,0],[-6,-5],[-10,-4],[-8,-2],[-1,0],[-3,-1],[-1,0],[-1,0],[-3,4],[-1,2],[5,6],[4,9],[5,5],[3,1],[6,0],[2,-1],[-1,4],[0,1],[5,2],[5,1],[4,-1],[2,-3],[3,-8],[5,-2],[-1,3],[-2,5],[-1,7],[-2,3],[-3,1],[-6,-1],[-3,5],[-1,2],[0,3],[-4,7],[-1,3],[-2,5],[-1,0],[1,-6],[2,-4],[3,-9],[1,-4],[-2,-3],[-3,-3],[-3,-2],[-6,-2],[1,5],[1,4],[-3,-1],[-3,-3],[-1,-5],[-2,-4],[-6,-10],[-2,-6],[-2,-3],[-3,0],[-2,2],[-2,5],[0,4],[0,10],[0,5],[-1,7],[-3,15],[-1,6],[-5,3],[-2,4],[-1,3],[1,1],[1,1],[8,4],[6,5],[7,8],[3,3],[10,2],[4,0],[0,1],[-1,1],[-7,0],[-9,-4],[-2,-1],[-4,-5],[-3,-3],[-8,-6],[-6,0],[-6,8],[-6,-2],[-5,1],[-1,1],[-1,10],[3,12],[-3,0],[-1,1],[-2,2],[-1,1],[1,2],[9,5],[14,11],[6,5],[4,1],[3,3],[3,4],[1,2],[2,2],[4,2],[5,2],[7,7],[1,2],[-2,1],[-3,-3],[-7,-5],[-5,-4],[-16,-14],[-8,-5],[-3,-4],[-3,-3],[-4,-2],[-3,-1],[-7,-1],[-4,-2],[-2,1],[-1,7],[1,4],[0,4],[2,6],[2,4],[1,2],[1,2],[5,4],[3,2],[2,4],[12,1],[4,0],[1,1],[1,1],[-1,1],[-3,1],[-10,0],[-9,0],[-4,1],[-2,0],[-3,1],[-4,2],[-5,9],[2,11],[0,5],[7,5],[4,1],[5,4],[7,5],[9,4],[4,1],[4,-1],[13,-5],[7,-1],[5,1],[8,-1],[13,-8],[3,1],[-1,2],[-15,8],[0,2],[4,1],[4,2],[-2,1],[-10,-1],[-3,-2],[-9,-1],[-5,2],[-5,1],[-6,3],[-6,-1],[-3,-1],[-7,-2],[-2,0],[-12,-11],[-5,-2],[-4,1],[3,6],[0,3],[0,3],[1,4],[7,8],[4,8],[1,5],[3,1],[4,-1],[13,-3],[11,-4],[7,-1],[5,0],[3,1],[1,2],[1,2],[0,3],[1,1],[2,1],[3,5],[1,4],[-1,2],[-2,-1],[-5,-1],[0,-1],[-5,-6],[-4,-1],[-11,-2],[-5,0],[-9,3],[-2,1],[0,1],[-11,0],[-4,-1],[-2,1],[1,3],[4,3],[4,12],[4,3],[8,2],[9,0],[14,-9],[5,-1],[4,1],[9,3],[2,1],[3,4],[5,6],[-1,2],[-6,-4],[-3,-1],[-3,0],[3,12],[1,8],[1,2],[8,0],[11,1],[2,2],[0,1],[-4,1],[-2,2],[-4,0],[-5,-2],[-6,0],[0,4],[5,8],[0,3],[2,8],[0,3],[3,4],[7,2],[3,2],[0,2],[-4,6],[1,2],[3,1],[2,2],[-1,0],[-3,1],[-5,-1],[-6,-1],[-4,2],[-4,1],[-2,0],[-7,-4],[-2,0],[-3,1],[-18,3],[-2,1],[-7,6],[-5,3],[-7,4],[-10,3],[-11,2],[-7,2],[-3,3],[-6,6],[-4,5],[-1,2],[2,3],[3,2],[5,2],[9,-1],[4,0],[5,-2],[4,0],[8,0],[8,-1],[5,-1],[6,-3],[17,-10],[7,-4],[4,0],[12,-4],[3,0],[5,2],[0,1],[-1,1],[-6,1],[-7,4],[-4,4],[0,5],[0,3],[1,2],[1,5],[-4,3],[-3,1],[-7,4],[-1,1],[4,0],[3,0],[8,-2],[3,0],[3,0],[0,1],[-4,3],[-5,4],[-12,1],[-7,-1],[-5,2],[-5,2],[-4,1],[-6,-2],[-4,0],[-3,1],[-3,7],[1,3],[2,1],[2,2],[1,3],[4,2],[22,6],[6,4],[-1,1],[-3,-1],[-5,-2],[-3,0],[-13,2],[-2,-1],[-5,-3],[-7,-4],[-3,0],[-5,3],[0,1],[-1,2],[5,3],[1,1],[4,4],[-1,2],[-5,-1],[-1,1],[1,3],[-1,4],[-1,4],[-5,6],[-1,1],[-2,2],[-3,8],[1,2],[3,1],[0,1],[-7,-1],[0,-2],[1,-2],[1,-2],[0,-4],[1,-2],[3,-4],[2,-1],[3,-4],[2,-5],[-1,-3],[-2,-2],[-4,-3],[-2,-2],[0,-3],[-3,-2],[-2,1],[-2,0],[2,-4],[1,-3],[-1,-4],[-4,-3],[-2,0],[-4,-2],[-10,-1],[-4,1],[-7,2],[-7,1],[-4,2],[-4,5],[-2,4],[0,4],[1,3],[3,2],[2,10],[4,9],[10,9],[2,4],[1,1],[0,2],[-1,1],[-12,-12],[-7,-1],[-2,3],[0,4],[2,1],[5,0],[3,2],[-4,4],[-4,1],[-1,1],[4,3],[9,0],[3,2],[3,2],[4,4],[1,3],[0,3],[0,2],[0,3],[0,2],[-1,3],[-2,3],[-6,2],[-2,-3],[-2,-1],[-2,0],[-2,1],[-3,0],[-2,2],[-3,0],[-1,1],[0,3],[0,3],[2,2],[4,1],[3,2],[2,4],[0,3],[-1,4],[-3,4],[-6,-4],[-3,0],[0,2],[-1,2],[-2,3],[-4,1],[-3,2],[0,2],[1,2],[1,2],[2,5],[2,0],[2,0],[-1,4],[-2,4],[-2,2],[0,1],[0,1],[-2,3],[-1,1],[-3,6],[-2,1],[-3,2],[-3,0],[-4,-2],[-8,-1],[-7,-1],[-1,0],[3,2],[5,2],[6,2],[2,3],[0,3],[0,3],[-2,3],[2,1],[6,2],[2,0],[3,2],[-7,5],[-8,4],[-2,1],[-2,2],[-1,3],[-3,3],[-3,4],[-5,3],[-12,5],[-5,4],[-3,5],[-2,3],[-2,2],[-9,4],[-1,2],[9,5],[1,2],[-4,6],[-4,4],[-4,2],[-6,1],[-5,2],[-6,3],[-5,2],[-7,2],[-13,6],[-19,6],[-9,3],[-5,2],[-7,0],[-13,3],[-11,1],[-7,0],[-2,0],[-5,4],[-8,2],[-5,-1],[-5,-4],[-6,-3],[-3,-1],[-5,4],[-2,2],[-3,1],[-2,-1],[-4,-3],[-4,-2],[-6,-3],[-5,-1],[-7,0],[-1,-1],[-3,0],[-3,1],[-3,1],[-3,3],[-2,1],[-2,0],[-5,-1],[-7,-4],[-3,-1],[-2,1],[-3,1],[-6,3],[-3,0],[-3,-1],[1,-3],[6,-6],[5,-4],[-5,-1],[-36,6],[-5,2],[-7,3],[-5,2],[-10,5],[-7,3],[-3,3],[0,1],[2,2],[15,8],[5,1],[12,2],[3,1],[1,1],[-3,1],[-16,0],[-13,1],[-12,3],[-2,1],[-2,1],[-2,3],[1,3],[3,3],[1,2],[1,1],[-15,-7],[-6,-3],[-5,1],[-3,1],[-2,1],[0,2],[1,1],[1,1],[-8,3],[-3,3],[-1,2],[3,3],[3,2],[2,1],[7,1],[27,2],[19,-2],[6,7],[4,2],[13,2],[20,0],[13,-1],[7,-2],[9,-3],[0,1],[-2,3],[0,3],[3,4],[2,3],[-1,2],[-4,3],[-7,4],[-4,0],[-4,0],[-5,-3],[-10,-5],[-5,-1],[-8,0],[-4,0],[-4,1],[-7,3],[-2,1],[-3,-2],[-4,-3],[-3,-2],[-3,-1],[-4,0],[-4,0],[-17,4],[-4,2],[0,4],[-6,3],[-6,0],[0,1],[7,5],[6,2],[-1,0],[-8,0],[-6,-2],[-3,0],[-7,-1],[-8,2],[-3,1],[-4,2],[-4,2],[-11,2],[-3,1],[-2,2],[-10,5],[-5,4],[-1,3],[7,5],[0,1],[-3,2],[-1,1],[1,2],[6,5],[2,2],[10,2],[10,4],[4,1],[4,0],[13,0],[4,1],[4,2],[6,2],[12,3],[27,5],[2,0],[0,1],[-2,3],[-1,1],[6,2],[12,3],[9,2],[5,0],[5,1],[6,2],[4,0],[21,1],[10,-1],[4,0],[3,1],[4,2],[8,6],[3,4],[4,5],[5,9],[3,9],[3,8],[2,5],[1,2],[4,2],[5,2],[8,1],[-1,1],[-3,1],[-3,1],[-3,0],[-6,-2],[-6,-2],[-7,1],[-5,-1],[-4,-2],[-7,-1],[-5,0],[-9,3],[-4,0],[-11,0],[-3,1],[-3,2],[-2,2],[-2,3],[0,4],[4,6],[2,1],[10,7],[7,3],[7,3],[4,1],[5,1],[4,1],[8,5],[8,4],[11,7],[5,2],[17,4],[5,0],[4,-1],[3,-2],[11,-7],[1,0],[-2,3],[-4,8],[1,4],[6,3],[2,1],[7,0],[10,-2],[7,-1],[5,-2],[7,-1],[3,0],[2,1],[3,3],[5,5],[1,7],[0,8],[-2,6],[-1,3],[1,3],[5,4],[5,3],[11,3],[9,1],[6,0],[7,-2],[10,-1],[9,-3],[15,-8],[9,-4],[8,-2],[8,-3],[12,-6],[6,-3],[4,-1],[3,0],[-1,2],[-6,4],[-8,4],[-19,7],[-11,6],[-9,6],[-7,3],[-13,4],[1,1],[15,5],[27,5],[32,3],[10,0],[19,1],[1,2],[4,1],[17,3],[5,0],[8,-1],[8,-3],[4,-2],[5,-5],[2,-6],[0,-18],[0,-4],[1,-1],[3,2],[5,4],[3,2],[3,4],[2,6],[1,4],[-4,5],[-1,7],[3,4],[7,0],[28,-14],[11,-3],[13,-7],[15,1],[13,-1],[7,0],[3,1],[-5,3],[-19,9],[-9,7],[-6,8],[-2,4],[5,1],[22,0],[32,-4],[42,-13],[21,-5],[37,-15],[11,-2],[4,-1],[4,2],[2,2],[0,3],[-2,3],[-1,4],[0,5],[2,9],[6,3],[3,3],[-3,6],[-7,4],[-27,11],[0,1],[6,1],[8,1],[67,-2],[11,-1],[5,-1],[3,-1],[2,-1],[15,1],[-1,3],[-1,2],[-78,4],[-15,2],[-7,0],[-8,-1],[-16,-1],[-7,0],[-9,6],[8,6],[7,0],[14,-3],[8,4],[13,3],[13,1],[28,6],[5,1],[6,-1],[15,-1],[5,-2],[7,-3],[4,-1],[4,0],[6,-2],[9,5],[8,5],[10,4],[13,-2],[8,-3],[8,-3],[10,-1],[18,-11],[4,0],[1,1],[2,2],[1,3],[2,4],[-2,1],[-15,4],[-3,2],[-3,3],[0,2],[3,2],[3,0],[10,0],[3,0],[3,2],[4,2],[3,1],[6,0],[10,-2],[9,0],[3,1],[1,2],[1,1],[1,0],[32,0],[8,1],[6,1],[8,0],[6,0],[8,-2],[9,0],[12,3],[11,1],[64,0],[21,-2]],[[2530,6099],[2,-1],[1,-1],[3,-3],[3,-2],[1,5],[-1,3],[0,1],[0,2],[10,-13]],[[2549,6090],[-1,-2],[-3,-5],[-5,-8],[-4,-6],[-4,-7],[-3,-5],[-1,-1],[-4,-4],[-1,-2],[-1,-8],[-1,-2],[1,-4],[1,-7],[0,-4],[-3,-4],[-2,-4],[-1,-3]],[[2517,6014],[0,1],[-1,0],[-2,-1],[-1,0],[-1,-1],[0,-3],[0,-4],[0,-2],[0,-1],[-3,-2],[-1,-3],[-1,-3],[-2,-2],[-1,0],[-1,0],[-2,-3],[-3,-5],[-1,-4],[0,-3],[0,-3]],[[2497,5975],[-11,9],[-3,2],[-15,0],[-7,4],[-7,7],[-5,6],[-11,19]],[[2438,6022],[0,1],[1,3],[1,4],[-1,4],[0,3],[1,5],[0,4],[0,2],[1,1],[1,3],[-3,9],[0,3],[0,2],[3,10],[3,12],[4,13],[3,8],[8,0],[5,0],[8,0],[7,0],[5,0],[2,1],[0,5],[0,5],[1,6],[0,2],[-1,3],[-3,1],[-2,3],[0,3],[-1,4],[-1,4],[-3,5],[-4,4],[-4,7],[-3,7],[-3,5],[-2,3],[0,1],[6,0],[5,0],[0,11],[0,10],[0,11],[10,0],[13,0],[12,0],[10,0],[6,0]],[[9020,5948],[-1,-1],[-1,2],[-1,2],[0,6],[4,6],[1,5],[1,0],[1,-1],[1,-2],[-4,-9],[-1,-8]],[[3411,5503],[-2,-3],[0,-3],[-1,-4],[-1,-2],[2,-5],[1,0],[0,-1],[1,-1],[0,-1],[-1,-1],[-1,-1],[-1,-3],[0,-3],[-1,-2],[-2,-1],[-5,0],[-2,0],[-1,-1],[-2,-2],[-1,-1],[-1,-1],[-1,-2],[-1,-4],[0,-2],[1,-3],[1,-3],[-1,-6],[-1,-4],[0,-3],[-1,-6],[-2,-6],[-1,-4],[0,-4],[1,-6],[3,-8],[1,-4],[1,-6],[3,-6],[2,-4],[0,-5],[0,-2],[2,-1],[1,-1],[2,0],[1,0],[1,1],[3,0],[0,-1],[0,-8],[1,-3],[0,-1],[1,-2],[0,-2],[0,-4],[1,-3],[0,-4],[0,-2],[1,-1],[1,-3],[0,-1],[1,-1],[1,-5],[0,-1],[1,0],[0,-2],[0,-4],[1,-1],[1,-4],[0,-3],[1,-4],[2,-3],[0,-3],[2,-6],[2,-5],[2,-1],[1,-1],[2,-1],[1,-2]],[[3312,5483],[-5,14],[-6,14],[-6,13],[-1,2],[3,6],[2,5],[2,2],[1,3],[-1,10],[0,3],[-1,4],[0,4],[0,4],[1,2],[1,1],[3,1],[2,1],[1,1],[1,2],[1,0],[3,-1],[1,2],[3,3],[5,5],[1,3],[1,5],[0,3],[-1,1],[-1,0],[-2,1],[-2,-2],[-1,1],[-2,3],[0,3],[1,3],[0,3],[-3,8],[0,2],[2,3],[1,3],[2,7],[1,3],[3,1],[1,1],[2,4],[3,4],[4,4],[1,6],[1,2],[3,3],[1,2],[0,1],[-5,14]],[[3333,5676],[1,-1],[4,-9],[2,-2],[0,2],[2,-1],[6,-6],[7,-10],[11,-20],[3,-7],[2,-4],[3,-8],[1,-4],[0,-17],[-3,-11],[0,-8],[0,-12],[-2,-6],[2,3],[1,11],[2,6],[2,6],[3,2],[4,-3],[3,0],[2,-2],[5,-11],[5,-9],[2,-7],[6,-3],[3,-5],[1,-5],[1,-12],[-1,-19],[0,-1]],[[8172,6463],[0,-1],[-2,4],[0,2],[1,0],[2,-2],[0,-2],[-1,-1]],[[8166,6463],[-4,0],[0,1],[-1,1],[2,2],[4,3],[-1,-3],[0,-4]],[[8173,6482],[1,-2],[0,-3],[1,-1],[0,-2],[-1,-2],[0,-2],[-1,-2],[-3,3],[-3,2],[-3,-1],[-1,2],[0,2],[3,3],[0,1]],[[7047,2123],[-4,-3],[-3,0],[-1,3],[-3,6],[-1,1],[-1,2],[2,1],[2,-2],[5,-1],[4,-4],[3,-1],[-1,-1],[-2,-1]],[[2690,6047],[-7,1],[-4,-2],[-1,-4],[-1,-1],[-2,0],[-2,-2],[-3,-3],[-3,-1],[-2,0],[-1,0],[0,-2],[-1,-1],[-1,0],[-1,0],[-1,1],[-1,0],[0,-3],[-1,0],[-1,1],[-2,-1],[-1,-3],[-3,0],[-3,1],[-2,3],[-2,5],[-1,1],[-4,-3],[-1,-4],[-1,-3],[1,-2],[-1,-1],[-2,-1],[-1,-3],[-1,-4],[0,-4],[1,-2],[-1,-2],[-2,-1],[-3,-4],[-3,-7],[-2,-4],[-3,-3],[-2,-3],[0,-3],[0,-1],[-1,-1],[-6,7],[-1,5],[-2,-1],[-1,-2],[-3,-6],[-2,-7],[-2,-1],[-6,1],[-4,0],[0,-1],[-1,-3],[1,-4],[1,-13],[0,-5],[0,-2],[-2,0],[-2,-1],[-2,-3],[0,-2],[0,-4],[-1,-3],[-1,-3],[-2,-1],[-7,-1]],[[2574,5931],[0,6],[-2,3],[-2,5],[-1,3],[1,2],[-1,3],[-3,2],[-3,-2],[-1,1],[-2,2]],[[2560,5956],[3,3],[0,1],[-1,2],[-1,1],[1,3],[0,4],[1,9],[0,2],[-2,3],[-3,0],[-2,-1],[-2,2],[-1,3],[-2,1],[-3,-2],[-4,-4],[-1,-1],[-1,0],[-1,3],[0,3],[0,1],[-2,1],[-2,1],[-1,1],[-1,2],[-3,3],[-1,3],[-3,5],[-1,2],[-1,2],[-2,3],[-1,-1],[-5,3],[-1,0]],[[2549,6090],[3,-2],[2,4],[1,1],[3,4],[1,1],[5,2],[2,0],[2,-4],[2,-3],[3,2],[2,1],[11,-4],[4,2],[8,0],[3,-1],[5,6],[3,1],[4,3],[-1,3],[-1,1],[6,-1],[8,-6],[9,1],[3,3],[2,1],[9,-6],[3,-5],[2,0],[1,1],[1,1],[-2,1],[-1,1],[7,-3],[14,-22],[0,-2],[-6,7],[-3,-1],[-1,-1],[0,-3],[1,-2],[1,0],[1,1],[2,-2],[2,-2],[2,-4],[1,-4],[1,0],[2,3],[2,0],[1,-3],[1,1],[-1,4],[-4,4],[1,0],[8,-7],[2,-10],[2,-2],[2,-3]],[[2599,6127],[-4,-4],[-2,0],[2,3],[4,3],[2,2],[3,-1],[-5,-3]],[[2614,6132],[-2,-3],[0,1],[1,3],[1,2],[1,0],[0,-2],[-1,-1]],[[5489,7647],[3,-4],[-11,5],[1,1],[2,0],[5,-2]],[[5462,7660],[5,-1],[4,0],[3,-1],[2,-1],[1,-1],[-3,0],[-3,0],[-3,-1],[-4,1],[-1,1],[-1,1],[0,2]],[[5512,7635],[0,-2],[1,-2],[1,-3]],[[5514,7628],[-5,5],[-5,6],[-9,10],[-7,2],[-9,8],[-6,2],[2,1],[3,0],[14,-10],[-2,3]],[[5477,7668],[-2,-1],[-12,1],[-4,1],[-4,3],[-1,1],[4,1],[4,-1],[1,-2],[10,-2],[4,-1]],[[5466,7676],[-5,0],[-3,1],[-2,2],[0,1],[0,3],[5,0],[6,-2],[2,-2],[-1,-1],[-2,-2]],[[5426,7717],[2,-5],[-1,1],[-2,3],[-1,3],[2,-2]],[[5423,7722],[0,-2],[-3,4],[-2,2],[0,1],[5,-5]],[[5421,7714],[1,-1],[0,-1],[-2,1],[-7,12],[-1,3],[3,-3],[6,-11]],[[5421,7737],[0,-1],[-2,3],[-2,2],[-1,2],[-2,3],[-1,4],[-4,6],[0,2],[2,-3],[1,-1],[1,-1],[3,-4],[3,-6],[4,-5],[-1,0],[-1,-1]],[[5411,7762],[1,-3],[-2,3],[-3,0],[0,2],[0,2],[1,1],[1,0],[1,-2],[1,-3]],[[5402,7756],[0,-2],[-2,3],[-1,5],[-2,8],[0,2],[1,3],[0,2],[-2,7],[2,1],[1,-5],[0,-2],[2,-4],[0,-6],[0,-8],[1,-2],[0,-2]],[[5411,7774],[-4,-1],[-1,2],[-1,2],[-2,1],[-2,2],[0,1],[2,3],[1,5],[2,-3],[2,-5],[1,-1],[2,-6]],[[5525,7829],[-1,-1],[0,-2],[-1,-2],[1,-4],[2,-6],[-1,-4],[1,-2],[3,-2],[0,-1],[-1,0],[-1,-2],[0,-4],[3,-4],[5,-3],[1,-1],[1,-1],[1,-1],[0,-1],[0,-1],[0,-1],[-2,-1],[-3,0],[-2,2],[0,-1],[0,-2],[-2,0],[1,-10],[0,-2],[-1,-1],[-1,0],[-1,0],[0,-1],[0,-2]],[[5488,7657],[-1,1],[-6,9],[-6,6],[-6,10],[-8,4],[-6,5],[-4,-1],[-3,-1],[-3,0],[-1,0],[-2,3],[0,2],[0,3],[-3,5],[-5,4],[-4,6],[-9,15],[-1,5],[1,1],[2,0],[1,1],[2,0],[3,-1],[-2,3],[-3,3],[-8,13],[-3,6],[0,6],[1,9],[-2,6],[-6,9],[-2,4],[-5,2],[-2,0],[-1,-3],[-1,-7],[-4,-9],[-1,-4],[-3,-6],[-1,0],[-2,0],[-3,9],[-3,7],[0,3],[-1,4],[-2,14],[2,3]],[[5377,7806],[1,-3],[7,-3],[2,2],[1,2],[0,1],[3,-2],[2,1],[3,0],[3,-1],[1,2],[2,5],[1,3],[1,1],[1,-1],[0,-2],[1,-2],[3,-4],[1,-2],[2,0],[1,1],[2,1],[4,-3],[4,-1],[3,2],[-1,2],[-1,2],[0,2],[0,2],[2,2],[0,1],[-2,3],[0,1],[5,4],[4,2],[1,1],[1,3],[0,4],[0,4],[-2,4],[0,1],[0,2],[1,2],[2,1],[2,1],[2,1],[2,1],[2,2],[2,4],[1,0],[3,0],[1,1],[-1,5],[1,2],[1,0],[1,1],[3,0],[2,-2]],[[5458,7862],[2,-1],[5,-4],[3,-4],[2,-5],[3,-4],[3,-3],[2,-3],[2,-5],[3,-2],[3,-1],[3,-2],[0,-2],[2,-3],[3,-2],[4,-1],[9,0],[1,0],[1,-1],[3,1],[2,2],[1,1],[3,5],[2,0],[3,0],[1,1],[1,0]],[[2977,6265],[0,-4],[-7,5],[-6,6],[0,4],[3,0],[3,-2],[4,-4],[3,-5]],[[3006,6223],[-2,4],[-3,4],[-1,2],[-2,1],[-12,-1],[-2,0],[-1,-2],[-1,0],[-3,-1],[-4,-1],[-8,3],[-3,2],[-3,1],[-3,0],[-4,-1],[-3,-2],[-2,-4],[0,-4],[-2,-1],[-3,6],[-2,4],[-3,3],[-6,5],[-2,2],[0,3],[2,11],[3,1],[2,1],[3,-2],[4,-2],[3,-1],[5,-1],[2,-2],[19,-4],[4,-1],[1,0],[1,2],[1,2],[2,2],[5,1],[1,1],[1,2],[0,3],[-3,4],[-5,9],[-5,10],[2,4],[-1,6],[1,6],[1,6],[-4,4],[-6,5],[-7,2],[-2,1],[-1,4],[1,5],[2,2],[3,2],[3,1],[6,2],[7,-2],[6,-5],[6,-4],[7,-1],[3,-2],[2,2]],[[2981,6338],[1,-1],[0,-2],[-3,1],[-3,2],[-1,-1],[0,1],[-2,1],[2,2],[1,0],[2,0],[3,-3]],[[5614,7972],[3,0],[1,0],[0,-3],[1,-2],[0,-2],[1,-2],[2,0],[3,-3],[2,-4],[2,-1],[1,-1],[0,1],[2,0],[0,-1],[2,-2],[0,-2],[0,-2],[0,-2],[1,-1]],[[5635,7945],[-1,-1],[-5,-7],[-2,-2],[-1,0],[-2,0],[-2,0],[-2,-2],[-1,0],[-2,-2],[-1,-4],[-2,-3],[-2,-2],[-1,-2],[-1,-6],[-1,-2],[-1,-2],[-1,-2],[-2,-9],[-2,-3],[-2,-3],[0,-2],[0,-2],[-2,-5],[-2,-5],[-1,-2],[1,-3],[-3,-3],[-1,-2],[-1,-1],[-1,-2],[-1,-5],[0,-2],[0,-2],[-2,-1],[0,-2],[-1,-3],[-1,-1],[-2,-3],[-6,1],[-2,0],[-1,-2],[0,-1],[0,-2],[-2,-1],[-1,-1],[-3,2],[-6,-2],[-1,-1]],[[5562,7840],[-1,1],[-2,1],[-6,1],[-2,-1],[-4,0],[-3,1],[-2,-1],[-2,-4],[-1,-1],[-1,-1],[-2,-1],[-1,-2],[-2,-1],[-2,1],[-1,1],[-1,0],[0,-2],[-1,-1],[-3,-2]],[[5458,7862],[0,1],[-2,5],[-2,2],[1,3],[-1,1],[-1,1],[0,3],[-1,3],[0,2],[-6,0]],[[5476,7949],[1,0],[2,0],[1,-1],[5,-6],[4,-4],[4,-3],[5,0],[5,0],[10,1],[7,0],[0,1],[1,3],[-1,2],[0,3],[1,4],[4,2],[10,2],[5,2],[1,3],[2,3],[2,0],[2,-1],[3,-3],[2,-1],[2,1],[5,4],[5,5],[4,11],[1,2],[4,1],[6,0],[3,-2],[3,0],[3,0],[5,2],[2,0],[2,-1],[1,-2],[2,-2],[0,-2],[1,-1],[1,-2],[1,-2],[1,0],[10,3],[0,1]],[[8414,4555],[-2,0],[-1,1],[0,5],[1,3],[6,4],[2,3],[3,7],[2,2],[1,1],[0,-1],[0,-5],[1,-3],[0,-2],[-3,-2],[-2,-7],[-6,-4],[-2,-2]],[[8385,4574],[-2,-1],[-3,2],[0,1],[2,3],[2,4],[3,0],[1,-1],[0,-5],[-3,-3]],[[8427,4590],[-2,-2],[0,5],[2,5],[2,2],[1,-2],[0,-1],[-3,-2],[0,-5]],[[8333,4644],[1,-3],[5,-5],[0,-2],[1,-3],[1,-3],[2,0],[2,0],[1,-1],[2,-3],[2,-5],[2,-6],[2,-3],[2,-4],[-1,-4],[-3,-6],[-2,-1],[-2,-1],[-3,-3],[-2,2],[-3,1],[-3,2],[-3,5],[-2,5],[-1,4],[-4,3],[-6,8],[-3,1],[-2,-1],[-1,0],[-8,4],[-1,2],[-1,3],[-1,2],[0,4],[1,2],[1,2],[4,3],[3,1],[4,0],[5,1],[5,-1],[1,1],[3,3],[1,-1],[1,-3]],[[8473,4636],[-2,-3],[-1,-6],[-3,-5],[-4,-9],[-3,-5],[-2,-5],[-3,-4],[-2,-1],[-5,-1],[-5,-6],[-3,-3],[-3,0],[-3,2],[-1,2],[0,3],[1,3],[1,2],[1,3],[-4,4],[0,3],[1,7],[1,8],[2,5],[4,9],[3,5],[2,2]],[[8445,4646],[0,-2],[1,-3],[1,0],[0,1],[4,-1],[1,1],[2,3],[1,2],[1,5],[0,2]],[[8456,4654],[4,2],[2,3],[1,3],[5,5],[1,2]],[[8469,4669],[0,-5],[1,-2],[1,0],[3,3],[1,0],[1,-2],[0,-5],[-2,-4],[-3,0],[-1,-1],[0,-2],[0,-3],[1,-1],[1,-4],[1,-7]],[[8211,4679],[-1,-2],[-2,3],[-1,2],[2,2],[2,-2],[0,-3]],[[8415,4692],[-1,-4],[-1,1],[0,3],[1,2],[2,3],[2,1],[2,-1],[0,-1],[-3,-1],[-2,-3]],[[8318,4680],[-1,0],[-2,1],[1,5],[-1,3],[1,3],[1,5],[0,1],[1,-1],[0,-1],[1,-1],[1,0],[0,-2],[0,-2],[0,-2],[-2,-2],[-1,-3],[1,-4]],[[8425,4703],[-1,-3],[-7,0],[0,4],[2,3],[1,1],[2,1],[3,-1],[0,-5]],[[8239,4688],[-3,-12],[1,-2],[1,-2],[-6,-2],[-3,1],[-1,-1],[-6,3],[-4,2],[-1,3],[1,2],[1,-1],[3,0],[2,1],[0,8],[-1,10],[5,8],[2,3],[3,2],[6,-4],[2,-2],[0,-1],[1,-3],[-3,-13]],[[8452,4704],[-2,-4],[-1,-6],[-1,-2],[-3,-1],[-1,6],[-2,0],[1,6],[1,2],[2,0],[0,-3],[1,0],[3,9],[1,0],[1,0],[0,-1],[0,-6]],[[8442,4707],[-4,-1],[-3,-7],[-2,0],[-1,-4],[0,-1],[0,-1],[0,-1],[-1,-2],[-2,2],[-1,-2],[-1,-1],[-2,3],[-2,0],[-1,0],[3,6],[3,5],[1,1],[-1,1],[-1,1],[0,1],[2,1],[2,0],[1,-2],[1,0],[4,6],[2,-1],[2,-2],[1,-2]],[[8857,4701],[-1,-1],[-7,2],[-1,2],[0,1],[2,3],[1,4],[3,1],[1,0],[2,-9],[0,-3]],[[8265,4702],[-1,0],[-1,1],[0,2],[0,4],[0,3],[1,2],[4,0],[0,-2],[-3,-10]],[[8307,4709],[-1,0],[-1,2],[1,3],[1,1],[1,-2],[0,-1],[0,-2],[-1,-1]],[[8460,4715],[0,-4],[2,2],[2,1],[5,-1],[4,0],[2,-2],[0,-7],[-1,-1],[-18,-6],[-2,2],[-1,2],[2,5],[0,2],[1,4],[2,3],[2,0]],[[8550,4717],[5,-2],[2,0],[1,-2],[-3,-5],[-5,4],[-1,4],[1,1]],[[8410,4688],[-4,-2],[-3,-2],[-2,-3],[-1,0],[-3,-1],[-4,1],[-2,-1],[-7,-7],[-3,0],[-3,-2],[0,3],[-1,2],[-3,0],[-2,0],[-3,-6],[-3,1],[-2,0],[-1,-1],[-2,-1],[-1,1],[-6,4],[-6,3],[-7,-1],[-5,2],[-3,-2],[-3,-2],[-1,2],[-1,3],[-1,4],[0,4],[0,3],[1,3],[1,3],[0,3],[1,-2],[1,1],[4,3],[4,5],[3,2],[2,1],[2,-1],[2,0],[1,1],[3,-4],[1,-1],[4,0],[4,-2],[3,-3],[4,-4],[3,-4],[2,-1],[1,-1],[1,1],[2,3],[2,1],[2,0],[3,1],[2,0],[1,2],[2,-1],[1,-2],[5,-7],[2,0],[3,1],[1,2],[0,3],[1,3],[1,2],[2,2],[4,3],[3,2],[2,5],[-5,2],[1,4],[2,2],[2,-1],[1,-3],[1,-10],[-1,-1],[-1,-2],[-1,-2],[-2,-4],[1,-4],[-1,-2],[-1,-1]],[[8634,4705],[-2,-2],[1,4],[6,11],[1,-2],[3,-1],[-4,-4],[-4,-2],[-1,-4]],[[8284,4705],[1,-3],[1,1],[3,3],[2,1],[1,0],[2,0],[2,-3],[0,-4],[1,-1],[1,5],[1,1],[1,1],[3,0],[1,-2],[2,-7],[0,-6],[0,-3],[2,-1],[0,-2],[0,-3],[-1,-1],[-2,-1],[-1,0],[-1,2],[-1,1],[-2,-1],[-2,-1],[0,-3],[2,-1],[0,-1],[0,-1],[-1,0],[-2,2],[-1,-1],[-6,-2],[-1,0],[-1,2],[0,6],[-1,2],[-4,-8],[-1,-1],[-1,-1],[-2,0],[-6,-5],[-2,1],[-1,0],[-7,-5],[-3,-1],[-2,-1],[-1,1],[-2,-1],[-1,-2],[-3,-1],[-3,1],[-2,2],[-3,2],[0,3],[0,4],[1,4],[-1,9],[1,4],[1,3],[1,2],[2,0],[3,3],[3,5],[1,-1],[4,-3],[2,0],[4,0],[1,-1],[1,-5],[1,-1],[1,-2],[3,-7],[2,0],[2,-1],[4,5],[3,-1],[0,4],[-1,4],[-2,3],[-1,0],[-2,0],[-1,1],[-4,6],[-2,4],[0,4],[0,3],[3,3],[2,1],[5,-2],[1,-2],[2,-6],[1,-3]],[[8206,4714],[3,-3],[4,-9],[0,-2],[-1,-3],[-3,-4],[-6,-5],[-1,-3],[-2,-6],[0,-2],[0,-1],[-1,-1],[-1,-1],[-2,1],[2,4],[0,4],[-1,4],[-2,3],[-3,4],[-3,4],[-3,2],[-3,1],[-1,2],[-2,5],[-1,3],[0,2],[0,3],[1,0],[3,0],[6,-4],[3,0],[2,1],[4,6],[1,0],[4,-3],[3,-2]],[[8606,4726],[-2,-6],[-2,1],[-3,7],[0,5],[0,1],[2,1],[4,-2],[1,-4],[0,-3]],[[8521,4742],[1,-3],[0,-1],[-4,-1],[-3,-3],[-1,-3],[-2,-5],[-4,2],[-4,0],[-2,2],[-2,0],[-2,-2],[-4,-4],[0,6],[1,4],[3,8],[4,-2],[3,0],[4,2],[3,4],[4,2],[3,-6],[2,0]],[[8539,4745],[-2,-2],[0,5],[0,3],[3,-1],[0,-3],[0,-1],[-1,-1]],[[8847,4707],[-6,-7],[-9,1],[-3,0],[-5,-2],[-1,2],[1,7],[4,19],[5,17],[2,4],[3,4],[3,3],[7,4],[6,-1],[1,-1],[2,-6],[2,-4],[1,-6],[-3,-11],[-3,-10],[-5,-8],[-2,-5]],[[8647,4723],[0,-1],[-4,1],[-2,0],[0,5],[-1,3],[2,5],[0,5],[1,1],[1,3],[1,9],[1,1],[2,1],[1,5],[1,1],[1,4],[2,2],[0,3],[1,2],[2,1],[1,-1],[1,-4],[-2,-4],[1,-10],[-2,-10],[-1,-4],[-2,-2],[-1,-3],[-2,-5],[-1,-5],[0,-2],[-1,-1]],[[8665,4769],[0,-3],[-1,2],[-1,3],[-2,0],[-1,1],[-1,2],[5,1],[1,-6]],[[8177,4773],[0,-2],[-2,0],[-1,4],[1,1],[1,0],[1,0],[0,-3]],[[8573,4770],[-1,-1],[-2,3],[-1,1],[2,3],[1,1],[1,-2],[0,-1],[0,-1],[0,-3]],[[8354,4774],[-3,-1],[-1,1],[0,6],[3,-3],[1,0],[0,-3]],[[8162,4775],[-1,-1],[-5,0],[-3,-5],[-2,-1],[-7,0],[-1,1],[-1,0],[0,-1],[-3,0],[-7,5],[-2,3],[2,5],[2,5],[6,2],[25,0],[3,-5],[0,-2],[-5,-3],[-1,-3]],[[8204,4782],[-2,-1],[-2,2],[0,3],[0,3],[3,1],[2,0],[2,-2],[1,-2],[1,-2],[-4,0],[-1,-2]],[[8740,4795],[0,-1],[-1,2],[0,1],[1,3],[1,2],[1,0],[0,-2],[-2,-5]],[[7923,4801],[-2,-1],[-1,1],[-1,2],[2,4],[1,1],[1,0],[1,-2],[-1,-5]],[[8741,4807],[-1,-1],[-1,5],[1,1],[2,-3],[-1,-2]],[[8744,4813],[-1,0],[0,3],[1,2],[1,2],[1,0],[-2,-7]],[[8736,4813],[0,-4],[-1,-5],[-2,-5],[-2,-8],[-1,-2],[-3,-3],[-3,4],[-1,4],[1,17],[2,-1],[0,1],[1,1],[-2,2],[-1,10],[1,3],[1,1],[2,-3],[2,-5],[3,-4],[3,-3]],[[7982,4838],[3,-7],[2,-3],[3,-2],[3,0],[3,-1],[3,-3],[4,-1],[2,1],[1,1],[1,0],[1,-1],[3,-6],[3,-5],[0,-3],[2,-12],[2,-3],[3,-1],[3,0],[3,-1],[8,-3],[3,1],[3,3],[2,-2],[7,-4],[3,-1],[4,1],[3,1],[2,-1],[2,-2],[1,0],[2,0],[2,3],[2,5],[1,6],[1,7],[1,3],[1,3],[2,2],[1,1],[4,-1],[1,-2],[4,-11],[1,-1],[4,-1],[1,0],[3,3],[2,0],[2,-3],[2,-3],[1,-1],[7,-2],[3,-5],[1,-1],[5,1],[3,-1],[3,-1],[2,-7],[1,-8],[0,-2],[3,-3],[1,-2],[0,-7],[0,-7],[6,-6],[7,-4],[7,0],[7,1],[3,2],[5,2],[1,0],[8,-8],[1,-1],[1,-6],[0,-6],[-1,-15],[-1,-4],[1,-4],[1,-9],[1,-3],[3,-4],[0,-3],[0,-2],[-3,1],[-3,2],[-1,4],[-1,2],[-4,-1],[-6,3],[-7,5],[-12,11],[-3,0],[-3,-1],[-4,-3],[-3,-2],[-3,-1],[-2,1],[-7,3],[-6,1],[-17,1],[-5,3],[-8,1],[-6,2],[-6,3],[-16,15],[-5,4],[-16,7],[-3,1],[-5,-1],[-4,2],[-3,0],[-5,-2],[-1,-2],[-2,-3],[-3,0],[-4,1],[-8,3],[-3,2],[-3,3],[-3,4],[-1,1],[-8,4],[-6,2],[-12,2],[-2,1],[-3,1],[-1,4],[0,4],[1,3],[1,4],[1,4],[-9,7],[-7,4],[-3,0],[-3,0],[-3,0],[-4,0],[-1,1],[-2,1],[-2,-1],[-1,0],[0,3],[0,3],[2,3],[1,1],[1,-5],[0,-1],[2,-1],[3,7],[1,3],[1,8],[1,-1],[2,1],[1,1],[2,20],[2,5],[2,5],[2,1],[2,-3],[5,-1],[3,-2],[3,0],[3,-1],[5,-3],[1,0],[2,1],[2,4],[1,6],[3,-3],[5,-2],[1,-1]],[[8445,4840],[0,-3],[-1,3],[-1,2],[0,3],[1,-1],[1,-4]],[[8347,4821],[-1,-10],[0,4],[-1,9],[0,4],[0,5],[0,12],[1,6],[1,-7],[1,-4],[-1,-19]],[[8130,4849],[0,-2],[-3,0],[0,3],[1,4],[1,0],[2,-2],[-1,-3]],[[8688,4847],[-1,-6],[-2,2],[-1,4],[1,6],[-2,8],[2,0],[1,-3],[2,-8],[0,-3]],[[8742,4855],[0,-2],[0,-4],[0,-4],[-1,-4],[1,-6],[0,-3],[0,-4],[0,-1],[-1,-6],[-1,-2],[-1,-2],[-5,2],[-3,4],[-2,4],[0,1],[-3,5],[0,2],[0,2],[2,1],[2,0],[0,2],[1,8],[-3,5],[-1,2],[1,2],[3,-2],[3,9],[1,2],[0,5],[2,0],[1,0],[1,-4],[1,-2],[-1,-3],[2,-1],[1,-6]],[[8692,4844],[-3,-5],[2,12],[1,5],[2,4],[3,18],[0,-1],[1,-1],[-1,-13],[-4,-10],[-1,-9]],[[7843,4868],[-3,0],[-4,7],[0,2],[1,2],[1,0],[5,-4],[1,-3],[-1,-4]],[[8433,4880],[0,-6],[-1,1],[-1,2],[0,2],[0,1],[0,1],[2,-1]],[[8389,4871],[-2,-2],[-3,7],[-1,5],[0,3],[1,3],[1,0],[-1,3],[2,2],[1,-1],[1,-3],[1,-1],[1,-4],[-1,-12]],[[8406,4880],[-1,-4],[-1,-3],[-2,0],[-1,1],[-2,2],[-1,-2],[-1,0],[-1,3],[1,11],[2,4],[0,4],[-2,9],[1,4],[5,4],[3,4],[2,1],[1,-3],[0,-15],[-4,-12],[1,-8]],[[8421,4922],[0,-13],[0,-3],[-1,5],[-1,1],[0,-1],[-1,-1],[-1,0],[-1,-5],[0,-4],[-1,-3],[0,-10],[0,-3],[2,1],[0,1],[3,-4],[1,-3],[0,-3],[-2,-4],[-2,-1],[-2,1],[0,-1],[-1,-1],[-1,-3],[1,-2],[-2,-7],[-1,-2],[-3,2],[-1,-2],[-1,1],[-2,6],[0,4],[2,3],[0,3],[1,3],[1,4],[1,3],[0,2],[1,7],[0,3],[1,3],[1,7],[0,12],[2,10],[3,3],[1,0],[0,-3],[3,-6]],[[8709,4939],[2,-3],[-3,3],[-5,5],[-1,3],[4,-5],[3,-3]],[[8423,4947],[-3,-7],[-2,0],[-2,5],[-1,5],[0,2],[2,3],[5,-1],[1,-3],[0,-4]],[[8570,4977],[-4,-3],[1,6],[0,1],[3,-1],[0,-3]],[[8562,4972],[0,-2],[-2,-1],[-1,0],[0,2],[0,1],[-1,-1],[-2,-1],[-2,-3],[-1,1],[0,3],[0,1],[2,4],[3,1],[4,4],[2,0],[-1,-2],[0,-2],[-1,-2],[0,-3]],[[8575,4980],[0,-3],[0,-1],[-2,1],[-1,0],[-1,5],[0,1],[2,-2],[1,0],[1,-1]],[[8233,4984],[-1,-10],[-2,6],[2,7],[1,1],[0,-4]],[[8544,4993],[0,-3],[-2,2],[-2,2],[2,2],[2,-3]],[[8230,4961],[-6,-11],[-1,3],[1,11],[-2,7],[0,5],[1,9],[2,6],[3,5],[1,1],[0,-9],[0,-3],[1,-3],[-1,-2],[1,-10],[0,-3],[-1,-3],[1,-3]],[[8523,5006],[5,-5],[1,-2],[0,-4],[1,-2],[1,-1],[2,-4],[1,-4],[-1,-9],[-2,-1],[-2,-2],[-4,-5],[-2,-1],[-2,0],[-1,-2],[-2,0],[-4,3],[-3,3],[-6,6],[-1,2],[-1,3],[-2,6],[-1,4],[0,10],[1,3],[1,1],[3,-3],[3,3],[7,2],[7,0],[1,-1]],[[8554,5015],[-1,-5],[-2,0],[-1,1],[3,3],[1,1]],[[7968,5011],[0,-1],[-2,0],[-1,2],[-1,1],[0,2],[2,2],[3,-2],[-1,-4]],[[7985,5017],[-2,-2],[0,2],[0,1],[0,2],[2,1],[0,-1],[0,-3]],[[8603,5019],[7,-7],[3,-1],[6,1],[2,0],[5,-9],[2,-5],[0,-5],[1,-5],[1,-1],[2,0],[2,-7],[0,-2],[-1,-16],[-7,6],[-6,7],[-2,3],[-7,6],[-1,2],[-1,2],[-3,4],[-6,1],[-2,0],[-1,-1],[0,-2],[0,-4],[-2,-1],[-3,2],[-4,1],[-3,3],[-3,1],[-1,1],[0,2],[0,2],[-1,1],[-1,-1],[-2,-1],[-1,-2],[-2,-6],[-2,-2],[-3,-1],[-1,1],[-2,1],[-4,10],[-1,2],[-1,2],[-2,1],[-1,-2],[-1,-3],[0,-3],[0,-3],[-2,-6],[-2,-3],[1,6],[0,3],[-1,4],[-1,3],[7,17],[2,4],[11,1],[6,-1],[3,1],[2,1],[2,-1],[1,-3],[1,-2],[1,0],[3,2],[3,4],[1,2],[2,0],[2,0],[1,-1],[4,-3]],[[7789,5000],[1,-8],[-3,6],[0,4],[-1,2],[-2,4],[-1,4],[-1,9],[1,2],[1,0],[6,-12],[0,-2],[0,-5],[-1,-1],[0,-3]],[[8005,5011],[0,-6],[-1,-2],[-2,-3],[-1,-2],[-2,0],[-1,3],[0,3],[-3,2],[0,-1],[-1,-3],[-4,-3],[-2,0],[1,5],[-1,4],[0,4],[0,2],[-1,2],[1,3],[0,4],[1,3],[1,10],[5,2],[1,-2],[5,-2],[4,-6],[2,-7],[-2,-10]],[[7783,5026],[-2,-5],[-4,0],[0,3],[0,7],[-1,2],[0,1],[1,4],[0,1],[6,-10],[0,-3]],[[8732,5061],[-1,0],[0,2],[0,3],[1,1],[1,-1],[-1,-5]],[[7773,5049],[0,-2],[-5,5],[-2,2],[-2,5],[1,3],[0,4],[0,1],[2,1],[1,-3],[2,-7],[2,-6],[1,-3]],[[8501,5043],[-1,-1],[-1,3],[-2,8],[-1,3],[-1,8],[1,3],[1,3],[1,0],[1,-2],[-1,-9],[3,-11],[0,-5]],[[8439,5071],[1,-2],[-2,0],[-1,4],[1,3],[1,-5]],[[8500,5081],[8,-2],[-1,-2],[-9,-4],[-3,1],[-10,-2],[-2,0],[0,3],[-1,3],[2,2],[2,0],[5,-1],[9,2]],[[8420,5079],[-2,-5],[0,3],[0,2],[1,2],[1,1],[0,-3]],[[8620,5086],[0,-3],[2,-3],[-1,-5],[0,-1],[0,-2],[1,-2],[-1,-1],[-1,1],[-2,-2],[-1,-2],[-3,-1],[-1,2],[-6,2],[-4,6],[0,1],[7,6],[3,2],[3,0],[3,2],[1,0]],[[8471,5086],[2,-2],[1,0],[1,2],[2,-1],[0,-4],[2,1],[1,-2],[0,-4],[-5,-1],[-3,-3],[-5,3],[-6,-5],[-3,-2],[-3,0],[-2,9],[1,10],[1,1],[2,1],[5,1],[9,-4]],[[8762,5092],[11,-3],[3,1],[7,-2],[5,-3],[9,-1],[3,-1],[2,-3],[-5,-2],[-3,-2],[-4,-1],[-4,1],[-3,-1],[-1,2],[-4,2],[-5,4],[-10,5],[-1,3],[0,1]],[[8026,5091],[-4,-3],[0,5],[2,2],[2,-1],[0,-3]],[[7945,5088],[1,-4],[1,-4],[1,-4],[1,-18],[5,-16],[12,-6],[-2,-3],[-1,-2],[0,-3],[-2,-11],[0,-2],[1,-4],[0,-4],[-1,0],[-2,1],[-2,1],[-1,2],[-1,2],[-2,1],[-2,3],[-4,2],[-3,2],[-2,5],[-1,6],[1,8],[-1,3],[-1,2],[-2,6],[0,7],[-3,3],[-2,2],[-2,1],[-6,-3],[-1,1],[-1,2],[-3,2],[0,4],[1,3],[4,4],[1,2],[1,4],[-1,3],[0,2],[1,3],[2,2],[3,3],[2,-5],[0,-4],[1,-3],[2,4],[-1,7],[3,2],[2,0],[2,-2],[1,-3],[1,-4]],[[8432,5086],[-1,-1],[-2,2],[0,8],[2,2],[0,-3],[1,-2],[1,-2],[-1,-4]],[[8559,5088],[-2,-2],[-1,-1],[-4,2],[-4,-1],[-5,-2],[-3,2],[-2,3],[0,3],[2,8],[3,6],[2,1],[3,-2],[4,-4],[4,-5],[3,-5],[0,-3]],[[8422,5116],[0,-3],[-1,-3],[1,-6],[3,8],[3,1],[1,-2],[1,-1],[1,-3],[-1,-7],[-2,-3],[-2,0],[-1,4],[-2,0],[-1,-8],[0,-1],[-1,-1],[-2,2],[0,1],[2,4],[-1,11],[-1,-2],[-4,-10],[-2,-5],[-1,3],[-1,6],[0,9],[2,6],[2,-1],[5,2],[2,-1]],[[8047,5116],[-6,-6],[-1,0],[-1,2],[0,12],[1,3],[4,0],[2,-1],[2,-2],[0,-4],[0,-2],[-1,-2]],[[8748,5120],[-1,-2],[-2,2],[-1,4],[0,3],[2,3],[1,-3],[1,-3],[1,0],[-1,-4]],[[7754,5081],[-3,0],[-5,7],[-2,3],[0,4],[-5,16],[-1,4],[2,13],[6,3],[1,-2],[1,-6],[3,-11],[1,-5],[1,-3],[0,-2],[0,-1],[2,-7],[2,-4],[0,-6],[-3,-3]],[[8638,5108],[-1,-2],[-3,2],[-2,3],[-1,5],[-1,4],[0,3],[-1,4],[0,2],[6,4],[1,-2],[3,0],[1,-3],[-1,-13],[-1,-7]],[[8635,5139],[0,-3],[-2,-2],[-12,-3],[1,2],[1,2],[1,1],[1,0],[1,0],[1,0],[1,1],[2,-1],[3,1],[0,3],[2,-1]],[[8760,5146],[6,-2],[2,0],[2,-2],[2,1],[2,-1],[5,-9],[2,-6],[4,-5],[2,-1],[-2,-5],[-4,-2],[-1,0],[-3,2],[-2,0],[-3,3],[0,6],[-2,11],[-3,-3],[-3,5],[-1,1],[0,-1],[-2,2],[-1,3],[0,3]],[[8535,5139],[0,-1],[-3,1],[-1,1],[2,8],[1,0],[1,-8],[0,-1]],[[8628,5153],[-2,0],[-3,3],[2,2],[1,0],[1,2],[2,-1],[0,-2],[-1,-4]],[[8384,5160],[1,-2],[0,-3],[-1,1],[-3,0],[-1,-1],[-1,-1],[-1,-1],[1,3],[2,4],[1,0],[2,0]],[[8915,5033],[0,-11]],[[8915,5022],[0,-11],[0,-12],[0,-12],[0,-12],[0,-11],[0,-12],[0,-12],[0,-11],[0,-12],[0,-12],[0,-11],[0,-12],[0,-12],[0,-12],[0,-11],[0,-12],[0,-12],[0,-5],[-1,-6],[-2,-9],[0,-7],[2,-6],[1,-4],[0,-10],[0,-11],[0,-12],[0,-12],[0,-11],[0,-12],[0,-12],[0,-12],[0,-11],[0,-12],[0,-12]],[[8915,4659],[-1,2],[-4,6],[-4,7],[-2,7],[-2,6],[-11,19],[-3,6],[0,1],[0,2],[1,3],[2,9],[-2,-5],[-3,-5],[-4,0],[-4,-1],[-3,-3],[-4,-1],[-2,1],[-1,4],[-1,3],[0,4],[-1,-6],[-3,-3],[-5,-7],[-1,1],[-1,3],[0,3],[1,3],[1,3],[0,7],[2,4],[1,9],[1,3],[1,3],[-1,3],[-2,1],[-1,2],[-2,6],[-1,2],[-2,2],[-1,3],[2,2],[1,1],[2,0],[3,-1],[1,0],[3,2],[-2,-1],[-1,0],[-6,4],[-4,4],[-3,7],[0,2],[2,1],[5,2],[-1,4],[-2,3],[-1,6],[-2,4],[-3,6],[-2,6],[-2,13],[-2,10],[0,4],[2,2],[-3,1],[-2,1],[1,5],[3,3],[-3,-1],[-2,-1],[-1,0],[-1,0],[-1,2],[0,3],[1,4],[-1,5],[-2,2],[-2,3],[-1,2],[-1,0],[-1,2],[-1,3],[-13,14],[-1,4],[-1,-2],[-1,-1],[-1,3],[-2,1],[-1,0],[-2,1],[-2,1],[-1,0],[-7,4],[-6,7],[-5,3],[-3,4],[-4,3],[-7,3],[-7,2],[-3,0],[-2,-1],[-2,0],[-13,15],[-2,7],[0,4],[1,3],[5,1],[-4,1],[-1,-1],[-3,-2],[-1,0],[-3,1],[-2,3],[-3,-2],[-2,3],[-1,3],[-1,2],[-1,0],[-2,-1],[-1,0],[-2,2],[0,4],[-2,2],[-1,2],[-2,4],[-2,5],[1,10],[0,4],[2,5],[2,6],[-2,0],[-2,-2],[-1,-3],[0,-3],[0,-10],[-2,-3],[-2,0],[1,-6],[-1,-5],[-3,-7],[0,-3],[0,-4],[0,-3],[-5,-9],[-1,-1],[-3,0],[-3,-1],[-2,2],[-1,3],[-1,3],[-1,7],[-1,7],[3,9],[-1,8],[-2,7],[-6,9],[-6,9],[-2,2],[-4,1],[-2,1],[-1,3],[-1,4],[3,2],[4,4],[3,0],[7,-2],[2,-3],[2,-1],[5,8],[4,10],[2,2],[2,0],[2,-1],[4,-3],[3,-2],[2,0],[2,-3],[1,-1],[0,4],[2,6],[2,1],[1,1],[1,1],[0,5],[-3,1],[1,4],[2,2],[0,2],[0,3],[-6,-5],[-6,-2],[-4,0],[-3,0],[-7,-3],[-3,0],[-7,1],[-3,2],[-3,-1],[-3,0],[-2,3],[-3,5],[-1,4],[-2,2],[0,3],[-2,13],[0,9],[-3,0],[-3,1],[-12,9],[-1,-3],[-2,-1],[-2,0],[-1,0],[-2,2],[0,2],[1,6],[2,2],[1,2],[1,3],[2,9],[0,3],[0,3],[0,3],[1,1],[5,3],[9,4],[3,3],[2,4],[2,3],[1,3],[1,2],[8,5],[3,1],[3,-1],[7,-3],[6,-6],[5,-7],[6,-5],[7,-1],[3,1],[4,-1],[1,-2],[2,-4],[0,-3],[-1,-6],[2,-6],[2,-5],[1,-7],[1,-3],[-1,-6],[-1,-3],[-2,-6],[-1,-5],[1,-7],[0,-8],[0,-6],[1,-7],[1,-6],[4,-18],[3,-12],[1,6],[0,8],[1,3],[1,1],[2,-1],[0,-3],[0,-7],[2,-13],[2,-1],[2,2],[0,-4],[0,-7],[1,-6],[1,-2],[3,-5],[2,-1],[4,-1],[3,-1],[4,2],[2,5],[2,4],[6,11],[2,6],[2,8],[0,1],[7,9],[0,3],[1,6],[2,6],[1,3],[6,3],[6,1],[7,6],[2,4],[1,3],[-2,5],[0,3],[2,2],[5,7],[7,7],[5,4],[3,0],[3,-4],[3,-3],[15,-10],[2,-3],[2,-5],[3,-3],[3,-1],[3,-3],[3,-3],[7,-7],[8,-7],[2,-1],[8,0],[2,-1],[1,-2],[1,-1],[9,-1],[2,-2],[1,-2],[1,-5],[6,-1]],[[7901,5165],[3,-6],[0,-2],[-1,-3],[-1,-5],[0,-1],[-2,2],[-2,-4],[-1,7],[-2,4],[2,5],[1,0],[0,-1],[3,4]],[[8543,5165],[3,-8],[-2,-8],[1,-5],[4,0],[1,-2],[1,-2],[0,-3],[-1,-2],[-2,-2],[-3,3],[0,3],[-1,1],[-3,-2],[-1,-1],[-1,4],[1,6],[-2,2],[-3,6],[0,2],[1,4],[0,3],[1,1],[3,-5],[1,4],[1,2],[1,-1]],[[8534,5155],[-2,-1],[-2,0],[0,6],[0,8],[2,1],[3,-2],[-1,-2],[1,-4],[-1,-6]],[[7881,5164],[-4,-2],[-4,1],[1,4],[2,4],[1,0],[3,-3],[2,-3],[-1,-1]],[[8633,5184],[5,-3],[1,0],[7,-6],[1,-3],[-1,-2],[1,-3],[-2,-4],[-1,-1],[-1,2],[-2,1],[-3,-2],[-1,1],[-2,4],[-2,3],[-4,8],[-1,0],[0,-3],[1,-3],[2,-6],[2,-1],[1,1],[1,-3],[0,-4],[-4,-2],[-1,3],[-1,6],[-2,-2],[-1,-2],[-2,5],[-4,1],[-3,3],[1,3],[0,3],[2,2],[2,-2],[2,2],[1,0],[1,1],[4,1],[3,2]],[[7734,5153],[-1,-2],[-3,2],[1,4],[0,5],[2,4],[0,5],[-3,13],[2,0],[1,-1],[2,-9],[2,-5],[-1,-7],[-2,-9]],[[7910,5174],[1,-1],[1,3],[1,-4],[1,-2],[2,-2],[-1,-1],[-1,-1],[-1,-1],[-5,7],[-4,-2],[-3,2],[0,1],[1,4],[1,8],[3,-2],[0,-3],[0,-1],[2,-1],[2,-4]],[[8598,5173],[-1,0],[-1,3],[-3,4],[-2,6],[7,-10],[0,-3]],[[8540,5183],[-1,-1],[0,2],[-1,1],[1,6],[0,1],[0,-4],[1,-5]],[[7907,5187],[0,-1],[-1,1],[-1,1],[0,1],[-3,8],[1,0],[3,-7],[1,-3]],[[7868,5215],[-3,0],[-1,0],[1,6],[1,3],[1,0],[2,-5],[-1,-4]],[[8539,5221],[-1,-1],[-1,0],[0,3],[1,4],[1,0],[0,-1],[0,-3],[0,-2]],[[8537,5229],[-1,-2],[-1,1],[0,3],[0,1],[1,1],[1,0],[0,-4]],[[7873,5222],[-1,-1],[-2,8],[0,4],[1,1],[1,-3],[1,-2],[1,-4],[-1,-3]],[[7883,5230],[0,-2],[-2,4],[0,2],[0,1],[2,-2],[0,-3]],[[7895,5232],[-2,-2],[-2,5],[0,2],[0,1],[1,0],[1,-3],[1,-1],[1,-2]],[[7861,5227],[0,-2],[-1,1],[-6,3],[-2,0],[-4,3],[-2,1],[-1,2],[1,4],[0,2],[1,6],[1,2],[2,-4],[3,-4],[1,-2],[5,-4],[1,-2],[1,-6]],[[7872,5244],[0,-3],[-2,1],[-1,4],[1,2],[1,1],[1,-3],[0,-2]],[[7865,5234],[-1,-2],[-1,1],[-2,2],[-2,3],[-2,3],[-3,2],[-1,1],[-1,0],[1,7],[2,0],[5,-6],[2,-3],[3,-8]],[[7889,5252],[2,-3],[1,2],[0,-2],[0,-2],[-2,-6],[-3,1],[-1,2],[0,2],[1,0],[0,3],[1,0],[1,3]],[[7904,5254],[1,-4],[1,-3],[1,-3],[-1,-5],[-1,-6],[-1,-1],[-2,1],[-1,2],[0,1],[0,2],[-1,1],[1,2],[-1,3],[-4,-2],[-1,0],[0,4],[0,1],[3,5],[2,1],[2,-1],[2,2]],[[7844,5241],[-1,-2],[-1,3],[-2,4],[0,4],[-1,7],[0,4],[1,3],[3,-3],[1,-5],[1,-1],[0,-5],[-1,-5],[0,-4]],[[7707,5268],[6,-16],[3,-2],[3,-8],[1,-2],[-1,-5],[-1,-15],[-2,-4],[-3,2],[0,3],[-3,11],[-4,6],[-1,0],[-1,7],[-2,7],[-6,14],[4,0],[3,3],[0,3],[1,0],[3,-4]],[[7846,5268],[0,-8],[-2,2],[-1,3],[-3,2],[-3,1],[-2,2],[-2,4],[0,1],[0,1],[1,1],[12,-6],[0,-3]],[[8468,5241],[-5,-10],[-2,-4],[-1,-5],[-2,-6],[-3,-5],[-1,-2],[-3,-2],[-1,-1],[-4,-1],[-9,-4],[-3,0],[-4,0],[-6,1],[-1,1],[-2,5],[-3,4],[-2,0],[-3,0],[-17,0],[-6,-1],[-6,-2],[-4,1],[-3,2],[-2,1],[-3,-1],[-11,-3],[-3,1],[-6,3],[-3,1],[-4,-1],[-3,-3],[-1,-3],[-3,-8],[-2,-6],[-1,-7],[-1,-7],[-1,-7],[0,-6],[0,-7],[1,-7],[1,-6],[4,-12],[1,-2],[4,-4],[3,-4],[2,-13],[2,-6],[2,0],[2,0],[3,-1],[3,-1],[3,4],[2,7],[2,5],[4,11],[3,5],[1,1],[2,-1],[1,-2],[2,-3],[3,-1],[3,1],[4,3],[1,2],[1,3],[3,2],[7,0],[3,-1],[7,1],[0,2],[-2,2],[0,2],[1,1],[4,2],[5,2],[3,-1],[2,-4],[1,-3],[1,-4],[-1,-11],[-1,-2],[-2,-1],[-2,1],[-2,6],[-3,2],[-4,-2],[-1,-2],[-2,-2],[-2,-5],[-2,-7],[-4,-10],[-5,-8],[-2,-4],[-3,-2],[-8,-6],[-2,-4],[-2,-5],[-2,-2],[-2,-1],[-1,1],[-4,3],[-1,-2],[0,-4],[2,-2],[2,-4],[2,-6],[2,-1],[2,-2],[2,-2],[2,-5],[3,-13],[1,-6],[2,-6],[6,-9],[0,-2],[0,-3],[1,-3],[2,-5],[0,-4],[-2,-4],[0,-6],[-2,-8],[0,-3],[0,-3],[1,-2],[1,-2],[2,-1],[1,-2],[3,-6],[1,-2],[1,-2],[0,-4],[1,-2],[1,-3],[2,-1],[1,1],[0,1],[2,0],[0,-3],[1,-3],[0,-4],[0,-7],[-1,-2],[-1,0],[-3,3],[0,-2],[0,-2],[-1,-1],[-2,0],[-4,0],[-7,-4],[-3,-3],[-1,-4],[-1,-3],[1,-7],[-1,-3],[-3,0],[-5,1],[-3,2],[-1,2],[-2,4],[-1,6],[1,17],[1,2],[0,2],[1,3],[0,4],[-2,5],[-3,1],[-3,4],[-11,21],[-1,2],[0,3],[1,4],[3,11],[1,2],[0,9],[0,8],[0,7],[-2,5],[-3,1],[-3,1],[-3,-2],[-3,-4],[-6,-7],[-2,-5],[0,-6],[1,-6],[2,-5],[0,-6],[2,-21],[0,-2],[-2,-6],[0,-14],[0,-19],[1,-11],[0,-6],[-3,-14],[-1,-8],[0,-3],[3,-14],[1,-5],[0,-6],[-3,3],[-1,-1],[-2,0],[-3,-1],[-4,0],[-1,-2],[-3,-3],[-1,-2],[-1,0],[-5,5],[-2,5],[-3,5],[0,7],[1,6],[1,7],[2,12],[0,8],[1,6],[1,6],[1,6],[0,22],[0,2],[-4,14],[0,2],[0,4],[0,3],[0,3],[0,2],[-2,3],[-1,1],[-4,-1],[-6,-4],[-2,3],[-2,5],[-1,7],[0,7],[0,7],[1,6],[-1,5],[-1,5],[0,2],[0,2],[2,2],[1,1],[2,2],[3,7],[1,6],[1,7],[1,7],[1,6],[3,6],[0,6],[-1,9],[1,5],[-1,5],[0,5],[2,9],[4,20],[4,10],[1,3],[3,-5],[1,-6],[0,5],[0,5],[-2,12],[-1,23],[0,2],[2,0],[1,2],[1,3],[-2,9],[0,3],[3,11],[2,5],[1,2],[1,8],[1,2],[2,2],[2,5],[1,7],[1,0],[2,-5],[1,-2],[3,-2],[2,2],[1,3],[1,2],[1,3],[1,2],[2,7],[2,6],[1,2],[1,1],[2,1],[2,0],[3,-3],[2,-1],[2,0],[2,-1],[1,-1],[0,-4],[2,-3],[1,-1],[1,-1],[7,1],[7,-3],[9,-1],[3,-1],[3,-3],[4,-4],[1,-1],[2,0],[2,4],[1,1],[2,0],[6,-1],[15,-5],[3,1],[9,10],[4,9],[3,3],[2,4],[0,5],[1,1],[3,2],[1,1],[3,7],[2,5],[1,2],[3,-1],[2,-3],[2,-8],[0,-1],[-3,-4],[0,-2],[-3,-11],[-2,-6],[-2,-5]],[[7824,5304],[2,-5],[0,-3],[-1,-4],[0,-5],[-3,-4],[-3,1],[-1,1],[-2,8],[0,7],[1,3],[3,-1],[3,4],[1,-2]],[[8547,5233],[2,-2],[2,1],[1,2],[1,4],[1,6],[2,4],[2,1],[1,1],[0,5],[0,5],[2,4],[5,7],[4,3],[4,0],[0,-2],[0,-4],[1,-5],[-1,-15],[-1,-3],[-4,-5],[-5,-4],[-1,-2],[-1,-4],[0,-4],[4,-5],[6,-6],[1,-2],[1,-4],[0,-4],[1,-3],[2,-1],[2,-2],[1,-3],[-10,7],[-3,3],[-3,1],[-3,1],[-3,2],[-4,1],[-1,-2],[-1,-4],[0,-4],[0,-5],[0,-4],[0,-5],[2,-18],[3,-13],[5,-14],[2,-5],[3,-5],[-5,2],[-1,4],[-5,5],[-1,3],[-3,13],[-1,3],[-3,4],[-2,4],[0,4],[0,5],[0,7],[0,6],[1,8],[-1,3],[-2,3],[-2,6],[0,7],[0,4],[1,4],[1,3],[0,3],[-3,4],[-2,12],[0,7],[3,12],[0,6],[0,4],[1,4],[1,8],[3,7],[5,10],[2,2],[2,1],[0,-2],[0,-2],[-4,-10],[0,-2],[0,-5],[1,-2],[2,-5],[0,-7],[0,-7],[0,-7],[-1,-3],[-2,-7],[-7,-9],[0,-2],[0,-2],[1,-3],[1,-2]],[[7703,5303],[0,-1],[-3,6],[-3,3],[1,1],[3,-1],[1,0],[1,-3],[0,-5]],[[8567,5302],[-4,-1],[-1,3],[-1,12],[3,10],[4,6],[2,1],[1,0],[3,-7],[-2,-14],[-2,-7],[-3,-3]],[[8483,5337],[-1,-2],[-1,7],[1,3],[1,-1],[1,-1],[-1,-3],[0,-3]],[[7679,5320],[-2,-1],[-2,1],[-1,4],[-7,9],[-3,0],[-1,3],[-2,1],[-3,6],[0,4],[2,1],[1,4],[2,-2],[3,-6],[3,-2],[1,-1],[1,-4],[6,-8],[1,-3],[1,-3],[0,-3]],[[8024,5351],[-1,-3],[-2,2],[2,6],[1,1],[0,-6]],[[7937,5349],[-1,-1],[-1,2],[1,3],[-1,2],[0,2],[0,3],[1,-1],[1,-2],[1,-1],[1,0],[0,-1],[-1,-4],[-1,-2]],[[7952,5366],[0,-4],[-2,2],[-1,4],[1,2],[1,-1],[1,-3]],[[8267,5373],[0,-2],[-2,5],[-1,3],[0,2],[3,1],[1,-2],[-1,-7]],[[8490,5382],[-1,-2],[-3,3],[0,5],[-1,3],[-1,2],[0,3],[0,3],[2,-4],[2,-6],[1,-5],[1,-2]],[[8523,5401],[-1,-1],[-1,2],[0,1],[0,2],[0,1],[2,-3],[0,-1],[0,-1]],[[8519,5407],[0,-2],[-1,5],[-1,7],[1,-3],[2,-5],[-1,-2]],[[8274,5425],[1,-6],[0,-2],[-5,-3],[-3,7],[0,3]],[[8267,5424],[3,0],[4,1]],[[8008,5396],[-4,-2],[-2,3],[2,4],[1,0],[1,1],[0,1],[-4,3],[-2,2],[-1,5],[0,4],[6,9],[1,1],[0,-4],[4,-10],[0,-6],[0,-2],[-2,-9]],[[8265,5424],[-2,-2],[-1,-3],[3,-5],[0,-4],[2,-3],[2,-5],[1,-1],[0,-2],[1,-3],[-2,-2],[-2,-1],[-2,3],[-2,3],[0,-4],[-1,-2],[-5,0],[-3,0],[-3,-1],[1,0],[2,-1],[5,-10],[1,-3],[-2,-7],[1,-3],[2,-2],[2,-3],[2,-1],[1,-2],[0,-3],[1,-3],[-2,-1],[2,-1],[2,-2],[-1,-2],[-1,-1],[1,-2],[2,-1],[1,-2],[1,-4],[2,-8],[4,-9],[1,-4],[0,-3],[-1,-3],[-2,-3],[-2,-4],[0,-2],[-3,-1],[1,-2],[1,-2],[2,-6],[4,-9],[2,-4],[9,-13],[5,-5],[6,-13],[3,-3],[0,-4],[-2,-5],[-4,-3],[-6,-1],[-6,2],[-4,1],[-2,3],[-3,7],[-2,3],[1,-4],[0,-4],[0,-4],[-1,-3],[-2,-3],[-2,-2],[-1,-1],[-5,-23],[-1,-6],[-2,-25],[0,-7],[2,-13],[1,-7],[0,-3],[0,-3],[-1,-1],[-5,-4],[-3,-4],[-3,-4],[-2,-6],[-2,-5],[-2,-2],[-2,1],[-1,2],[-1,3],[-1,5],[0,-3],[0,-3],[0,-4],[1,-3],[-1,-4],[-1,-2],[-3,-3],[-1,-3],[0,-5],[-1,-2],[-1,-2],[-4,-5],[-1,-2],[-1,-2],[2,0],[2,0],[0,-5],[1,-3],[-1,-7],[-3,-5],[2,-2],[1,-1],[3,-1],[1,-6],[0,-6],[-1,-6],[-2,-1],[-1,1],[-2,0],[-1,-2],[0,-3],[2,1],[0,-7],[-1,-7],[0,-4],[-2,-4],[-1,-1],[-2,3],[0,-3],[0,-2],[3,-6],[-2,-2],[-1,-2],[0,-2],[-3,-7],[-1,-5],[-1,-5],[-1,-4],[-19,-18],[-16,-15],[-1,1],[-1,2],[0,23],[-2,13],[-1,6],[-2,-6],[-1,1],[-2,1],[-1,2],[0,3],[1,7],[-1,-4],[-2,-3],[-1,1],[-2,1],[0,3],[-1,0],[-3,-7],[-5,-3],[-2,0],[-2,2],[0,5],[0,5],[-1,3],[-1,1],[-1,-1],[-4,-2],[-1,0],[0,-1],[-9,18],[-2,-15],[-6,-8],[-4,-4],[-4,2],[-5,3],[-4,-4],[-5,-9],[-1,-1],[-2,0],[-1,1],[1,7],[0,6],[-1,15],[0,3],[-1,4],[-2,2],[-1,-2],[-1,-3],[-4,1],[-3,2],[-3,-1],[-6,-6],[-3,-1],[-2,1],[-1,3],[0,3],[2,2],[-3,-1],[-2,-3],[-1,-2],[-1,1],[-2,6],[-6,-2],[0,-1],[-2,-2],[-1,1],[-1,2],[0,14],[-3,26],[-1,14],[0,3],[-3,5],[0,6],[1,6],[1,7],[-1,7],[-1,7],[-1,6],[-2,4],[-2,6],[-3,3],[-6,5],[-4,-1],[-1,2],[-1,2],[1,5],[1,3],[1,0],[0,2],[-3,4],[-3,4],[0,3],[-1,3],[0,8],[1,4],[1,3],[0,7],[2,3],[0,1],[-1,1],[-1,3],[-1,2],[-2,5],[-4,6],[0,10],[-1,16],[1,6],[1,13],[2,4],[1,1],[2,2],[-1,0],[-1,0],[-2,-1],[2,12],[0,3],[3,6],[3,6],[1,7],[1,6],[7,6]],[[8044,5301],[-2,-8],[0,-3],[1,-2],[2,-2],[0,-9],[2,-5],[3,-5],[1,-3],[2,-3],[2,-3],[1,-3],[2,-3],[6,-11],[2,-3],[2,-3],[1,-2],[3,1],[9,8],[1,1],[3,1],[5,0],[6,-3],[2,0],[1,2],[3,-1],[2,-1],[1,1],[3,6],[4,2],[2,5],[1,6],[0,6],[2,2],[3,2],[4,3],[12,0],[2,-1],[0,-3],[0,-2],[0,-2],[2,0],[2,-1],[6,-5],[3,-1],[1,0],[3,-4],[2,1],[2,3],[2,4],[2,3],[3,2],[3,-1],[4,2],[4,1],[3,-3],[1,1],[1,3],[1,6],[1,4],[1,8],[0,1],[2,1],[1,2],[0,2],[1,3],[0,2],[-1,2],[-1,6],[0,3],[1,2],[1,2],[4,4],[3,6],[2,2],[1,2],[0,3],[-2,2],[-1,2],[0,3],[0,2],[0,2],[0,2],[0,2],[1,4],[2,4],[1,3],[2,-2],[2,1],[2,2],[1,5],[0,3],[0,2],[1,7],[0,1],[1,5],[0,4],[0,7],[0,6],[0,12],[1,2],[1,6],[1,6],[3,4],[2,4],[1,1],[1,0],[3,-3],[3,4],[3,0],[2,0],[2,-2],[1,-1],[3,4],[1,-1],[1,-1],[1,0],[2,1],[4,-1],[7,0],[5,-3],[5,-6],[2,-1],[1,0]],[[8522,5416],[-1,-1],[-2,0],[0,3],[2,6],[1,5],[-2,1],[-1,4],[0,4],[1,8],[2,-1],[1,-3],[1,-6],[1,-5],[-2,-6],[-1,-9]],[[7680,5485],[3,-1],[6,4],[4,-1],[3,-2],[3,-1],[7,1],[2,0],[1,-1],[1,-2],[3,-8],[6,-9],[2,-6],[0,-7],[1,-1],[6,-13],[1,-5],[-1,-8],[2,-5],[6,-6],[4,-4],[1,-2],[0,-3],[2,-5],[3,-2],[7,-8],[11,-15],[6,-8],[4,-11],[2,-5],[2,-6],[3,-9],[5,-10],[1,-3],[1,-5],[2,-4],[2,-4],[2,-3],[2,-1],[4,-8],[2,-2],[-1,6],[-1,5],[0,3],[0,3],[1,2],[2,1],[3,-2],[5,-9],[2,-5],[2,-8],[1,-7],[2,-4],[3,-1],[3,-1],[3,-2],[6,-10],[2,-5],[2,-6],[1,-6],[1,-8],[0,-1],[4,-9],[3,-3],[2,-2],[8,-2],[3,-3],[2,-5],[1,-5],[-1,-4],[-7,-7],[-6,-5],[6,2],[3,2],[3,3],[3,4],[5,5],[2,1],[2,0],[2,-2],[2,-5],[3,-6],[2,-6],[1,-7],[-2,-4],[-3,-3],[-5,-7],[0,-3],[1,-2],[-1,-5],[2,-3],[0,-3],[-2,-4],[1,-2],[2,-11],[1,-2],[4,-5],[6,-6],[4,-2],[4,-2],[1,0],[3,1],[1,-2],[1,-10],[1,-7],[0,-13],[2,-6],[-1,-7],[2,-6],[3,-4],[3,-3],[2,-3],[0,-4],[-1,-4],[-1,-3],[-3,-6],[-1,-2],[0,-7],[0,-3],[2,0],[1,2],[4,8],[1,2],[1,1],[2,1],[7,0],[3,-1],[3,-3],[2,-4],[9,-23],[4,-12],[0,-3],[0,-4],[0,-2],[-4,-9],[-1,-2],[-1,-9],[1,-7],[1,-3],[1,-3],[0,-3],[-3,-14],[0,-2],[2,-22],[0,-7],[-1,-7],[1,-13],[-2,-38],[-1,-2],[-1,-6],[-2,0],[-2,1],[-1,2],[-1,3],[-1,2],[-4,7],[-2,-1],[-5,-9],[-1,-1],[-1,1],[-3,3],[-8,9],[-1,-3],[0,-4],[2,-10],[0,-5],[-1,0],[-1,0],[-4,6],[-3,6],[-3,9],[-3,4],[-2,5],[-7,17],[-1,3],[-10,12],[-2,3],[-3,5],[-3,5],[-6,7],[-11,19],[-4,10],[-5,17],[-2,4],[-9,13],[-4,8],[-2,4],[-5,16],[-1,5],[-2,5],[-2,3],[-3,5],[-5,14],[-1,5],[-1,6],[0,12],[-10,37],[-3,11],[-2,16],[-1,2],[-6,14],[-2,4],[-2,5],[-2,5],[-4,16],[-1,4],[-2,4],[-7,6],[-3,3],[-2,5],[-2,6],[-1,13],[-4,20],[-3,27],[-3,12],[-3,9],[-1,2],[-13,17],[-2,3],[-3,1],[-3,1],[-3,5],[-1,7],[-1,11],[0,6],[-1,4],[-5,7],[-3,6],[-1,6],[-2,5],[-6,18],[-2,4],[-3,3],[-8,4],[-2,3],[-3,9],[-3,5],[-6,11],[-12,23],[-2,6],[-2,6],[-1,6],[-5,18],[0,4],[1,3],[0,4],[-1,3],[0,2],[2,2],[3,2],[3,0],[4,-1],[3,-2],[2,-4],[6,-9],[3,-3],[3,-2],[7,-2]],[[7648,5519],[0,-2],[-2,1],[-2,5],[1,1],[1,0],[2,-2],[0,-2],[0,-1]],[[4877,8305],[-6,-8],[-2,2],[-2,-1],[1,3],[1,6],[2,2],[3,7],[3,2],[0,-1],[1,0],[1,-7],[-1,-3],[-1,-2]],[[7607,5577],[-1,-4],[-4,14],[-1,1],[0,7],[1,3],[3,3],[1,-2],[2,-14],[-1,-8]],[[7603,5608],[-3,-6],[-1,3],[1,3],[1,1],[1,2],[1,-3]],[[7595,5638],[-2,-1],[-1,3],[-1,3],[1,2],[1,1],[2,-4],[0,-3],[0,-1]],[[7597,5648],[-1,-2],[0,2],[0,1],[-1,2],[0,3],[1,4],[1,-1],[0,-3],[0,-6]],[[7029,5660],[0,-1],[-1,0],[0,1],[1,0],[0,2],[0,1],[0,-2],[0,-1]],[[7586,5659],[1,-2],[-1,0],[-2,3],[1,3],[0,2],[1,-6]],[[7577,5710],[-2,0],[0,2],[0,2],[0,1],[1,1],[1,0],[0,-4],[0,-2]],[[7569,5792],[-1,-2],[-3,1],[0,6],[0,6],[0,2],[2,5],[2,1],[1,-5],[1,-6],[-2,-8]],[[7574,5839],[-1,-1],[-2,2],[1,2],[1,5],[1,-3],[0,-3],[0,-2]],[[7583,5877],[1,-8],[-2,4],[-1,2],[1,2],[1,0]],[[7575,5925],[-1,-4],[0,8],[0,1],[1,0],[0,-5]],[[7575,5848],[-1,-1],[-1,1],[-2,11],[-1,6],[0,3],[1,3],[1,1],[0,4],[1,5],[1,5],[0,1],[2,0],[1,1],[-1,4],[-1,2],[0,2],[0,10],[0,4],[1,4],[-1,6],[1,2],[1,4],[1,7],[-1,2],[2,11],[0,7],[1,8],[3,3],[1,0],[0,-6],[1,-2],[-2,-4],[2,-5],[-1,-2],[0,-3],[-1,-4],[-2,-2],[-1,-5],[-1,-2],[3,-5],[0,-18],[-1,-5],[-2,-1],[0,-12],[0,-3],[-2,-5],[0,-3],[-1,-2],[0,-3],[1,-2],[0,-2],[-1,-7],[0,-7],[-1,-6]],[[7186,7020],[0,1],[-2,4],[2,-5]],[[7203,6975],[1,-1]],[[7219,6963],[0,0]],[[7219,6963],[5,-6]],[[7250,6921],[-2,1],[-1,0],[-2,-2],[-1,-1],[-3,-8],[-2,-2],[-2,-3],[-4,-10],[-3,-9],[-1,-8],[0,-7],[-1,-7],[-2,-4],[-1,-1],[-1,-6],[-1,-7],[0,-3],[3,-3],[2,-3],[3,-3],[2,-3],[2,-1],[0,2],[1,2],[2,-1],[2,-3],[2,-3],[4,-4],[4,-4],[4,-4],[1,-3],[1,-3],[2,-3],[5,-7],[4,-5],[3,-3],[3,-3],[1,0],[2,2],[1,1],[1,-1],[2,-2],[5,-6],[5,-5],[5,1],[1,-1],[1,-5],[0,-4],[6,-3],[4,-1],[4,-3],[2,-2],[2,3],[0,2],[2,1],[3,-1],[6,-3],[2,-1],[2,3],[3,2],[2,1],[4,-3],[7,-5],[4,-3],[0,-3],[1,-2],[0,-7],[1,-3],[7,-6],[2,-3],[2,-1],[1,0],[1,-1],[0,-4],[1,0],[1,-1],[2,-1],[4,3],[3,3],[2,-1],[2,-3],[0,-4],[1,-4],[1,-2],[2,0],[4,3],[4,-2],[3,-1],[3,-2],[2,-1],[3,-3],[5,-4],[1,1],[7,6],[1,0],[1,-7],[3,-2],[3,-2],[3,4],[3,-1],[4,-1],[3,2],[3,1],[4,-4],[0,1],[1,2],[2,9],[1,8],[0,5],[-1,7],[-3,9],[-1,3],[1,16],[2,9],[1,4],[1,6],[0,3],[0,3],[-1,1]],[[7703,6809],[-1,-4],[0,-3],[1,-4],[0,-2],[0,-3],[-1,-2],[-2,-1],[-2,-3],[-3,-4],[-2,-4],[-2,-3],[-1,-3],[0,-4],[1,-5],[6,-16],[0,-2],[-2,-1],[-3,2],[-2,2],[-2,7],[-2,2],[-2,0],[-10,-3],[-3,-1],[-3,-3],[-3,-5],[-2,-4],[-2,-2],[-2,-4],[-8,-11],[-4,-5],[-3,-2],[-2,-2],[-1,-4],[-1,-3],[0,-8],[0,-9],[1,-5],[1,-2],[0,-1],[-1,-3],[-2,-3],[0,-2],[-1,-8],[-1,-4],[-3,-6],[-2,-4],[-3,-4],[-1,-3],[-2,-5],[0,-4],[0,-2],[0,-1],[1,-2],[2,-1],[1,-3],[0,-2],[-1,-7],[-2,-10],[-3,-7],[-3,-7],[0,-3],[-3,-8],[-2,-12],[-1,-8],[-1,-6],[-2,0],[-1,2],[-5,2],[-2,2],[-2,2],[-2,-1],[-2,-1],[-2,0],[-1,0],[-3,5],[-1,-3],[2,-14],[1,-5],[0,-9],[-1,-11],[0,-12],[-1,-3],[-1,-3],[-1,-1],[-2,2],[-1,-1],[0,-2],[0,-5],[-1,-6],[-1,-5],[0,-5],[0,-5],[2,-10],[0,-4],[0,-4],[-1,-1],[-1,0],[-1,-1],[-1,-3],[-1,-8],[-2,-1],[-1,2],[-3,5],[-1,2],[-1,0],[0,-2],[-1,-3],[-1,-2],[-1,-2]],[[7473,6456],[-1,-9],[-2,0],[2,-6],[1,-4],[0,-6],[-2,-1],[-2,1],[-1,5],[-1,-5],[-3,-4],[0,2],[-1,3],[0,4],[1,15],[0,2],[-1,1],[-1,1],[0,3],[-3,-17],[1,-7],[0,-3],[-4,-2],[-4,6],[0,2],[-1,-3],[0,-5],[-4,1],[-2,3],[1,6],[3,14],[0,6],[-3,5],[-2,2],[-2,7],[1,-7],[1,-3],[2,-2],[2,-3],[-1,-4],[-2,-3],[-3,-10],[-3,-6],[-4,-4],[-13,-6],[-3,-3],[-4,-8],[-3,-7],[0,-8],[1,-8],[1,-12],[1,-3],[-1,-5],[-3,-4],[-2,-7],[1,-4],[-1,-2],[-7,-8],[-1,-5],[-2,-5],[-3,3],[-1,0],[2,-4],[0,-2],[-1,-2],[-2,-1],[-10,-6],[-8,-6],[-2,0],[1,2],[1,2],[0,6],[-2,1],[-1,1],[-6,-8],[-2,-8],[0,-2],[2,1],[4,4],[2,-1],[0,-2],[-6,-7],[-13,-22],[-1,-4],[-1,-5],[-2,-4],[-5,-12],[-7,-16],[-3,-7],[-12,-12],[-2,-4],[-5,-13],[-6,-10],[-6,-8],[-10,-11],[-7,-10],[-2,-7],[0,-3],[1,-3],[1,-3],[0,-3],[-1,-4],[0,-2],[-2,-6],[-3,-5],[-11,-9],[-1,1],[-9,1],[-3,-1],[-1,-4],[-3,-18],[-3,-4],[-1,-5],[0,-3],[-2,1],[-1,1],[-2,-1],[-1,6],[-2,1],[-2,0],[-7,-6],[-2,-4],[-6,-23],[-1,-14],[1,-16],[2,-13],[0,-5],[0,-8],[-1,-3],[0,-5],[0,-8],[3,-12],[0,-5],[0,-5],[2,-11],[-1,2],[-1,4],[-2,7],[-3,-7],[2,-4],[5,-5],[1,-5],[-3,-38],[-3,-14],[-2,-9],[-2,-3],[-3,-15],[-3,-17],[0,-6],[1,-8],[-1,-4],[-2,-4],[3,2],[1,-4],[0,-4],[0,-25],[0,-26],[-2,-1],[-3,0],[-2,1],[-2,1],[-3,-2],[-3,-2],[-1,-5],[0,-8],[-7,-20],[-2,-7],[-1,-7],[1,-3],[2,-4],[3,-1],[4,-1],[3,-2],[1,-4],[-5,4],[-7,1],[-15,-10],[-4,-6],[-3,-6],[-1,-13],[-1,-9],[-1,-7],[-8,-11],[-6,-4],[-1,-3],[-6,4],[-7,10],[-3,5],[-9,25],[-2,4],[-2,10],[0,4],[-1,2],[-1,1],[0,2],[-3,12],[0,13],[-2,15],[1,-1],[2,-5],[1,-7],[0,-10],[1,-1],[1,1],[-3,22],[-3,6],[-1,4],[0,4],[0,2],[-2,8],[-1,4],[-5,22],[-2,16],[-3,17],[-2,6],[-4,14],[-3,6],[-3,9],[-2,3],[-1,2],[-7,29],[-2,17],[-2,7],[-1,6],[-2,25],[0,4],[-1,5],[-1,11],[-3,11],[-1,7],[0,3],[-2,11],[-1,5],[-1,4],[-1,5],[-2,3],[-4,11],[-1,3],[-3,7],[-1,13],[-3,6],[4,0],[-2,5],[-1,3],[-1,2],[1,5],[-3,0],[-1,3],[-2,9],[-4,10],[0,6],[-4,18],[-2,42],[-3,19],[0,6],[-3,16],[-1,11],[-1,10],[0,6],[-1,12],[-1,4],[-1,2],[1,5],[2,9],[1,5],[-1,8],[-2,-8],[-2,-2],[0,6],[0,8],[-1,2],[1,2],[5,-1],[-6,5],[0,3],[-1,2],[2,4],[-3,3],[0,11],[-1,2],[0,2],[1,14],[5,28],[0,7],[0,8],[-1,8],[-1,7],[0,2],[-2,1],[-1,3],[-2,11],[1,3],[2,2],[-2,0],[-2,0],[3,5],[3,4],[6,5],[2,3],[-4,-3],[-3,-1],[-9,0],[2,11],[1,3],[2,2],[-3,0],[-2,1],[1,10],[2,2],[2,1],[3,1],[-3,2],[-3,1],[-4,-2],[-3,2],[-5,0],[2,-2],[2,-3],[-1,-6],[-1,-3],[-2,-3],[-2,-4],[-1,-3],[-1,-2],[2,-2],[2,-1],[1,-3],[1,-4],[0,-7],[-5,-18],[-1,-4],[-13,-10],[-4,-6],[-11,-8],[-4,-1],[-4,1],[-7,6],[-10,15],[-2,5],[-8,18],[-6,10],[-4,10],[-6,8],[-5,12],[-1,6],[1,5],[1,3],[3,-1],[1,-5],[2,-2],[1,-1],[7,7],[3,0],[2,4],[3,-1],[5,6],[2,0],[3,1],[4,14],[3,9],[2,2],[0,2],[-1,3],[-1,-1],[-1,-3],[-1,-3],[-1,-2],[-2,2],[-2,0],[-2,-1],[-7,-6],[-3,-4],[-3,-1],[-11,5],[-12,12],[-5,8],[-3,10],[-3,11],[1,4],[5,7],[4,6],[-4,-3],[-4,-3],[-2,-3],[-2,-5],[-3,-1],[-1,8],[-1,7]],[[6893,6558],[2,2],[1,2],[3,1],[3,1],[2,0],[4,0],[0,17],[1,2],[0,1],[1,0],[1,-3],[1,1],[1,1],[3,-1],[1,1],[2,-1],[4,0],[5,0],[4,0],[2,-3],[2,-3],[2,0],[4,0],[2,1],[2,3],[0,3],[6,4],[5,3],[2,0],[0,-2],[0,-3],[1,-3],[2,-2],[2,0],[1,0],[1,1],[2,5],[2,1],[1,0],[2,2],[0,2],[-1,1],[-1,2],[0,2],[0,3],[0,3],[1,2],[1,2],[-1,4],[-2,8],[-2,9],[-2,9],[-3,7],[-1,5],[0,12],[0,2],[-1,2],[-1,0],[-2,-1],[-2,0],[-3,0],[-2,1],[-4,12],[-1,5],[0,5],[1,8],[1,7],[0,8],[0,2],[-1,2],[-2,2],[-4,0],[-5,2],[-3,5],[-3,2],[-1,2],[0,2],[1,8],[1,10],[1,3],[1,3],[1,2],[2,3],[5,9],[4,13],[3,9],[1,3],[2,2],[2,2],[2,3],[2,0],[3,-2],[1,-3],[1,-6],[1,-4],[1,-2],[2,-1],[2,0],[9,7],[3,1],[7,1],[4,3],[5,2],[0,5],[2,8],[5,10],[1,4],[2,8],[1,8],[2,3],[8,8],[7,8],[2,3],[5,16],[3,11],[0,3],[2,10],[2,9],[2,2],[5,4],[5,3],[2,4],[1,4],[0,3],[-1,4],[0,2],[0,3],[3,5],[6,14],[3,7],[1,0],[4,4],[3,4],[0,2],[0,3],[-2,1],[-1,3],[1,4],[1,12],[0,4],[-2,10],[0,3],[1,3],[3,5],[2,3],[10,8],[1,1],[4,2],[2,4],[0,4],[-1,2],[-2,3],[-3,3],[-4,3],[-5,-1],[-3,2],[-1,2],[0,5],[0,9],[-1,0],[-1,-1],[-3,1],[-3,0],[-2,3],[1,3],[0,3],[-1,4],[0,1],[-2,1],[-3,3],[-2,4],[-1,2],[0,2],[0,1],[1,4],[2,5],[1,4],[0,3],[0,2],[-2,3],[-2,2],[-1,2],[0,3],[1,4],[2,3],[4,3],[1,3],[0,3],[-1,0],[-3,0],[-5,1],[0,2],[-1,2],[0,1],[1,2],[1,3],[0,3],[-1,3],[-3,2],[-1,3],[1,2],[1,4],[1,3],[2,7],[2,1],[4,3],[3,2],[6,-2],[2,-1],[6,-2],[4,-2],[5,0],[2,0],[2,-2],[5,-4],[4,-2],[3,0],[5,3],[2,3],[3,4],[3,0],[8,5],[2,-1],[2,0],[3,2],[1,4],[0,2],[1,1],[3,2],[3,3],[1,4],[1,3]],[[7140,7206],[3,4],[3,3],[4,4],[4,5],[4,3],[2,3]],[[7160,7228],[1,0]],[[7197,7098],[0,-4]],[[7200,7059],[0,-3]],[[7691,4481],[0,1],[0,1],[1,0],[0,-1],[-1,-1]],[[7689,4482],[1,0],[0,-1],[-1,1],[0,2],[0,1],[0,-1],[0,-1],[0,-1]],[[7936,4579],[-1,-4],[-1,3],[-2,0],[0,3],[2,1],[1,1],[1,-4]],[[7013,4759],[-1,-2],[-1,-1],[0,5],[-2,4],[1,0],[1,-2],[1,-5],[0,1],[0,2],[0,2],[0,2],[-1,2],[1,1],[1,-2],[0,-2],[0,-5]],[[4723,8289],[0,-2],[-2,3],[-1,2],[-6,1],[3,2],[1,-1],[4,0],[1,-1],[0,-4]],[[4827,8299],[1,-2],[0,-2],[-2,-1],[-2,1],[-1,-2],[0,-2],[1,-4],[1,-2],[1,-6],[1,-6],[2,-3],[0,-5],[0,-2],[0,-4],[0,-1],[0,-4],[2,-8],[1,-4],[0,-10],[-1,-3],[-2,-4],[-1,-4],[-1,-4],[0,-7],[-4,-8],[-1,-2],[-2,-1],[4,-6],[-3,-2],[-4,-1],[-4,1],[-2,0],[-2,-2],[-1,-1],[-1,1],[-1,4],[-1,-5],[-2,-1],[-4,0],[-6,-1],[-3,-1],[-1,-3],[0,-2],[-1,-1],[-1,-1],[-5,-2],[-1,-1],[-2,-4],[-3,-2],[-3,-1],[-2,3],[-1,1],[-1,1],[-3,0],[1,-1],[1,-2],[0,-3],[0,-3],[-2,-2],[-2,0],[-3,-3],[-4,-1],[-2,-3],[-14,-5],[-2,1],[-2,1],[-2,-1],[-6,-2],[-3,0],[4,7],[4,4],[1,1],[-2,0],[-8,-2],[-4,-2],[-3,-1],[2,3],[4,4],[2,2],[1,1],[2,3],[4,3],[-14,-6],[-3,0],[-1,2],[-3,-1],[-1,4],[4,6],[3,3],[3,1],[2,3],[1,2],[-1,1],[-8,-1],[-4,1],[0,2],[1,2],[4,4],[2,0],[2,0],[2,-1],[1,-1],[5,0],[-2,3],[0,5],[-2,1],[2,2],[2,2],[4,4],[1,1],[7,1],[8,3],[8,3],[-4,2],[-2,2],[-3,-5],[-2,-2],[-6,-1],[-2,1],[-3,2],[-1,-1],[-1,-1],[-4,-3],[-4,0],[5,4],[6,8],[2,2],[2,5],[-1,1],[-1,1],[4,9],[2,2],[3,0],[2,1],[1,0],[1,1],[1,2],[-2,2],[-3,1],[-10,-1],[-1,0],[-1,1],[-1,1],[0,3],[-1,1],[-2,0],[-2,-1],[-1,0],[-2,1],[2,3],[-2,1],[-3,-1],[-3,1],[0,2],[1,2],[-1,2],[0,2],[1,1],[2,0],[3,2],[5,0],[-4,2],[-2,1],[0,3],[0,1],[5,4],[4,1],[0,2],[0,2],[-4,1],[-5,-2],[1,5],[1,3],[0,3],[0,3],[-2,-2],[-1,4],[-1,3],[-3,-2],[0,4],[1,2],[2,1],[2,0],[3,0],[3,1],[4,1],[7,-1],[4,-5],[2,1],[2,3],[0,1],[8,-2],[4,-2],[1,1],[0,4],[-2,2],[2,3],[2,3],[2,1],[3,1],[2,1],[1,5],[2,3],[-9,-2],[-9,4],[1,3],[2,2],[3,1],[1,2],[1,1],[3,3],[-1,5],[0,3],[2,2],[1,3],[1,2],[3,1],[4,2],[1,0],[5,0],[1,-1],[0,4],[3,0],[1,0],[0,-3],[1,-1],[1,-3],[-1,-2],[-2,-2],[2,-2],[-2,-3],[2,1],[3,3],[0,3],[-1,3],[-1,3],[1,3],[1,2],[5,1],[-2,3],[2,1],[1,-1],[3,-3],[2,-2],[3,-2],[-2,-3],[-4,-2],[-1,-3]],[[6560,6734],[-2,-6],[-4,-6],[-2,2],[-1,-1],[-3,-2],[-2,0],[-4,-4],[-3,-2],[-2,0],[-1,0],[-1,3],[0,1],[2,0],[5,3],[6,6],[1,3],[-1,4],[0,1],[4,-2],[5,4],[4,1],[2,-3],[-3,-2]],[[6357,7398],[0,-3],[1,-14],[0,-8],[1,-7],[2,-6],[2,-7],[2,-3],[6,-5],[3,-1],[7,-1],[7,-2],[4,-3],[1,-1],[1,-2],[4,-11],[5,-8],[11,-12],[5,-4],[18,-7],[12,0],[33,14],[11,4],[4,0],[-2,-3],[-5,-2],[3,-2],[4,0],[2,0],[1,2],[0,3],[0,3],[-2,13],[-1,10]],[[6497,7335],[8,-1],[3,1],[4,3],[3,2],[2,1],[2,1],[1,2],[3,13],[1,3],[5,7],[4,4],[5,4],[5,3],[7,0],[6,-1],[4,0],[1,0],[1,0],[1,1],[1,6],[1,1],[2,2],[3,0],[4,0],[2,0],[4,-2],[5,0],[3,0],[2,-2],[1,-3],[1,-2],[0,-4],[0,-2],[1,-1],[1,-1],[3,-2],[5,-1],[5,-2],[3,-2],[3,-3],[5,-7],[1,-1],[2,0],[2,0],[3,3],[3,-3],[1,1],[3,1],[3,-2],[9,-7],[1,0],[1,-1],[0,-1],[1,-2],[0,-7],[3,-4],[3,-5],[3,-2],[8,-6],[3,-4],[3,-8],[4,-10],[0,-1],[11,0],[11,0],[1,-4],[0,-8],[1,-8],[1,-6],[0,-5],[-1,-3],[-1,-3],[0,-1],[1,-2],[2,-4],[0,-6],[-1,-4],[0,-2],[1,-3]],[[6697,6919],[-7,-14],[-1,-1]],[[6689,6904],[6,-12],[3,-7],[5,-9],[0,-3],[0,-4],[5,-14],[2,-8],[1,-5],[4,-7],[3,-7],[4,-3],[3,-1],[6,-4],[3,-2],[3,-8],[4,1],[1,0],[1,0],[0,-3],[-1,-11],[1,-12],[1,-17],[0,-3],[-1,-5],[0,-4],[-1,-2],[1,-1],[1,-1],[3,0],[7,2],[1,-1],[1,-2],[2,-3],[0,-2],[-2,-3],[0,-4],[0,-7],[0,-1],[-2,-1],[0,-10],[0,-1],[-2,-1],[-9,0],[-1,0],[-3,-2],[-5,-2],[-2,-1],[-2,-3],[-1,-4],[-1,-3],[0,-1],[-3,1],[-1,-3],[-6,-5],[-1,-1],[-1,-3],[-1,-10],[0,-9],[-1,-1],[-2,-3],[0,-1],[0,-3],[0,-7],[-1,-17],[-1,-5]],[[6710,6635],[-1,0],[-2,-2],[-2,-3],[-4,2],[-4,2],[-13,6],[-1,3],[-1,5],[-2,1],[-3,-7],[-10,4],[-4,-1],[-2,2],[-6,0],[-4,4],[-6,-3],[-5,0],[-7,8],[-8,2],[-6,-1],[-3,1],[-5,3],[-2,3],[-4,-3],[-2,5],[-11,3],[-2,8],[-2,7],[0,7],[-2,12],[-1,18],[-1,6],[-2,7],[-2,5],[-3,5],[-2,2],[-10,4],[-2,0],[-5,-3],[-5,-6],[-8,-3],[-1,-3],[-2,-6],[-3,-3],[-4,1],[-4,-4],[-7,-10],[-4,-3],[-3,1],[-3,4],[-8,6],[-5,3],[-7,-2],[-3,1],[-5,7],[-2,6],[-3,3],[-10,8],[-8,11],[-1,4],[-1,5],[-4,7],[-8,6],[-4,6],[-6,2],[-4,0],[-3,1],[-2,2],[-6,13],[0,5],[-4,13],[-1,4],[-1,12],[-1,4],[-5,5],[0,3],[1,4],[0,4],[-3,3],[-3,2],[-1,3],[1,8],[-1,4],[-3,8],[-4,7],[-4,11],[-2,3],[-1,8],[-2,8],[-2,1],[-12,-11],[-4,6],[-10,10],[-1,2],[0,2],[1,2],[1,0],[3,-2],[1,3],[0,3],[-3,2],[-3,0],[1,-3],[-4,-3],[-1,-4],[1,-5],[0,-7],[-1,-4],[-1,-1],[-5,-1],[-2,-3],[-1,0]],[[6348,6910],[-2,2],[-1,2],[-1,4],[-1,3],[1,2],[-1,2],[-1,3],[-2,2],[-1,0],[-1,2],[-1,4],[-2,2],[-2,1],[0,11],[0,9],[0,10],[-5,0],[-4,0],[0,9],[0,14],[2,12],[2,11],[-3,8],[-4,9],[-2,4],[-2,11],[-2,4],[-1,2],[-1,1],[-5,0],[-4,6],[-5,7],[-6,8],[-5,5],[-3,2],[-5,0],[0,1],[-1,3],[0,4],[2,5],[0,3],[-3,10],[-1,4],[-3,1],[0,3],[0,2],[0,2],[-1,0],[-1,1],[-2,-2],[-2,5],[-5,14],[-2,2],[-1,0],[2,5],[2,6],[0,4],[0,4],[-2,7],[0,3],[1,4],[0,3],[2,-1],[2,0],[1,2],[0,8],[0,3],[7,13],[3,3],[3,3],[0,4],[0,2],[-1,3],[0,2],[-3,6],[-1,3],[0,3],[1,5],[1,4],[4,2],[2,2],[1,1],[-3,3],[-6,1],[-5,-1],[-2,1],[-2,5],[-2,3],[-2,2],[-2,0],[-2,0],[0,2],[-3,18],[-1,2],[-1,1],[-1,0],[-1,1],[-1,3],[-1,3],[0,4],[0,3],[0,3],[-1,2],[-2,1],[-1,2],[-2,16],[-1,4]],[[6243,7323],[0,1],[0,3],[1,3],[0,2],[-3,4],[-3,3],[0,1],[0,4],[0,3],[-1,3],[0,2],[0,1],[1,3],[-1,2],[-4,5],[-2,2],[-3,1],[-1,1],[1,4],[1,4],[2,4],[0,2],[1,4],[0,2],[2,4],[0,1],[0,1],[-2,1],[-2,0],[0,1],[0,2],[0,8],[-1,4],[0,4],[0,8],[-1,1],[-2,4],[0,4],[0,1],[0,2],[1,3],[0,2],[-2,3],[-1,2],[0,2],[-1,3],[0,2],[-1,2],[1,1],[2,0],[3,0],[3,0],[1,1],[2,15],[2,3],[2,2],[4,-5],[1,-1],[1,0]],[[6348,6910],[-3,-2],[-2,1],[-6,5],[-2,0],[-3,-2],[0,-1]],[[6332,6911],[-6,5],[-2,1],[-1,0],[-4,0],[-5,-1],[-3,-2],[-2,-2],[-1,-2],[0,-2],[-2,-6],[-2,-9],[-2,-8],[-3,-11],[-3,-5],[-4,-9]],[[6292,6860],[-5,-2],[-11,2],[-13,2],[-12,2],[-9,1],[-1,1],[-9,13],[-8,11],[-9,13],[-9,14],[-9,13],[-7,10],[-8,13],[-8,12],[-6,9],[-8,8],[-5,6],[-9,10],[-7,7],[-6,6],[-9,10],[-3,2],[-10,4],[-9,2],[-9,3],[-6,2]],[[6087,7034],[4,7],[-1,6],[-3,-1],[-3,-1],[-2,9],[2,1],[-2,13],[-2,13],[-2,12],[-2,13]],[[6076,7106],[8,8],[6,6],[8,9],[8,8],[8,8],[8,9],[8,7],[6,3],[2,3],[3,10],[3,9],[0,3],[0,12],[0,15],[1,8],[2,7],[1,6],[0,4],[0,5],[-1,8],[-2,8],[0,7],[1,4],[1,6],[1,5],[2,3],[6,3],[4,2],[5,8],[3,5],[5,8],[3,5],[0,2],[0,1]],[[6176,7321],[3,1],[5,7],[3,7],[1,0],[2,-2],[2,0],[4,2],[3,-1],[2,-2],[1,0],[6,-4],[2,0],[3,-1],[4,0],[3,2],[2,3],[1,0],[2,-1],[1,-1],[1,-2],[0,-2],[0,-9],[1,-2],[0,-2],[1,0],[2,2],[2,2],[2,3],[2,3],[1,1],[2,0],[2,-1],[1,-1]],[[4568,8998],[3,0],[5,2],[2,2],[6,4],[3,1],[5,0],[2,0],[-3,-2],[-2,-1],[-4,-2],[-3,-6],[-2,-3],[0,-2],[3,-2],[3,-2],[3,2],[1,-1],[1,-2],[1,-1],[0,-2],[0,-4],[-2,-3],[-3,-3],[1,-1],[2,-1],[9,2],[1,0],[0,-1],[0,-2],[1,-1],[1,-2],[0,-1],[-4,-5],[4,3],[4,1],[6,-2],[3,-2],[2,-3],[2,1],[1,0],[1,-1],[0,-2],[-1,-3],[0,-2],[-1,-1],[-2,-1],[-1,-1],[1,-2],[1,-2],[2,0],[1,0],[0,-1],[-1,-2],[-1,-1],[-2,-1],[5,-3],[1,-1],[0,-2],[0,-1],[-1,-2],[-2,-1],[-3,-1],[-2,-1],[0,-2],[0,-2],[0,-3],[-3,-5],[-3,-2],[-2,-2],[-5,1],[-2,1],[0,-4],[-2,-2],[0,-2],[1,-1],[0,-3],[-2,-2],[-2,-3],[-2,-2],[-4,-2],[-4,-3],[-3,-2],[-6,0],[-7,-2],[-9,-5],[-7,-3],[-4,-5],[-7,-7],[-5,-3],[-2,0],[-6,-1],[-4,-2],[-15,-3],[-5,-2],[-1,-2],[-2,-3],[0,-1],[1,-1],[0,-1],[-2,-3],[-4,-2],[-1,0],[-3,2],[-1,0],[0,-1],[1,-2],[-2,-1],[-10,-3],[-16,2],[-7,2],[-8,3],[-5,1],[-6,1],[-6,4],[-3,3],[0,1],[0,2],[1,1],[1,0],[2,0],[0,1],[-1,2],[-2,-1],[-3,-3],[-2,0],[-2,2],[0,1],[-4,1],[-4,2],[-4,3],[0,1],[2,1],[-1,1],[-1,0],[-3,-1],[-4,-3],[-1,-1],[-26,-1],[-6,0],[-2,-1],[-1,3],[-1,5],[0,3],[0,2],[1,2],[1,0],[2,-2],[1,-2],[1,-1],[9,2],[4,2],[1,2],[2,3],[2,1],[1,2],[2,5],[1,2],[2,1],[1,1],[4,1],[-2,1],[-3,0],[-8,-5],[-3,0],[0,1],[1,1],[3,3],[-2,0],[-1,1],[0,2],[2,4],[7,5],[2,0],[1,1],[-1,1],[-2,0],[-6,-4],[-5,-2],[-2,0],[-3,2],[0,1],[-2,2],[1,1],[2,4],[0,1],[-2,0],[-5,4],[-7,0],[-17,2],[-4,-1],[-5,-3],[-4,-1],[-2,0],[-1,2],[-2,2],[-1,3],[1,2],[2,1],[2,0],[4,0],[6,2],[4,0],[1,0],[2,2],[1,1],[2,-1],[1,-1],[5,2],[2,1],[1,1],[1,0],[2,-1],[3,0],[3,1],[5,0],[11,1],[2,1],[1,2],[1,4],[0,1],[-8,-4],[-1,0],[-9,2],[-3,2],[1,2],[5,3],[4,3],[7,4],[2,1],[0,1],[-5,3],[-8,-1],[-2,4],[-7,1],[-5,-1],[-3,2],[-6,-3],[-13,-3],[-5,-3],[-3,-1],[-4,2],[-5,3],[-7,1],[0,1],[3,4],[3,1],[3,0],[4,-3],[4,-1],[-4,4],[0,2],[-1,2],[-1,2],[-1,2],[0,1],[2,1],[3,-1],[9,-5],[4,1],[2,2],[3,1],[-1,1],[-7,0],[-4,1],[-2,1],[-1,3],[0,1],[2,1],[6,-1],[-4,5],[-3,2],[0,1],[0,2],[1,1],[7,-2],[2,0],[-2,1],[-3,3],[0,1],[1,0],[1,2],[0,1],[2,1],[2,0],[2,-1],[7,-5],[1,-1],[0,-2],[0,-2],[0,-1],[3,1],[2,-1],[1,0],[2,4],[2,-1],[1,-2],[1,-1],[0,-2],[-1,-4],[2,2],[3,0],[1,1],[0,4],[-1,4],[-10,5],[-2,1],[-2,3],[1,1],[2,1],[2,0],[7,0],[1,1],[-1,1],[-3,1],[-1,0],[-1,2],[-3,-1],[-5,0],[-4,1],[0,1],[2,1],[3,3],[2,1],[4,-1],[5,1],[4,-1],[3,-3],[4,-4],[5,-3],[1,-1],[3,-2],[6,-7],[6,-3],[0,-1],[-1,-1],[-2,-2],[3,-1],[3,-3],[0,-1],[-2,-8],[-1,-1],[-1,-1],[-6,1],[1,-2],[4,-3],[1,-1],[0,-2],[1,1],[1,-1],[0,-2],[-1,-2],[-1,-2],[1,-1],[1,1],[2,-1],[2,-2],[2,-7],[1,-2],[0,2],[1,5],[1,2],[1,0],[0,1],[1,2],[1,5],[4,4],[1,2],[2,0],[1,-1],[3,-4],[1,-1],[1,1],[2,3],[1,5],[0,6],[0,7],[0,5],[2,3],[2,1],[3,-1],[2,-2],[4,-7],[4,-3],[3,-4],[1,-1],[3,-1],[1,0],[0,1],[1,2],[-1,9],[1,3],[1,3],[5,1],[3,1],[3,3],[2,1],[2,0],[2,-1],[2,-2],[3,-4],[4,-6],[5,-4],[2,-8],[1,-1],[1,0],[0,1],[1,1],[0,4],[-2,4],[-4,11],[0,2],[0,1],[4,1],[7,-1],[3,-2],[5,-7],[1,-1],[1,-1],[0,1],[2,1],[2,2],[2,3],[5,7],[1,0],[2,0],[2,-2],[1,-1],[3,-1],[2,0],[4,2],[4,2],[1,3],[0,1],[-3,10],[1,2],[7,2],[6,1],[2,-1],[3,-5],[3,-2],[1,-2],[0,-4],[2,-2],[3,-2]],[[5993,7069],[-1,0],[-3,-3],[-1,-1],[0,-1],[-1,-1],[0,-13]],[[5987,7050],[-2,0],[-2,3],[-1,2],[0,1],[-2,0],[-3,2],[-4,-5],[-1,-7],[0,-3],[-2,-7],[1,-4],[0,-6],[0,-4],[0,-3],[-1,-1],[1,-1],[0,-1],[2,2],[2,-2],[2,-2],[0,-1],[-1,-1],[-3,-4],[-3,-4],[0,-4],[-2,-8],[0,-1],[1,-1],[5,0],[5,4],[4,3],[1,0]],[[5984,6997],[-1,-9],[0,-5],[0,-1],[1,-5],[-2,-9],[-1,-7],[-1,-3],[-2,-7],[-2,-9],[0,-6],[0,-2],[-1,-11],[1,-3],[-2,-10],[-1,-4],[-1,-7],[-1,-13]],[[5971,6886],[-2,-4]],[[5951,6981],[3,5],[0,4],[4,10],[0,1],[-1,2]],[[5957,7003],[6,18],[3,17],[3,24],[3,13],[2,8],[1,6]],[[5975,7089],[3,1],[2,-1],[3,0],[2,2],[1,8],[2,1],[0,-2],[1,2],[3,4],[2,2],[1,2],[1,1]],[[5996,7109],[-1,-3],[0,-2],[0,-3],[0,-2],[1,-3],[1,-4],[-1,-2],[0,-3],[0,-3],[1,-2],[-2,-5],[-1,-5],[-1,-3]],[[5334,7301],[-1,-1],[-2,2],[0,3],[0,1],[2,-1],[1,-3],[0,-1]],[[5432,7385],[-2,-6],[-1,-3],[-6,-16],[-1,-4],[-1,-4],[0,-3],[-1,-3],[-1,-5],[0,-4],[0,-3],[1,-1],[2,-2],[1,-2],[-2,-2],[2,-4],[1,-2],[0,-3],[0,-2],[-3,-5],[-1,-2],[-1,-3],[0,-3],[0,-3],[0,-3],[-3,0],[-3,2],[-3,-1],[-5,3],[-1,1],[-2,1],[-3,10],[-3,5],[-4,3],[-3,0],[-3,0],[-3,2],[-6,7],[-6,5],[-3,4],[-1,2],[-2,2],[-3,1],[-4,4],[-1,0],[-3,0],[-2,0],[-1,1],[-4,5],[-2,6],[0,2],[1,7],[2,7],[2,1],[1,2],[1,2],[1,2],[3,-7],[2,-1],[1,0],[3,2],[0,3],[3,4],[4,0],[1,-1],[1,-3],[2,-1],[1,-1],[6,-5],[1,-1],[1,-1],[5,3],[3,1],[6,-1],[4,1],[2,0],[4,2],[3,4],[1,1],[2,0],[4,0],[3,-1],[2,1],[1,3],[2,1],[2,-1],[4,4],[2,1],[2,-2],[-2,-3]],[[5235,7434],[-2,-6],[-1,4],[0,4],[0,1],[2,-2],[1,-1]],[[5387,7528],[-2,0],[0,1],[-1,0],[1,3],[2,-2],[0,-1],[0,-1]],[[5230,7548],[-1,-3],[-2,0],[1,2],[1,4],[2,1],[0,-1],[0,-2],[-1,-1]],[[5267,7539],[1,-4],[4,-15],[0,-3],[-1,-4],[-1,-2],[-3,-8],[1,-6],[1,-4],[0,-4],[0,-6],[-2,-32],[-1,-6],[-1,-5],[-2,-2],[-3,2],[-3,3],[-2,-1],[-1,-1],[-2,1],[-1,2],[-1,-11],[-1,-5],[-3,-3],[-2,0],[-2,1],[-2,0],[-2,2],[-1,4],[-2,5],[-2,5],[0,5],[0,11],[0,2],[1,3],[1,4],[-1,5],[1,1],[1,-1],[1,0],[0,2],[0,4],[-2,4],[-2,1],[0,3],[0,4],[1,2],[1,3],[0,10],[-2,3],[-1,5],[0,4],[-2,3],[-2,3],[-1,2],[0,7],[0,6],[1,2],[1,0],[1,-3],[2,-1],[3,0],[3,1],[3,2],[4,3],[4,10],[3,2],[2,2],[1,3],[1,1],[1,-3],[2,0],[3,-3],[1,-3],[1,-3],[1,-1],[2,-1],[-1,-1],[-1,-4],[0,-1],[2,-1]],[[5288,7652],[1,-2],[0,-1],[0,-2],[0,-3],[-2,3],[-4,-2],[-2,1],[-1,2],[1,2],[3,0],[1,1],[2,-1],[1,2]],[[5380,7863],[-1,-3],[-1,-1],[-2,-2],[-2,-2],[-2,-3],[-1,-4],[1,-2],[1,0],[1,0],[2,-1],[2,-1],[0,-2],[0,-1],[-2,-3],[-2,-2],[0,-2],[0,-1],[1,-1],[2,0],[1,-1],[-2,-7],[1,-1],[2,-2],[2,-1],[3,-5],[1,-4],[-1,-1],[-2,-1],[-1,1]],[[5381,7810],[1,2],[-4,8],[-2,0],[-3,-3],[-7,3],[-1,-1],[-1,-3],[-3,-4],[-3,-1],[-4,-4],[-4,-3],[-3,-2],[-2,1],[3,4],[-2,0],[-3,-3],[-3,-3],[0,-4],[-1,-7],[2,-2],[3,-10],[3,-4],[0,-4],[-1,-3],[-3,-3],[-1,2],[-1,0],[-1,-6],[1,-17],[3,-12],[2,-5],[6,-8],[6,-4],[11,-14],[6,-4],[1,-3],[4,-10],[3,-12],[3,-19],[3,-9],[4,-11],[10,-15],[9,-11],[9,-7],[6,-1],[16,1],[3,0],[2,-2],[1,-5],[-1,-3],[-3,-3],[-3,-5],[-1,-6],[3,-5],[15,-11],[16,-10],[4,-5],[6,-8],[13,-11],[2,-5],[9,-11],[3,-9],[1,-6],[-2,-7],[-1,-5],[-1,-5],[-3,2],[-4,5],[-6,20],[-11,2],[-2,1],[-4,4],[0,2],[-1,3],[-1,1],[-4,0],[-3,-3],[-4,-7],[-3,-11],[-4,-16],[-1,-7],[3,-6],[6,-4],[5,-5],[3,-6],[0,-14],[2,-8],[-3,-5],[-4,2],[-5,-3],[-4,-5],[-2,-5],[1,-13],[-1,-5],[-7,-9],[-4,-9],[-1,-4],[-2,-5],[-9,0],[-2,6],[0,8],[2,5],[3,2],[2,10],[0,8],[1,3],[1,3],[3,1],[3,1],[1,11],[-3,5],[-1,6],[-1,13],[-5,15],[-3,14],[-2,7],[-3,4],[-5,0],[-3,1],[-9,10],[-1,1],[0,3],[2,3],[-1,6],[-1,5],[-2,4],[-2,2],[-5,-1],[-1,-1],[-3,0],[-2,-2],[-1,0],[3,8],[-1,1],[-3,4],[-5,0],[-1,0],[-1,-2],[0,2],[0,3],[-6,15],[-3,6],[-2,1],[-3,-1],[-5,2],[-4,1],[-1,-1],[-3,-2],[-1,2],[-1,2],[-5,6],[-6,3],[-11,20],[-4,8],[-8,8],[-4,11],[-4,5],[-6,3],[-1,0],[-2,-1],[-1,-1],[-1,2],[1,2],[1,0],[0,5],[-7,11],[-3,4],[-1,3],[-1,3],[-1,2],[-2,1],[-1,0],[-2,1],[0,5],[0,5],[0,3],[-2,10],[-4,8],[-2,20],[-2,5],[-3,4],[-9,5],[-12,13],[-3,0],[-7,5],[-5,0],[-6,-4],[-7,-12],[-6,-13],[-2,-2],[-8,-4],[-6,-2]],[[5344,7714],[1,-2],[1,0],[1,3],[0,3],[-2,-1],[-1,-3]],[[2854,6247],[3,-2],[3,-1],[2,0],[1,-1],[4,-5],[2,-3],[10,-6],[3,-10],[1,-3],[-3,-2],[-3,-1],[-3,0],[-3,2],[-1,1],[-3,1],[1,2],[-1,0],[-2,0],[-1,-4],[-2,-3],[-2,0],[-1,3],[-1,-1],[-2,-2],[-1,-8],[-2,4],[-2,3],[-3,1],[-6,0],[-3,2],[-2,6],[-1,2],[-2,1],[-2,8],[-1,1],[-6,1],[-1,4],[0,4],[2,4],[1,1],[3,0],[4,2],[1,1],[2,2],[11,-4],[3,0],[3,0]],[[4943,8019],[1,-2],[-2,-1],[-1,1],[-2,0],[-2,-1],[1,5],[4,0],[1,-2]],[[6087,7034],[-4,-7],[-1,0],[-6,-3],[-11,-6],[-7,-4],[-9,-5],[-8,-4],[-8,-4],[-7,-3],[4,-8],[6,-12],[4,-8],[5,-11],[5,-9],[4,-9],[-3,-4],[-5,-5],[-1,-1],[0,-1],[-2,-10],[-2,-8],[-1,-1],[-7,-2],[-8,-3],[-5,-2],[-1,-2],[-3,-9],[-3,-10],[-6,-8],[-6,-9],[-1,-1],[-4,1],[-8,3],[-7,2],[-5,2],[-6,2]],[[5970,6875],[1,7],[0,4]],[[5984,6997],[1,5],[1,6],[1,5],[-1,13],[0,7],[2,8],[-1,9]],[[5993,7069],[3,-1],[2,-3],[3,-7],[5,-3],[1,-2],[3,-4],[3,-1],[9,-3],[8,9],[6,7],[7,8],[5,6],[9,9],[5,6],[7,8],[7,8]],[[8441,6582],[-2,-1],[-2,1],[-2,1],[0,1],[2,2],[0,3],[0,1],[5,-3],[0,-2],[-1,-3]],[[8452,6596],[-2,-9],[-1,-2],[-2,1],[-1,5],[1,2],[1,-1],[1,1],[3,7],[1,-1],[-1,-3]],[[8484,6609],[-3,-2],[-2,1],[0,8],[1,-1],[1,-2],[2,-2],[1,-2]],[[8949,6717],[-1,0],[-1,6],[1,-1],[1,-3],[0,-2]],[[8562,6719],[-3,-3],[-1,-3],[-2,-1],[-3,-4],[-2,-1],[0,-4],[1,-3],[-1,0],[-2,-4],[0,-3],[0,-2],[0,-1],[-2,-3],[-2,0],[0,3],[0,3],[2,6],[0,7],[2,1],[1,1],[3,5],[0,3],[-1,2],[0,2],[0,1],[3,-1],[1,-1],[0,-1],[1,2],[1,2],[3,5],[1,5],[2,-4],[-1,-5],[-1,-4]],[[8582,6780],[-1,-1],[-1,2],[-1,6],[1,4],[1,0],[1,-5],[1,-3],[-1,-3]],[[8591,6803],[1,-2],[-3,1],[-1,6],[2,-1],[0,-2],[1,-2]],[[8595,6809],[-2,-5],[-3,4],[-3,3],[2,1],[0,1],[0,2],[2,2],[4,2],[2,0],[1,2],[1,2],[0,1],[3,2],[0,-2],[0,-3],[-2,-1],[-2,-3],[-1,-3],[-2,-2],[0,-1],[0,-2]],[[8628,6927],[-4,-1],[-1,1],[-2,7],[3,5],[4,-5],[1,-1],[-1,-6]],[[8637,6935],[-3,-1],[0,3],[2,8],[1,5],[1,7],[1,2],[1,0],[0,-2],[0,-8],[-2,-7],[-1,-7]],[[8602,7007],[0,-1],[0,5],[2,4],[1,-3],[-3,-5]],[[8621,7051],[-3,0],[-1,1],[0,2],[3,3],[3,0],[-1,-4],[-1,-2]],[[8613,7040],[-3,-2],[0,2],[-1,1],[2,3],[0,1],[-1,2],[1,7],[0,3],[4,1],[1,-3],[0,-8],[-3,-7]],[[8573,7072],[1,-1],[2,0],[1,1],[1,-1],[1,-4],[1,-2],[-2,-1],[-1,0],[-1,-3],[-2,1],[-1,1],[0,2],[0,7]],[[8884,7088],[-1,-1],[-1,2],[0,2],[0,1],[1,0],[1,-2],[0,-2]],[[8585,7075],[-1,0],[-1,5],[-1,2],[1,1],[3,9],[0,-4],[1,-3],[1,-1],[-1,-3],[-1,-1],[-1,-5]],[[8596,7097],[-2,-2],[-1,0],[1,3],[0,1],[1,5],[2,1],[1,0],[-1,-4],[-1,-4]],[[8605,7128],[-2,-3],[-2,2],[1,5],[0,2],[2,-2],[1,-4]],[[8643,7119],[4,-1],[1,-1],[2,1],[2,2],[2,2],[2,-1],[1,-2],[1,-3],[0,-3],[-3,-6],[-2,-7],[5,-1],[5,0],[-1,-4],[0,-4],[1,-1],[1,-3],[0,-2],[-1,-2],[3,-3],[0,-2],[-1,-2],[-7,-15],[-2,-7],[-1,-8],[-1,-6],[-1,-6],[-1,-7],[-1,-7],[0,-6],[0,-6],[-4,-15],[-2,0],[-3,2],[-2,0],[-1,-4],[2,-7],[-6,-8],[-6,-6],[0,3],[1,2],[1,1],[0,2],[1,7],[0,6],[-2,9],[0,3],[1,1],[1,0],[0,1],[0,3],[0,2],[-2,1],[-2,0],[-1,-3],[-1,-6],[-1,-6],[0,-3],[1,-3],[2,-5],[0,-3],[-1,-2],[-8,5],[-2,0],[-1,1],[-2,7],[3,1],[1,1],[1,2],[0,7],[-1,5],[-2,2],[-1,3],[1,4],[0,6],[0,8],[0,2],[3,1],[2,5],[2,5],[3,8],[2,10],[-2,0],[-2,2],[2,4],[-1,6],[-3,7],[-1,8],[-3,3],[-1,2],[-2,-2],[-1,-2],[1,-6],[0,-4],[0,-5],[1,0],[2,1],[1,-1],[1,-2],[0,-4],[0,-3],[-1,-1],[-2,0],[-1,2],[-2,2],[-2,1],[-3,-2],[-3,-6],[-2,-3],[1,4],[0,5],[-1,3],[-2,5],[-1,3],[0,4],[0,4],[3,-4],[1,-6],[2,-2],[3,0],[-2,8],[-1,2],[-2,3],[-4,6],[-2,3],[0,6],[2,2],[1,-1],[4,-2],[0,3],[0,2],[-1,2],[3,2],[4,3],[1,1],[1,2],[1,1],[3,0],[2,2],[2,6],[1,3],[1,3],[5,4],[1,1],[4,-1],[3,-2],[1,-6],[2,-6],[3,-4]],[[8673,7139],[2,-2],[3,1],[0,-1],[-1,-2],[-1,-2],[-3,2],[-1,0],[-1,3],[1,1],[1,0]],[[8682,7149],[-1,-3],[-2,1],[1,2],[0,3],[1,0],[0,-3],[1,0]],[[8590,7149],[-2,-2],[0,3],[0,11],[4,-2],[0,-4],[-2,-6]],[[8731,7157],[4,-2],[4,0],[0,-10],[1,-4],[1,-3],[-1,-5],[2,-1],[-5,-5],[-5,-7],[-2,-5],[-2,-5],[-1,-5],[-1,-6],[-1,2],[-5,9],[-3,3],[-4,1],[-2,0],[-9,-9],[-2,-6],[-2,-10],[-2,-3],[-1,-1],[-1,-1],[-1,-9],[-3,-5],[-2,0],[-3,2],[-1,-1],[1,8],[-2,1],[-3,0],[-1,5],[-1,3],[1,4],[0,3],[1,2],[0,2],[0,2],[-2,1],[-1,2],[0,5],[-1,1],[-2,-1],[-6,-5],[-1,0],[2,3],[5,5],[2,2],[5,7],[3,3],[1,6],[1,4],[1,3],[1,5],[1,1],[3,5],[1,-1],[2,-5],[2,-4],[2,0],[3,2],[1,1],[4,0],[3,2],[1,3],[0,4],[-1,6],[2,0],[1,0],[4,4],[3,2],[3,1],[4,-2],[4,-4]],[[8731,7170],[0,-1],[-1,0],[-2,-2],[0,2],[-1,2],[-1,1],[4,1],[2,-1],[-1,-2]],[[8747,7159],[-3,-5],[-2,0],[-2,2],[0,3],[2,4],[3,6],[1,3],[2,2],[1,-1],[-2,-8],[0,-6]],[[8593,7163],[0,-3],[-2,2],[-1,1],[2,9],[-1,4],[1,1],[3,5],[1,-1],[0,-1],[0,-2],[0,-5],[-3,-7],[0,-3]],[[8873,7184],[0,-3],[-2,1],[-1,2],[1,3],[1,0],[1,-3]],[[8704,7269],[-1,-2],[-3,1],[-1,3],[0,3],[3,3],[2,-5],[0,-3]],[[8842,7362],[-3,0],[0,1],[1,1],[0,3],[1,4],[0,1],[-2,0],[0,5],[2,5],[4,7],[1,2],[1,-4],[-2,-7],[0,-3],[3,-1],[-2,-9],[-4,-5]],[[8922,7567],[1,-1],[5,3],[-1,-9],[0,-9],[0,-15],[1,-7],[1,-6],[2,-5],[3,-3],[4,-10],[2,-13],[2,-7],[1,-6],[0,-3],[0,-3],[0,-4],[0,-4],[0,-10],[-2,-12],[0,-6],[-2,-2],[-1,-3],[-1,-1],[-1,-1],[-1,0],[-1,-1],[0,-4],[-1,-3],[-1,-2],[-1,-4],[-1,-7],[0,-8],[-1,-5],[-3,-2],[-3,1],[-4,-3],[-1,-1],[-3,-10],[-1,-5],[0,-6],[1,-8],[1,-7],[1,-13],[-1,-20],[-1,-7],[-2,-4],[-2,-2],[-1,-3],[-2,-7],[-3,-13],[0,-3],[0,-3],[-1,-5],[0,-4],[0,-5],[1,-5],[4,-13],[2,-3],[1,-3],[-6,-4],[-1,-2],[-4,-7],[-2,-7],[1,-7],[-1,-3],[-1,-2],[-1,-1],[-5,-4],[-2,-3],[-3,-5],[-1,-3],[-2,1],[-2,2],[2,3],[-1,4],[1,9],[-1,4],[2,3],[1,4],[3,4],[1,3],[1,2],[-2,3],[-1,2],[-3,0],[-2,0],[-1,-3],[0,-4],[0,-1],[0,-2],[-4,-5],[1,-5],[1,-2],[1,-2],[0,-1],[-2,-5],[-1,0],[-2,6],[-3,3],[-3,0],[-3,-1],[-2,-4],[-1,-3],[-1,-4],[1,-8],[-1,-7],[-2,-5],[-1,-3],[-3,-4],[-1,0],[-1,2],[-1,2],[1,11],[0,5],[3,3],[-3,4],[-3,2],[-4,-2],[-1,-3],[0,-3],[-3,-4],[-2,-4],[-3,-7],[-1,-8],[-6,3],[-3,1],[-4,-1],[-5,1],[-6,-1],[-8,-3],[1,2],[6,5],[0,1],[-1,3],[-1,0],[-4,-1],[-1,0],[-1,3],[-1,1],[-1,-1],[0,-5],[-1,-1],[-1,1],[0,5],[0,6],[0,4],[1,3],[-1,1],[-2,0],[-1,-2],[-2,-2],[-3,-11],[-1,-7],[2,-5],[6,-7],[1,-2],[0,-3],[0,-3],[-2,-2],[-7,-2],[-6,-5],[-2,-4],[-5,-19],[-4,-12],[-7,-4],[-6,3],[-2,5],[-1,5],[-3,5],[-2,5],[-1,7],[0,10],[-1,6],[1,1],[4,4],[1,2],[2,5],[1,3],[0,4],[-2,2],[-4,0],[-5,-2],[-3,2],[-4,5],[-1,1],[-4,1],[-4,-1],[-3,-2],[-3,-1],[-1,-1],[-4,-6],[-3,-3],[-2,-2],[-6,-1],[-2,-1],[-3,-2],[-1,0],[-3,-3],[-4,-2],[-1,-2],[-4,1],[-7,-4],[-3,-1],[-3,3],[-3,3],[-4,-1],[-2,-6],[-1,-11],[-1,-5],[0,-6],[-2,1],[-9,11],[-8,-2],[-2,-1],[-2,-2],[-3,-1],[-2,2],[-2,2],[-2,0],[-2,-2],[-1,16],[0,2],[2,3],[1,3],[4,1],[3,-1],[3,1],[2,3],[2,5],[3,4],[3,3],[4,3],[3,5],[3,5],[2,4],[3,3],[4,8],[6,8],[2,7],[2,2],[4,3],[7,3],[3,0],[3,-6],[2,1],[1,1],[4,1],[3,-1],[3,0],[4,1],[6,2],[4,2],[3,3],[12,2],[8,5],[1,-1],[2,-1],[0,-3],[-1,-4],[1,-3],[1,-1],[8,0],[2,-1],[3,2],[3,4],[3,4],[3,5],[-2,6],[-1,7],[2,7],[2,6],[3,4],[3,4],[5,12],[4,10],[2,12],[-1,14],[3,11],[4,2],[6,5],[4,1],[0,-2],[0,-3],[-5,-9],[-3,-3],[-2,-2],[-1,-1],[-1,-3],[3,-6],[0,-3],[0,-4],[0,-3],[3,-4],[4,-1],[1,0],[1,1],[4,9],[1,1],[11,7],[5,5],[4,1],[2,3],[7,10],[2,4],[2,5],[2,6],[1,7],[2,4],[10,9],[3,5],[1,3],[2,7],[0,8],[2,5],[1,6],[3,6],[2,5],[2,5],[2,13],[1,7],[0,3],[1,2],[1,3],[1,3],[0,3],[1,9],[0,7],[-2,6],[-2,2],[-1,0],[-2,0],[-2,2],[0,2],[2,1],[1,1],[1,2],[2,7],[1,7],[0,3],[-1,6],[-1,6],[0,4],[1,4],[2,4],[1,1],[2,0],[2,1],[1,2],[1,2],[1,6],[1,4],[-1,9],[1,2],[1,2],[1,-2],[2,0],[2,1],[1,-1],[1,-3],[1,-15],[1,-2],[1,-1],[1,0],[1,2],[1,3],[2,1],[5,-3],[2,2],[1,4],[1,6],[0,6],[-2,2],[-1,0],[-1,-2],[-1,-1],[-8,-3],[0,7],[2,10],[1,3],[1,1],[3,-1],[2,-1],[3,-5]],[[8874,7608],[-1,-1],[-1,1],[0,4],[0,2],[2,2],[2,0],[-2,-8]],[[8924,7783],[-2,-1],[-2,3],[0,3],[1,2],[2,-1],[1,-3],[1,-2],[-1,-1]],[[8918,7795],[-1,-4],[-2,6],[0,6],[1,0],[1,-1],[1,-3],[0,-4]],[[8994,7725],[4,0],[1,0],[3,-1],[10,-9],[4,-1],[3,0],[2,1],[2,2],[7,11],[6,9],[1,0],[0,-3],[0,-3],[-3,-8],[-4,-12],[0,-6],[1,-6],[2,-5],[1,-7],[2,-9],[3,-1],[1,0],[3,2],[3,4],[2,0],[2,0],[-3,-3],[-3,-3],[-2,-5],[-1,-1],[-3,0],[-1,0],[-4,-3],[-3,-2],[-2,-4],[-3,-1],[-3,-1],[-5,-3],[-4,0],[-6,3],[-2,-1],[-7,-5],[-6,-8],[-5,-9],[-4,-10],[-1,-5],[-1,-6],[-1,-4],[0,-4],[-1,-3],[-1,-2],[-4,1],[-5,6],[-11,8],[-12,12],[-7,6],[-12,-2],[-12,-11],[-1,1],[-4,8],[-2,3],[-3,1],[-2,0],[-2,-1],[-2,-4],[-1,-3],[-1,-3],[0,-3],[0,-2],[3,-6],[3,-3],[1,-1],[3,0],[1,0],[5,-8],[6,-8],[1,-2],[-2,-3],[-2,-1],[-3,0],[-2,1],[-5,3],[-2,-2],[-2,-6],[-2,-6],[-1,-3],[-3,-3],[-4,-2],[-2,0],[-1,3],[-1,2],[0,4],[1,6],[1,7],[1,6],[-1,9],[-1,2],[-4,5],[-2,5],[0,6],[0,4],[1,7],[1,4],[2,2],[1,0],[3,3],[3,4],[3,4],[3,5],[2,5],[-3,7],[0,4],[0,4],[3,2],[2,-2],[6,-5],[1,-1],[3,0],[6,-1],[3,0],[1,1],[2,5],[1,6],[0,7],[0,8],[1,6],[4,9],[2,6],[0,14],[2,7],[1,6],[1,13],[-2,13],[-2,7],[-2,6],[0,5],[2,6],[0,1],[0,2],[3,1],[2,1],[1,3],[2,1],[1,-1],[1,-3],[4,-7],[7,-11],[8,-18],[5,-8],[5,-8],[6,-8],[7,-7],[4,-3],[2,-5],[2,-1]],[[7140,7206],[-2,5],[0,3],[-2,6],[-1,5],[-2,8],[-1,5]],[[6393,7767],[-1,-1],[-1,0],[-3,6],[1,6],[1,2],[1,0],[0,-1],[-1,-3],[-1,-3],[2,-4],[2,-2]],[[6397,7774],[-1,-1],[-1,4],[1,3],[2,1],[-1,-5],[0,-2]],[[6463,7799],[-1,0],[-2,1],[-1,3],[2,3],[1,0],[1,-4],[0,-3]],[[7227,7614],[-4,6],[-4,7],[-3,1],[-6,1],[-3,0],[-1,2],[-2,3],[-2,4],[-3,3],[-1,6],[-1,1],[-2,-1],[-3,0],[-1,1],[-3,0],[-4,3],[-3,2],[-5,0],[-2,0],[-7,-1],[-7,2],[-5,1],[-3,0],[-1,0],[-3,0],[-3,1],[-5,3],[-2,0],[-1,0],[-9,-3],[-3,0],[-9,0],[-7,0],[-3,1],[-1,0],[-3,-6],[-2,-1],[-7,1],[-9,4],[-6,4],[-6,5],[-7,7],[-4,3],[-1,-2],[-1,0],[-2,-1],[-4,1],[-1,-4],[-5,-2],[-3,-3],[-1,-2],[-3,-18],[-1,-6],[2,-11],[-2,1],[-3,3],[-1,2],[-3,1],[-9,2],[-2,3],[-1,2],[-2,1],[-4,1],[-7,5],[-3,0],[-10,3],[-1,0],[-1,0],[-4,-2],[-2,-1],[-3,1],[-4,-3],[-3,-4],[-2,-4],[-2,-3],[0,-5],[-2,-2],[-1,-4],[0,-3],[1,-3]],[[6970,7617],[-2,-2],[-3,-1],[-1,-1],[-2,-4],[-1,-3],[-1,-1],[-1,0],[-2,3],[-2,-1],[-2,-2],[-3,-5],[-4,-7],[-3,-4],[-5,-4],[-4,-1],[-2,-2],[-5,-5],[-1,-3],[-3,-2],[-3,-2],[-2,-4],[-1,-5],[-1,-4],[-4,-5],[-3,-4],[-2,-5],[-3,-5],[0,-2],[0,-4],[1,-3],[0,-3],[-1,-2],[-2,-1],[-2,0],[-4,3],[-3,3],[-2,2],[-1,3],[0,3],[1,6],[0,4],[-1,2],[-1,2],[-1,2],[-2,4],[-2,-1],[-1,-1],[-2,1],[-6,0],[-4,-1],[-4,0],[-5,-1],[-7,0],[-2,0],[-1,2],[-1,5],[0,4],[-2,9],[0,6],[-1,8],[-1,9],[0,6],[-5,0],[-4,0],[-5,0],[0,5],[0,6],[0,7],[1,9],[0,8],[1,9],[0,6],[0,7],[-2,-2],[-3,-2],[-3,-3],[-2,6],[-2,5],[-2,8],[-2,6],[-4,4],[-3,3],[-2,4],[-3,5],[-2,4],[-3,4],[-2,-1],[-3,-3],[-3,-2],[-3,-3],[-2,-1],[-3,1],[-3,0],[-6,1],[-4,0],[-5,1],[-6,1],[-7,1],[-4,-1],[-6,-2],[-6,-1],[-5,-2],[-6,-1],[-4,-1],[-3,0],[-3,5],[-4,8],[-3,4],[-3,5],[-4,7],[-3,5],[-3,5],[-2,4],[0,6],[-2,3],[-4,3],[-3,4],[-4,4],[-4,4],[-4,3],[-4,4],[-4,4],[-3,4],[-4,4],[-4,3],[-4,4],[-4,4],[-4,4],[-3,4],[-4,3],[-4,4],[-4,4],[-3,3],[-3,-1],[-4,-2],[-5,-2],[-5,-2],[-8,-4],[-5,-2],[-4,-2],[-5,-2],[-5,-3],[-5,-2],[-6,-3],[-5,-2],[-4,-2],[-4,-2],[-4,-2],[0,-13],[0,-13],[0,-13],[0,-13],[0,-14],[0,-13],[0,-13],[0,-13],[0,-14],[0,-13],[0,-13],[0,-13],[0,-13],[0,-14],[0,-13],[0,-13]],[[6554,7564],[-1,0],[-3,-1],[-4,-2],[-4,-1],[-1,1],[-2,1],[-1,3],[-2,4],[-2,3],[-2,6],[-2,4],[-4,10],[-1,3],[-1,3],[-1,3],[-5,6],[-6,6],[-5,6],[-2,1],[-2,2],[-4,0],[-2,0],[-6,-2],[-6,-2],[-6,-3],[-6,-4],[-1,-1],[-4,-4],[-5,-6],[-5,-10]],[[6458,7590],[-1,6],[0,10],[0,3],[1,8],[2,5],[1,6],[1,7],[-2,12],[-1,2],[-1,1],[-2,0],[-3,0],[-2,-1],[-2,4],[-3,1],[-2,-2],[-1,0],[-2,1],[-2,2],[0,3],[-1,3],[-3,6],[-2,3],[-3,0],[-4,0],[-2,1],[0,3],[1,7],[0,4],[-1,3],[0,3],[-1,3],[-3,4],[-2,6],[-4,12],[-3,13],[-1,2],[-3,2],[-6,2],[-4,2],[-1,2],[-1,3],[0,3],[1,3],[1,4],[3,2],[6,1],[6,-1],[5,-5],[2,-2],[2,0],[4,2],[1,0],[5,0],[-1,2],[-2,2],[-2,0],[-1,1],[-3,5],[-4,6],[-1,2],[-1,4],[1,4],[3,3],[3,5],[1,6],[1,3],[3,4],[3,-1],[5,4],[9,-1],[11,1],[3,0],[6,-3],[4,-2],[5,-1],[3,2],[-3,4],[-7,5],[-2,5],[3,12],[5,10],[2,13],[0,13],[-2,4],[1,4],[1,3],[1,4],[-1,4],[-1,7],[-1,2],[-4,3],[-6,0],[-6,2],[-2,-1],[-1,-3],[-1,-1],[-4,-3],[-1,-1],[-2,1],[-2,3],[-2,0],[-5,2],[-3,5],[-1,1],[-9,4],[-3,0],[-7,-4],[-5,-5],[-2,-1],[-3,-3],[-1,0],[-2,0],[-1,0],[-3,-5],[-6,-6],[-3,-3],[-3,-2],[-3,-2],[-4,0],[-1,-1],[-4,-1],[-3,-1],[0,-2],[1,-4],[-3,1],[-2,-2],[1,-3]],[[6367,7853],[-1,0],[-7,6],[-5,4],[-4,3],[-1,1],[-1,1],[-1,3],[0,3],[0,2],[1,1],[2,0],[1,0],[1,-1],[2,-2],[3,0],[2,1],[0,3],[-3,10],[-3,9],[-4,9],[-1,3],[-4,8],[-4,8],[-3,7],[-1,2],[-5,1],[-9,1],[-4,1],[-2,-2],[-3,-1],[-2,3],[-2,4],[-1,5],[0,4],[0,6],[-1,6],[-2,3],[-4,2],[-5,5],[-2,10],[3,13],[4,9],[3,4],[1,4],[1,3],[-1,3],[-1,3],[-3,3],[-2,3],[1,8],[2,11],[3,9],[4,5],[3,4],[1,3],[0,5],[0,4],[1,3],[1,3],[2,2],[2,3],[3,1],[3,-3],[4,-5],[5,-11],[4,-7],[1,-2],[3,-4],[3,-2],[4,3],[5,3],[1,2],[1,2],[-1,5],[0,4],[-1,4],[-2,7],[-1,11],[-1,4],[1,0],[2,0],[2,-1],[3,3],[4,5],[7,7],[2,5],[1,5],[2,3],[5,1],[4,2],[3,4],[5,3],[4,2],[2,2],[1,3],[5,7],[3,5],[3,5],[1,3],[3,0],[4,-2],[4,-2],[3,-3],[0,-4],[0,-2],[2,-1],[1,-1],[2,1],[4,0],[5,4],[6,7],[6,2],[3,-1],[3,-5],[2,-5],[2,-2],[1,0],[3,1],[3,0],[2,-2],[4,0],[5,1],[0,1],[3,-1],[3,-2],[2,-3],[5,-8],[2,-2],[5,-3],[3,-3],[2,-4],[2,-3],[3,-5],[3,-7],[1,-6],[0,-6],[2,-2],[1,0],[1,0],[1,3],[0,4],[0,7],[-1,5],[-1,2],[0,2],[0,3],[2,1],[3,-1],[3,-3],[5,-4],[5,-7],[4,-5],[5,-4],[4,-1],[3,1],[4,3],[3,4],[2,3],[1,4],[5,6],[5,4],[2,0],[1,-2],[5,3],[2,1],[4,1],[5,-2],[3,-5],[4,-3],[3,0],[3,2],[2,3],[1,4],[2,2],[0,1],[6,-2],[3,0],[1,1],[4,-1],[6,-5],[3,-6],[4,-8],[2,-2],[3,-1],[2,-1],[3,-1],[8,-2],[1,0],[1,-2],[-1,-4],[1,-1],[6,3],[2,2],[2,6],[2,7],[1,2],[2,1],[1,-1],[2,-4],[3,-4],[4,-1],[2,-1],[4,0],[8,2],[8,4],[5,5],[2,8],[1,8],[2,6],[-1,5],[-4,5],[-1,2],[-10,3],[0,2],[-1,0],[-9,5],[-5,2],[-1,3],[-1,4],[-3,3],[-6,4],[-1,2],[1,3],[4,2],[6,6],[2,1],[5,1],[4,4],[3,3],[2,3],[-1,4],[-4,10],[-1,6],[0,4],[3,4],[1,2],[2,5],[1,2],[5,1],[5,0],[4,-1],[5,0],[4,-1],[3,-1],[2,2],[1,2],[0,3],[-2,3],[-7,4],[-3,3],[-2,-1],[-4,1],[-4,2],[-3,1],[-1,3],[1,4],[1,2],[2,1],[3,0],[3,1],[0,1],[1,2],[-1,1],[-1,2],[-2,0],[-2,-1],[-2,-1],[-4,2],[-4,2],[0,2],[3,3],[1,3],[0,3],[0,4],[1,5],[2,3],[3,2],[7,-3],[10,-3],[1,0],[1,2],[1,1],[12,1],[3,2],[1,1],[12,2],[2,2],[2,2],[2,0],[4,1],[4,2],[4,1],[4,0],[4,1],[1,1],[1,2],[4,2],[7,2],[2,-1],[3,-1],[5,1],[3,2],[2,-2],[2,-1],[2,1],[1,5],[1,4],[3,2],[1,1],[2,1],[1,2],[7,0],[5,4],[1,-2],[8,1],[9,2],[6,2],[9,3],[5,2],[6,1],[6,1],[3,4],[4,1],[3,0],[3,1],[1,2],[1,3],[-1,3],[0,3],[3,1],[3,1],[3,1],[5,5],[4,3],[3,2],[8,-1],[7,-1],[7,-3],[3,-3],[3,-3],[3,-1],[3,-1],[3,1],[2,2],[1,2],[2,2],[7,1],[2,-2],[3,-8],[2,-10],[4,-14],[2,-6],[-1,-4],[0,-5],[0,-5],[-3,-6],[1,-3],[7,-3],[9,1],[6,3],[3,-1],[2,1],[1,5],[2,1],[3,-3],[1,-5],[2,-4],[0,-4],[1,-5],[1,-1],[2,2],[2,1],[0,1],[-1,2],[0,2],[0,2],[2,1],[3,-1],[5,-1],[5,-7],[3,-1],[2,0],[3,0],[3,2],[2,3],[1,1],[2,0],[1,-1],[0,-3],[-1,-4],[-4,-3],[-4,-4],[-2,-6],[-1,-6],[1,-3],[1,-2],[0,-3],[1,-1],[2,2],[5,6],[2,1],[4,1],[6,0],[4,-2],[2,-3],[2,-2],[1,1],[1,2],[0,3],[0,3],[7,6],[4,4],[1,1],[3,-1],[2,0],[5,4],[4,4],[1,3],[0,3],[1,1],[6,1],[1,1],[5,3],[7,5],[4,3],[6,1],[1,1],[3,2],[3,3],[3,1],[-2,-7],[-2,-8],[-1,-3],[-7,1],[0,-2],[1,-4],[1,-2],[1,-1],[1,-3],[7,-7],[9,-9],[9,-10],[7,-7],[2,-3],[2,-3],[5,-10],[4,-10],[8,-16],[7,-17],[8,-17],[4,-11],[9,-21],[2,-7],[5,-12],[4,-12],[3,-11],[2,-1],[1,3],[0,2],[1,1],[3,3],[1,1],[2,0],[2,1],[1,3],[0,6],[-1,2],[1,3],[1,1],[2,1],[1,0],[2,3],[2,1],[2,0],[2,0],[1,-3],[1,-3],[2,0],[3,0],[0,-2],[-1,-5],[-1,-3],[0,-2],[2,-2],[5,1],[2,0],[1,-3],[0,-2],[1,-3],[-1,-3],[1,-2],[5,0],[3,2],[5,0],[5,-3],[3,0],[3,1],[5,0],[3,2],[2,3],[1,3],[1,1],[5,0],[2,0],[2,4],[2,2],[3,0],[3,0],[6,-3],[4,-3],[4,-4],[2,-3],[2,-5],[2,-4],[2,-5],[1,-5],[2,-9],[2,-3],[2,0],[2,-1],[3,-1],[7,-6],[2,0],[2,-2],[0,-3],[0,-3],[0,-3],[3,-5],[1,-4],[2,-5],[1,-2],[1,-1],[3,1],[3,-1],[11,-3],[1,0],[1,-3],[2,0],[2,0],[2,0],[2,3],[1,2],[4,3],[3,4],[2,3],[2,1],[1,-2],[0,-3],[-1,-2],[-2,-3],[1,-2],[2,-1],[3,-4],[4,-9],[1,-2],[2,-2],[2,-1],[2,-1],[2,-4],[1,-4]],[[6138,5059],[-1,0],[1,3],[3,4],[1,0],[0,-1],[0,-1],[0,-1],[-4,-4]],[[6163,5413],[-4,-10],[-4,-12],[-7,-23],[-6,-12],[-4,-8],[-1,-2],[0,-10],[0,-24],[0,-49],[1,-48],[0,-49],[0,-24],[0,-8],[3,-11],[4,-9],[5,-14],[3,-7],[0,-2],[0,-5]],[[6153,5086],[-4,-10],[-3,-4],[-5,-2],[-1,0],[-2,1],[-1,-2],[0,-4],[-1,1],[-1,1],[1,-6],[0,-4],[-1,-4],[-2,-4],[0,-3],[-5,-8],[-6,-1],[-4,-5],[-1,-3],[-2,-8],[1,-11],[-2,-9],[0,-4],[-4,-6],[-1,-5],[-1,-6],[-1,-2],[-2,-12],[-1,-8],[-1,-2],[0,-2],[-1,-5],[-1,-2],[-1,-2],[-4,-19],[-3,-9],[-2,1],[-2,-3],[0,-1]],[[6089,4914],[-1,0],[-2,3],[-4,7],[-5,6],[-4,7],[-4,6],[-4,6],[-5,7],[-4,6],[-4,6],[-3,4],[-1,2],[-1,5],[0,1],[-1,1],[-2,1],[0,2],[1,4],[1,5],[0,4],[0,4],[-1,6],[0,1],[-3,4],[-6,7],[-6,6],[-6,7],[-5,7],[-6,7],[-6,7],[-6,7],[-6,6],[-6,7],[-6,7],[-6,7],[-6,7],[-6,7],[-6,7],[-6,6],[-5,7],[-3,3],[-2,2],[-2,0]],[[5941,5126],[0,10],[1,25],[0,22],[0,11],[3,7],[1,5],[1,7],[1,6],[3,4],[1,3],[3,8],[2,10],[2,3],[2,3],[1,2],[2,2],[2,1],[0,2],[0,6],[0,2],[1,5],[2,3],[1,3],[1,2],[0,5],[0,3],[0,5],[0,12],[-2,9],[-1,11],[1,4],[-1,6],[-1,0],[-1,2],[-1,6],[-1,5],[0,1],[-4,5],[-2,12],[-2,2],[-1,11],[0,3],[1,12],[0,2],[-1,2],[-4,3],[-3,4],[1,2],[0,2],[-1,1],[-5,19]],[[5943,5427],[6,11],[5,12],[8,15],[6,13],[6,12],[5,10]],[[7045,7456],[-2,0],[-3,1],[-2,-1],[-2,-2],[-2,-2],[-4,-1],[-4,0],[-2,0],[-7,1],[-2,0],[-2,-1],[-4,-1],[-2,-4],[-1,-3],[0,-1],[-3,3],[-1,3],[-2,2],[-1,0],[-5,-4],[-1,0],[-1,2],[0,4],[0,3],[-2,1],[-3,0],[-1,2],[0,2],[0,2],[0,2],[-1,1],[-2,0],[-2,-2],[-2,-2],[-2,-1],[-2,0],[-2,-1],[-1,-5],[-6,-1],[-2,1],[-1,3],[-2,6],[-1,0],[-2,1],[-3,0],[-4,-3],[-1,2],[-1,1],[-1,-2],[-1,0],[-4,0],[-6,0],[-2,1],[-2,0],[-4,-2],[-2,0],[-3,-1],[0,8],[-2,6],[1,4],[1,5],[1,3],[1,-1],[2,-2],[1,0],[1,2],[-1,2],[0,2],[1,2],[1,2],[6,4],[6,2],[3,-1],[5,-4],[3,-2],[2,-1],[2,-6],[1,0],[1,1],[1,2],[1,5],[2,2],[6,4],[0,1],[0,1]],[[6970,7501],[1,1],[3,1],[6,1],[2,0],[2,-2],[2,-2],[2,0],[1,0],[1,0],[0,-2],[1,-1],[2,2],[2,2],[2,1],[1,1],[1,1],[1,3],[3,6],[2,1],[1,0],[0,-1],[0,-1],[3,-1],[1,1],[1,2],[-1,4],[0,1],[0,1],[0,1],[5,-3],[1,0],[2,2],[2,3],[1,2],[9,8],[1,1],[0,1],[-4,2],[-2,-1],[-2,0],[-1,1],[-4,1],[-1,1],[-4,5],[-2,2],[-2,2],[-2,0],[-2,-2],[0,1],[-1,2],[0,3],[0,3],[-1,1],[-2,-1],[-3,1],[-2,1],[-1,6],[-1,3],[0,3],[-1,1],[-2,1],[0,4],[0,1],[-1,1],[-1,-1],[-1,-2],[1,-4],[-1,-4],[0,-1],[-1,-2],[-2,0],[-2,2],[0,-12],[-1,-1],[-2,2],[-2,-1],[-3,1],[-3,2],[-2,1],[-2,1],[-3,2],[-1,8],[-1,3],[-1,1],[-5,-3],[-2,2],[-3,3],[-3,1],[0,1],[0,2],[7,9],[3,6],[2,3],[3,1],[2,1],[1,6],[1,1],[1,0],[3,2],[6,5],[0,2],[-1,1],[-2,2],[-2,2],[-2,-1],[-1,-1]],[[6963,7478],[0,1],[-1,0],[-2,1],[-2,1],[-1,0],[0,-1],[1,-2],[1,-2],[2,-1],[2,3]],[[6993,7485],[0,2],[-1,0],[-2,-1],[0,-1],[1,-2],[1,-1],[1,3]],[[6977,7482],[1,0],[-1,5],[1,4],[-3,0],[-1,1],[-2,4],[0,1],[-1,-2],[-1,-2],[1,-3],[1,-2],[1,-1],[0,-1],[-1,-4],[1,-1],[3,0],[1,1]],[[7869,5801],[-1,-2],[-1,5],[0,1],[2,-4]],[[7862,5834],[-1,-1],[-1,1],[0,3],[1,2],[0,1],[1,-6]],[[7900,5783],[-5,8],[-9,3],[-1,3],[0,1],[-1,-5],[-5,-4],[-2,3],[-2,3],[0,3],[2,3],[2,2],[1,8],[-1,10],[-2,3],[-2,2],[-2,-4],[-1,-6],[-2,-3],[-2,-1],[-3,0],[-2,10],[0,8],[0,9],[1,5],[-3,7],[-1,7],[-1,4],[-1,-2],[0,-2]],[[7858,5858],[0,2],[-5,20],[-1,10],[1,7],[1,3],[-2,3],[-2,5],[-4,6],[0,9],[-1,10],[-1,4],[-1,7],[-1,5],[-1,15],[1,1],[2,0],[4,1],[0,3],[0,2],[2,3],[3,7],[2,8],[2,4],[1,5],[3,7],[5,4],[3,1],[3,2],[4,2],[1,0],[4,-2],[2,-1],[2,0],[3,0],[2,0],[4,2],[6,-2],[4,2],[6,2],[3,-2],[2,-2],[0,-4],[1,-2],[1,-2],[1,0],[1,3],[2,4]],[[7921,6010],[0,-1],[1,-4],[1,-3],[1,-3],[2,-3],[1,0],[4,3],[5,-4],[1,-2],[2,-4],[2,-3],[5,0],[1,7],[-1,4],[-2,8],[-1,5],[1,1],[4,1],[1,1],[1,5],[1,-1],[3,-1],[2,4],[2,3],[0,-1],[1,-3],[1,-1],[2,-2],[2,-3],[1,-4],[1,-1],[3,1],[1,0],[1,4],[1,2],[1,-1],[1,0],[3,5],[2,4],[1,1],[2,-2],[1,1],[1,5],[2,3]],[[7986,6031],[0,-3],[-1,-6],[-1,-6],[-2,-5],[-1,-3],[0,-11],[0,-3],[0,-3],[1,-1],[2,-10],[2,-10],[2,-7],[0,-5],[-1,-12],[-2,-12],[0,-5],[1,-6],[1,-7],[0,-10],[-1,-6],[-1,-4],[-1,-4],[-2,-2],[-1,3],[-2,1],[-2,-2],[-1,-1],[-3,-6],[-3,-6],[-5,-1],[-2,-4],[-2,-1],[-3,0],[-3,-1],[0,-2],[0,-10],[0,-2],[0,-1],[-2,0],[-3,1],[-3,3],[-3,0],[-2,-4],[0,-2],[-1,0],[-1,-1],[-1,-2],[0,-2],[1,-5],[0,-6],[0,-5],[1,-3],[5,-9],[2,-2],[0,-2],[-1,-5],[1,-7],[-2,0],[-3,3],[-1,2],[-2,-2],[0,1],[-2,3],[-1,4],[-2,0],[-3,-1],[-4,-1],[-1,0],[0,-1],[-2,-6],[-1,1],[-4,2],[-3,1],[-1,-1],[1,-5],[1,-4],[-1,-2],[-2,-2],[-2,-4],[-1,-3],[-1,-1],[-4,0],[-3,0],[-2,-4],[-1,-2],[-1,-1]],[[784,4525],[0,-1],[-1,0],[0,1],[0,2],[0,1],[1,-2],[0,-1]],[[670,4860],[0,-1],[-1,0],[0,1],[0,1],[1,0],[0,-1]],[[152,4915],[1,-1],[0,-1],[-1,1],[0,1],[0,1],[0,-1]],[[216,4924],[1,0],[0,-1],[-1,0],[0,1],[0,1],[1,0],[-1,-1]],[[244,4927],[-1,-1],[0,1],[0,1],[1,-1]],[[696,4948],[-1,0],[0,1],[-1,1],[0,1],[1,0],[1,1],[0,-1],[0,-1],[0,-2]],[[248,5003],[-1,0],[0,1],[1,0],[0,-1]],[[231,5024],[1,-1],[0,-1],[1,-2],[0,-1],[-1,0],[-1,1],[0,1],[1,-1],[0,1],[0,2],[-1,0],[0,1],[-1,0],[0,1],[1,-1]],[[9854,5114],[0,-3],[-1,0],[0,2],[0,3],[-1,3],[1,-1],[1,-3],[0,-1]],[[9709,5133],[-1,1],[0,1],[1,-1],[0,-1]],[[9846,5138],[0,-2],[-1,1],[1,2],[-1,8],[-1,1],[-1,2],[2,-2],[1,-1],[0,-5],[0,-4]],[[9805,5242],[2,-2],[0,-2],[-1,-1],[-2,-5],[2,4],[0,3],[-1,2],[-1,2],[1,0],[0,-1]],[[9806,5261],[-1,0],[0,1],[4,1],[0,1],[0,-1],[0,-1],[-1,0],[-2,-1]],[[9805,5283],[-1,-1],[1,1],[0,1],[0,4],[1,0],[0,-2],[0,-2],[-1,-1]],[[9805,5290],[0,-1],[-1,3],[-1,3],[0,1],[0,-1],[1,-1],[0,-1],[1,-3]],[[629,5291],[5,-7],[-2,0],[-5,3],[-4,6],[1,2],[1,-3],[2,-2],[1,5],[1,1],[-4,5],[2,-1],[3,-3],[-1,-6]],[[9800,5360],[-2,-3],[0,1],[0,1],[2,2],[1,0],[0,-1],[-1,0]],[[9804,5364],[-2,-2],[-1,0],[3,3],[0,-1]],[[574,5410],[2,-5],[0,-3],[-2,1],[-1,1],[2,0],[0,1],[-1,1],[-1,1],[0,-2],[-1,2],[0,1],[1,1],[1,1]],[[3263,6170],[-2,-1],[-1,1],[0,4],[1,1],[2,-2],[0,-3]],[[3260,6177],[-1,-1],[-1,3],[-2,1],[-2,3],[0,1],[0,1],[1,1],[3,-3],[1,-3],[1,-2],[0,-1]],[[8508,7097],[-1,-1],[-1,1],[0,1],[-2,3],[0,2],[1,3],[4,5],[9,5],[2,0],[4,-2],[1,-4],[-1,-3],[-1,-3],[-4,-4],[-4,-2],[-7,-1]],[[8520,7162],[1,-3],[-3,1],[-1,2],[0,3],[2,0],[1,-3]],[[8506,7163],[-2,0],[-1,2],[-1,0],[1,3],[2,5],[1,2],[3,-1],[1,-3],[-2,-4],[-2,-4]],[[8549,7178],[0,-2],[-2,2],[2,3],[0,-3]],[[8504,7184],[0,-1],[-2,0],[-1,4],[0,3],[-2,2],[2,3],[3,-5],[0,-6]],[[8557,7189],[-1,-6],[-2,0],[-1,3],[-1,-1],[-1,-1],[-1,5],[0,4],[2,2],[2,-1],[2,-1],[1,-4]],[[8575,7188],[-2,-3],[-4,4],[-1,3],[3,4],[2,4],[2,1],[0,-13]],[[8511,7286],[-1,-4],[-1,2],[-1,9],[2,-3],[1,-4]],[[8636,7343],[-2,-2],[-1,2],[0,1],[1,2],[1,1],[1,-2],[0,-2]],[[8514,7357],[-1,-7],[-1,0],[-1,1],[-1,1],[-1,7],[2,3],[2,-2],[1,-3]],[[8565,7408],[7,-25],[6,-17],[6,-12],[8,-23],[2,-13],[0,-7],[2,-11],[-1,-6],[0,-10],[-1,-4],[-1,-4],[0,-7],[1,-4],[0,-5],[0,-2],[1,0],[2,2],[1,0],[0,-6],[-2,-15],[-2,-11],[-2,-9],[-4,-9],[-3,-3],[-3,-1],[-5,-1],[-4,2],[-4,-1],[-2,-2],[-1,-3],[1,-5],[0,-4],[-2,1],[-3,2],[-3,0],[-2,1],[-1,5],[-2,0],[-3,-3],[-4,-1],[-2,-1],[0,-3],[0,-2],[3,-4],[-1,-3],[-3,-2],[-1,4],[-2,5],[-1,0],[-2,-1],[0,-5],[1,-3],[1,-4],[-2,-4],[0,-3],[-2,-2],[-4,5],[0,3],[2,3],[0,4],[0,2],[-6,-9],[-4,-10],[-2,1],[-1,3],[-1,1],[-4,-7],[-1,-5],[-1,0],[-1,2],[0,5],[0,4],[-5,5],[-1,5],[1,3],[3,-2],[3,0],[-1,3],[-1,1],[2,1],[2,3],[-2,0],[-2,-1],[-1,1],[-1,6],[-2,6],[-1,7],[2,3],[1,6],[2,8],[1,3],[2,2],[1,2],[-1,1],[-2,1],[0,2],[1,1],[2,3],[3,3],[1,6],[-1,1],[-2,2],[1,3],[0,2],[0,2],[-2,3],[-2,4],[1,4],[-1,6],[0,5],[0,3],[-1,6],[0,6],[-2,-1],[-1,-1],[-4,2],[-2,0],[0,5],[1,6],[4,5],[2,0],[2,2],[2,1],[3,-3],[3,-1],[1,-6],[1,-1],[1,2],[2,3],[0,1],[0,2],[-3,1],[-2,7],[0,3],[-1,2],[1,6],[-3,7],[-1,2],[0,6],[-1,4],[-1,2],[0,3],[0,2],[1,0],[1,2]],[[8517,7360],[1,1],[0,2],[0,5],[2,3],[4,8],[1,4],[2,3],[2,3],[3,1],[3,1],[7,-1],[1,1],[5,0],[1,-1],[3,0],[4,0],[2,1],[1,2],[2,4],[1,6],[2,5],[1,0]],[[5598,7617],[-4,-1],[-2,-2],[-1,-4],[0,-1],[-1,0],[-1,1],[-2,3],[-3,0],[-7,-6],[-1,-3],[0,-7],[-1,-1],[-1,-1],[-3,0],[0,1]],[[5557,7634],[0,1],[0,4],[0,3],[-1,3],[1,2],[2,0],[1,-1],[1,3],[4,2]],[[5565,7651],[3,1],[1,2],[-1,2],[0,2],[4,5],[1,2],[0,1],[0,2],[-1,3],[0,1],[2,2],[2,1],[1,1],[1,-2],[0,-1],[0,-2],[2,-2],[2,-2],[2,-1],[2,-3],[3,-5],[0,-2],[3,-3],[2,-2],[0,-5],[7,-4],[2,0],[1,0],[0,-2],[-1,-3],[-3,-10],[0,-2],[-2,-2],[-1,-1],[1,-3],[0,-2]],[[6340,6890],[-1,-1],[-1,0],[-1,3],[-2,8],[1,3],[0,1],[0,1],[1,1],[0,3],[1,2],[1,-3],[3,-9],[0,-3],[0,-2],[-2,-4]],[[6345,6828],[-5,0],[-6,0],[-5,-1],[-5,0],[-3,6],[-1,6],[-1,6],[-2,9],[-8,2],[-5,1],[-7,1],[-5,2]],[[6332,6911],[0,-2],[1,-7],[2,-7],[1,-5],[1,-3],[-2,1],[-1,1],[-2,1],[-4,-8],[-3,-4],[0,-1],[3,-2],[3,0],[2,1],[1,-1],[1,-5],[0,-4],[3,-13],[2,-5],[2,-7],[1,-5],[1,-3],[1,-5]],[[7836,6473],[2,-6],[3,-6],[4,-8],[1,-4],[3,-4],[0,-3],[1,-4],[0,-4],[1,-2],[1,0],[1,0],[1,2],[1,5],[0,1],[1,-4],[1,-1],[1,-1],[1,-1],[0,-4],[0,-3],[-1,-3],[-1,-4],[0,-6],[-1,-4],[1,-4],[6,-18],[3,-3],[7,-3],[3,-3],[2,-2],[2,1],[2,5],[3,3],[5,5],[1,0],[3,-2],[4,-5],[3,-5],[2,-3],[1,-2],[0,-3],[-1,-2],[-2,-2],[-2,-2],[-1,-3],[1,-1],[3,0],[3,-3],[1,-2],[0,-3],[1,-3],[1,-1],[3,0],[1,-1],[1,-1],[1,-5],[0,-4],[-2,-4],[-1,-3],[-1,-4],[-1,-4],[-5,-8],[-1,-1],[-8,5],[-3,-1],[-2,0],[-1,0],[-1,-2],[2,-4],[0,-5],[-1,-4],[-3,-3],[-1,-1],[0,-2],[1,-2],[2,-3],[3,-2],[9,-12],[2,-3],[3,-4],[3,-3],[8,-4],[3,-3],[1,-2],[0,-2],[-1,-2],[-1,-5],[0,-3],[1,-2],[1,-4],[3,-6],[2,-3]],[[7925,6231],[2,0],[2,-2]],[[7929,6229],[1,-4],[2,-5],[0,-4],[1,-5],[2,-6],[3,-5],[3,-7],[2,-4],[1,-2],[7,-12],[2,-4],[2,-8],[2,-1],[1,-2],[0,-4],[0,-3],[1,-10],[1,-3],[1,-4],[1,-2],[1,-2],[1,-1],[2,3],[1,2],[0,-1],[1,-7],[2,-2],[1,-3],[2,-2],[4,-8],[3,-3],[1,-1],[1,-1],[1,-3],[-1,-2],[-1,-2],[-4,-5],[-1,-2],[1,-3],[1,-4],[1,-4],[2,-3],[3,-5],[3,-5],[2,-4],[1,-4],[-1,-3],[-1,-4],[-1,-4],[-2,-2],[0,-2],[0,-4],[1,-3],[0,-3],[0,-6]],[[7921,6010],[2,1],[2,3],[3,3],[1,4],[1,3],[0,4],[0,11],[1,5],[0,6],[-1,5],[0,8],[0,3],[0,3],[2,3],[1,4],[1,6],[0,4],[-1,2],[-1,2],[-3,3],[-2,3],[-1,3],[0,3],[1,3],[-2,3],[-5,3],[-3,4],[0,4],[-3,6],[-3,7],[-2,11],[0,13],[0,11],[2,13],[-2,10],[-3,4],[-3,4],[-3,5],[-3,7],[-3,10],[-5,13],[-2,6],[-2,-1],[-3,1],[-4,4],[-4,2],[-3,0],[-3,-1],[-1,-2],[0,-2],[1,-2],[0,-1],[-2,-1],[-2,-3],[-1,-4],[-1,-7],[-2,-2],[-2,-1],[-3,-2],[-3,-3],[-1,-2],[0,-2],[-1,1],[-1,2],[0,3],[-1,3],[-3,1],[-3,3],[-3,6],[-2,3],[-2,1],[-1,-3],[-3,-5],[-2,-2],[-1,1],[-2,-2],[-1,-4],[-1,-4],[-4,-4],[-4,-6],[-3,-5],[-4,-7],[-1,-1],[-2,1],[-2,2],[-2,3],[3,12],[3,14],[1,6],[0,4],[0,4],[-2,4],[-1,3],[0,2],[0,2],[2,3],[1,5],[2,10],[2,11],[0,6],[-2,7],[-1,7],[1,9],[0,4],[-2,2],[-5,1],[-2,0],[-1,-1],[-2,-3],[-1,-1],[-4,-1],[-3,3],[-2,5],[-1,7],[2,7],[1,7],[1,5],[0,2],[-1,3],[-2,4],[-2,5],[-1,3],[-2,0],[-1,-3],[-1,-4],[-1,-1],[-1,1],[0,3]],[[7780,6354],[1,3],[1,13],[2,8],[2,4],[2,1],[3,0],[2,0],[1,2],[0,1],[-2,1],[0,2],[0,4],[1,3],[1,1],[1,4],[2,7],[1,3],[2,0],[3,3],[4,6],[2,6]],[[5975,7089],[1,5],[1,5],[2,8],[2,7],[5,21],[3,9],[1,12],[4,11],[3,4],[2,3],[0,4]],[[5999,7178],[5,0],[3,1],[1,2],[2,-1],[1,-3],[-1,-2],[-2,-3],[1,-1],[1,0],[2,-2],[1,-2],[3,-12],[-2,-5],[-2,-5],[-1,0],[-2,-2],[-1,-3],[-1,-2],[0,-2],[2,-2],[1,-1],[-1,-1],[-2,1],[-2,0],[-1,0],[-2,-1],[-2,-2],[-1,-2],[0,-1],[-1,-4],[1,-3],[1,-1],[0,-1],[0,-1],[-1,-2],[-2,-2],[0,-2],[-1,-2]],[[4790,5434],[-3,1],[-10,8],[-7,5],[-24,27],[-7,11],[-8,16],[-17,32],[-4,5],[-5,3],[-3,2],[-2,3],[-2,9],[-4,5],[-8,8],[-6,13]],[[4680,5582],[1,2],[3,8],[3,8],[2,5],[3,5],[2,4],[3,4],[6,11],[1,2],[1,8],[1,10],[1,3],[4,2],[1,1],[1,7],[1,9],[0,2]],[[5693,6451],[0,-29],[0,-29],[0,-28],[0,-29],[-7,0],[-7,0],[-7,0],[-6,0],[0,-8],[0,-7],[0,-7],[0,-7]],[[5666,6307],[-14,13],[-13,14],[-13,14],[-14,13],[-13,14],[-13,14],[-14,13],[-13,14],[-13,13],[-14,14],[-13,14],[-13,13],[-13,14],[-14,14],[-13,13],[-13,14],[-10,9],[-9,-9],[-8,-7],[-10,-10]],[[5416,6508],[-12,-12],[-9,-9],[-1,0],[-9,16],[-8,12],[-3,4],[-14,6],[-14,7],[-14,6]],[[5264,6925],[3,3],[5,3],[2,3],[1,2],[4,9],[2,5],[2,7],[1,5],[0,4],[0,5],[-2,13],[-2,12],[2,5],[1,2],[2,6],[1,1],[4,2],[2,4],[2,4],[0,3],[2,3],[3,2],[1,4],[5,5],[5,5],[5,5],[4,4],[1,3],[0,3],[-2,7],[0,8],[0,7],[0,4],[1,11],[0,1]],[[5319,7095],[4,-4],[5,-1],[13,-14],[4,-1],[9,-2],[10,6],[4,1],[7,-6],[4,-1],[5,0],[9,-5],[2,-2],[5,-7],[3,-3],[18,-7],[3,-4],[2,-9],[0,-11],[2,-8],[2,-10],[3,-7],[3,-6],[3,-4],[8,-5],[9,-3],[10,0],[15,-8],[14,-9],[3,-4],[7,-4],[13,-21],[7,-8],[6,-1],[4,1],[9,8],[3,4],[8,18],[3,9],[1,7],[0,7],[-1,6],[-2,6],[-2,8],[-1,15],[1,11],[2,6],[2,7],[7,12],[7,8],[13,12],[7,0],[3,1],[5,8],[3,0],[3,-2],[10,1],[4,-2],[5,-5],[7,-3],[4,-3],[5,-4],[1,-10],[-1,-3],[0,-4],[5,-7],[14,-3],[3,-2],[4,-5],[3,-2],[9,0],[6,1],[6,-2],[2,-2],[2,-4],[2,-10],[1,-3]],[[3308,5980],[-1,-6],[-3,4],[-1,4],[0,3],[2,6],[2,3],[1,2],[0,-5],[0,-11]],[[7218,5705],[1,-4],[-2,3],[-2,2],[-1,2],[4,-2],[0,-1]],[[7221,5739],[-2,-1],[-1,4],[-1,1],[1,1],[0,1],[1,-4],[2,-2]],[[7221,5749],[3,0],[3,0],[2,-1],[3,-9],[9,-16],[5,-16],[1,-3],[0,-3],[2,-1],[1,-2],[5,-15],[0,-3],[0,-4],[1,-2],[1,-2],[2,0],[1,-3],[1,-12],[0,-4],[0,-2],[7,-19],[0,-2],[0,-2],[0,-2],[1,-3],[2,-9],[1,-2],[2,-8],[0,-16],[-1,-7],[-1,-8],[-1,-8],[-2,-6],[-2,-5],[-7,-11],[-2,-2],[-10,-7],[-6,-6],[-7,-2],[-6,4],[-5,8],[-2,12],[-2,13],[-2,14],[-2,44],[-1,12],[-2,15],[1,7],[1,7],[0,-15],[0,-1],[1,1],[1,15],[0,6],[3,16],[0,3],[0,6],[0,3],[3,12],[1,6],[1,7],[0,7],[-1,7],[3,-2],[2,-2],[1,-2],[2,1],[1,0],[-1,4],[-3,3],[-6,3],[-2,2],[-1,3],[1,3],[0,1]],[[5798,3450],[-3,-1],[0,-1],[-2,1],[-2,-1],[-2,0],[-1,-1],[-2,-4],[-4,-11],[-1,-2],[0,-4],[-1,-4],[-1,-2],[-1,-1],[-4,1],[-4,1],[-2,4],[-2,4],[-1,3],[-2,2],[0,1],[-2,1],[0,1],[-1,1],[0,2],[-1,2],[0,5],[-1,3],[-2,5],[-1,4],[-2,6],[-1,5],[-1,5],[0,2],[1,2],[3,3],[3,2],[1,3],[2,6],[1,3],[1,2],[1,2],[2,5],[2,6],[2,6],[2,2],[4,2],[4,5],[4,5],[6,5],[3,1],[2,1],[0,-1],[1,-3],[1,-3],[3,-4],[1,-1],[3,-6],[3,-4],[3,-5],[2,-2],[1,-1],[1,-4],[1,-3],[1,-3],[0,-3],[-1,-7],[-2,-7],[-1,-3],[-2,-2],[-1,-3],[-1,-6],[0,-6],[-2,-3],[-2,-2],[-2,-2],[-4,-4]],[[5582,8368],[-2,0]],[[5580,8368],[3,7],[1,4],[1,6],[1,2],[0,-3],[0,-4],[-2,-8],[-2,-4]],[[5652,8291],[0,1],[0,2],[0,5],[-1,3],[-2,4],[-3,2],[-3,2],[-2,1],[-1,1],[-1,1],[0,1],[-1,1],[-3,2],[-2,0],[-1,-2]],[[5632,8315],[-1,2],[-2,6],[1,4],[0,4],[4,11],[-1,2],[-2,4],[-3,2],[-2,5],[-6,0],[-6,0],[-1,0],[-6,3],[-5,3],[-4,2],[-3,2],[-1,3],[-3,-1],[-2,0]],[[5589,8367],[-1,5],[1,6],[-1,9],[-4,12],[0,12],[0,2]],[[5584,8413],[8,7],[9,7],[2,1],[9,4],[1,1],[8,-1],[6,-1],[5,0],[3,1],[2,-1],[3,-3],[2,0],[2,2],[11,-1],[3,0],[3,-1],[5,-2],[3,-1],[7,1],[3,0],[2,0],[5,5],[2,1],[1,1],[2,-1],[1,-4],[4,-7],[4,-1],[10,-3],[2,-2],[6,-6],[4,-3],[2,-3],[3,-5],[2,-3],[4,-3],[4,-2],[1,0]],[[5759,8497],[3,0],[2,-1],[0,-4],[4,-4],[4,-3],[0,-1],[1,-3],[-1,-3],[0,-1],[-1,-2],[-2,-5],[0,-4],[-2,-8],[1,0],[4,1],[1,-1],[1,-1],[0,-5],[2,-2],[1,-4],[0,-2],[3,-3],[0,-2],[2,-7],[1,-5],[0,-3],[-1,-4],[-1,-2]],[[5584,8413],[-1,11],[1,22],[1,11],[5,6],[3,5],[1,6],[0,6],[2,5],[7,15],[6,1],[8,4],[9,4],[2,-5],[1,-3],[10,-12],[3,-3],[4,-14],[10,-7],[8,2],[4,4],[6,6],[3,4],[0,5],[-1,18],[-2,8],[1,5]],[[8153,6465],[0,-1],[-1,-1],[0,-1],[-1,0]],[[3249,6225],[-3,0]],[[3246,6225],[0,1],[2,1],[1,0],[0,-2]],[[4758,6777],[-3,0],[0,-3],[1,-4],[0,-5],[-1,-2],[0,-3],[0,-3],[1,-4],[0,-3],[0,-2],[-1,-2],[-2,-1],[-4,-1],[-2,0],[-3,1],[-2,0],[-2,0],[-2,-1],[-2,-2],[-2,-4],[-3,-4],[-2,-3],[-2,-1],[-2,0],[-3,3],[-1,1],[-1,0],[-2,-2],[-2,-1],[-1,0],[-3,2],[-4,4],[-2,1],[-2,1],[-3,1],[-2,0],[-3,0],[-3,-3],[-3,-1],[-3,-2],[-4,-2],[1,-5],[1,-3],[0,-3],[0,-3],[-2,-3],[-2,-4],[-1,-3],[-1,-4],[-1,-2],[-2,-4],[-1,-4],[0,-3],[-1,-4],[-1,-1],[-3,-1],[-3,-1],[-2,-1],[0,-2],[-1,-4],[0,-3],[-1,-2],[0,-6],[-2,-5],[0,-7],[-1,-6],[-1,-9],[-1,-9],[-2,-8],[-1,-5],[-1,-3],[-2,-3],[-1,-3],[-2,-3],[-3,-3],[-3,-3],[-2,-3],[-1,-1],[-1,-2],[-2,-4],[-2,-6],[-1,-4],[-2,-8],[-1,-4],[-1,-2],[-2,-2],[-3,-2],[-3,-2],[-2,-3],[-3,-2],[-2,-2],[-1,-4],[-1,-4],[-2,-5],[-1,-7],[0,-4],[-2,-14],[-1,-8],[0,-5],[-1,-6],[-1,-10],[0,-8],[0,-5],[0,-3],[-2,-4],[-1,-3],[-2,-4],[-2,-2],[0,-3],[-2,-3],[-1,-4],[-2,-3],[0,-2],[1,-4],[-1,-4],[-1,-5],[-2,-6],[-3,-3],[-3,0],[-5,0],[-4,0],[-5,0],[-4,1],[-4,2],[-5,0],[-3,0],[-4,-1],[-11,0],[-4,-1],[-6,-2],[-2,0]],[[4527,6418],[2,27],[4,15],[3,7],[5,3],[4,15],[2,14],[2,6],[1,5],[-1,4],[3,8],[3,11],[2,7],[3,12],[1,2],[0,3],[-2,-2],[-1,-5],[-2,-3],[0,4],[2,6],[3,6],[6,7],[11,24],[4,4],[4,10],[1,8],[0,20],[2,11],[2,8],[3,15],[2,7],[2,14],[1,5],[3,2],[4,7],[6,5],[7,8],[3,6],[3,8],[2,15],[4,17],[3,13],[3,6],[3,9],[4,3],[9,2],[14,7],[12,10],[3,5],[4,8],[6,11],[11,13],[5,7],[8,18],[5,15],[5,10],[3,8],[2,9],[1,14],[-1,6],[-3,8],[-2,3],[-1,4],[1,8],[0,12],[1,21],[4,16],[9,22],[2,9],[1,14],[0,5],[11,20],[7,15],[2,4],[6,7],[20,15],[12,11],[7,8],[4,10],[11,37],[11,52],[1,6],[5,2],[3,0],[3,2],[4,4],[3,-1],[-2,-3],[0,-6],[3,-8],[4,-8],[7,-11],[6,-4],[8,-3],[10,5],[5,0],[3,2],[3,-3],[5,-1],[5,2],[4,4],[3,5],[0,-2],[0,-3],[1,-2],[2,-6],[1,-3],[3,1],[2,-2],[6,1],[6,-1]],[[5206,7704],[-2,-1]],[[5783,7802],[-1,3],[-2,4],[-1,1],[1,1],[1,1],[1,1],[0,4],[-1,4],[-1,2],[0,4],[0,5],[1,9],[2,12],[1,6],[-1,4],[1,7],[-1,4],[-2,5],[-2,11],[-3,3],[-3,5],[-1,3],[-1,3],[-2,3],[-3,4],[-2,7],[-2,4],[0,1],[-3,5],[-2,4],[-1,4],[0,3],[-2,7],[-2,5],[-2,4],[-1,2],[-2,4],[-3,2],[-3,1],[-2,-1]],[[5739,7963],[0,2],[6,6],[2,-1],[3,0],[6,0],[3,3],[2,-1],[1,2],[3,2],[0,-1],[4,-1],[3,-2],[2,-2],[2,-2],[2,-1],[1,-1],[1,-3],[2,-1],[3,0],[2,-1],[-1,-3],[1,-1],[1,1],[1,-1],[0,-2],[1,-1],[2,3],[2,0],[5,-2],[2,-7],[2,-2],[1,-1],[2,1],[2,1],[0,-1],[2,-4],[1,-6],[0,-3],[-1,-4],[-1,-5],[-1,-3],[1,-2],[0,-2],[2,0],[3,-4],[2,-3],[2,-2],[1,0],[1,-1],[0,-2],[0,-3],[-1,-4],[0,-2],[2,-2],[0,-3],[0,-2],[1,-2],[3,-3],[4,-3],[1,-3],[1,-3],[0,-6],[0,-5],[5,-6],[0,-2],[-1,-1],[-6,-1],[-1,0],[-2,5],[-1,0],[-2,-2],[-1,-1],[-2,1],[-1,1],[-1,1],[-1,1],[-1,-2],[-2,1],[-1,1],[-1,-4],[-1,-1],[0,7],[-1,2],[-1,0],[-3,-2],[-2,-2],[-1,-2],[0,-4],[0,-4],[2,-7],[-1,-2],[0,-5],[-3,-4],[-3,-2],[-1,-5],[-1,-4],[-3,-3],[-2,-4],[0,-3],[0,-2],[0,-2],[0,-1],[-1,-1],[-4,-1],[-1,0],[-2,-2]],[[6386,4210],[-3,-10],[1,8],[4,13],[1,1],[-3,-12]],[[6342,4414],[0,-2],[-3,1],[-1,7],[2,0],[0,3],[1,1],[1,-7],[0,-3]],[[6375,4468],[2,-6],[1,-6],[5,-14],[2,-5],[2,-6],[0,-12],[3,-17],[3,-27],[1,-27],[1,-13],[2,-12],[4,-12],[1,-13],[-3,-14],[-3,-14],[0,-2],[-2,-3],[-1,0],[-2,3],[-2,6],[-3,13],[-1,6],[-1,2],[-3,-1],[-2,-4],[0,-3],[0,-7],[1,-7],[0,-7],[0,-8],[1,-3],[1,-2],[2,-6],[0,-13],[-1,-7],[-2,-5],[0,-3],[1,-4],[-1,-2],[-3,-2],[-1,-2],[-2,-6],[-2,-12],[0,-6],[1,-19],[0,-13],[-3,-25],[-2,-12],[-3,-15],[-4,-18],[-4,-24],[-3,-24],[-3,-15],[-2,-15],[-4,-25],[-4,-26],[-4,-28],[-7,-32],[-1,-4],[-1,-16],[-2,-14],[-2,-14],[-3,-23],[-1,-8],[-1,-6],[-3,-15],[-2,-5],[-1,-6],[0,-7],[-1,-7],[-3,-13],[-4,-11],[-3,-4],[-6,-6],[-3,-1],[-6,0],[-6,-3],[-7,-7],[-6,-7],[-3,-4],[-3,-2],[-8,0],[-2,2],[-9,12],[-3,2],[-6,1],[-2,1],[-2,2],[-2,6],[-5,5],[-1,2],[-1,4],[-1,4],[-1,4],[-1,9],[-2,5],[-4,11],[-1,3],[0,11],[0,8],[0,13],[0,7],[2,6],[-1,6],[-1,6],[-1,7],[-1,6],[-5,12],[-1,5],[-1,6],[-2,18],[0,6],[0,13],[1,7],[1,4],[0,4],[1,3],[1,2],[1,3],[2,17],[2,3],[3,3],[3,4],[2,6],[1,12],[4,12],[2,6],[3,10],[3,13],[1,7],[1,6],[1,15],[0,7],[0,7],[-2,7],[-4,13],[0,3],[0,9],[0,7],[-1,7],[-2,7],[-2,12],[-1,21],[0,7],[-1,7],[-1,6],[1,11],[12,40],[1,4],[-1,13],[0,7],[1,2],[1,2],[2,0],[10,2],[1,1],[3,4],[3,6],[2,2],[1,-1],[1,-2],[1,-2],[4,3],[1,0],[2,0],[1,2],[0,4],[1,3],[1,1],[5,1],[3,1],[5,2],[4,-9],[1,-1],[1,0],[1,1],[-2,5],[-1,3],[0,3],[2,6],[2,5],[6,8],[6,9],[1,0],[2,-1],[1,-11],[0,-1],[1,0],[1,1],[1,4],[0,3],[-1,4],[0,3],[0,2],[2,6],[3,6],[1,7],[1,3],[2,4],[1,-1],[0,-3],[1,-3],[-1,-3],[-1,-3],[0,-4],[1,-1],[2,1],[1,8],[3,7],[1,3],[1,3],[3,-1],[3,-1],[-5,7],[-1,10],[5,18],[1,3],[0,1],[1,2],[-3,6],[-1,3],[1,4],[1,4],[1,3],[2,1],[1,-2],[3,-5],[2,0],[2,4],[2,6],[3,4],[3,2],[5,10],[3,19],[0,5],[0,7],[-2,6],[-1,8],[0,2],[3,-1],[1,1],[2,7],[5,14],[2,0],[1,-3],[1,-3],[1,-3],[3,-6],[1,-5]],[[7039,5370],[-1,0],[0,1],[0,1],[0,1],[1,0],[0,-1],[0,-1],[0,-1]],[[7041,5424],[0,-1],[-1,0],[0,1],[0,1],[1,1],[0,2],[1,0],[0,-1],[0,-1],[-1,-1],[0,-1]],[[2453,6260],[-3,-2],[-1,2],[7,5],[1,0],[0,-1],[-3,-2],[-1,-2]],[[1919,6263],[-2,-1],[-2,4],[0,2],[2,2],[1,-3],[1,-4]],[[2585,6353],[-2,-2],[0,7],[1,6],[1,4],[3,0],[2,1],[0,-1],[-2,-5],[-3,-10]],[[2591,6407],[1,-3],[-1,1],[-1,2],[0,2],[1,0],[0,-2]],[[2041,6429],[0,-5],[-3,2],[0,3],[0,5],[1,0],[1,-2],[1,-1],[0,-2]],[[1950,6575],[-1,0],[-1,3],[-1,7],[0,1],[3,-9],[0,-1],[0,-1]],[[1897,6589],[0,-3],[-9,11],[2,1],[3,-1],[4,-8]],[[1928,6624],[1,-6],[-1,0],[-2,4],[-1,4],[0,2],[0,1],[3,-3],[0,-2]],[[1887,6598],[0,-1],[-3,7],[0,4],[-1,2],[-3,2],[3,9],[1,19],[1,-3],[-2,-20],[0,-2],[1,-3],[1,-4],[0,-4],[2,-4],[0,-2]],[[1914,6683],[0,-3],[-1,1],[-2,-8],[-1,-1],[1,12],[2,1],[1,1],[0,-3]],[[1801,6801],[-1,-2],[-4,4],[2,6],[0,7],[1,2],[1,-3],[1,-9],[0,-5]],[[1715,6851],[-1,-2],[-3,12],[0,3],[1,1],[1,0],[0,-3],[2,-3],[0,-2],[0,-6]],[[1883,6854],[-2,-13],[-2,0],[-5,4],[0,3],[2,16],[1,2],[4,2],[0,-2],[1,-5],[1,-7]],[[1857,6857],[-1,-1],[-2,4],[-7,12],[-2,6],[-1,3],[1,6],[2,-1],[2,-4],[1,-4],[1,-4],[4,-2],[1,-10],[1,-5]],[[1814,7010],[-1,0],[-2,2],[0,3],[1,0],[1,-2],[1,-2],[0,-1]],[[2301,6679],[0,-12],[-2,-10],[-5,-20],[-3,-12],[-4,-36],[-2,-24],[0,-11],[0,-2],[0,-1],[-1,-25],[1,-21],[-1,-3],[-1,-6],[-1,-9],[0,-4],[0,-3],[2,-13],[0,-10],[5,-17],[3,-6],[3,-5],[2,-3],[-1,-7],[-1,-4],[-1,-6],[-1,5],[1,6],[1,4],[0,2],[-2,3],[-4,8],[-5,16],[4,-25],[1,-4],[1,-1],[1,-2],[0,-3],[0,-2],[4,-17],[5,-17],[0,-5],[2,-6],[11,-24],[7,-19],[3,-17],[1,-6],[1,-7],[5,-8],[1,-6],[3,-3],[2,-9],[3,-5],[-1,0],[-3,3],[0,-2],[3,-4],[5,-4],[2,0],[-2,2],[-2,3],[1,0],[3,-3],[11,-1],[4,-8],[6,-3],[4,-9],[3,-10],[3,-1],[2,0],[5,2],[9,6],[3,3],[6,4],[9,1],[3,-1],[7,3],[3,3],[1,3],[0,2],[7,3],[1,0],[6,1],[3,1],[4,1],[3,-5],[0,-2],[-2,-2],[1,-2],[3,-3],[5,-2],[2,1],[3,5],[4,5],[0,5],[-1,3],[-1,0],[0,2],[1,4],[-1,1],[-2,-3],[-1,0],[0,1],[1,2],[8,8],[2,4],[3,3],[6,11],[2,22],[1,4],[4,7],[0,2],[0,4],[0,12],[0,9],[0,10],[1,9],[1,2],[2,15],[5,6],[8,8],[2,1],[26,8],[4,2],[4,5],[3,2],[6,0],[2,1],[1,0],[0,1],[1,1],[3,-1],[7,-3],[2,-1],[6,-3],[6,-2],[1,1],[1,1],[1,2],[-1,2],[-1,0],[-1,-1],[-1,0],[-3,1],[1,1],[2,0],[2,1],[3,2],[2,-2],[4,-7],[2,-2],[0,-11],[1,-2],[0,-3],[-1,-8],[-1,-7],[-2,-6],[-4,-9],[-4,-7],[-6,-16],[-1,-7],[0,-6],[1,-6],[0,-2],[-1,-2],[-1,0],[-2,-3],[-3,-8],[0,-3],[1,-2],[2,1],[2,0],[1,1],[1,0],[0,-5],[-1,-3],[-1,-1],[-2,-1],[-1,-2],[-1,-2],[0,-5],[1,0],[2,4],[1,-1],[0,-1],[-2,-14],[-2,-14],[-2,-9],[-1,-12],[-1,-5],[-2,-5],[-3,10],[-2,2],[0,3],[1,11],[-1,7],[-1,0],[-1,-4],[-2,-3],[0,-4],[-2,-8],[-1,-2]],[[2438,6022],[-1,1],[-8,16],[-7,17],[-3,5],[-3,5],[-4,8],[-11,17],[-5,8],[-5,9],[-5,6],[-4,3],[-2,2],[-2,3],[-1,0],[0,-4],[1,-1],[2,-2],[2,0],[1,-1],[5,-5],[1,-3],[-13,10],[-6,1],[0,2],[2,5],[0,1],[-1,1],[-3,-4],[-1,0],[0,2],[0,2],[-2,4],[-1,-1],[-1,-2],[-3,-4],[0,-2],[5,-1],[2,-1],[-1,-2],[-4,0],[-5,-1],[-9,-12],[-9,-5],[-12,-11],[-5,-1],[-3,-2],[-8,5],[-11,10],[-16,3],[-10,14],[-11,6],[-7,13],[-4,1],[-2,2],[-10,5],[-9,3],[-10,11],[-6,4],[-5,5],[-12,8],[-4,4],[-4,7],[-6,7],[-3,5],[-3,3],[-5,10],[-2,5],[-2,2],[-2,1],[-7,-1],[-9,5],[-4,1],[-9,7],[-12,8],[-3,9],[-4,9],[-6,11],[-3,5],[-7,6],[-3,4],[-6,4],[-9,9],[-3,8],[-2,7],[-5,8],[-5,15],[-2,6],[-1,9],[-1,5],[-1,4],[0,3],[3,3],[5,1],[3,4],[0,3],[0,2],[-2,5],[-3,1],[-2,1],[0,1],[1,2],[2,5],[3,6],[2,5],[0,8],[0,7],[0,7],[-6,7],[-1,3],[-2,9],[-3,9],[0,20],[-4,17],[-4,9],[-2,3],[-6,13],[-5,8],[-4,14],[-5,10],[-6,15],[-4,8],[-19,26],[1,0],[6,-6],[1,0],[0,4],[-1,3],[-1,1],[-1,-1],[-2,1],[-1,1],[-3,1],[-4,5],[-1,4],[-1,5],[-5,11],[-2,6],[1,0],[1,-2],[2,-1],[2,0],[1,1],[-1,2],[-1,1],[-8,6],[-2,4],[-7,7],[-1,2],[-1,7],[-2,0],[-1,-2],[-4,-2],[-1,3],[0,2],[3,2],[2,6],[0,2],[-1,-2],[-2,-3],[-2,-2],[-3,-1],[-2,1],[-1,1],[-3,6],[-1,17],[2,6],[3,6],[1,4],[2,-3],[1,0],[-1,3],[-2,3],[-1,3],[0,2],[-1,5],[-5,10],[-6,-1],[-2,1],[-2,4],[-2,6],[-1,6],[0,3],[0,3],[-9,4],[-3,4],[-3,6],[-1,4],[-1,3],[-1,5],[-1,7],[1,8],[2,4],[-7,3],[-2,0],[-2,-2],[-2,2],[-4,3],[-4,8],[-6,16],[-5,5],[-2,5],[-3,5],[-2,6],[0,3],[-1,1],[-3,4],[-3,7],[-1,6],[-1,9],[-2,3],[-2,1],[0,4],[0,3],[-1,4],[-4,11],[-2,8],[-2,3],[-1,4],[0,8],[-2,10],[-4,12],[-3,8],[-1,8],[1,9],[-1,5],[0,1],[0,2],[1,-1],[1,1],[0,6],[-1,1],[-3,2],[-1,1],[-7,2],[-4,3],[-1,7],[-2,3],[-1,2],[-5,5],[-1,-3],[-1,-3],[-2,-1],[-2,0],[-3,2],[-8,11],[-2,1],[-2,1],[-1,2],[-6,5],[1,-3],[2,-3],[1,-8],[-1,-7],[-1,-22],[1,-4],[2,-7],[2,-11],[0,-8],[2,-7],[-1,-16],[1,-4],[2,-8],[4,-7],[1,-4],[5,-6],[3,-7],[7,-10],[2,-4],[6,-15],[0,-4],[1,-6],[3,1],[2,-4],[0,-2],[0,-2],[2,1],[1,-1],[3,-17],[2,-2],[2,-1],[3,-2],[0,-4],[0,-4],[2,-5],[-1,-6],[2,-6],[0,-5],[0,-4],[5,-10],[7,-8],[1,-10],[2,-9],[3,-3],[3,-3],[-1,-4],[0,-3],[4,-7],[1,-10],[3,-6],[1,1],[-2,6],[-1,4],[0,6],[0,1],[7,-10],[0,-7],[2,-4],[1,-6],[1,-3],[0,-5],[2,-8],[0,-12],[1,-8],[4,-12],[4,-3],[0,-6],[3,-16],[4,-9],[2,-7],[0,-4],[-1,-7],[0,-5],[2,-14],[3,-8],[4,-1],[0,-1],[0,-2],[1,-2],[1,2],[1,3],[-1,4],[0,3],[1,2],[1,0],[7,-10],[1,-4],[2,-4],[2,-5],[1,-5],[2,-3],[1,-8],[5,-4],[2,-7],[1,-4],[-2,-11],[-1,-3],[-3,-5],[-3,-5],[-3,-4],[-3,-2],[-2,0],[-2,7],[-3,19],[-2,4],[-1,6],[-2,5],[-7,8],[-4,8],[-4,5],[-4,8],[-10,13],[-5,7],[-2,6],[-2,0],[-2,-1],[0,2],[0,4],[-1,2],[-6,10],[-2,5],[0,6],[2,16],[0,10],[0,5],[-1,0],[0,3],[-1,8],[-1,8],[-6,18],[-4,3],[-4,3],[-10,15],[-2,8],[-1,4],[0,9],[-2,-5],[-2,-4],[-4,0],[-5,-4],[-3,4],[-1,5],[-2,5],[-3,1],[-2,0],[-3,7],[-2,2],[-4,1],[-3,4],[-1,3],[-1,6],[-1,3],[-5,6],[-4,7],[-3,4],[-2,4],[0,2],[6,0],[7,-3],[4,1],[2,2],[2,2],[0,-2],[0,-3],[2,-4],[2,-2],[2,0],[-2,3],[-1,6],[1,2],[0,3],[-3,-1],[0,2],[2,4],[3,12],[1,12],[-3,10],[-4,8],[-10,21],[-6,10],[-2,4],[-1,2],[-5,3],[-4,6],[-7,8],[-3,5],[-2,10],[-2,1],[0,8],[0,12],[-1,3],[-4,4],[-1,8],[0,8],[-1,6],[-7,10],[0,4],[0,5],[-1,4],[-3,9],[-4,8],[-2,4],[0,8],[-1,2],[1,0],[1,1],[0,5],[-6,9],[-2,11],[-3,7],[-1,2],[-2,11]],[[1746,7058],[8,1],[8,1],[8,1],[8,2],[8,1],[8,1],[8,1],[8,2],[3,0],[-2,-9],[-1,-3],[13,-8],[13,-9],[13,-8],[14,-9],[13,-8],[13,-9],[13,-8],[13,-9],[10,0],[10,0],[10,0],[10,0],[9,0],[10,0],[10,0],[10,0],[0,7],[0,6],[0,7],[0,6],[6,0],[6,0],[6,0],[6,0],[6,0],[7,0],[6,0],[6,0],[0,-1],[3,-5],[2,-7],[3,-6],[4,-3],[6,-9],[8,-15],[6,-10],[5,-5],[4,-4],[1,-4],[3,-7],[4,-19],[0,-8],[2,-8],[3,-10],[3,-6],[2,-2],[3,-3],[3,-6],[3,-3],[4,-2],[5,-5],[7,-8],[5,-4],[2,0],[2,3],[2,5],[2,3],[2,2],[0,2],[0,3],[1,8],[3,11],[3,6],[4,1],[3,3],[1,3],[2,0],[3,-2],[5,-2],[6,-1],[4,0],[1,2],[1,0],[0,-2],[1,0],[2,0],[2,-2],[2,-6],[7,-10],[1,-4],[2,-5],[5,-7],[3,-7],[0,-5],[3,-9],[4,-12],[2,-6],[-1,-1],[1,-4],[1,-6],[2,-4],[3,-4],[3,-8],[3,-10],[4,-8],[4,-5],[3,-5],[0,-5],[0,-4],[0,-3],[0,-4],[1,-3],[1,-3],[-1,-5],[0,-2],[0,-1],[4,-9],[2,-7],[2,-11],[2,-7],[2,-3],[4,-1],[3,-2],[2,-4],[3,-2],[3,-1],[3,-2],[3,-4],[5,-3],[8,-1],[6,-4],[4,-5],[2,-1],[1,1],[0,1],[2,2],[3,1]],[[9711,5520],[0,-2],[-1,0],[0,1],[1,2],[1,5],[1,2],[1,2],[0,-2],[-2,-2],[-1,-6]],[[9765,5590],[1,-1],[2,0],[2,-4],[-1,1],[-1,1],[-1,1],[-1,-1],[-1,1],[0,2]],[[9752,5595],[3,-3],[5,1],[-1,-1],[-2,0],[-1,-1],[-1,0],[-3,2],[-2,3],[0,1],[2,-2]],[[9689,5605],[-1,-1],[-2,0],[-2,2],[1,0],[2,0],[2,-1]],[[9635,5826],[-1,0],[0,1],[1,0],[0,-1]],[[5598,7617],[2,0],[3,1],[2,2],[1,1],[2,0],[2,0],[2,-1],[3,2],[2,2],[1,-1],[1,-2],[1,0]],[[5117,6286],[0,-10],[0,-15],[0,-17],[0,-15],[0,-18],[0,-14],[0,-17],[0,-17],[-1,-2],[0,-10],[0,-12],[-2,-13],[-3,-10],[-1,-9],[-1,-5],[-1,-3],[0,-3],[-1,-5],[-1,-3],[0,-1],[-3,-2],[-6,-9],[0,-8],[-6,2],[-6,2],[-1,0],[-1,-1],[0,-4],[-9,0],[-7,-1],[-9,0],[-7,-1],[-8,-1],[-7,-1],[-5,-8],[-5,-8],[-7,-2],[-7,2],[-5,0],[-1,-1],[0,-3]],[[4683,5898],[0,5],[-1,3],[-1,1],[1,4],[0,9],[0,3],[1,6],[-1,3],[0,2],[-2,4],[-1,4],[-1,4],[0,3],[-2,5],[-1,1],[-2,0],[0,-1],[-1,-3],[-1,0],[-1,3],[-1,2],[0,2],[-2,4],[-2,7],[0,6],[2,3],[0,2],[0,3],[0,3],[-1,3],[0,5],[0,8],[-2,4],[-1,3],[-2,3],[-1,5],[0,6],[1,5],[-3,9]],[[4658,6037],[5,-4],[1,1],[2,3],[2,4],[2,6],[1,8],[0,7],[1,6],[1,4],[2,5],[2,4],[3,3],[1,0],[3,-5],[5,-11],[5,-7],[1,-5],[2,0],[2,8],[2,7],[1,1],[3,1],[3,0],[2,0],[4,-1],[2,-1],[2,-1],[5,-1],[6,2],[4,2],[4,1],[0,3],[0,4],[1,3],[1,2],[1,1],[0,-9],[1,-1],[4,-1],[5,0],[6,0],[5,0],[6,0],[6,0],[5,0],[6,0],[6,0],[5,0],[6,0],[6,0],[5,0],[6,0],[6,0],[5,0],[6,0],[6,0],[5,0],[2,17],[1,16],[2,13],[-5,9],[-3,7],[-1,14],[0,14],[-1,15],[-1,14],[-1,14],[-1,15],[0,14],[-1,14],[-1,15],[-1,14],[-1,14],[0,15],[-1,14],[-1,14],[-1,15],[0,14],[-1,14],[-1,14],[-1,15],[-1,14],[0,14],[-1,15],[-1,14],[-1,14],[-1,15],[0,14],[-1,14],[-1,15],[-1,14],[-1,14],[0,15],[-1,14],[-1,14],[-1,13],[9,0],[9,0],[9,0],[13,0],[10,1]],[[5404,7249],[-1,-2],[-3,0],[-2,3],[0,6],[3,-1],[2,-4],[1,-2]],[[5397,7259],[-2,-1],[-1,2],[-1,1],[3,1],[1,-1],[0,-2]],[[7727,5756],[-2,-3],[0,5],[3,4],[2,1],[-1,-3],[-1,-3],[-1,-1]],[[7727,5815],[3,-10],[-1,-2],[0,-1],[-1,1],[0,5],[-2,4],[-2,-1],[1,4],[1,1],[1,-1]],[[7737,5815],[-1,0],[-1,0],[0,1],[1,6],[1,-7]],[[7728,5845],[-1,-1],[0,1],[0,5],[1,5],[1,6],[1,1],[0,-3],[-1,-7],[0,-4],[-1,-3]],[[7737,5860],[-1,-12],[-2,2],[-2,7],[1,2],[-1,4],[4,1],[1,-4]],[[7724,5857],[0,-3],[-2,3],[0,10],[1,-6],[1,-1],[0,-3]],[[7736,5870],[-1,-1],[-1,10],[0,1],[2,-5],[2,-3],[-1,-1],[-1,-1]],[[7725,5884],[0,-1],[-1,1],[-2,4],[1,3],[0,1],[1,0],[1,-1],[0,-1],[0,-2],[0,-2],[0,-2]],[[7723,5897],[0,-2],[-1,-4],[-2,3],[0,1],[1,3],[2,-1],[0,1],[0,-1]],[[7733,5909],[1,-1],[0,-6],[-2,-7],[-1,-1],[-1,0],[1,10],[-1,6],[0,4],[2,-2],[1,-3]],[[7730,5938],[0,-9],[-1,4],[-1,6],[1,4],[0,1],[0,-1],[1,-2],[0,-3]],[[7633,6095],[-1,-1],[-1,1],[2,7],[1,-3],[-1,-4]],[[7624,6102],[-2,-5],[-1,8],[3,5],[2,4],[1,3],[1,-3],[-2,-8],[-2,-4]],[[7710,6120],[-1,-1],[-2,4],[0,9],[1,2],[1,0],[1,-1],[0,-1],[0,-2],[0,-2],[0,-8]],[[7602,6260],[-1,-1],[-3,5],[-2,7],[4,1],[3,-2],[0,-3],[0,-5],[-1,-2]],[[7602,6310],[4,-4],[1,0],[2,-3],[0,-1],[0,-3],[-1,-2],[-3,-2],[-1,2],[-1,5],[-2,3],[-1,2],[2,3]],[[7596,6330],[1,-8],[-2,3],[-1,4],[0,4],[2,-3]],[[7583,6331],[0,-5],[-1,2],[-2,8],[0,5],[1,-3],[2,-7]],[[7780,6354],[-3,4],[-1,2],[-2,0],[-2,-2],[-1,-3],[-2,0],[-2,-1],[-3,2],[-2,1],[0,-1],[1,-5],[0,-4],[0,-3],[-1,-1],[-2,-2],[-1,-1],[-2,0],[-2,2],[-2,0],[-2,-1],[-1,-1],[0,-2],[-1,-10],[-1,-3],[-1,-2],[-1,-1],[-2,1],[-1,0],[-8,-4],[-1,-1],[-2,0],[-2,0],[-2,0],[-3,4],[-2,1],[-1,-2],[-1,-5],[-2,-4],[-3,-7],[0,-12],[0,-7],[-2,-8],[-1,-4],[2,-18],[-1,-2],[-2,-1],[-2,-2],[-2,-2],[-1,0],[-2,1],[-1,0],[0,-1],[2,-8],[2,-3],[2,0],[1,-1],[0,-2],[1,-4],[2,-8],[0,-6],[-1,-6],[0,-2],[1,-1],[2,-6],[3,-8],[4,-10],[3,-7],[3,-6],[5,-9],[1,-5],[0,-9],[1,-6],[1,-4],[1,-3],[2,-11],[1,-1],[4,6],[1,-1],[0,-2],[0,-3],[-1,-4],[-1,-3],[-6,-8],[-1,-6],[0,-10],[0,-12],[0,-9],[0,-2],[-1,-1],[-2,0],[-3,-4],[-2,-1],[-1,-1],[-1,-2],[-1,-4],[1,-10],[1,-9],[3,-7],[2,-5],[2,-8],[2,-6],[4,-7],[6,-11],[3,-6],[2,-7],[1,-6],[1,-8],[0,-5],[0,-15],[-1,-3],[-1,-4],[1,-5],[1,-4],[0,-4],[1,-8],[2,-5],[3,-4],[0,-2],[0,-5],[1,-4],[0,-5],[1,-7],[2,-6],[2,-18],[0,-1],[-1,-4],[-1,-3],[-1,-1],[-1,-4],[-3,-9],[-4,-17],[-5,-10],[-4,-8],[-3,-4],[-1,-3],[0,-2],[1,-4],[0,-7],[-1,-5],[-1,-5],[0,-4]],[[7741,5771],[-1,-1],[-3,-8],[-1,4],[-1,4],[1,10],[-2,19],[1,2],[1,1],[2,8],[2,7],[0,8],[2,6],[0,5],[0,6],[0,5],[0,4],[1,5],[3,3],[-1,1],[-1,2],[-3,-3],[-2,1],[0,4],[0,3],[0,3],[2,2],[0,6],[-1,4],[1,6],[-2,0],[-1,1],[1,3],[1,3],[-1,5],[1,6],[0,7],[-1,6],[0,5],[-1,8],[-1,10],[-2,7],[-2,11],[-5,15],[0,6],[0,5],[-1,3],[-1,-19],[-1,4],[-1,10],[-1,5],[1,10],[-3,10],[0,8],[-2,11],[0,2],[3,-2],[-2,6],[-2,-1],[-2,7],[0,18],[-2,7],[1,8],[-2,25],[-3,9],[1,7],[0,6],[0,12],[1,3],[2,3],[-2,-1],[-1,-1],[-3,0],[-4,-1],[-1,9],[-2,4],[-1,9],[-1,10],[0,1],[-3,4],[0,3],[-3,6],[-3,5],[0,-3],[1,-2],[-1,-6],[1,-10],[-1,-7],[-2,-8],[-1,-4],[-4,-8],[-3,-3],[-2,-1],[-2,1],[-2,5],[-1,3],[0,6],[-1,1],[-1,0],[2,-8],[-1,-4],[3,-7],[-1,-2],[-4,-4],[-2,1],[-1,-1],[0,-3],[-1,-2],[-7,-5],[-1,-5],[-1,-6],[-3,-8],[-5,-7],[-1,1],[-1,1],[0,7],[1,7],[0,6],[-1,-4],[-3,-9],[-1,-3],[-3,1],[-3,-1],[-2,9],[0,4],[0,2],[0,3],[0,3],[-1,-5],[0,-4],[-1,-3],[-4,-4],[0,5],[-1,4],[1,4],[0,6],[1,9],[0,3],[0,4],[-1,-5],[0,-5],[-1,-2],[-1,-1],[-3,-6],[-1,-5],[-4,-5],[-2,0],[-1,7],[2,22],[1,3],[1,4],[1,13],[2,5],[0,11],[1,2],[2,8],[1,15],[-1,7],[-2,7],[-2,22],[-4,18],[-1,6],[-2,7],[2,0],[-4,6],[-1,3],[-1,15],[1,8],[-1,-1],[-1,-5],[-1,-2],[0,-9],[0,-2],[-1,-4],[-3,4],[-3,4],[-3,9],[-3,10],[1,2],[2,0],[4,-7],[2,-2],[2,2],[2,3],[1,7],[-1,2],[-2,1],[-1,2],[-2,4],[0,2],[-1,3],[-2,2],[-1,3],[1,4],[1,4],[-3,0],[-4,5],[-1,2],[-1,1],[-3,1],[-3,-2],[1,-8],[0,-3],[-2,1],[-3,12],[1,3],[1,3],[-1,1],[-1,-1],[1,12],[0,1],[-1,-3],[-1,-4],[-3,-7],[-1,1],[-1,2],[1,4],[1,1],[1,2],[-2,5],[-1,3],[-2,5],[-1,0],[1,-6],[0,-9],[-3,10],[-7,14],[-1,4]],[[5533,7691],[0,-3],[0,-2],[3,-2],[3,-4],[4,-7],[1,-2],[2,-1],[3,-3],[2,-1],[2,-1],[7,-6],[2,-2],[2,-3],[1,-2],[0,-1]],[[5537,7595],[-5,5],[-1,6],[-7,11],[-7,8],[0,1],[0,1],[0,1],[-1,1],[-1,-1],[-1,0]],[[7439,8015],[3,1],[1,1],[1,2],[3,2],[0,2],[0,5],[2,4],[4,1],[2,1],[1,-1],[3,1],[2,0],[2,-1],[1,-1],[3,0],[1,2],[0,3],[1,0],[1,-2],[1,-1],[1,-1],[3,2],[1,2],[1,3],[1,2],[2,-1],[2,0],[3,3],[3,2],[2,1],[0,2],[-1,5],[0,4],[3,3],[4,0],[3,2],[0,5],[2,1],[1,1],[3,0],[3,2],[1,1],[5,3],[3,1],[2,2],[1,2],[3,1],[2,3],[3,3],[1,0],[5,2],[1,0],[1,1],[3,0],[0,3],[3,2],[2,1],[1,2],[2,3],[2,2],[5,0],[4,0],[2,0],[2,4],[1,3],[0,2],[2,0],[2,-3],[1,-2],[3,-2],[1,-3],[2,0],[1,2],[1,4],[3,0],[2,0],[1,-2],[0,-2],[1,-4],[2,-2],[4,0],[1,0],[3,0],[3,-1],[4,-1],[1,0],[4,0],[5,-1],[2,1],[5,-1],[1,-3],[1,-6],[1,-6],[0,-5],[1,-2],[2,-1],[1,-2],[2,-2],[1,-4],[2,0],[1,1],[3,0],[3,0],[2,-2],[1,-2],[2,-2],[2,0],[4,1],[2,-1],[1,-1],[3,0],[1,1],[4,2],[2,2],[2,0],[1,-1],[1,-2],[2,1],[0,2],[2,0],[1,-1],[3,-2],[3,-3],[1,0],[3,1],[1,0],[1,-1],[2,-1],[1,1],[2,1],[7,-2],[2,-3],[1,-2],[1,-2],[2,-2],[5,1],[1,2],[4,4],[1,4],[2,1],[2,1],[1,0],[2,0],[3,3],[2,1],[2,3],[1,2],[1,4],[1,3],[1,4],[1,7],[1,4],[-1,2],[-1,2],[-3,0],[-1,2],[-2,3],[-1,3],[-1,4],[0,3],[0,2],[-1,2],[-2,3],[0,2],[0,4],[2,7],[0,3],[0,2],[0,1],[1,4],[1,2],[1,4],[2,2],[3,0],[1,1],[0,5],[1,3],[1,2],[1,3],[8,4],[4,6],[1,3],[1,7],[1,3],[2,-1],[2,-4],[2,0],[2,-2],[7,-4],[3,-2],[2,0],[3,-1],[2,-3],[4,-4],[3,-1],[5,-1],[7,0],[2,-1],[5,-3],[5,-3],[5,-3],[4,-2],[2,-2],[2,-2],[3,1],[3,0],[7,-2],[4,-3],[4,-1],[1,-3],[0,-3],[0,-2],[0,-6],[1,-4],[0,-4],[1,-4],[0,-5],[0,-2],[1,-1],[1,-3],[0,-3],[-1,-2],[1,-3],[1,-2],[2,0],[2,-1],[2,-4],[4,-4],[2,-1],[2,-2],[5,-2],[4,-1],[2,-1],[2,-4],[3,-1],[2,-1],[4,-1],[2,1],[3,1],[1,0],[3,-1],[3,0],[3,0],[2,3],[3,4],[3,1],[4,1],[2,1],[8,3],[4,0],[2,2],[2,2],[4,1],[4,-2],[4,-1],[5,-1],[4,-2],[2,-2],[4,-2],[4,1],[6,1],[3,-1],[4,-4],[3,-3],[3,-6],[2,-3],[3,-3],[3,0],[8,0],[4,-2],[4,0],[1,-2],[-1,-4],[1,-6],[-1,-3],[1,-2],[1,-1],[1,-3],[2,-1],[3,-3],[6,-7],[3,-3],[2,-1],[4,0],[5,0],[9,0],[6,-2],[2,-1],[6,-2],[7,-2],[5,-2],[4,3],[3,0],[2,-2],[3,-3],[2,0],[4,2],[10,8],[4,3],[2,-1],[3,1],[1,1],[5,1],[3,0],[2,1],[5,1],[8,5],[3,1],[6,-2],[3,1],[3,3],[4,3],[1,4],[2,6],[4,4],[3,4],[4,4],[4,3],[5,3],[5,6],[4,3],[2,1],[3,-2],[4,0],[4,0],[1,-1],[4,-3],[4,-2],[2,-5],[5,-6],[3,-2],[2,-1],[4,-1],[4,0],[2,1],[3,3],[6,3],[2,0],[4,-2],[6,-3],[2,-2],[1,-3]],[[9034,5999],[-1,-2],[-1,0],[-1,1],[0,2],[2,1],[1,0],[0,-2]],[[9045,6046],[-1,-3],[-1,5],[0,2],[1,1],[1,0],[0,-5]],[[9048,6055],[0,-1],[-2,0],[0,1],[1,5],[2,3],[1,0],[-1,-2],[0,-3],[-1,-3]],[[9047,6125],[-1,0],[-1,0],[0,1],[-1,1],[2,0],[1,-1],[0,-1]],[[9048,6225],[-1,-1],[2,6],[0,1],[1,-3],[-2,-3]],[[9047,6264],[-1,-2],[-1,2],[0,3],[1,0],[1,-1],[0,-2]],[[5913,3637],[-3,0],[-5,0],[-3,0],[-4,0],[-4,1],[-3,0]],[[5891,3638],[0,18],[-1,4],[0,6],[-1,4],[1,4],[0,6],[0,5],[-3,3],[0,1]],[[5887,3689],[-1,4],[0,6],[2,8],[0,16],[0,6],[0,11],[0,13],[0,12],[0,10],[-1,5],[0,2],[-1,6],[-2,11],[-1,9],[-2,5],[-1,3],[-1,4],[-2,7],[-1,4],[-1,4],[0,8],[-2,15],[-1,11],[-2,12],[-1,8],[0,1],[0,3]],[[5869,3893],[3,6],[4,9],[5,10],[4,8],[4,8],[5,11],[5,10],[1,1],[0,1],[-2,9],[4,11],[0,7],[0,7],[0,3],[1,3],[4,5],[3,9],[2,8],[4,14],[0,3],[0,3],[-1,5],[-2,7],[-2,6],[-1,10],[1,9],[1,5],[0,2],[-1,3],[-1,2],[-2,1],[0,4],[0,4],[0,2],[4,4],[1,2],[0,2],[0,4],[1,8],[2,7],[0,3],[-1,2],[0,5],[0,6],[0,19],[1,18],[-1,11],[-2,12],[0,9],[1,7],[1,3],[-2,1],[-2,0],[-2,1],[-3,5],[-5,5],[-6,3],[-8,2],[-7,12],[-6,2],[-2,1],[-5,8],[-8,1],[-9,0],[-5,0],[-1,1],[0,11],[0,9]],[[5844,4283],[-1,8],[-1,9],[-1,3],[-1,6],[-1,7],[0,3],[0,1],[6,5],[3,3],[3,2],[7,4],[6,3],[6,4],[5,3],[3,3],[3,2],[7,5],[2,1],[4,3],[2,1],[8,5],[9,6],[3,3],[6,4]],[[5922,4377],[1,-2],[4,-14],[3,-9],[4,-7],[1,2],[2,1],[6,1],[2,0],[2,3],[3,1],[3,1],[1,-1],[4,-10],[0,-8],[1,-11],[0,-5],[0,-7],[0,-9],[-3,-11],[-1,-5],[-1,-8],[-2,-4],[-1,-3],[0,-3],[1,-3],[2,-5],[1,-3],[0,-3],[0,-4],[0,-3],[1,-2],[3,-2],[2,-7],[4,-7],[5,-12],[2,-3],[2,-1],[1,-4],[-1,-4],[-1,-2],[0,-4],[1,-2],[1,-1],[2,0],[2,1],[1,1],[-1,17],[-1,9],[-1,4],[-1,1],[1,3],[1,8],[2,7],[1,3],[1,2],[6,2],[3,2],[2,2],[1,6],[0,16],[1,15],[-1,9],[1,13],[1,8],[0,2],[-1,11],[-4,12],[-6,15],[-3,8],[-3,9],[-7,15],[-3,5],[-2,2],[-5,2],[-1,3],[-1,4],[-1,9],[0,6],[-1,10],[-1,15],[0,5],[-2,11],[-1,10],[0,3],[0,3],[3,8],[1,5],[1,3],[2,8],[0,4],[1,2],[5,1],[4,0]],[[5971,4517],[6,0],[6,0],[1,-1],[2,-1],[1,1],[2,1],[2,3],[2,4],[4,0],[5,-5],[2,-4],[1,-3],[3,-2],[6,-1],[4,2],[3,4],[3,2],[3,1],[2,-2],[1,-3],[3,-2],[5,-2],[4,2],[5,6],[3,5],[1,6],[1,4],[1,1],[2,1],[5,0],[4,-2],[5,-6],[3,4],[5,7],[5,4],[5,0],[5,2],[3,5],[3,3],[4,2],[3,2],[5,6],[5,7],[5,8],[3,5]],[[6123,4581],[2,-6],[2,-5],[-1,-3],[-2,-3],[3,-4],[-2,-6],[0,-4],[0,-1],[1,-3],[-2,-6],[-2,-5],[0,-4],[1,-7],[0,-12],[1,-10],[1,-6],[0,-4],[-1,-6],[1,-11],[0,-5],[-1,-6],[2,-2],[1,-6],[-1,-7],[0,-4],[-3,-4],[0,-2],[0,-3],[3,0],[0,-4],[0,-4],[0,-6],[0,-4],[1,-5],[-1,-5],[0,-4],[0,-5],[1,-13],[0,-16],[0,-2],[2,-2],[1,-1],[0,-4],[-2,-6],[0,-4],[0,-5],[3,7],[1,0],[1,-3],[0,-3],[0,-2],[0,-4],[1,-5],[0,-4],[-2,-3],[-2,-5],[0,-5],[0,-3],[-2,-1],[0,-2],[1,-4],[0,-4],[-3,-12],[-7,-17],[-3,-6],[-2,-7],[0,-2],[-1,-3],[-3,-9],[-3,-1],[-2,-3],[1,-8],[-2,-2],[-4,-6],[-11,-12],[-1,-3],[-3,-8],[-3,-2],[-2,-2],[-4,-1],[-1,1],[-1,0],[-1,-2],[-7,-5],[-7,-4],[-2,-2],[-1,-3],[-6,-4],[-9,-10],[-7,-10],[-5,-10],[-2,-1],[-2,-4],[0,-5],[-1,-2],[-4,-11],[-6,-12],[-1,-3],[-2,-7],[0,-4],[-3,-2],[-1,5],[-1,-9],[-2,0],[-1,2],[-4,-5],[-4,-4],[-5,-10],[-8,-19],[-12,-18],[-1,-1],[-1,0],[-4,7],[-2,0],[2,-4],[1,-3],[0,-6],[0,-9],[-2,-18],[0,-4],[2,-6],[3,-6],[3,-8],[4,-22],[0,-12],[4,-14],[0,-7],[2,-16],[0,-12],[-1,-8],[2,-4],[1,3],[0,5],[0,8],[1,4],[1,-1],[1,-3],[0,-4],[1,-3],[0,-4],[-2,-16],[1,-7],[2,-11],[-3,-13],[-3,-30],[0,-5],[1,-2],[1,-1],[1,4],[1,0],[1,-2],[-2,-14],[-1,-6],[-5,-15],[-3,-7],[-5,-6],[-10,-10],[-22,-14],[-8,-7],[-5,-4],[-11,-13],[-5,-9],[-2,-10],[-1,-5],[-2,-6],[1,-5],[2,-4],[2,-2],[1,-3],[1,-1],[1,8],[1,2],[1,0],[-1,-9],[-1,-34],[0,-1]],[[5962,4492],[-1,1],[-1,1],[-1,0],[0,-2],[1,-3],[1,0],[1,3]],[[5964,4486],[1,2],[0,1],[0,2],[-1,1],[-1,0],[-1,-2],[0,-3],[1,-1],[1,0]],[[4545,6319],[-2,-6],[-1,2],[0,4],[1,5],[1,3],[2,1],[-1,-9]],[[4658,6037],[-3,4],[-2,5],[-2,4],[-3,3],[-2,2],[-1,4],[-1,2],[-2,1],[0,1],[1,1],[-1,3],[-2,7],[-1,3],[-2,-1],[-1,1],[0,2],[0,2],[-2,2],[-1,0],[-2,5],[-1,9],[-1,7],[-2,5],[-1,2],[-1,0],[0,1],[-1,1],[-1,1],[-2,-2],[-2,1],[0,2],[-2,0],[-1,-2],[-2,1],[-1,3],[-1,3],[-1,3],[-3,6],[-6,10],[-6,4],[-7,0],[-4,0],[-1,1],[-1,0],[-1,-1],[-1,-1],[-1,1],[0,-3],[-3,-1],[-5,0],[-3,-2],[-3,-2],[-4,-2],[-6,1],[-3,1],[-1,1],[-2,1],[-2,-1],[-1,-5],[-2,-8],[-1,-5],[-1,-1],[-1,-6],[-1,-10],[-1,-5]],[[4540,6096],[0,26],[2,10],[0,8],[3,19],[4,15],[4,20],[1,20],[0,19],[-1,18],[-2,11],[-2,16],[-2,9],[-5,8],[-1,4],[1,2],[3,1],[2,6],[-4,-3],[4,19],[2,12],[-1,8],[1,5],[-3,11],[-3,13],[-1,2],[-2,2],[0,-4],[-1,-2],[-1,1],[-3,10],[-4,16],[-2,2],[-1,-2],[-1,-2],[-1,-14]],[[4526,6382],[0,6],[0,6],[1,8],[1,10],[4,0],[6,0],[7,0],[6,0],[6,0],[7,0],[6,0],[6,0],[7,0],[6,0],[7,0],[6,1],[6,0],[7,0],[6,0],[6,0],[7,0],[4,0],[0,7],[0,6],[-1,8],[0,9],[0,8],[-1,7],[0,8],[0,7],[0,7],[-1,3],[-1,8],[0,3],[0,4],[1,4],[3,7],[3,5],[5,6],[3,4],[2,1],[5,2],[4,3],[4,4],[2,1],[0,7],[0,7],[0,8],[0,7],[0,8],[0,8],[0,8],[0,8],[0,8],[0,7],[0,8],[0,8],[0,8],[0,8],[0,8],[0,8],[0,7],[0,8],[0,7],[4,0],[5,0],[5,0],[5,0],[6,0],[5,0],[5,0],[5,0],[5,0],[5,0],[6,0],[5,0],[5,0],[5,0],[5,0],[6,0],[5,0],[5,0],[0,7],[0,9],[0,13],[0,13],[0,11],[0,12],[0,9]],[[3273,6148],[0,-3],[-2,1],[0,3],[1,3],[1,0],[0,-4]],[[6601,4004],[-4,-2],[-4,1],[-1,3],[0,1],[1,1],[0,4],[0,7],[1,2],[2,3],[1,5],[2,3],[2,0],[2,-6],[2,-6],[-1,-7],[-1,-2],[-1,-4],[-1,-3]],[[5922,4377],[-2,4],[-1,-1],[-2,-3],[-1,-1],[0,1],[-1,2],[-1,5],[-2,4],[-1,1],[-1,2],[0,2],[1,1],[-1,1],[0,2],[-3,3],[0,1],[2,2],[2,3],[1,3],[1,5],[1,6],[1,2],[0,4],[0,4],[1,6],[0,5],[-1,2],[0,3],[0,6],[2,4],[6,5],[4,3],[1,2],[2,3],[0,4],[0,1],[-4,0],[0,1],[-3,11],[1,13],[1,5],[0,6],[-1,5],[-1,2],[-1,2],[1,7],[1,1],[2,9],[1,5],[-2,4],[-1,6],[0,4],[-1,1],[1,3],[2,2],[1,1],[2,1],[5,11],[0,2],[-1,4],[-2,5],[0,3],[0,6],[-1,2],[-3,5],[-2,5],[0,4],[1,6],[-1,3],[-2,3],[-1,4],[0,3],[-2,2],[-1,0],[-1,-2],[-1,0],[-1,1],[0,2],[0,3],[-1,3],[-1,2],[0,2]],[[5914,4642],[1,1],[5,-6],[2,0],[3,-1],[3,-6],[1,0],[2,0],[4,1],[2,-1],[3,-3],[1,0],[1,0],[1,1],[0,1],[-1,4],[1,2],[1,2],[2,-3],[7,-11],[0,-1],[4,-11],[1,-5],[0,-2],[2,-10],[0,-5],[0,-3],[0,-3],[0,-4],[0,-1],[2,-6],[0,-5],[0,-5],[0,-4],[-1,-7],[-1,-3],[1,-2],[1,-3],[1,-3],[1,-4],[1,-4],[0,-1],[1,0],[1,-1],[2,-2],[1,-4],[0,-5],[1,-2]],[[8093,5323],[-1,-1],[-1,2],[0,18],[1,1],[1,-3],[0,-8],[0,-7],[0,-2]],[[7894,5341],[-1,0],[-1,0],[0,2],[1,5],[0,1],[1,-5],[0,-3]],[[7814,5356],[-2,-1],[0,1],[0,2],[1,2],[1,-1],[0,-3]],[[8267,5424],[1,2],[0,3],[1,0],[1,0],[4,-4]],[[7785,5489],[-1,-2],[-2,1],[1,10],[1,1],[2,-2],[0,-2],[-1,-6]],[[7773,5556],[2,-6],[-1,-3],[-1,0],[-1,0],[-1,-2],[-1,0],[-1,4],[-2,2],[0,2],[2,1],[1,-1],[2,2],[1,1]],[[7835,5543],[5,-2],[2,-2],[5,-18],[8,-12],[3,-5],[2,-2],[3,-7],[3,-8],[6,-24],[1,-10],[0,-16],[-1,-24],[-2,-12],[1,-6],[2,-8],[-1,-9],[1,-6],[0,-19],[1,-6],[1,-3],[8,-12],[0,-4],[4,-14],[7,-31],[2,-14],[0,-4],[-1,-1],[-2,-2],[-2,3],[0,2],[0,3],[-1,2],[-1,3],[-1,2],[0,-4],[0,-5],[-2,-1],[-3,2],[-3,-2],[-4,-6],[-2,-1],[-2,6],[-1,4],[-1,3],[-13,14],[-4,4],[-5,10],[-11,12],[-8,12],[-3,7],[-7,6],[-3,8],[-1,1],[-2,3],[2,7],[-1,8],[-1,6],[-5,13],[-3,9],[-4,8],[-2,5],[-2,6],[1,2],[1,2],[-1,4],[-3,7],[-1,9],[0,16],[-4,22],[-3,32],[0,11],[0,11],[-3,12],[-3,8],[-1,7]],[[7780,5555],[1,3],[0,8],[1,2],[1,1],[1,0],[3,-8],[6,-5],[1,-1],[3,2],[1,-1],[1,-2],[1,-6],[1,-4],[3,0],[2,0],[0,-1],[1,-4],[0,-8],[0,-4],[-2,-6],[-1,-5],[1,-2],[2,-3],[1,-3],[1,1],[1,1],[1,4],[1,3],[4,4],[4,3],[1,0],[0,-2],[2,-4],[1,-1],[1,-1],[2,1],[2,2],[1,5],[1,4],[3,7],[0,5],[1,3]],[[8044,5301],[2,-8],[1,-2],[4,-6],[3,-2],[4,-1],[4,-1],[1,1],[1,1],[2,-1],[8,-9],[2,-2],[4,1],[1,-1],[4,-7],[2,0],[2,0],[-3,3],[-2,2],[-1,5],[1,4],[2,3],[1,3],[0,9],[1,5],[1,5],[1,4],[-2,3],[0,6],[0,5],[1,3],[2,-2],[1,-2],[2,0],[1,1],[0,2],[0,5],[0,8],[2,6],[3,4],[3,2],[11,4],[17,9],[5,3],[2,2],[1,2],[3,8],[5,13],[3,10],[8,15],[6,14],[1,3],[1,7],[0,4],[-1,4],[1,1],[1,1],[1,0]],[[8198,5466],[6,2],[2,2],[2,5],[1,2],[1,6],[-3,3],[-2,5],[0,5],[4,8],[1,3],[1,-4],[2,0],[1,-1],[2,1],[2,4],[1,7],[4,9],[1,7],[1,7],[10,22],[1,4],[6,23],[1,0],[2,-2],[0,-7],[0,-3],[-1,-5],[-1,-5],[1,0],[3,3],[3,8],[1,7],[2,3],[3,-1],[0,-2],[0,-5],[0,-2],[1,-7],[3,-3],[3,-3],[3,-3],[1,-2],[1,-3],[0,-4],[1,-5],[-3,-4],[1,-7],[0,-5],[-1,-3],[-3,-3],[9,3],[2,2],[3,4],[2,-4],[1,-7],[-1,-1],[-4,-3],[0,-1],[1,-4],[2,1],[3,2],[3,4],[1,0],[2,-1],[3,-2],[1,-2],[2,-3],[0,-5],[4,-2],[7,-7],[1,-1],[1,0],[4,1],[1,-1],[1,-3],[0,-3],[0,-4],[0,-3],[-1,-2],[-3,-3],[-6,-5],[-6,-3],[-4,0],[-4,3],[-2,-1],[-2,-1],[-2,-9],[4,-9],[7,-10],[0,-2],[0,-3],[-1,-2],[-1,-1],[-4,-1],[-4,-2],[-3,-1],[-3,-2],[-3,0],[-4,5],[-1,0],[-2,-2],[-1,-6],[-1,-2]],[[8253,5597],[-2,-3],[0,3],[0,5],[2,4],[4,1],[0,-3],[0,-4],[-1,-2],[-3,-1]],[[5649,4168],[6,2],[6,2],[6,3],[5,1],[2,1],[12,-2],[6,-2],[2,-1],[2,-4],[5,-9]],[[5554,3757],[0,-24],[0,-26],[0,-26],[0,-25],[0,-26],[0,-26],[0,-25],[0,-26],[0,-8],[-2,0],[-6,-3],[-4,-4],[-1,-5],[-2,-3],[-3,-1],[-1,-3],[0,-4],[-1,-3],[-2,-2],[-4,1],[-5,3],[-7,1],[-8,-2],[-6,1],[-3,3],[-4,2],[-4,1],[-2,1],[-5,3],[-1,4],[0,4],[-2,3],[0,3],[1,2],[0,4],[0,5],[-2,2],[-1,0],[-2,2],[0,3],[-1,3],[-3,3],[-3,-2],[-2,-3],[-1,-6],[-1,-2],[0,-5],[0,-3],[-1,-3],[-1,-1],[-1,0],[-2,-1],[-4,-5],[-1,-3]],[[5456,3535],[-3,5],[-9,18],[-3,4],[-5,11],[-10,33],[-2,7],[-2,16],[-2,12],[0,7],[1,4],[-1,5],[-1,5],[-4,6],[-1,21],[-2,13],[0,11],[-1,10],[0,7],[1,12],[-2,14],[-4,14],[-4,20],[0,9],[0,23],[-1,10],[1,11],[-2,12],[0,6],[1,5],[0,-2],[1,0],[1,6],[0,6],[-2,15],[-4,15],[-9,24],[-3,9],[-1,8],[-11,32],[-5,23],[-3,19],[-3,9],[-16,64],[-4,10],[-7,12],[-1,4],[-3,11],[-4,16],[-2,14],[0,17],[1,12]],[[9653,3881],[-1,-2],[-1,0],[-1,1],[0,1],[0,4],[3,-2],[0,-2]],[[9666,3949],[1,-1],[3,1],[-1,-10],[-3,-2],[-1,0],[-1,2],[-2,2],[0,3],[-1,8],[3,1],[1,2],[0,-2],[1,-2],[0,-2]],[[9649,3965],[-1,0],[-2,4],[-4,2],[-2,3],[-1,5],[2,1],[2,6],[-1,2],[-3,0],[0,2],[5,3],[1,-2],[1,-1],[0,-10],[2,-2],[2,-7],[0,-2],[-1,-4]],[[9625,3992],[-1,-1],[2,5],[0,4],[0,6],[0,2],[2,0],[1,-2],[-2,-2],[0,-2],[0,-4],[0,-1],[0,-3],[-2,-2]],[[9560,4018],[3,-4],[4,2],[4,-6],[11,-17],[3,-4],[3,-1],[1,-3],[2,-4],[2,-3],[1,-3],[0,-3],[1,-2],[4,-6],[2,-5],[3,-3],[1,-3],[2,-1],[2,-3],[3,-3],[7,-8],[5,-9],[2,-5],[3,-5],[4,-3],[3,-5],[2,-9],[-1,-4],[-2,-2],[-2,0],[-1,-1],[-6,6],[-1,1],[-2,0],[-1,1],[0,2],[-4,3],[-3,3],[-1,3],[0,3],[-1,2],[-5,3],[-3,3],[-2,4],[-3,4],[-6,6],[-2,2],[-3,3],[-6,11],[-3,3],[-2,5],[-5,12],[-3,5],[-3,4],[-2,5],[-2,6],[-4,9],[0,4],[0,4],[-1,2],[-2,2],[0,2],[0,4],[0,2],[4,-6]],[[9442,4071],[0,-1],[0,9],[0,4],[1,-7],[-1,-5]],[[5416,6508],[3,-33],[2,-29],[0,-18],[0,-4],[1,-4],[2,-3],[9,-26],[-2,-5],[1,-8],[3,-4],[7,-15],[1,-3],[-1,-3],[-5,-18],[0,-5],[-1,-23],[-1,-17],[-1,-23],[-1,-27],[-1,-23],[-2,-30],[-1,-29],[-7,-16],[-13,-28],[-10,-23],[-6,-15],[-10,-30],[-5,-19],[-3,-11],[-2,-4],[2,-14],[2,-25]],[[5377,5973],[-5,0],[-2,-2],[-4,-5],[-4,-3],[-5,-5],[-3,-4],[-3,-3],[-4,-7],[-1,-6],[-4,-1],[-6,1],[-3,6],[-9,6],[-5,2],[-3,1],[-12,1],[-14,-2],[-6,-3],[-2,-1],[-3,-4],[-4,-4],[-8,-18],[-12,0],[-7,2],[-5,3],[-9,9],[-10,13],[-4,2],[-3,1],[-1,0],[-12,-13],[-2,0],[-3,-1],[-2,-4],[-1,-1],[-2,-1],[-2,1],[-2,2],[-2,4],[-4,15],[-1,2],[-3,5],[-3,6],[-3,4],[-1,0],[-2,0],[-9,6],[-10,6],[-2,-1],[-2,-1],[-3,-5],[-4,-1],[-5,1],[-3,0],[-4,-1],[-3,-2],[-4,-3],[-5,-9],[-1,-1],[-1,-1],[-2,-23],[-1,-7],[-3,-9],[-5,-9],[-3,-5],[0,-8],[-1,-11],[0,-8],[1,-6],[-1,-2],[0,-3],[0,-3],[1,-2],[0,-2],[0,-1],[-2,-3]],[[9664,3512],[1,0],[0,-1],[0,-1],[0,-1],[0,-1],[-1,1],[-1,0],[0,1],[0,1],[1,0],[0,1],[-1,0],[0,1],[1,-1]],[[5202,5438],[-2,-1],[-2,0],[2,8],[1,-2],[2,-1],[-1,-4]],[[5377,5973],[5,-12],[4,-14],[4,-10]],[[5237,5458],[-1,-2],[-2,1],[-1,4],[-2,1],[-2,5],[-1,-1],[3,-14],[-1,-6],[-8,0],[-6,-2],[-4,0],[-2,3],[-1,5],[-1,-1],[0,-3],[-1,-2],[-5,0],[-2,3],[-2,5],[-2,1],[0,-1],[2,-4],[0,-6],[-4,-7],[-2,0],[-2,3],[-1,4],[0,7],[-1,5],[-1,0],[1,-4],[0,-4],[0,-7],[2,-5],[-3,-2],[-1,0],[-2,0],[-1,2],[0,4],[-1,2],[0,-8],[-2,-1],[-1,0],[-5,-1],[-1,0],[0,1],[1,3],[0,3],[-2,-3],[0,-5],[-1,-1],[-3,1],[-3,3],[-1,3],[-3,3],[-6,11],[-1,5],[-2,7],[-1,6],[-2,10],[1,1],[1,-1],[1,2],[-3,1],[0,1],[-1,4],[1,4],[2,2],[1,1],[1,2],[1,3],[-5,-4],[-4,5],[-1,3],[0,2],[2,0],[3,0],[2,2],[-1,1],[-2,0],[-1,1],[0,4],[0,-1],[-1,-3],[-3,-2],[-1,2],[-1,5],[0,2],[-1,2],[-5,13],[-7,11],[-5,7],[-9,4],[-18,0],[-1,1],[1,2],[2,1],[6,6],[-1,1],[-6,-4],[-2,0],[-3,-8],[-15,-1],[-2,0]],[[2690,6047],[-1,-2],[-1,-1],[-2,-7],[0,-1],[0,5],[-1,1],[-2,-2],[0,-2],[1,-4],[1,0],[1,-1],[3,-23],[-1,-4],[-2,-7],[-1,-6],[-2,-3],[-3,-15],[-2,-24],[2,-22],[-1,-20],[1,-4],[0,-6],[-2,-1],[-1,3],[0,4],[1,3],[0,5],[0,3],[-1,-6],[-2,-2],[-1,-1],[-1,-3],[1,-6],[2,-4],[0,-2],[0,-4],[-1,-12],[0,1],[-1,1],[-1,0],[0,-4],[0,-3],[-1,-2],[-1,-2],[1,-1],[1,-1],[2,0],[1,-6],[0,-5],[-3,-4],[0,-4],[-2,-4],[-1,-4],[0,-3],[1,-10],[2,-7],[1,-4],[2,-1]],[[2618,5821],[0,1],[-2,7],[-4,7],[-14,24],[-5,14],[-3,10],[-3,5],[-7,11],[-2,4],[-8,15],[-5,8],[-1,4],[3,4],[1,0],[1,-3],[2,-4],[1,0],[2,2],[0,1]],[[283,4085],[-3,-4],[-1,4],[1,5],[2,1],[1,-4],[0,-2]],[[3105,5883],[-1,-6],[-1,3],[0,5],[-1,2],[-1,1],[-1,2],[1,2],[4,-4],[0,-5]],[[3251,6192],[0,-2],[-1,0],[0,2],[0,2],[0,-1],[1,-1]],[[5093,8143],[2,1],[4,0],[4,-1],[4,-1],[4,2],[3,-2],[3,2]],[[5109,8164],[3,-3],[0,-1],[1,-1],[-4,-2],[-3,4],[-3,-1],[-1,2],[0,1],[3,1],[4,0]],[[5135,8241],[-3,-4],[-1,1],[-1,1],[1,3],[4,5],[0,-6]],[[5141,8254],[-5,-4],[0,1],[3,3],[2,0]],[[5117,8144],[-3,0],[-3,3],[-5,-2],[-4,2],[-3,0],[-2,2],[-2,3],[2,3],[1,0],[5,1],[4,-2],[8,-6],[1,0],[2,0],[-1,2],[-2,1],[-2,2],[-2,3],[5,0],[-1,2],[-1,2],[-5,8],[1,2],[1,5],[2,4],[1,1],[2,2],[5,8],[3,7],[2,7],[3,22],[1,3],[2,4],[2,-1],[1,-1],[5,3],[8,8],[3,7],[2,3],[10,6],[5,2],[8,0],[6,2],[7,0],[2,-4],[2,-3],[3,-1],[3,-1]],[[5166,8107],[-5,0],[-2,0],[-1,1]],[[5147,8259],[-2,-1],[-1,1],[6,2],[4,1],[1,0],[-8,-3]],[[5164,8263],[-5,-1],[-2,1],[1,1],[5,0],[1,-1]],[[5175,8266],[-3,-2],[-1,0],[0,1],[3,1],[1,0]],[[5187,8270],[-3,0],[1,1],[2,2],[1,0],[-1,-3]],[[5141,8657],[0,-6],[-3,0],[-1,3],[0,1],[0,4],[-1,4],[1,2],[1,1],[2,-4],[1,-5]],[[5137,8702],[-2,-1],[-2,1],[1,6],[1,0],[1,1],[2,-3],[-1,-4]],[[5225,8832],[-3,0],[-3,1],[-2,2],[-1,1],[4,2],[4,2],[1,-3],[1,-3],[-1,-2]],[[5235,8851],[-3,0],[-2,1],[4,3],[7,2],[1,2],[1,0],[1,-2],[0,-3],[0,-1],[-9,-2]],[[5311,8920],[-1,-2],[-3,2],[-7,-1],[-2,1],[2,3],[6,3],[3,0],[3,-4],[-1,-2]],[[5332,8964],[-2,-2],[-3,1],[-1,1],[1,3],[2,1],[3,0],[1,-1],[-1,-3]],[[5347,8980],[-2,-1],[0,3],[1,2],[2,1],[3,1],[3,0],[0,-1],[-1,-2],[-6,-3]],[[5344,8988],[-2,-1],[0,3],[2,2],[1,2],[1,2],[1,1],[3,-1],[0,-4],[-1,-3],[-5,-1]],[[5360,9093],[-4,-3],[1,6],[2,5],[3,4],[2,-2],[-1,-2],[0,-3],[0,-1],[-3,-4]],[[5385,9116],[1,-1],[5,0],[1,0],[-1,-2],[-2,-2],[-4,-1],[-2,-3],[-1,0],[-3,0],[-2,-1],[-3,-3],[-2,2],[0,-1],[-1,-2],[-1,-1],[-3,-1],[-1,6],[2,1],[1,3],[2,0],[1,0],[4,5],[4,1],[2,0],[3,0]],[[5422,9155],[3,-6],[2,-3],[-1,-7],[-4,-3],[-5,-1],[-4,1],[-2,1],[-1,2],[-1,0],[-4,-2],[-2,0],[-3,2],[-1,2],[3,4],[2,3],[4,-1],[3,-1],[1,3],[0,3],[1,1],[4,-1],[0,6],[2,1],[1,-1],[1,-1],[1,-2]],[[5437,9133],[1,-1],[3,6],[5,2],[0,2],[1,1],[0,4],[1,2],[2,1],[2,1],[1,0],[3,-2],[1,-2],[2,-5],[-1,-5],[-5,-4],[-4,-1],[-4,-5],[-2,-3],[-2,-1],[-1,0],[-1,1],[-2,0],[-2,-3],[-7,-2],[-2,0],[-1,3],[-1,0],[-3,-4],[-2,-1],[-2,0],[-3,1],[-8,-6],[-8,-1],[-2,0],[-1,4],[6,5],[4,4],[14,2],[9,10],[2,11],[2,4],[-1,2],[-3,0],[0,4],[2,4],[4,5],[3,2],[4,6],[2,1],[2,0],[3,-1],[-1,-3],[-3,-6],[-5,-6],[0,-3],[2,-3],[1,-5],[0,-5],[-4,-7],[-1,-3]],[[5486,9192],[3,-3],[1,1],[3,1],[3,-2],[1,-2],[3,0],[1,-3],[1,-3],[-2,-3],[-2,-1],[-1,-3],[1,-4],[-5,-2],[-6,-1],[-2,2],[-4,-3],[-5,-6],[-2,-1],[0,2],[-3,1],[-5,0],[1,2],[0,1],[4,1],[1,3],[-1,5],[1,3],[0,2],[2,2],[8,-1],[1,2],[-1,1],[-4,3],[1,1],[3,1],[2,1],[1,2],[0,1],[1,0]],[[5832,9204],[-6,-2],[0,2],[1,2],[1,4],[2,0],[3,-2],[1,-2],[-2,-2]],[[5577,9221],[-2,-1],[-2,-1],[-1,1],[-2,0],[-2,0],[-2,3],[0,2],[3,2],[4,2],[4,-1],[1,0],[-1,-7]],[[5534,9220],[3,-4],[2,1],[1,1],[1,0],[3,-1],[0,-3],[-4,-4],[-3,-5],[-4,-1],[-2,1],[-4,-3],[-2,-3],[-3,-4],[0,-2],[-1,-2],[-10,-1],[-4,-1],[-4,1],[-2,3],[1,1],[4,1],[0,2],[1,2],[1,0],[1,3],[2,1],[3,-1],[2,3],[1,0],[1,-2],[1,3],[-1,2],[1,1],[3,4],[2,3],[2,2],[3,0],[0,3],[0,2],[0,2],[2,5],[2,0],[1,-4],[0,-6]],[[5549,9228],[1,-1],[1,1],[2,-1],[2,-3],[2,-1],[0,-1],[-2,-2],[-3,0],[-3,0],[-1,2],[-1,3],[-3,3],[0,3],[2,0],[3,-3]],[[5655,9247],[1,-2],[0,-3],[-2,-3],[-6,-4],[0,-1],[-2,-1],[-3,-1],[-2,1],[0,3],[0,1],[-3,-1],[-2,2],[0,2],[1,1],[2,3],[4,1],[2,0],[9,6],[0,-1],[1,-3]],[[5667,9248],[-6,-2],[-3,2],[-1,2],[0,5],[0,2],[3,2],[2,-1],[0,-1],[3,-1],[3,-3],[-1,-5]],[[5651,9263],[-1,-2],[-1,-2],[-2,-2],[-7,-7],[-4,-1],[-1,-1],[-1,-1],[-5,1],[-2,-2],[-1,-1],[-3,0],[-2,0],[-6,3],[-3,3],[-2,3],[5,-1],[2,1],[3,0],[2,2],[4,0],[8,2],[3,-1],[7,6],[2,0],[3,1],[2,-1]],[[5857,9203],[1,-7],[0,-3],[0,-3],[-1,-1],[-2,0],[-5,0],[-7,3],[-4,3],[-1,0],[-1,-1],[1,-2],[0,-3],[-1,-2],[-1,-2],[-1,-2],[-2,-2],[-5,-2],[-12,-4],[-1,-1],[-4,-10],[-1,-2],[-2,-1],[-4,-2]],[[5572,9160],[-3,0],[-11,-1],[5,-5],[1,-2],[1,-3],[-1,-5],[-2,-5],[-3,-4],[-5,-3],[8,-4],[-5,-5],[-3,-2],[-3,0],[-5,2],[-12,4],[-5,2],[-5,0],[-3,0],[-11,4],[-2,-1],[-4,-1],[0,-4],[0,-8],[0,-7],[-1,-4],[-2,-2],[-4,-8],[-10,5],[-6,3],[-5,-4],[-10,-8],[-6,-15],[-3,-4],[-5,-2],[-3,-1],[-2,-5],[5,-6],[2,-4],[2,-5],[0,-4],[-1,-2],[-4,-4],[-10,-12],[-9,-13],[-4,-3],[2,-11],[-3,-3],[-7,-4],[-3,-1],[-3,-1],[-11,-1],[2,-12],[1,-5],[0,-3],[-1,-3],[-1,-5],[-2,-20],[-2,-2],[-2,-5],[-6,-13],[-6,-9],[-7,-12],[6,-4],[6,-3],[1,-5],[0,-7],[0,-5],[-2,-4],[-2,-4],[-1,-1],[-8,1],[-10,2],[-3,0],[-6,-1],[-5,-3],[-3,-2],[-1,-1],[-3,-6],[-7,-10],[-3,-4],[1,-6],[-6,-12],[4,-11],[0,-1],[2,-4],[-2,-4],[-1,-1],[0,-6],[1,-6],[-1,-3],[0,-4],[5,-18],[0,-4],[0,-2],[-2,-11],[-2,-15],[4,-4],[5,-5],[3,-2],[5,-5],[3,-5],[0,-4],[-1,-4],[-2,-3],[-1,-3],[-1,-3],[0,-1],[-6,0],[-3,-1],[-2,-2],[1,-6],[3,-12],[3,-8],[1,-5],[-1,-6],[-1,-3],[0,-4],[-1,-7],[-2,-4],[-3,-4],[-3,-3],[-3,-1],[-3,-1],[-1,-1],[-1,-5],[-2,-5],[-4,-6],[0,-2],[2,-7],[1,-8],[-1,-8],[-1,-8],[-2,-5],[-3,-2],[-2,1],[-2,7]],[[5316,8584],[0,2],[-1,2],[-6,2],[-1,0],[-3,2],[-1,0],[-4,1],[-2,6],[-3,6],[0,2],[0,10],[-1,4],[0,5],[-2,-4],[1,-6],[-2,-3],[-3,-1],[1,-4],[1,0],[0,-4],[-1,-6],[-5,-12],[-1,-2],[-1,-1],[-2,1],[-4,-4],[-3,0],[-1,4],[-5,5],[-2,0],[2,-3],[2,-3],[-1,-3],[-1,-1],[-2,-1],[-7,-4],[2,-3],[-2,-3],[-2,-1],[-1,-1],[-1,-3],[-7,-6],[-11,-15],[-6,-5],[-4,-4],[-3,0],[-5,-4],[-11,-3],[-8,1],[-5,-1],[-3,3],[0,1],[0,1],[0,2],[-3,0],[0,-1],[-1,-3],[-1,-1],[-3,2],[-1,2],[1,3],[2,2],[0,1],[-1,2],[-1,0],[-3,-1],[-3,1],[-9,6],[-2,3],[-8,6],[-3,5],[-2,6],[0,6],[1,9],[1,2],[7,-3],[7,-5],[1,0],[2,4],[4,3],[-1,1],[-6,-4],[-2,2],[-4,5],[0,2],[2,2],[0,3],[-1,3],[1,3],[3,4],[4,4],[3,4],[3,3],[-1,0],[-3,-1],[-3,-3],[-4,-4],[-5,-4],[-4,-1],[-1,-1],[-3,-1],[-3,-5],[-3,-2],[-5,-1],[-1,4],[2,13],[1,7],[2,4],[3,1],[2,3],[1,0],[1,-1],[6,-2],[2,4],[4,1],[6,4],[0,1],[-4,-1],[-3,0],[-3,-1],[-2,1],[-1,3],[1,3],[6,7],[2,3],[1,2],[0,2],[1,4],[6,7],[5,3],[1,-3],[-1,-8],[0,-3],[4,12],[1,3],[2,2],[5,1],[1,2],[-5,0],[-13,-5],[-6,-4],[-1,-4],[-4,-4],[-2,-4],[0,-4],[-2,-3],[-3,-1],[-4,-6],[-2,-4],[-4,-4],[-2,-3],[-1,-1],[-1,-3],[-2,0],[-1,2],[0,3],[1,6],[2,4],[0,4],[-1,4],[1,3],[2,0],[3,-1],[3,0],[6,3],[-1,2],[-3,0],[-4,0],[-4,3],[-3,5],[-1,8],[1,3],[11,8],[2,3],[-1,1],[-4,-5],[-6,-2],[-3,3],[-2,4],[-1,9],[0,5],[0,6],[2,1],[3,-1],[2,0],[6,1],[14,3],[8,-2],[4,0],[5,3],[5,1],[3,-3],[2,-2],[0,-4],[2,-2],[1,0],[-1,3],[0,5],[14,5],[2,1],[-6,1],[-1,5],[2,6],[0,1],[-3,-3],[-1,-5],[0,-4],[0,-2],[-3,-1],[-7,0],[-4,1],[-4,1],[-1,1],[1,3],[-1,1],[-2,-3],[-1,-5],[-3,-1],[-9,2],[-12,-1],[-5,-3],[-4,1],[-6,4],[-2,4],[-1,7],[0,3],[5,2],[3,0],[2,1],[-2,1],[-3,3],[-2,4],[-3,1],[-2,4],[0,6],[0,4],[2,1],[4,-1],[9,1],[9,-4],[7,-2],[12,1],[7,3],[-1,1],[-8,-2],[-7,0],[-13,4],[-5,2],[-6,-1],[-3,1],[-2,4],[1,8],[3,2],[2,-2],[1,0],[2,3],[2,2],[1,4],[5,4],[2,0],[4,2],[2,-1],[1,-1],[1,-2],[4,0],[10,3],[1,1],[2,3],[-6,-1],[-6,-2],[-3,-1],[-1,3],[2,2],[2,2],[1,4],[2,1],[2,0],[5,1],[4,1],[6,-1],[9,-1],[6,-4],[2,0],[2,1],[1,2],[-4,1],[-1,2],[1,2],[7,2],[8,1],[-1,2],[-18,-3],[-4,2],[-4,0],[-2,-1],[-7,-2],[-1,1],[1,4],[4,7],[0,1],[2,2],[11,4],[5,4],[2,1],[2,-1],[4,1],[6,-1],[4,-6],[2,-1],[9,-7],[0,2],[-8,9],[-3,2],[-2,5],[1,4],[2,3],[9,2],[1,1],[1,3],[-2,2],[-3,0],[-3,1],[0,3],[1,2],[5,4],[2,1],[5,2],[8,-3],[1,-2],[-2,-4],[0,-2],[2,0],[4,6],[6,1],[2,2],[3,0],[4,-5],[1,-2],[1,-1],[2,-5],[1,0],[1,2],[3,2],[5,1],[7,-2],[3,1],[1,0],[-1,4],[-1,2],[1,3],[2,2],[5,3],[4,1],[3,2],[4,3],[0,2],[-1,2],[-3,0],[-1,1],[3,3],[5,3],[-1,2],[-3,1],[-3,-1],[-4,-3],[-4,-3],[1,-2],[2,-3],[-3,-4],[-16,-12],[-8,-3],[-4,1],[-1,3],[-1,2],[-2,5],[-3,0],[-2,-1],[-1,1],[2,5],[2,4],[4,3],[3,4],[2,6],[6,5],[9,14],[7,5],[3,4],[5,2],[3,4],[3,1],[6,3],[3,4],[-2,0],[-5,-2],[-3,-1],[0,4],[2,4],[4,4],[18,12],[2,-2],[2,-3],[6,0],[6,7],[5,7],[-2,-1],[-3,-3],[-6,-4],[-3,-1],[-1,1],[-1,3],[-2,0],[-2,0],[-1,2],[-1,5],[3,7],[1,4],[2,4],[8,10],[2,6],[3,3],[5,-1],[1,1],[-1,3],[-5,3],[0,2],[16,5],[8,0],[3,2],[4,2],[3,2],[-1,2],[-8,-3],[-6,-1],[-2,0],[-2,-1],[-6,0],[-2,11],[1,6],[3,0],[0,6],[3,4],[4,1],[2,1],[3,3],[4,-1],[5,1],[-1,1],[-6,2],[-1,4],[2,1],[2,2],[2,0],[4,6],[2,3],[3,-1],[4,3],[3,-1],[4,2],[5,1],[18,1],[0,2],[-4,1],[-13,0],[-6,0],[-3,0],[-1,1],[0,1],[2,2],[1,3],[5,7],[6,4],[4,-1],[5,-4],[4,-1],[1,-1],[2,-6],[2,0],[-1,5],[3,5],[-1,1],[-4,-1],[-4,1],[-3,4],[-1,3],[2,3],[2,1],[-1,2],[-8,-5],[-5,-1],[-2,1],[1,4],[0,4],[6,8],[3,1],[4,-1],[3,-2],[3,0],[3,2],[0,2],[-7,1],[-2,2],[1,1],[5,2],[4,4],[6,1],[4,3],[1,-1],[1,-1],[1,-10],[4,-8],[2,0],[-2,7],[1,2],[2,1],[1,2],[-2,0],[-2,3],[-2,8],[1,2],[5,4],[6,1],[7,-3],[2,0],[4,1],[7,2],[4,1],[2,0],[1,1],[-2,1],[-1,1],[-1,0],[-7,-1],[-17,0],[-2,2],[0,2],[2,4],[2,2],[6,3],[7,0],[8,7],[2,4],[2,7],[4,6],[11,3],[1,2],[-1,2],[0,6],[3,6],[2,2],[1,0],[2,-2],[3,-4],[4,-2],[6,-1],[2,1],[-5,3],[-3,3],[0,3],[1,2],[3,0],[3,0],[3,2],[0,2],[1,2],[0,2],[5,5],[13,3],[1,-1],[0,-10],[-2,-6],[0,-4],[3,4],[3,13],[3,6],[3,3],[2,1],[2,1],[3,2],[1,-2],[1,-3],[-2,-11],[0,-3],[-1,-5],[-7,-10],[1,-2],[1,1],[2,1],[9,10],[7,-1],[0,1],[-3,3],[-2,3],[-1,3],[0,9],[2,4],[6,-1],[4,1],[2,-2],[3,0],[3,7],[5,0],[4,-4],[5,-3],[5,-4],[1,1],[-2,10],[-3,3],[-5,2],[-6,5],[-2,2],[1,1],[5,2],[6,-2],[6,4],[2,-1],[5,1],[2,-2],[2,1],[1,3],[8,2],[4,-2],[3,-2],[1,-4],[2,-7],[3,-5],[2,-2],[3,0],[1,2],[-2,2],[-1,3],[1,6],[2,2],[8,9],[6,4],[4,1],[7,10],[2,2],[2,0],[-1,3],[-3,1],[-1,3],[5,4],[6,6],[3,1],[2,-2],[6,-3],[4,-3],[2,-2],[2,1],[1,2],[2,1],[4,0],[2,-2],[2,0],[1,-1],[1,-2],[-4,-3],[-5,-6],[-6,-6],[-1,-4],[-2,-10],[-4,-6],[-1,-4],[2,-2],[5,2],[6,5],[1,6],[14,17],[7,9],[8,7],[4,2],[2,-5],[-2,-7],[-3,-4],[3,-2],[-1,-5],[-1,-2],[0,-3],[0,-3],[2,1],[9,5],[2,6],[3,4],[1,4],[3,3],[7,0],[0,1],[-8,5],[-1,2],[3,3],[7,6],[4,-1],[2,-1],[9,-1],[7,-4],[0,-6],[-2,-3],[-1,-1],[-9,-5],[-2,-2],[3,-1],[6,2],[2,-2],[-2,-5],[0,-8],[-1,-5],[0,-4],[1,-2],[2,9],[1,2],[3,4],[2,6],[3,8],[4,5],[2,1],[8,0],[3,-2],[3,-3],[2,-2],[7,-2],[2,-2],[0,-1],[2,0],[5,3],[3,0],[4,-4],[-1,-4],[1,-1],[5,0],[5,-1],[9,-7],[1,-4],[0,-4],[-13,-4],[-6,-4],[-9,-2],[-32,3],[1,-3],[22,-7],[1,-2],[-1,-4],[0,-3],[1,-2],[1,-2],[3,-1],[5,1],[3,-2],[2,2],[1,6],[1,1],[3,-2],[2,-6],[1,0],[1,4],[3,0],[4,0],[4,-1]],[[5710,9281],[8,-2],[2,0],[4,-4],[2,1],[-1,-3],[-3,-1],[-6,-1],[-1,0],[-5,0],[-3,3],[-4,1],[0,1],[3,3],[4,2]],[[4751,9264],[-3,0],[-1,1],[4,3],[12,7],[5,6],[9,3],[1,-4],[-1,-4],[-8,-4],[-9,-2],[-9,-6]],[[5533,9469],[-3,-3],[-5,4],[-3,4],[1,2],[9,0],[2,-2],[1,-2],[-2,-3]],[[5600,9711],[3,-2],[9,1],[4,-10],[3,-10],[4,-1],[8,1],[7,1],[4,-1],[6,-3],[3,-2],[-3,-2],[-5,-1],[-1,-6],[6,-2],[9,-5],[6,0],[10,2],[9,-4],[9,-5],[-21,-5],[-2,-2],[-3,-4],[-3,-3],[-3,-2],[-7,-4],[-3,-1],[-8,0],[-3,-1],[-2,-3],[-3,-2],[-7,-1],[-4,3],[2,1],[0,2],[-1,4],[6,4],[2,2],[-1,1],[-2,0],[-5,1],[-1,0],[-4,-3],[-6,-1],[-5,-1],[-23,-3],[-3,1],[-2,6],[9,4],[2,5],[2,3],[3,3],[5,6],[1,0],[-12,5],[-5,3],[-6,6],[-1,5],[-7,4],[1,6],[-6,-1],[-4,4],[4,2],[19,3],[11,2],[5,0]],[[5746,9714],[-4,0],[-8,4],[-1,4],[1,1],[4,0],[6,-5],[6,-1],[-4,-3]],[[5312,9712],[0,-4],[5,0],[5,-4],[6,-2],[2,-2],[1,-2],[3,-4],[2,-4],[-4,-1],[-6,6],[-5,4],[-6,3],[-4,0],[-3,1],[-7,11],[-2,2],[-4,4],[-2,5],[0,3],[6,0],[5,-3],[4,-5],[1,-2],[-2,-2],[2,-3],[3,-1]],[[5806,9729],[9,0],[8,1],[1,-1],[-10,-3],[-12,1],[-11,1],[-13,-4],[-4,2],[7,3],[7,1],[1,2],[2,0],[10,0],[5,-3]],[[5466,9786],[1,0],[2,1],[1,1],[1,1],[7,-1],[10,-3],[3,-2],[4,-3],[3,-5],[-2,-4],[-4,-4],[-1,-2],[1,-3],[0,-3],[-2,-3],[6,3],[11,10],[2,0],[1,0],[6,-2],[4,-5],[1,-1],[1,-2],[1,-3],[-1,-3],[0,-1],[-3,-2],[-1,-1],[3,0],[3,-1],[3,-4],[3,-1],[11,1],[7,-1],[4,-6],[6,1],[0,3],[2,1],[8,0],[4,-2],[4,-3],[-7,-4],[6,-4],[10,-3],[6,-4],[2,-1],[1,-2],[-4,-2],[-5,-2],[-10,0],[-9,-1],[-17,-2],[-3,0],[-1,-1],[-1,-2],[-6,-5],[-7,-6],[-2,-3],[-2,-5],[-1,-3],[1,-3],[0,-3],[-5,-2],[-3,0],[-4,0],[-3,-1],[-1,-2],[1,-3],[-1,-8],[-1,-7],[-2,-6],[-2,-3],[-3,-1],[-8,-1],[-6,-5],[-5,-10],[-3,-4],[-5,-6],[1,-3],[2,-2],[-3,-4],[-5,-5],[0,-2],[2,-3],[0,-4],[-3,-3],[-7,-1],[-6,1],[-3,2],[-3,4],[-4,2],[-3,1],[-13,7],[-11,12],[-11,4],[-7,2],[-3,2],[-4,3],[-3,3],[-2,4],[-2,3],[0,3],[1,2],[1,1],[9,1],[3,0],[3,-2],[3,-1],[6,10],[36,5],[11,1],[12,0],[-2,2],[-2,4],[-1,0],[-9,-1],[-13,-2],[-7,0],[-7,1],[-6,-1],[-7,-3],[-7,-1],[-7,-1],[-14,0],[-4,2],[-4,3],[-2,2],[-1,2],[-1,6],[2,2],[1,1],[1,0],[4,0],[3,-1],[7,-3],[-2,4],[21,4],[10,4],[5,1],[5,0],[-2,2],[0,2],[4,1],[2,1],[8,1],[17,0],[7,1],[4,3],[-5,-1],[-5,-1],[-2,1],[-5,2],[-3,3],[7,7],[3,3],[-7,-1],[-3,-1],[-8,-6],[-6,-2],[-7,-1],[-7,0],[-2,1],[-2,3],[-1,2],[0,2],[3,3],[1,3],[0,3],[-2,0],[-3,-2],[-2,-4],[-3,-2],[-4,0],[-1,2],[-2,2],[-1,1],[-2,0],[-3,-1],[-3,-2],[1,-2],[1,-3],[-2,-2],[-1,-3],[4,-2],[2,-3],[-4,-1],[-4,-2],[-3,-3],[-4,-2],[-5,0],[-7,-1],[-14,-1],[-7,4],[-1,2],[-1,1],[-5,2],[-6,5],[-5,7],[-3,0],[-5,2],[-3,2],[-2,3],[-1,3],[0,2],[3,1],[-7,3],[-7,4],[3,2],[2,0],[20,-4],[2,0],[2,2],[-1,1],[-3,1],[-5,0],[-1,0],[-2,3],[-1,3],[-1,2],[0,2],[3,3],[2,3],[-3,2],[-8,0],[-3,-1],[1,-4],[-2,-3],[-6,-3],[-3,2],[-3,5],[-4,5],[-1,2],[-1,4],[-2,3],[-2,3],[-1,2],[1,2],[2,3],[-2,3],[-2,2],[0,2],[2,2],[2,0],[1,0],[5,-2],[3,-3],[1,1],[2,3],[3,1],[10,1],[11,-4],[3,-2],[2,0],[-1,2],[-1,3],[2,1],[9,-2],[4,0],[10,3],[16,2],[6,-3],[0,-1],[0,-2],[0,-1],[-4,-2],[-20,-1],[-14,-7],[19,1],[3,-1],[1,-5],[2,-1],[4,-1],[3,-1],[4,-3],[3,-2],[2,0],[1,2],[-1,3],[0,3],[0,3],[0,3],[4,2],[6,6],[6,4],[6,-2],[7,-5],[5,-8],[5,-7],[6,-10],[3,-4],[3,-1],[12,-10],[1,0],[-2,8],[-6,13],[-5,10],[-1,4],[0,5],[0,2],[1,1],[3,6],[4,3],[-2,4],[2,3],[4,3],[4,0],[3,-2],[8,-7]],[[5903,9799],[-26,-3],[-3,2],[43,6],[2,1],[8,1],[7,-2],[-2,-1],[-29,-4]],[[5520,9809],[-6,-3],[-10,2],[1,3],[3,1],[6,0],[6,-3]],[[5580,9806],[3,-1],[15,1],[3,-2],[1,-3],[2,-1],[4,-1],[8,-4],[3,0],[2,2],[2,6],[0,6],[-1,4],[1,2],[3,1],[3,-1],[4,2],[2,2],[4,0],[6,-2],[2,-1],[-2,-2],[0,-4],[-3,-8],[6,0],[9,2],[3,2],[5,3],[5,0],[3,0],[1,2],[0,1],[3,0],[4,-3],[2,-1],[4,1],[1,0],[3,-1],[16,-3],[5,-1],[3,-1],[2,-1],[17,0],[12,-1],[4,-2],[4,-4],[1,-9],[-3,-2],[-24,-11],[-6,-3],[-3,-4],[-5,-7],[-2,-2],[-11,-3],[-3,0],[-8,1],[-3,0],[-10,-4],[-4,-2],[-3,-3],[-5,-1],[-6,1],[-23,1],[-4,2],[-2,4],[5,5],[-27,-2],[-29,1],[-2,1],[-1,2],[-10,1],[-7,1],[-7,3],[-6,3],[2,2],[2,1],[5,0],[5,-1],[9,1],[2,3],[3,1],[3,2],[-9,2],[-10,0],[-6,-2],[-7,-1],[-7,0],[-12,0],[-6,2],[-9,4],[-3,2],[-1,1],[0,3],[9,2],[4,1],[3,3],[-14,1],[-6,2],[-6,3],[5,2],[19,1],[5,-1],[5,-2],[6,-2],[5,3],[-5,1],[-4,5],[-1,2],[0,2],[3,0],[1,-1],[7,-4],[5,-1],[2,4],[0,1],[-1,2],[-3,3],[-2,3],[4,1],[3,0],[7,-3],[7,-1],[3,-2],[6,-4],[6,-3]],[[9637,5154],[-1,-2],[-1,2],[1,1],[0,1],[1,-1],[0,-1]],[[9698,2160],[2,-3],[-3,-1],[-1,1],[-1,1],[-1,2],[2,0],[1,1],[1,-1]],[[9616,2260],[1,-5],[-2,0],[-3,1],[-1,3],[-2,-2],[-2,0],[1,3],[4,5],[1,6],[0,2],[3,0],[1,0],[1,-1],[-1,-1],[-1,-2],[0,-3],[0,-2],[-1,-1],[1,-2],[0,-1]],[[9670,2485],[0,-3],[-3,1],[0,-2],[2,-2],[1,-2],[2,1],[1,-3],[-1,-2],[-1,-2],[-5,-1],[-3,-4],[-3,1],[-3,-4],[-4,-2],[-1,1],[1,3],[2,3],[0,4],[1,2],[3,2],[0,3],[1,3],[-1,6],[1,6],[4,0],[6,-9]],[[9631,2554],[0,-3],[-1,-1],[-1,0],[-1,0],[-1,1],[-1,0],[-1,1],[1,3],[3,1],[1,-1],[1,-1]],[[9637,2582],[2,-7],[-3,1],[-1,2],[2,3],[0,1]],[[106,2631],[-1,-1],[0,4],[0,2],[2,1],[1,-3],[-2,-3]],[[106,2664],[-1,-1],[-2,0],[-2,-6],[0,5],[-1,1],[-3,0],[0,-1],[1,-1],[1,-1],[-2,-2],[2,-6],[1,0],[2,-4],[0,-1],[-3,-2],[-2,-2],[-2,0],[-1,0],[0,4],[0,2],[1,3],[2,3],[-1,3],[-3,2],[-4,-1],[-1,1],[2,3],[3,0],[2,3],[11,-2]],[[9830,2830],[-4,-3],[0,2],[1,5],[2,3],[1,0],[1,2],[0,-4],[-1,-5]],[[9808,2806],[3,0],[3,4],[3,4],[3,2],[5,7],[1,1],[4,1],[1,2],[1,0],[-1,-4],[-2,-1],[0,-2],[1,-2],[-2,-3],[1,-4],[-2,-4],[2,1],[2,3],[-1,2],[1,4],[2,1],[-1,3],[0,2],[3,-1],[1,0],[1,1],[1,0],[1,-2],[2,0],[-1,-3],[-2,-3],[0,-2],[-3,-3],[-2,-2],[3,0],[4,4],[3,4],[0,-5],[-2,-4],[-2,-3],[-2,-1],[-2,-2],[-1,-3],[0,-3],[1,-2],[2,-3],[-2,-6],[2,0],[1,-1],[2,-3],[-1,-5],[-1,-2],[-4,-9],[-2,-4],[-3,-3],[0,-5],[-1,-3],[-7,-12],[-1,-2],[-6,-19],[-3,-8],[-2,-2],[-2,-2],[-6,-4],[-2,-4],[-2,-4],[-3,-1],[0,-1],[2,-1],[1,-2],[-1,-3],[-2,-2],[-2,0],[-1,-2],[5,1],[1,-1],[1,-3],[0,-2],[1,-4],[4,-2],[4,-1],[0,-1],[1,-6],[-1,-3],[-1,-1],[-1,-1],[-3,0],[-2,1],[-2,3],[-6,-1],[-1,-1],[-1,1],[3,4],[-2,1],[-1,1],[-1,-1],[-1,-2],[0,-3],[-1,-1],[-2,-1],[-2,3],[-2,3],[-3,4],[0,-3],[3,-5],[1,-4],[-3,-2],[-3,-3],[-2,-1],[-3,-2],[-2,-3],[-2,-1],[-4,0],[-2,-1],[0,-5],[-2,-2],[-3,-1],[1,-1],[1,-1],[-3,-13],[0,-5],[0,-9],[-2,-8],[-4,0],[1,-2],[3,-2],[-1,-3],[-3,-7],[-2,-4],[-1,-9],[-2,-8],[-3,-10],[0,-1],[1,-3],[1,-2],[0,-3],[0,-1],[-2,-1],[-1,-1],[-7,-2],[-2,-3],[-2,-5],[-3,-5],[-7,-10],[-4,-8],[-1,-3],[-1,-2],[-10,-3],[-7,-1],[-3,1],[-4,2],[-2,1],[-4,-2],[-1,-1],[-3,1],[-3,-1],[0,1],[-1,3],[0,3],[0,3],[-2,1],[-1,2],[-1,1],[-3,1],[-5,-1],[-2,0],[-3,8],[-1,2],[-4,3],[-1,-1],[-3,-4],[-1,-1],[-7,0],[-8,1],[-3,2],[0,4],[6,10],[-2,-2],[-4,-4],[-2,1],[2,4],[1,2],[-1,3],[-3,-4],[-3,-1],[-1,4],[1,4],[0,1],[9,2],[4,2],[1,2],[-5,1],[-1,3],[1,2],[5,4],[-4,-1],[-3,1],[0,4],[1,3],[4,0],[-2,3],[0,3],[1,0],[4,-4],[3,-2],[-1,3],[0,3],[1,0],[2,1],[0,1],[-3,1],[-2,2],[0,3],[0,3],[2,4],[2,-3],[2,1],[-1,2],[-1,3],[0,2],[6,8],[2,-8],[0,3],[0,2],[0,2],[0,2],[0,2],[3,2],[3,6],[3,2],[2,-2],[1,-2],[0,2],[-1,2],[0,6],[4,8],[5,8],[5,8],[2,3],[6,3],[3,-1],[1,0],[5,6],[2,1],[2,-2],[1,-1],[-1,6],[1,2],[4,5],[6,4],[4,2],[3,3],[2,0],[-1,2],[1,3],[1,-1],[1,1],[-2,2],[5,4],[2,5],[1,1],[2,1],[1,4],[2,1],[1,-1],[1,-1],[0,2],[-2,2],[2,2],[2,2],[2,-1],[2,-2],[-2,3],[0,2],[2,2],[2,0],[2,-4],[-1,3],[1,3],[3,5],[3,7],[1,-2],[1,-3],[-1,-4],[1,1],[0,3],[0,7],[4,11],[1,1],[1,1],[2,0],[-1,2],[-1,2],[1,5],[1,7],[1,6],[2,6],[2,10],[1,3],[4,0],[1,2],[3,4],[3,6],[2,6],[2,14],[2,14],[3,11],[6,8],[5,6],[2,1],[3,1],[3,-2],[-6,-1],[0,-4],[-1,-4],[1,-3],[1,-3],[3,-2],[3,-2],[2,-6],[0,-7],[0,-6],[2,-6]],[[9875,3094],[0,-3],[-2,1],[-1,3],[-2,2],[0,1],[-1,4],[2,3],[0,1],[1,0],[0,-2],[2,-4],[1,-6]],[[9812,3172],[0,-3],[2,2],[1,3],[2,3],[0,-5],[1,-1],[6,-3],[1,-3],[1,-1],[1,1],[1,1],[2,-1],[5,-5],[1,-2],[-1,-3],[1,-2],[0,-2],[2,-1],[2,3],[1,1],[2,-5],[0,-2],[1,-3],[1,-2],[2,-8],[0,-2],[-1,-3],[2,-6],[-1,-1],[-4,1],[0,-1],[3,-5],[2,-7],[1,-4],[6,-14],[-1,-4],[0,-3],[-1,-3],[2,-7],[-1,-2],[-1,-7],[-1,-2],[0,-2],[3,-1],[1,-1],[1,-2],[1,2],[1,1],[2,-3],[6,-4],[1,-1],[1,-3],[1,-6],[1,-3],[2,-1],[2,1],[1,2],[-1,7],[-1,10],[0,4],[0,3],[0,4],[-1,3],[-1,2],[-1,2],[0,3],[2,2],[1,-3],[1,-3],[4,-10],[3,1],[0,-4],[2,-4],[0,-5],[2,-14],[2,-14],[3,-5],[0,-3],[-2,1],[0,-1],[0,-1],[2,-2],[2,-2],[2,0],[1,-1],[9,-8],[4,-4],[11,-5],[3,-1],[2,1],[3,2],[3,3],[3,5],[2,6],[2,3],[3,2],[1,2],[2,2],[7,-1],[2,-3],[4,-2],[1,-2],[0,-4],[-2,-6],[-2,-6],[-1,-14],[-1,-14],[-1,-6],[-3,-4],[-2,-4],[-3,-2],[-1,-7],[-1,-10],[0,-2],[1,-2],[1,-3],[-2,-5],[-1,0],[-1,5],[-1,2],[-4,2],[-4,0],[-3,0],[-3,-2],[-5,-4],[-1,-2],[-1,-3],[-3,-6],[0,-7],[0,-4],[1,-2],[4,-4],[-4,-14],[-4,-14],[-2,-4],[-2,-4],[-2,-9],[-4,-7],[-2,-6],[-2,-5],[-2,-7],[-4,-8],[-1,-6],[-3,-5],[-4,-6],[-4,-5],[-6,-8],[-2,-2],[-2,-2],[-3,2],[0,2],[-1,5],[0,2],[-3,2],[-4,-3],[-1,1],[0,1],[0,7],[0,2],[-1,1],[-1,0],[0,-2],[1,-1],[-3,-2],[-2,-1],[-1,1],[0,2],[1,2],[0,2],[5,9],[5,12],[4,13],[1,7],[1,12],[-1,5],[-2,5],[-4,10],[-5,5],[-4,1],[-3,2],[-3,4],[-3,5],[-6,5],[-5,3],[-4,5],[-1,3],[0,3],[0,3],[0,3],[1,3],[1,1],[6,7],[7,3],[1,0],[1,1],[2,2],[3,5],[1,3],[1,10],[0,10],[2,12],[3,7],[1,5],[-1,7],[1,3],[1,1],[1,1],[-2,7],[-3,11],[0,3],[0,3],[1,3],[-2,1],[-1,3],[-2,10],[0,2],[2,-1],[2,-8],[0,4],[2,2],[1,2],[2,0],[-4,8],[-1,0],[-2,-2],[-2,-1],[-2,1],[-1,2],[-1,3],[-1,7],[-1,2],[-5,14],[1,0],[5,-6],[0,2],[1,3],[0,3],[-1,3],[-2,2],[0,3],[1,2],[0,2],[-2,4],[-1,1],[-1,-2],[1,-3],[-1,0],[-6,7],[-1,6],[-2,7],[0,-3],[0,-4],[2,-7],[4,-8],[1,-3],[-1,-2],[-1,-1],[-1,2],[-2,7],[-1,3],[-15,37],[2,4],[3,4],[1,2],[0,2],[-1,1],[-1,-1],[-2,-2],[-1,-2],[-1,-5],[-1,-1],[-2,3],[0,2],[0,3],[-1,1],[-1,1],[-2,5],[-1,2],[2,5],[0,6],[-2,6],[-3,6],[-4,10],[-5,10],[5,2],[5,0],[-2,-6],[1,-4],[1,-3],[3,-9],[1,-3],[1,-2],[1,-2]],[[245,4645],[-1,1],[1,0],[0,-1]],[[209,4690],[0,-1],[0,1],[-1,1],[0,1],[1,-1],[0,-1]],[[6631,6348],[-2,-1],[-1,1],[0,7],[4,9],[3,11],[2,-10],[-3,-5],[-2,-9],[-1,-3]],[[6566,6623],[3,-16],[4,-14],[3,-8],[4,-10],[6,-10],[3,-3],[11,-7],[6,-3],[8,-2],[5,-6],[2,0],[3,2],[3,0],[5,-8],[2,-7],[2,-3],[2,-6],[1,-6],[5,-9],[3,-10],[3,-8],[3,-5],[5,-2],[3,-2],[0,-5],[0,-6],[-1,-5],[-3,-10],[-1,-6],[-3,-10],[-4,-16],[-2,-4],[-7,-8],[-5,-10],[-5,-18],[-5,-17],[-1,-6],[-4,-1],[-2,1],[-2,1],[1,5],[0,5],[-2,0],[-2,-1],[-4,-13],[-2,-6],[-1,-7],[-1,-10],[-2,-8],[0,-8],[0,-4],[1,-10],[0,-10],[1,-6],[0,-8],[-2,-2],[-2,-1],[-6,-1],[-7,-2],[-7,-5],[-3,-4],[-5,-10],[-3,-24],[-4,-10],[-4,-2],[-7,-1],[-11,-3],[-4,-2],[-6,-15],[0,-5],[1,-3],[0,-4],[0,-4],[-3,-9],[-3,-7],[-8,-4],[-3,2],[-3,2],[-5,0],[-9,-2],[-3,-5],[-5,-3],[-4,-6],[-9,-2],[-6,-4]],[[6474,6143],[-2,7],[-1,8],[-2,7],[-2,8],[-1,5],[-2,2],[-1,6],[-1,6],[-2,5],[-1,6],[-1,6],[-1,6],[-2,5],[-1,6],[-1,6],[-1,6],[-1,5],[-2,6],[-1,6],[-1,6],[-1,5],[-2,6],[-1,6]],[[6443,6278],[4,3],[5,3],[5,3],[4,4],[5,3],[5,3],[5,3],[5,4],[4,3],[5,3],[5,4],[5,3],[4,3],[5,4],[5,3],[5,3],[5,3],[3,3],[1,7],[1,7],[1,6],[1,6],[1,7],[1,6],[1,6],[1,7],[1,6],[1,7],[1,6],[1,6],[1,7],[1,6],[1,6],[1,7],[1,6],[1,6],[-2,6],[-2,7],[-3,8],[-2,8],[-2,5],[-2,7]],[[6557,6685],[2,8],[1,2],[1,-1],[2,1],[2,4],[0,3],[1,0],[1,-2],[0,-7],[-1,-5],[-1,-18],[-1,-3],[-1,-2],[0,-4]],[[6893,6558],[-1,-4],[-1,-2],[-1,4],[-1,1],[-1,-1],[-1,0],[-3,5],[-1,-5],[-4,-1],[-1,4],[0,3],[-2,-3],[-2,4],[0,4],[-1,1],[-1,2],[-1,1],[-2,5],[0,5],[-1,6],[-3,23],[-2,2],[-11,4],[0,4],[0,10],[0,7],[-4,9],[-1,6],[-2,5],[-3,1],[-3,0],[-2,-2],[-1,-4],[7,1],[1,-1],[2,-3],[-2,0],[-2,2],[-3,0],[-10,-3],[-5,-4],[-8,1],[-9,-3],[-8,-1],[-4,-7],[-1,2],[-2,1],[-11,6],[0,2],[-2,2],[-2,-3],[-2,-1],[-6,3],[-4,-2],[-2,-3],[0,-5],[-6,1],[-3,1],[-4,-1],[-10,2],[-3,-1],[-3,-3],[-2,-2],[-2,-1],[-2,3],[-1,2],[-1,-1],[-2,-3],[-5,-2],[-5,1],[-4,2],[0,1]],[[2733,5606],[-2,0],[-3,2],[-2,5],[0,2],[0,1],[1,5],[2,2],[2,-6],[-1,-2],[0,-4],[3,-2],[0,-3]],[[2803,5659],[-1,-2],[0,2],[1,3],[0,-3]],[[2808,5660],[0,-2],[-2,5],[0,2],[0,5],[2,1],[1,0],[0,-1],[1,-5],[-1,-3],[-1,-2]],[[2715,5724],[0,-3],[-2,5],[1,1],[1,0],[0,-3]],[[2836,5600],[-1,2],[-7,16],[-5,21],[-2,9],[2,1],[1,-1],[1,2],[1,3],[-1,6],[3,5],[1,3],[1,-1],[2,-5],[2,-3],[4,-5],[2,-1],[-3,5],[-4,6],[-2,4],[-1,6],[-1,-2],[-1,-2],[-1,-2],[-1,2],[0,2],[-3,0],[0,2],[-1,1],[0,-4],[1,-2],[0,-3],[-1,0],[-1,3],[-1,2],[-1,11],[-3,5],[-2,1],[-1,1],[-1,3],[-3,2],[-2,5],[-4,4],[-5,1],[-5,0],[-2,-3],[-1,-2],[-1,-1],[-3,-3],[-1,-5],[-1,-3],[-1,-5],[1,-2],[-10,-14],[-2,-2],[-5,-2],[-1,-1],[-1,-3],[0,-4],[0,-4],[1,-3],[1,-2],[3,-8],[5,-11],[1,-3],[1,-6],[-1,-3],[-2,-1],[-4,0],[-2,-3],[-1,-3],[-2,-3],[-6,-3],[-5,0],[-2,3],[0,9],[-3,16],[-1,11],[-1,-2],[-2,-1],[0,-2],[-1,-9],[0,-2],[-2,0],[-3,3],[-3,3],[-5,17],[-1,3],[0,4],[-4,1],[-3,3],[-4,0],[-1,-1],[-2,2],[-1,5],[-3,-3],[-5,1],[-4,2],[-3,-1],[-2,-3],[0,-9],[0,-1]],[[2706,5735],[2,-3],[4,-5],[0,-3],[0,-2],[1,-8],[1,-1],[2,2],[1,-2],[-1,-1],[-1,-2],[0,-6],[3,-3],[2,-3],[5,2],[2,-1],[1,1],[-1,5],[-2,4],[0,1],[1,-1],[1,-3],[3,-3],[5,-11],[5,-2],[4,0],[4,1],[6,5],[5,7],[3,4],[12,7],[4,8],[2,1],[2,1],[3,6],[2,4],[2,3],[6,-2],[4,-2],[3,0],[3,-1],[1,-4],[1,-1],[7,0],[5,-1],[12,-10],[7,-10],[3,-10],[9,-13]],[[1436,3779],[0,-1],[-1,0],[0,2],[0,2],[0,1],[1,-1],[0,-2],[0,-1]],[[3044,4127],[-2,4],[-9,13],[-4,7],[-3,3],[-8,11],[-1,4],[-1,11],[-1,4],[-2,4],[-7,5],[-3,3],[-2,5],[-4,3],[-5,8],[-2,6],[-3,3],[-9,6],[-5,5],[-8,8],[-4,5],[-9,6],[-3,2],[-9,14],[-6,5],[-5,8],[-16,16],[-2,5],[-2,9],[-4,4],[-3,12],[-6,6],[-6,9],[-2,8],[-3,10],[-1,5],[-3,6],[-1,10],[-2,5],[2,3],[1,1],[2,16],[-1,9],[-5,15],[-2,7],[-2,9],[-2,6],[-3,11],[-3,11],[-4,7],[-1,3],[-1,3],[-2,3],[-1,8],[-1,15],[-3,8],[-9,14],[0,5],[-1,10],[-2,11],[-10,33],[-2,10],[-3,16],[-2,9],[-2,16],[-4,12],[-2,11],[-3,13],[0,7],[-5,13],[-2,11],[-4,9],[-4,7],[-2,5],[-6,24],[-1,8],[-4,13],[-4,9],[-2,8],[-4,7],[-19,21],[-7,9],[-2,4],[-1,7],[0,3],[2,4],[3,-3],[2,1],[1,5],[0,7],[-2,9],[-6,18],[1,4],[1,4],[-3,9],[-2,7],[-2,5],[2,20],[1,5],[10,20],[2,9],[4,5],[5,8],[4,7]],[[8339,5487],[0,-4],[-1,-2],[-1,1],[-1,2],[-1,-2],[-2,-2],[-2,-4],[-2,-1],[-1,1],[0,3],[4,6],[3,2],[2,4],[1,0],[1,-3],[0,-1]],[[8365,5534],[1,-4],[2,1],[3,-1],[1,-3],[0,-1],[-4,-4],[-2,4],[-3,-3],[-2,2],[-3,-2],[-1,4],[0,3],[4,5],[4,-1]],[[8391,5554],[-3,-1],[-1,0],[-2,6],[0,3],[-2,3],[0,3],[3,0],[4,4],[6,-6],[1,-2],[-2,-1],[-1,-6],[-3,-3]],[[8493,5585],[0,-3],[-2,7],[-1,2],[1,7],[2,-3],[0,-10]],[[8414,5611],[0,-2],[0,-1],[-3,-3],[-1,0],[0,5],[1,2],[1,-2],[1,2],[1,-1]],[[8251,5638],[-1,-4],[-2,5],[1,7],[0,1],[2,2],[0,-11]],[[8259,5657],[-2,-1],[0,3],[0,4],[1,-1],[1,-1],[0,-4]],[[8466,5710],[-1,-3],[-3,3],[-1,2],[1,3],[1,1],[1,0],[2,-3],[0,-3]],[[8435,5716],[0,-6],[-2,-2],[-2,2],[-1,3],[0,2],[1,-1],[2,4],[1,0],[1,-2]],[[8498,5736],[0,-1],[-1,3],[1,7],[0,1],[1,-4],[-1,-6]],[[8499,5721],[3,-4],[3,1],[-1,-9],[1,-2],[3,-8],[0,-6],[-2,-6],[-1,-2],[-2,-4],[0,-2],[1,-2],[3,-1],[2,-4],[1,-9],[2,-7],[0,-3],[-1,-13],[0,-5],[2,-4],[1,-2],[1,-3],[1,-8],[0,-12],[-1,-5],[-1,-4],[-3,-9],[-4,-8],[-2,1],[-1,-3],[2,-6],[-1,-15],[-1,-10],[-1,5],[-1,6],[-1,14],[-1,6],[-1,6],[-1,5],[-2,5],[-2,12],[-1,0],[-2,-4],[-1,-2],[0,-4],[-1,-3],[-3,-5],[-2,-6],[-1,-7],[-1,-6],[1,-5],[2,-2],[2,-4],[1,-2],[2,-14],[0,-14],[-2,-6],[-4,-12],[-3,-4],[-2,2],[-1,7],[0,3],[1,7],[0,6],[-1,2],[-1,0],[-1,-1],[-3,-8],[-1,-2],[-1,0],[-2,0],[-8,7],[-6,7],[-5,7],[-4,10],[-1,7],[0,8],[-2,11],[0,4],[0,4],[2,7],[2,3],[1,3],[1,2],[1,4],[-1,4],[0,2],[-4,8],[-2,5],[-6,5],[-1,2],[-2,2],[-1,1],[-2,0],[-1,-1],[-1,-3],[0,-3],[0,-3],[-2,-15],[-3,4],[-3,3],[-1,3],[0,3],[-1,2],[0,2],[-2,-5],[-1,-4],[-2,0],[-3,-1],[0,2],[-1,10],[-2,3],[-3,-1],[-3,-5],[-1,-2],[0,-5],[-4,-12],[-2,-10],[-2,-10],[-1,-3],[-1,-2],[-2,1],[-2,2],[-2,6],[1,7],[2,5],[1,5],[2,17],[0,6],[1,3],[3,7],[2,5],[2,1],[5,3],[3,2],[3,0],[3,2],[3,3],[0,4],[0,4],[0,3],[1,2],[1,2],[2,2],[4,2],[1,1],[1,3],[2,5],[2,-1],[1,-2],[4,-2],[3,-4],[1,-6],[1,-4],[0,-11],[0,-2],[-3,-5],[1,-1],[4,5],[2,2],[4,2],[1,2],[1,2],[1,7],[2,7],[1,3],[1,2],[1,1],[5,-5],[3,2],[1,7],[0,11],[1,3],[2,3],[2,-1],[3,-4],[2,-1],[1,3],[1,6],[1,0],[4,-2],[3,1],[1,7],[0,8],[-3,23],[1,5],[2,0],[3,-6],[7,-8],[2,-5],[1,-6]],[[8501,5746],[-1,0],[-1,4],[0,6],[2,7],[2,-6],[0,-3],[0,-2],[1,-4],[-1,-2],[-2,0]],[[8479,5759],[0,-3],[-3,7],[-1,6],[1,-1],[2,-2],[1,-7]],[[8460,5748],[0,-3],[-2,1],[-1,-1],[-2,-5],[-1,-2],[-7,-1],[-5,1],[-2,3],[-1,5],[0,3],[1,4],[1,2],[4,5],[1,3],[2,5],[5,1],[0,-1],[1,-1],[1,0],[2,-3],[3,-3],[-1,-8],[1,-3],[0,-2]],[[8491,5755],[-1,-2],[-1,4],[-1,3],[-2,5],[-1,2],[1,4],[0,7],[1,3],[1,1],[1,3],[1,0],[0,-3],[-1,-8],[2,-10],[-1,-6],[1,-2],[0,-1]],[[8330,5788],[-3,-2],[-1,6],[2,5],[3,-2],[2,-2],[-1,-2],[-2,-3]],[[8452,5795],[0,-1],[1,6],[1,0],[0,-1],[0,-3],[-2,-1]],[[8406,5787],[-1,-1],[-2,-2],[-1,4],[1,7],[2,5],[1,1],[1,1],[1,0],[0,-2],[1,-3],[-2,-9],[-1,-1]],[[8419,5706],[-1,-1],[-2,1],[-2,2],[-2,13],[-2,3],[-3,2],[-2,2],[-1,2],[-5,12],[0,8],[1,4],[1,4],[2,1],[3,0],[2,0],[4,6],[0,2],[0,9],[0,7],[-1,6],[1,3],[1,2],[2,6],[0,4],[0,4],[0,3],[2,1],[5,5],[1,0],[7,-4],[1,-6],[1,-2],[-2,-7],[0,-5],[-3,-7],[-2,-7],[-1,-12],[-1,-4],[-2,-7],[-1,-4],[0,-9],[0,-3],[0,-3],[4,-14],[1,-3],[0,-2],[-1,-3],[-2,-6],[-1,-2],[-2,-1]],[[8426,5728],[-1,-1],[0,3],[0,5],[2,18],[0,5],[3,10],[2,9],[4,10],[0,5],[3,10],[3,13],[0,5],[0,2],[1,3],[0,3],[2,5],[0,-3],[0,-6],[0,-4],[0,-1],[0,-6],[-1,-9],[1,-10],[-1,-11],[-2,-5],[-2,-3],[-2,-2],[-3,-6],[-1,-6],[-1,-6],[-3,-19],[-4,-8]],[[8437,5834],[1,-8],[-2,0],[-1,6],[1,1],[1,1]],[[8258,5670],[-3,-4],[1,5],[0,5],[3,10],[2,3],[3,8],[2,3],[4,8],[4,8],[1,1],[1,0],[2,1],[2,4],[7,15],[5,11],[5,14],[3,4],[0,1],[5,13],[2,2],[2,1],[1,2],[1,2],[2,6],[0,6],[0,4],[-1,5],[1,8],[1,3],[4,15],[1,3],[1,-2],[0,-2],[0,-7],[0,-3],[0,-3],[-1,-5],[3,-14],[2,-9],[0,-3],[-3,-6],[-1,-1],[-4,-2],[-1,-1],[-2,-5],[-2,-5],[0,-3],[-1,-3],[-7,-4],[-3,-2],[-1,-2],[-1,-3],[0,-6],[-5,-19],[-2,-6],[-2,-4],[-2,-3],[-4,-2],[-2,-4],[-2,-7],[-2,-6],[-3,-4],[-3,-4],[-3,-3],[-3,-2],[-1,-3],[0,-3],[-2,-2],[-1,-1],[-3,-3]],[[8329,5848],[0,-3],[-1,-5],[0,-1],[-1,2],[-2,1],[0,3],[1,0],[2,2],[1,1]],[[8460,5837],[2,-2],[2,1],[2,5],[3,-2],[2,-7],[1,-2],[1,-5],[-1,-10],[0,-10],[0,-2],[2,-2],[1,-2],[1,-2],[1,-4],[0,-7],[2,-6],[0,-2],[-1,-3],[-2,0],[-1,-2],[0,-2],[-1,1],[-1,6],[-2,3],[1,-10],[0,-5],[0,-4],[-3,3],[-3,3],[-1,1],[1,7],[0,3],[-2,6],[2,14],[0,3],[-1,3],[-1,5],[-2,5],[-1,0],[-3,-3],[-2,1],[-1,13],[-1,13],[-1,3],[-1,3],[1,3],[1,-1],[2,-3],[2,-2],[1,-2],[1,-3]],[[8461,5846],[-4,-1],[-1,3],[-2,8],[2,1],[2,0],[1,-3],[2,-5],[0,-3]],[[8467,5852],[0,-3],[-1,0],[-1,2],[-1,4],[0,4],[2,-2],[0,-4],[1,-1]],[[8402,5853],[3,-3],[3,2],[3,0],[3,-4],[-1,-3],[0,-2],[6,6],[1,-1],[0,-5],[0,-5],[-1,-4],[-1,-5],[-2,-5],[-2,-3],[-2,-2],[-2,-2],[0,-3],[0,-4],[-1,-3],[-2,-1],[-4,-6],[-9,-4],[-3,-3],[-2,-4],[-1,-3],[-1,-1],[-1,2],[0,1],[2,9],[-1,3],[0,3],[0,7],[2,6],[0,7],[1,13],[1,18],[0,3],[-1,2],[-4,2],[-1,2],[1,4],[1,2],[2,0],[1,-2],[6,-5],[3,-4],[3,-5]],[[8334,5858],[-2,-2],[-1,1],[0,3],[0,2],[-2,10],[1,2],[1,-1],[1,-2],[2,-1],[0,-3],[0,-2],[1,-2],[-1,-5]],[[8335,5885],[2,-1],[1,1],[1,3],[1,-5],[2,-4],[-1,-3],[-2,-1],[-2,1],[-2,-1],[-2,0],[-2,4],[-1,6],[-1,1],[0,3],[0,2],[0,1],[1,1],[2,-2],[3,-5],[0,-1]],[[8406,5893],[-1,-2],[-3,6],[-2,3],[0,1],[1,2],[4,0],[2,-4],[0,-2],[-1,-4]],[[8478,5905],[2,-4],[0,-4],[0,-3],[1,-2],[2,-1],[2,-2],[1,-3],[-1,-3],[1,-5],[-2,-6],[0,-10],[1,-4],[0,-3],[0,-3],[0,-3],[3,-10],[0,-3],[0,-3],[-1,-2],[2,0],[2,-4],[1,-5],[0,-2],[-2,4],[-1,1],[-6,-1],[-3,2],[-2,0],[-2,7],[-2,1],[-2,3],[-2,8],[-1,5],[2,4],[0,4],[0,3],[-1,0],[-2,1],[-2,4],[0,3],[-2,2],[-2,5],[-3,2],[-1,2],[-2,4],[-2,5],[-1,9],[-1,10],[7,-3],[8,1],[9,2],[2,-3]],[[8436,5892],[5,-7],[4,-12],[0,-9],[0,-3],[-2,4],[-4,5],[-2,1],[-1,1],[0,3],[-1,3],[-1,1],[-1,1],[-2,6],[-2,1],[-2,-1],[-3,-9],[-4,-6],[0,2],[2,8],[1,13],[0,4],[-1,5],[0,6],[3,-3],[4,-2],[2,-3],[1,-3],[4,-6]],[[8397,5905],[-1,-1],[-1,0],[0,3],[1,2],[1,-4]],[[8391,5895],[-3,-14],[-1,5],[1,3],[-2,3],[0,2],[0,3],[2,3],[0,9],[3,3],[1,1],[0,-3],[0,-4],[-1,-11]],[[8437,5901],[0,-5],[-1,2],[-3,10],[-1,3],[1,3],[3,-4],[1,-9]],[[8424,5924],[2,-9],[-3,6],[-3,4],[-3,7],[-2,3],[-1,1],[1,3],[1,0],[1,0],[5,-12],[2,-3]],[[8352,5960],[1,0],[5,1],[2,0],[1,-4],[1,-1],[2,-1],[2,2],[2,-3],[2,-6],[3,-5],[2,-3],[0,-2],[-1,-4],[-1,-5],[1,-6],[1,-11],[0,-3],[-2,-5],[-1,-5],[0,-2],[-1,-1],[0,-4],[-1,1],[-1,-1],[-1,-1],[-1,-3],[-2,1],[-1,1],[-1,2],[0,3],[-1,1],[-3,5],[-1,3],[0,4],[-1,4],[-1,4],[-1,2],[-1,3],[0,2],[0,8],[-3,9],[0,2],[-3,3],[-1,3],[-1,2],[-1,5],[0,1],[-2,0],[-1,0],[0,4],[2,2],[2,1],[5,-2],[1,-1]],[[8386,5964],[1,0],[1,0],[3,-5],[0,-2],[0,-3],[-1,-6],[-1,-2],[-1,-2],[-3,5],[-2,3],[0,5],[1,8],[2,-1]],[[8340,5976],[0,-4],[-5,6],[0,2],[0,1],[1,1],[2,-2],[2,-4]],[[8453,5969],[0,-4],[-1,2],[-2,-1],[-2,-3],[-3,4],[0,4],[2,7],[0,11],[1,3],[1,2],[1,1],[2,-8],[1,-1],[2,-3],[0,-7],[0,-4],[-2,-3]],[[8393,5993],[0,-2],[-6,8],[0,2],[0,1],[0,1],[6,-10]],[[8389,6048],[0,-2],[-2,-4],[2,-8],[-1,-6],[-2,0],[0,1],[0,2],[0,2],[0,3],[-1,3],[-1,4],[-1,3],[1,4],[3,0],[2,-2]],[[8363,6256],[4,-3],[10,-11],[3,-2],[4,-2],[3,-1],[2,2],[1,3],[2,7],[2,0],[1,-2],[1,-3],[1,-5],[-1,-5],[-2,-4],[-1,-6],[-1,-17],[0,-6],[1,-5],[2,-8],[1,-2],[2,-3],[1,-2],[0,-4],[0,-4],[2,-1],[1,-2],[0,-4],[-1,-4],[-1,-9],[-6,-23],[0,-4],[-2,-10],[-5,-2],[-5,-4],[-3,-4],[-2,-4],[-1,-7],[1,-2],[0,-3],[0,-4],[-1,-2],[-2,-7],[-1,-5],[-1,-3],[-1,-3],[0,-3],[1,-3],[3,-12],[4,-12],[0,-2],[1,-1],[-2,-4],[0,-5],[0,-6],[3,-14],[1,-4],[1,-3],[1,-3],[2,-3],[4,-4],[2,-1],[2,0],[0,3],[2,1],[0,3],[-2,4],[0,2],[1,1],[1,1],[3,4],[3,4],[3,-1],[4,-1],[3,-2],[2,-4],[2,-6],[2,-7],[0,-3],[-1,-4],[0,-3],[2,-2],[3,0],[2,5],[0,6],[-1,2],[1,3],[1,2],[1,-2],[2,-4],[5,-4],[2,0],[1,0],[2,-3],[2,-2],[-2,-5],[-5,-1],[-2,-3],[2,-7],[2,-6],[2,-4],[2,-5],[0,-4],[-1,-5],[2,0],[2,-1],[4,-4],[1,0],[1,1],[-1,-14],[-2,-13],[-2,1],[-3,6],[1,6],[1,7],[-1,1],[-1,0],[-2,-2],[-2,0],[-3,0],[-6,7],[-3,1],[0,3],[0,7],[-2,8],[-1,3],[-1,2],[-7,9],[-1,1],[-2,7],[-5,10],[-2,1],[-1,0],[-1,-2],[1,-4],[0,-3],[0,-4],[0,-3],[3,-5],[0,-3],[2,-7],[0,-8],[-2,-3],[-3,4],[0,3],[0,3],[-3,7],[0,2],[-5,7],[-4,8],[-8,9],[-1,0],[-2,-1],[-1,-1],[-4,-4],[-1,-3],[0,-4],[-3,-4],[-4,-1],[-3,3],[-3,4],[-2,0],[-2,8],[-3,0],[-3,-5],[0,11],[0,11],[0,3],[2,3],[6,12],[1,3],[0,5],[-2,4],[-2,3],[-3,1],[-2,2],[-1,4],[-1,-7],[1,-10],[0,-6],[-1,-2],[-2,0],[-1,0],[-1,3],[-1,6],[-3,5],[-1,6],[-1,1],[-2,-1],[-1,3],[-1,8],[0,7],[-1,7],[-2,6],[0,6],[-2,23],[0,2],[0,2],[-2,3],[-1,3],[0,3],[0,11],[1,3],[1,1],[1,-2],[2,-3],[1,-1],[1,-2],[3,-7],[1,-1],[3,0],[2,1],[1,3],[0,3],[0,3],[-1,10],[-1,8],[0,7],[0,6],[3,11],[0,8],[0,11],[0,6],[0,3],[-1,6],[-1,6],[5,30],[1,6],[1,6],[0,8],[3,2],[3,3],[2,0],[1,-1],[4,2],[1,0]],[[8386,6272],[-2,-4],[-1,1],[1,4],[0,2],[1,3],[1,1],[2,-3],[-2,-4]],[[8367,6283],[0,-4],[-1,2],[-1,3],[1,2],[0,3],[1,-3],[0,-3]],[[8375,6299],[0,-5],[-2,0],[-2,3],[0,2],[0,1],[0,1],[4,-2]],[[8387,6357],[-1,-1],[0,6],[2,1],[1,0],[-2,-6]],[[8385,6381],[-2,-5],[-1,0],[0,3],[2,5],[1,-3]],[[8643,5358],[-1,0],[0,1],[0,1],[1,0],[0,-1],[0,-1]],[[8738,5609],[-2,-1],[-1,4],[1,5],[1,4],[1,1],[0,1],[1,5],[1,-3],[-1,-9],[-1,-4],[0,-3]],[[9264,4523],[5,-3],[1,-4],[-1,-1],[-5,-1],[0,2],[-4,2],[-1,4],[-2,-2],[1,3],[-2,3],[-1,4],[0,2],[3,-2],[6,-7]],[[9285,4529],[-1,-3],[-1,1],[-3,-1],[-1,0],[-1,3],[0,1],[2,-1],[0,3],[3,-1],[2,-2]],[[9191,4575],[-1,-4],[-2,1],[0,1],[0,3],[2,0],[1,-1]],[[9196,4607],[1,0],[2,4],[2,1],[1,-2],[-2,-13],[-2,2],[-6,3],[0,6],[-1,2],[-1,5],[-2,6],[-1,4],[1,-2],[2,-4],[5,-8],[0,-2],[1,-2]],[[9180,4645],[4,-4],[2,1],[2,-1],[2,-5],[0,-4],[1,-4],[0,-1],[-2,-2],[0,2],[-1,1],[-3,0],[-3,1],[-4,0],[2,4],[0,2],[-2,5],[0,3],[0,2],[2,1],[0,-1]],[[9175,4637],[0,-1],[-2,1],[-4,8],[1,5],[2,4],[3,-4],[1,-5],[0,-2],[-1,-6]],[[9239,4668],[1,-1],[4,0],[1,-3],[1,-1],[2,-2],[1,-2],[0,-1],[0,-1],[-1,-1],[0,-3],[-1,1],[-2,-2],[-3,3],[-1,1],[0,2],[-2,4],[-3,3],[1,2],[2,1]],[[8988,4687],[0,-3],[-4,3],[-4,6],[-2,2],[-1,4],[2,-3],[5,-3],[4,-6]],[[9196,4681],[1,-4],[-2,4],[1,5],[0,3],[0,1],[-2,3],[1,4],[1,1],[1,1],[0,-6],[0,-3],[-1,-9]],[[8988,4695],[-2,0],[-4,4],[-2,3],[6,-1],[1,-1],[1,-3],[0,-2]],[[9111,4848],[-1,0],[-1,2],[-2,3],[-3,7],[0,6],[1,1],[1,1],[6,-7],[0,-3],[0,-6],[-1,-4]],[[9331,4799],[0,-6],[-1,-1],[-1,2],[-2,-2],[-1,-2],[-1,-1],[-3,0],[-3,1],[-3,3],[-2,4],[-2,5],[-2,6],[1,7],[-1,5],[-4,5],[-1,1],[-2,6],[-2,3],[-2,5],[-1,2],[-1,7],[0,4],[0,11],[0,6],[1,0],[2,-3],[1,-1],[4,-1],[2,-5],[3,-9],[0,-3],[1,-2],[3,-4],[1,-2],[3,-10],[1,-2],[2,-1],[1,-2],[3,-4],[2,-5],[2,-5],[1,-5],[1,-7]],[[9087,4871],[-1,0],[-3,5],[0,2],[0,3],[3,4],[2,-4],[1,-7],[-2,-3]],[[9295,4871],[-1,-1],[-1,8],[0,5],[-1,4],[0,2],[2,5],[0,1],[2,-2],[0,-5],[1,-5],[-1,-9],[-1,-3]],[[9055,4912],[-2,-2],[-1,1],[-1,4],[1,4],[2,2],[1,1],[1,-2],[0,-3],[-1,-5]],[[9219,4936],[1,-1],[5,6],[2,-4],[3,-2],[3,-1],[-2,-9],[1,-4],[1,-4],[-1,-6],[-1,-5],[-3,-8],[-1,-1],[-1,-1],[-4,0],[-1,-4],[0,-5],[2,-5],[2,-7],[-2,-6],[-3,-4],[-2,-2],[-5,2],[-5,-1],[-1,-2],[0,-4],[-1,-3],[-1,-2],[-2,-6],[-3,-4],[-4,-5],[-1,-1],[-4,0],[-3,-3],[-1,-2],[-2,-2],[-3,-3],[-3,-4],[-1,-1],[-7,0],[-9,-1],[-3,0],[-3,0],[-1,2],[-4,8],[-2,3],[-3,0],[-5,-3],[-8,12],[-3,3],[-2,2],[-4,1],[-3,3],[-1,5],[0,7],[2,5],[4,-2],[1,0],[2,1],[1,-1],[2,-1],[6,2],[3,-2],[4,-3],[3,-1],[3,1],[5,3],[1,0],[4,0],[4,4],[1,18],[1,6],[1,1],[1,0],[1,-3],[-1,-4],[-1,-3],[0,-7],[1,-7],[2,-5],[3,-1],[3,4],[3,0],[3,-3],[3,0],[2,3],[1,1],[2,0],[1,1],[2,6],[1,7],[2,5],[6,9],[1,1],[2,1],[3,-1],[3,4],[0,7],[0,7],[-3,17],[0,2],[0,3],[1,3],[3,0],[3,-1],[2,-3],[1,-2]],[[9267,4948],[0,-2],[-1,2],[1,3],[0,-3]],[[9240,5003],[-1,-5],[-1,3],[-2,4],[1,2],[2,2],[1,-6]],[[9224,5014],[0,-3],[-1,0],[-2,6],[-1,1],[1,2],[2,-4],[1,-2]],[[9220,5021],[-1,0],[0,4],[1,3],[1,-2],[1,-4],[-2,-1]],[[8915,5022],[0,7],[0,4]],[[8915,5033],[1,0],[3,0],[2,-1],[14,-12],[4,-5],[1,-1],[2,0],[1,-1],[6,-7],[10,-7],[10,-6],[3,-2],[3,0],[7,-3],[3,-2],[6,-8],[2,-3],[3,-4],[4,-5],[1,-1],[1,-1],[4,0],[4,1],[1,-1],[1,-1],[2,-1],[0,-4],[3,-4],[3,-2],[3,-4],[2,-5],[2,-5],[2,-5],[4,-1],[3,-1],[12,-25],[1,-4],[0,-16],[-1,-13],[3,-4],[4,-2],[5,-3],[6,-4],[17,-17],[3,-2],[3,0],[4,0],[1,-1],[3,-3],[1,-2],[3,-6],[2,-6],[1,-2],[1,-1],[0,-3],[1,-11],[0,-6],[-1,-2],[-3,-1],[-10,-2],[-6,2],[-5,-7],[0,-3],[0,-2],[4,-14],[3,-12],[2,-5],[3,-4],[2,-5],[3,-5],[5,-10],[2,-3],[3,-3],[6,-7],[0,-3],[2,-10],[1,-7],[0,-3],[0,-3],[5,-6],[1,-2],[2,-14],[1,-7],[3,-2],[3,0],[9,4],[1,1],[1,-1],[2,-3],[0,-6],[-1,-7],[0,-6],[1,-5],[5,-4],[1,-1],[8,-2],[3,-1],[3,-2],[1,-1],[-1,-3],[-1,-1],[-2,-1],[-3,-2],[0,-4],[2,-3],[1,-5],[2,-2],[1,-1],[3,-1],[3,-2],[3,-3],[2,-1],[5,-1],[3,-3],[5,1],[-4,-4],[-2,-2],[-5,2],[-1,-2],[2,-5],[4,-3],[1,-2],[-1,-2],[-4,-5],[-1,-1],[-3,0],[-5,2],[-4,3],[-1,3],[-1,2],[-3,5],[-2,2],[-3,1],[-3,0],[-5,3],[-12,2],[-3,1],[-3,4],[-2,1],[-1,-1],[-5,-1],[-1,0],[-3,3],[-4,2],[-1,-1],[-1,-1],[-5,3],[-3,1],[-3,3],[-2,3],[-1,3],[-2,7],[-2,7],[-3,5],[-7,9],[-1,2],[-3,8],[0,6],[1,5],[-1,-2],[-2,0],[-4,4],[-2,4],[-3,12],[-2,6],[-4,11],[-1,6],[-2,6],[-1,2],[-1,2],[-1,3],[-1,3],[-7,4],[-1,2],[-1,1],[-4,0],[-3,1],[-5,4],[-3,1],[-3,1],[-3,1],[-1,2],[-1,2],[-1,6],[-2,0],[-3,1],[-2,2],[-3,1],[-1,-2],[-1,-5],[-1,0],[-1,1],[-1,0],[-1,-3],[-2,-2],[-2,0],[-5,3],[-2,2],[-2,3],[-1,4],[-2,3],[-1,2],[2,-5],[6,-23],[-2,0],[-1,0],[1,-4],[-2,-1],[-1,0],[-3,2],[-3,1],[-1,-1],[0,-2],[1,-4],[1,-6],[-4,-2],[-5,-1],[-5,-3],[-5,0],[-3,1],[-3,1],[-2,-1],[-3,-2],[-2,1],[-1,3],[-1,3],[-1,2],[-2,0],[-2,-1],[4,0],[1,-3],[0,-4],[3,-3],[3,2],[6,-1],[6,-6],[1,0],[1,-1],[4,-6],[2,-5],[2,-6],[0,-2],[0,-6],[0,-3],[-4,-5],[-4,-3],[-7,-6],[-5,-7],[-4,1],[-2,4],[-1,1],[-3,2],[-2,1],[-7,-2],[-7,-1],[-3,0],[-3,1],[-3,3],[-3,-1],[-2,-3],[-3,0],[-4,6]],[[9248,4910],[-2,-5],[-1,5],[-2,3],[-1,4],[-2,8],[0,4],[1,4],[0,4],[-1,9],[-2,8],[-7,19],[-2,4],[-2,5],[-2,1],[-3,1],[-1,1],[-3,3],[-2,4],[-6,10],[-4,3],[-1,4],[-10,12],[-2,3],[-4,0],[-3,2],[3,2],[0,4],[0,4],[4,-7],[5,-6],[2,-5],[2,0],[5,-4],[3,-3],[3,-4],[3,-6],[6,-4],[1,-2],[3,-8],[4,-6],[2,-4],[18,-30],[3,-8],[0,-6],[-1,-2],[-2,-5],[0,-6],[0,-5],[-2,-5]],[[9178,5030],[-6,0],[-2,1],[-1,3],[-2,5],[-2,1],[0,1],[4,4],[3,1],[6,-4],[0,-3],[0,-2],[0,-5],[0,-2]],[[9107,5052],[-1,-3],[-2,1],[-1,0],[1,1],[1,3],[1,0],[1,-2]],[[9084,5071],[10,-4],[0,2],[1,-1],[0,-3],[-2,0],[-1,0],[-1,-2],[-3,-5],[-2,1],[-2,-1],[-4,0],[-5,2],[-1,-2],[-2,1],[-1,-3],[-1,1],[-1,3],[0,1],[3,2],[-1,5],[2,2],[3,0],[2,2],[6,-1]],[[9159,5094],[0,-2],[-2,1],[-4,6],[0,4],[1,3],[2,-1],[2,-4],[1,-7]],[[5544,8321],[1,-1],[8,-1],[8,-1],[12,0],[14,-1],[13,-1],[15,-1],[16,-1],[1,1]],[[5655,8151],[2,-4],[0,-3],[0,-2],[0,-3],[1,-2],[4,-8],[2,-8],[2,-3],[3,-4],[0,-2],[-1,-1],[-1,0],[-1,-1],[0,-1],[0,-1],[1,-3],[2,-6],[0,-5],[-1,-1],[-2,-3],[-1,-3],[-7,-2],[-2,-2],[-4,-6],[-2,-3],[-4,-6],[-7,-10],[-2,-4],[-2,-4],[-5,-9],[-1,-4],[0,-3],[2,-7],[0,-4],[0,-3],[-1,-3],[0,-1],[2,-2],[2,-3],[0,-1],[0,-2],[-1,-1],[-3,1],[-3,3],[-1,-1]],[[5626,8010],[-2,1],[-8,4],[-5,3],[0,2],[-1,3],[-2,3],[-5,2],[-2,2],[-8,1],[-4,0],[-2,-1],[-2,0],[-2,-4],[-2,-2],[-2,0],[-2,1],[-2,2],[-3,2],[-2,-1],[-2,1],[-1,0],[-1,-1],[-1,0],[-2,-1],[-1,-1],[-2,-2],[-2,-2],[-1,-5],[-4,2],[-2,-1],[-1,-1],[-2,1],[1,2],[0,2],[0,2],[0,4],[-1,1],[-2,0],[-1,1],[0,1],[-1,1],[-2,3],[-1,4],[-2,2],[-1,-2],[-2,-3],[-2,0],[-3,-7],[-5,0],[0,3],[0,3],[-3,1]],[[5396,8279],[6,-4],[3,-2],[-1,2],[0,2],[0,3],[0,4],[-6,2],[-4,1]],[[5394,8291],[1,-1],[4,0],[9,5],[16,7],[17,7],[4,0],[4,2],[2,2],[1,2],[2,4],[5,7],[9,2],[4,4],[7,4],[16,5],[7,1],[6,0],[6,-4],[7,-4],[1,-3],[-4,1],[-5,5],[-1,0],[4,-13],[2,-5],[5,-4],[4,-1],[12,2],[4,3],[1,2]],[[3114,6224],[0,1],[-1,1],[0,1],[0,1],[2,0],[0,-1],[0,-1],[0,-1],[-1,-1]],[[3182,6227],[-2,-1],[-1,1],[-1,1],[3,2],[3,0],[2,-1],[0,-1],[-4,-1]],[[3163,6246],[1,-1],[0,3],[6,-2],[3,-2],[4,-1],[0,-8],[-3,-4],[-2,-3],[-1,-4],[-4,-5],[-4,-1],[-3,0],[-2,0],[-1,1],[-2,-1],[-3,2],[-2,-1],[-5,1],[-2,-2],[-2,0],[-1,0],[-2,1],[-3,0],[-2,1],[1,9],[0,4],[-1,4],[-1,2],[-1,3],[2,1],[1,3],[0,3],[1,1],[2,1],[7,-2],[17,-1],[1,0],[1,-2]],[[8469,7461],[-2,-2],[0,3],[1,3],[2,0],[-1,-4]],[[8625,7634],[1,-4],[1,-3],[1,-3],[1,-2],[0,-2]],[[8629,7620],[-1,-1],[-2,1],[-3,0],[-4,-5],[-2,-2],[-2,-4],[-3,-3],[-2,-4],[-2,-5],[-1,-5],[-4,-6],[-1,-6],[-1,-6],[3,-6],[0,-5],[-2,-11],[1,-11],[-1,-4],[-10,-7],[-3,-4],[-3,-10],[-5,-4],[-3,-4],[-4,-2],[-2,-7],[-3,-4],[-3,-2],[-3,-3],[-5,0],[-4,-3],[-3,-5],[-8,-7],[-1,-5],[0,-7],[0,-6],[-1,-5],[-1,1],[-1,-1],[-1,-5],[0,-5],[3,-2],[2,-2],[3,-1],[3,-2],[5,-11],[4,-4],[1,-2],[3,-3],[2,-3],[1,-4]],[[8517,7360],[-1,0],[-1,1],[-6,5],[-4,-3],[-1,-4],[-2,-1],[-1,7],[-3,0],[-5,7],[-2,-2],[-1,-2],[-2,-6],[-4,-5],[-1,-1],[-2,1],[1,1],[-2,6],[-6,2],[-2,2],[-1,1],[6,6],[1,1],[-1,1],[-1,1],[-5,-1],[-2,2],[-4,-1],[-2,2],[5,6],[0,4],[0,2],[3,8],[2,5],[7,6],[3,1],[2,-1],[2,1],[-2,2],[-2,2],[-3,-1],[-4,4],[0,4],[7,24],[0,2],[-1,6],[-1,5],[-5,4],[-2,0],[-6,7],[-3,3],[-1,-1],[0,-5],[-1,-1],[-2,-1],[-1,5],[-1,5],[-4,4],[-2,2],[1,6]],[[4522,7077],[4,-3],[3,1],[5,-3],[2,-1],[-2,-3],[-2,-4],[-5,1],[-4,4],[-2,2],[0,2],[1,4]],[[4304,7313],[0,-1],[-1,0],[-2,0],[-1,3],[1,1],[2,0],[1,-1],[0,-2]],[[4287,7363],[2,0],[9,1],[2,-1],[0,-4],[-2,-2],[-5,-1],[-8,3],[-3,4],[0,2],[0,1],[1,1],[4,-4]],[[4218,7399],[2,-3],[-3,0],[-2,-1],[-2,1],[-4,0],[-2,3],[0,3],[1,2],[3,0],[7,-5]],[[4204,7403],[-3,0],[-3,4],[4,2],[2,-1],[0,-2],[1,-2],[-1,-1]],[[4228,7405],[-1,-1],[-8,4],[-2,2],[-4,5],[10,-6],[5,-4]],[[4247,7410],[0,-1],[-6,2],[-1,2],[-1,4],[1,1],[2,1],[4,-1],[2,-3],[0,-3],[-1,-2]],[[4135,7454],[-2,-3],[-2,1],[0,1],[0,6],[2,1],[2,-2],[0,-4]],[[4794,7325],[-3,0],[-9,-10],[-3,0],[-5,4],[-10,2],[-3,1],[-4,-3],[-3,0],[-3,-3],[-1,1],[2,8],[3,15],[0,9],[0,8],[-1,8],[-1,5],[2,13],[0,7],[-2,8],[6,-1],[-2,3],[-2,2],[-2,0],[-1,0],[-5,-3],[-3,-1],[0,6],[-1,6],[2,2],[2,1],[2,3],[1,3],[0,6],[1,5],[4,5],[-2,-1],[-2,-3],[-4,-10],[-1,-6],[-3,-1],[-3,-1],[-2,0],[-2,2],[0,4],[0,3],[2,6],[0,9],[2,7],[0,3],[-1,3],[2,3],[2,2],[2,6],[4,16],[5,17],[0,2],[-1,2],[0,5],[3,20],[1,2],[1,6],[1,10],[0,6],[0,3],[0,4],[-2,8],[-2,16],[0,5],[1,3],[-2,0],[-1,3],[0,4],[3,7]],[[5949,6988],[6,9],[2,6]],[[1153,3982],[-1,-1],[0,2],[-1,3],[0,1],[1,-2],[1,-3]],[[1214,4116],[-1,-2],[0,2],[-2,1],[-1,2],[-1,0],[0,1],[1,0],[2,-2],[1,-1],[1,-1]],[[1092,4125],[0,-2],[0,1],[-2,2],[-1,2],[3,-3]],[[1195,4127],[0,-1],[-3,6],[2,-1],[1,-4]],[[1088,4136],[0,-1],[-1,1],[-1,3],[-2,3],[0,2],[1,-2],[1,-2],[2,-4]],[[1089,4155],[0,-1],[-1,0],[-1,1],[0,2],[1,2],[1,2],[1,2],[2,2],[1,1],[0,-1],[-4,-4],[-1,-3],[0,-2],[1,-1]],[[852,4165],[4,-3],[1,-4],[-1,-3],[-2,1],[-1,1],[-1,5],[-4,-1],[-3,1],[-2,7],[0,3],[1,2],[3,2],[3,-1],[2,-4],[0,-6]],[[838,4173],[0,-1],[-2,1],[0,1],[0,2],[0,2],[3,-1],[-1,-4]],[[794,4212],[-1,0],[-1,0],[0,6],[1,2],[1,-2],[1,-6],[-1,0]],[[1015,4227],[2,-3],[-2,2],[-3,0],[1,1],[2,0]],[[1012,4226],[-1,-1],[-3,4],[1,0],[2,-2],[1,-1]],[[793,4224],[-1,0],[-1,1],[0,2],[0,2],[2,-2],[0,-1],[0,-2]],[[959,4243],[0,-1],[-1,0],[-1,3],[0,3],[-1,3],[-1,2],[0,2],[0,3],[1,-5],[1,-4],[1,-3],[1,-3]],[[1041,4257],[0,-1],[0,5],[1,0],[-1,-4]],[[971,4271],[0,-3],[-1,2],[-2,4],[0,2],[3,-5]],[[1148,4578],[-1,-1],[0,6],[2,-1],[0,-1],[0,-2],[-1,-1]],[[1137,4612],[-2,-5],[0,5],[1,1],[1,-1]],[[1138,4625],[4,-3],[2,1],[-2,-3],[-4,-2],[-1,-1],[-2,1],[-1,3],[4,4]],[[1109,4641],[-1,-1],[-1,3],[0,2],[2,2],[1,-1],[-1,-5]],[[1123,4669],[-1,-1],[-1,3],[1,2],[1,0],[1,0],[1,-2],[0,-1],[-2,-1]],[[1109,4671],[-3,-2],[-1,0],[-1,5],[0,3],[1,1],[4,-1],[1,-2],[0,-2],[-1,-2]],[[6423,6601],[-2,-1],[-2,-1],[-2,0],[-2,0],[-1,1],[-2,5],[-1,7]],[[6411,6612],[0,3],[1,2],[-2,17],[-1,13],[0,2],[2,3],[1,7],[1,6],[3,15],[3,6],[4,4],[4,-8],[4,-6],[1,-7],[-1,-6],[-1,-9],[0,-4],[0,-4],[2,-6],[1,-8],[0,-5],[-1,-5],[-1,-5],[-3,-12],[-1,-2],[-4,-2]],[[5783,7802],[3,-6],[4,-3],[8,-4],[1,1],[0,1],[-1,1],[1,2],[1,0],[2,-2],[4,2],[5,5],[5,1],[5,-3],[2,-3],[2,-3]],[[5825,7791],[-1,-4],[0,-3],[-1,-9],[-1,-4],[-2,-4],[-14,-5],[1,2],[0,4],[-1,3],[2,3],[-4,1],[-1,-1],[-1,-3],[1,-6],[-2,-4],[0,-2],[0,-4],[-1,-2],[0,-2],[2,0],[-1,-4],[-4,-7],[-2,-5],[0,-18],[-1,-11],[-1,-3]],[[5630,7732],[0,3],[-1,1],[-2,2],[-2,2],[-1,3],[1,3],[1,3],[2,2],[2,-1],[1,1],[0,2],[-3,3],[-4,3],[-4,-2],[-4,-7],[-3,-1],[-2,5],[-3,2],[-5,1],[-3,2],[-1,3],[-2,2],[-4,2],[0,2],[2,0],[2,1],[1,1],[0,1],[-2,1],[-2,1],[-1,1],[0,1],[0,1],[0,1],[1,0],[0,1],[1,2],[1,2],[0,1],[0,1],[0,2],[-1,1],[-2,1],[-4,2],[-2,3],[-1,0],[-3,1],[-2,3],[-2,3],[-2,3],[0,1],[-1,1],[1,1],[0,1],[-1,3],[1,4],[0,3],[0,2],[-1,0],[-1,-1],[-2,3],[-2,5],[-1,2],[-3,2],[-2,2],[-2,4],[-1,4]],[[5635,7945],[1,1],[4,3],[1,2],[1,3],[2,-1],[6,-5],[6,0],[1,0],[1,0],[8,-3],[1,0],[1,0],[3,-2],[3,0],[3,2],[3,0],[2,0],[2,-4],[5,-6],[2,-3],[2,1],[3,1],[3,4],[8,5],[6,2],[6,2],[7,1],[2,4],[1,3],[1,5],[4,2],[4,1],[1,0]],[[9056,7684],[-1,1],[1,1],[1,0],[0,-1],[-1,-1]],[[9051,7687],[1,0],[1,0],[0,-1],[0,-1],[-1,0],[-1,1],[0,1]],[[9065,7697],[-1,-1],[-1,1],[-1,0],[1,0],[0,1],[1,0],[1,-1]],[[9074,7703],[0,-1],[-2,1],[0,3],[0,1],[6,3],[1,-2],[1,-1],[-6,-4]],[[9060,7747],[5,-4],[5,0],[-1,-3],[-2,0],[-4,-6],[-4,0],[-1,-2],[-6,-8],[0,-3],[-4,-6],[-5,-6],[-1,-10],[-3,4],[0,4],[1,4],[5,7],[3,4],[0,4],[3,3],[1,3],[1,2],[5,13],[2,0]],[[9127,7794],[-5,-4],[-5,-2],[-7,-8],[-2,-5],[-4,-2],[-3,1],[-1,-1],[-1,-4],[-1,-3],[-7,-9],[-3,-7],[-3,-1],[-5,-8],[1,7],[1,3],[4,5],[1,6],[2,5],[5,6],[4,6],[3,2],[3,6],[3,2],[0,4],[1,5],[1,-1],[3,-6],[2,0],[5,1],[8,12],[3,2],[2,0],[1,-1],[0,-1],[0,-2],[0,-2],[0,-3],[-1,-3],[-5,0]],[[6332,7804],[0,-1],[-2,5],[0,3],[1,2],[1,-5],[0,-4]],[[9157,7813],[-4,-3],[-3,0],[6,14],[4,2],[5,9],[9,10],[1,1],[6,-1],[-9,-11],[-1,-5],[-4,-4],[-3,-2],[-1,-2],[-6,-8]],[[9221,7885],[-5,-6],[-2,0],[0,2],[-1,1],[5,1],[4,9],[4,5],[2,2],[1,0],[-8,-14]],[[9252,7935],[-1,-3],[-2,0],[0,1],[1,4],[1,1],[1,-3]],[[9279,7994],[-1,-3],[-1,1],[0,1],[2,3],[1,5],[2,0],[1,-1],[0,-2],[-4,-4]],[[9299,8024],[-2,-2],[-3,1],[0,5],[6,15],[2,-1],[-1,-3],[-2,-6],[1,-7],[-1,-2]],[[9330,8081],[-3,-6],[-5,-1],[-3,-2],[-2,-4],[-1,-2],[-3,1],[-2,2],[0,7],[-1,3],[1,2],[3,0],[3,4],[7,2],[2,5],[3,11],[3,4],[3,1],[1,-6],[-1,-6],[-1,-6],[-4,-9]],[[9344,8102],[-1,-2],[-2,1],[-3,3],[-1,2],[1,3],[5,4],[2,0],[1,-1],[0,-5],[-2,-5]],[[9323,8111],[-3,-1],[-1,2],[-1,2],[0,2],[2,2],[2,-2],[1,-4],[0,-1]],[[8965,8317],[6,-15],[0,-3],[-1,-3],[-1,-4],[0,-5],[1,-4],[-1,-1],[5,-17],[4,-11],[1,-5],[0,-5],[1,-10],[1,-15],[-1,-5],[0,-5],[-1,-3],[-2,-2],[-1,-5],[0,-15],[1,-8],[1,-6],[2,-6],[0,-6],[0,-3],[3,-4],[1,-3],[0,-4],[0,-5],[1,-2],[1,-1],[6,-43],[2,-13],[6,-22],[3,-14],[2,-6],[1,-7],[1,-7],[2,-7],[2,-8],[5,-7],[2,-3],[1,-3],[0,-11],[-1,3],[-2,7],[-2,5],[-3,5],[-4,5],[-4,8],[-3,2],[-2,2],[-4,2],[-2,0],[-10,-1],[-4,-2],[-4,-3],[-2,-6],[-1,-11],[-9,-38],[-2,-10],[-1,-11],[0,-9],[1,-3],[2,-8],[2,-5],[2,-2],[2,-2],[1,-1],[1,-2],[1,-6],[3,-13],[2,-9],[1,-3],[3,1],[2,0],[2,-1],[1,-2],[1,-11],[1,-9],[0,-3],[-2,-7],[0,-4],[0,-3],[-1,-3],[-1,-2],[0,11],[-1,8],[-1,7],[-2,5],[-6,1],[-6,1],[-1,1],[-2,3],[-1,2],[-2,1],[-1,-1],[-3,-4],[-2,-5],[-2,-5],[-1,-6],[-3,-16],[-1,-5],[-2,-4],[-2,2],[-2,3],[0,4],[-1,5],[-2,16],[1,14],[4,20],[1,6],[-1,6],[-1,6],[0,11],[0,3],[1,6],[2,6],[2,6],[1,6],[-2,16],[-3,11],[-3,10],[-1,3],[0,3],[3,13],[1,6],[1,13],[2,7],[1,8],[0,37],[0,6],[-2,11],[-1,7],[1,8],[2,7],[1,6],[0,13],[-3,12],[-2,5],[-4,7],[-3,3],[-1,3],[1,1],[1,2],[-2,3],[-2,5],[0,20],[1,5],[2,5],[1,6],[2,14],[0,14],[-1,5],[0,12],[0,3],[4,4],[4,2],[2,-1],[3,-4],[2,0],[1,0],[3,2],[2,5],[-2,3],[1,4],[3,1],[1,4],[-2,0],[2,5],[0,4],[-1,4],[-5,11],[-4,7],[6,0],[2,2],[1,3],[1,3],[2,-1]],[[9667,8327],[1,-3],[-11,10],[-6,6],[-1,3],[2,0],[2,-3],[4,-2],[4,-4],[5,-7]],[[8810,8357],[-4,-10],[-2,0],[-2,2],[-4,0],[-1,0],[2,3],[6,5],[2,0],[2,1],[1,-1]],[[8831,8357],[2,-2],[4,0],[1,-1],[-3,-3],[-2,-5],[-1,-5],[-1,-1],[-2,-3],[-2,-3],[-2,-2],[-2,0],[-4,10],[-1,2],[-6,-4],[-1,0],[1,5],[3,7],[2,1],[3,8],[1,2],[9,-5],[1,-1]],[[5544,8321],[4,4],[3,6],[2,6],[1,5],[0,5],[4,2],[8,0],[3,2],[5,7],[4,7],[2,3]],[[5582,8368],[-3,-6],[-7,-11],[2,-2],[3,0],[3,-3],[3,0],[5,2],[1,10],[0,9]],[[9628,8342],[0,-8],[-3,4],[-2,4],[-2,0],[-2,2],[-2,4],[-4,5],[-1,3],[0,4],[-2,3],[-7,6],[2,0],[3,3],[8,-2],[2,0],[-1,-4],[0,-5],[4,-9],[2,-3],[3,-3],[2,-4]],[[9182,8583],[-2,0],[-1,1],[0,1],[3,3],[2,3],[2,-2],[0,-1],[-4,-5]],[[9544,8559],[-4,-5],[-1,1],[0,1],[0,2],[4,3],[4,10],[2,7],[-1,3],[0,2],[12,5],[9,7],[2,0],[1,-6],[1,-9],[-1,-4],[-10,-3],[-9,-6],[-9,-8]],[[5994,8938],[1,-2],[0,-4],[0,-2],[0,-2],[-2,-2],[-2,5],[-2,0],[-2,2],[-1,3],[2,1],[1,0],[3,2],[2,-1]],[[6944,9014],[-5,0],[-5,4],[-5,9],[1,2],[3,-1],[5,0],[3,-2],[5,-1],[-1,-4],[0,-1],[2,-2],[-2,-3],[-1,-1]],[[6186,9026],[-1,-1],[-6,3],[0,2],[0,1],[2,0],[3,-1],[1,-2],[1,-2]],[[6396,9169],[0,-6],[-2,-2],[-1,-1],[-1,4],[-1,1],[-5,-4],[-2,-4],[-6,-7],[-13,-5],[-7,-2],[-7,0],[-6,4],[-4,8],[0,2],[-1,3],[0,4],[1,5],[1,5],[2,4],[6,5],[6,4],[3,0],[8,1],[21,-12],[5,-3],[3,-4]],[[6870,9189],[-2,-5],[-5,0],[-1,1],[-1,1],[5,5],[4,0],[0,-2]],[[9484,9152],[-1,0],[1,4],[0,2],[-3,3],[-5,2],[-1,1],[0,5],[1,8],[-2,4],[0,4],[6,4],[3,3],[2,3],[1,0],[2,-3],[0,-5],[-2,-4],[-4,-1],[-1,-3],[1,-4],[0,-6],[0,-5],[3,-5],[1,-3],[-1,-2],[-1,-2]],[[9699,9192],[-8,-1],[-16,5],[-5,3],[-4,4],[-5,2],[-1,1],[1,2],[1,2],[5,4],[4,2],[5,1],[28,-8],[1,-2],[1,-1],[-1,-3],[-2,-1],[-1,-2],[-1,-6],[-1,-1],[-1,-1]],[[6679,9212],[0,-3],[0,-5],[-1,-4],[-3,-1],[-3,-1],[-5,1],[-3,-1],[-3,0],[-3,1],[-2,1],[-2,1],[0,3],[-2,4],[-3,1],[-3,1],[-4,1],[-1,0],[-3,-2],[-1,1],[-8,9],[-1,2],[-1,2],[-1,2],[-2,6],[1,3],[3,2],[1,0],[4,5],[5,1],[2,0],[1,-1],[6,-4],[3,-3],[3,-4],[3,-3],[9,-5],[6,-5],[6,-3],[2,-2]],[[6848,9247],[0,-2],[-1,0],[-2,3],[-1,3],[0,7],[0,1],[1,1],[1,0],[-1,-4],[3,-9]],[[9463,9263],[-1,-1],[-4,1],[-2,2],[0,4],[3,0],[2,-2],[2,-4]],[[6469,9294],[2,-4],[3,-3],[2,0],[1,-1],[0,-4],[-3,-5],[-1,-2],[2,-2],[0,-1],[-3,-1],[0,3],[-2,2],[-3,2],[-1,2],[-2,4],[-5,4],[-3,-1],[-4,2],[-1,1],[-1,2],[2,2],[6,1],[3,0],[3,-1],[0,2],[0,1],[1,-1],[4,-2]],[[8831,9303],[-7,-5],[-2,0],[-3,3],[-2,0],[-1,0],[-2,-1],[-2,0],[-5,2],[-1,2],[1,1],[1,0],[1,0],[4,2],[14,0],[2,0],[2,-2],[0,-2]],[[0,9304],[4,1],[5,2],[4,0],[4,-1],[4,0],[4,2],[3,-1],[3,0],[12,-3],[3,0],[4,-3],[2,-1],[2,-2],[2,-2],[5,-3],[6,-3],[2,-2],[0,-2],[0,-3],[-8,-6],[-7,-1],[-13,-2],[-18,-4],[-7,-1],[-2,0],[-7,3],[-7,1],[9996,-1],[-7,-5],[-14,-1],[-8,-3],[-2,0],[-4,10],[0,3],[1,3],[4,5],[2,3],[10,5],[8,7],[5,1],[5,3],[-9996,1]],[[7156,9348],[-14,-1],[-6,1],[-1,1],[0,3],[7,4],[3,3],[4,4],[5,4],[5,0],[15,-4],[2,-3],[0,-1],[-6,-4],[-4,-2],[-6,-4],[-4,-1]],[[7208,9372],[-2,0],[-16,2],[-5,3],[-1,3],[0,2],[14,12],[6,-3],[1,-3],[4,-4],[0,-9],[-1,-3]],[[7073,9381],[-2,1],[-4,1],[-7,4],[-2,3],[1,3],[1,2],[6,1],[6,-1],[3,0],[7,-3],[-7,-2],[-2,-3],[0,-3],[1,-1],[-1,-2]],[[8340,9394],[-7,-3],[-6,0],[-4,5],[3,1],[6,1],[3,0],[4,-3],[1,-1]],[[6536,9406],[13,-2],[10,-1],[6,-2],[2,-1],[-1,-4],[-2,-1],[-4,-5],[0,-2],[0,-5],[0,-3],[-2,-3],[-1,-1],[-7,0],[-3,-1],[0,-3],[0,-2],[-3,-5],[-5,-1],[-1,-1],[1,-3],[-2,-2],[0,-4],[1,-1],[0,-4],[4,-5],[-1,-3],[-3,-4],[0,-5],[-3,-5],[5,-4],[2,-5],[2,-5],[6,-10],[6,-10],[12,-14],[12,-10],[5,-3],[11,-5],[2,-1],[2,-2],[-5,-4],[-5,-2],[0,-1],[-3,-1],[-14,3],[-1,0],[-1,3],[-2,2],[-3,0],[-4,-1],[2,-2],[2,-1],[4,-4],[-1,-2],[-2,0],[-8,6],[-1,-1],[-1,-2],[-4,2],[-1,-1],[-3,-1],[-2,2],[0,2],[-1,1],[-12,-2],[-5,0],[-6,1],[-6,3],[-1,-1],[0,-2],[-2,1],[-5,3],[-4,1],[-13,3],[-10,3],[3,2],[4,0],[0,2],[-1,3],[0,3],[2,2],[5,-1],[0,4],[2,0],[5,-2],[2,2],[-8,4],[-8,5],[1,2],[-3,1],[-3,0],[-3,3],[1,5],[2,3],[-1,0],[-13,-2],[-6,0],[-8,2],[-6,-2],[-7,-1],[-3,1],[-4,2],[-3,2],[-2,5],[-2,7],[0,3],[0,6],[1,3],[3,5],[2,2],[4,2],[3,1],[5,-2],[5,0],[2,2],[2,2],[2,3],[3,2],[1,1],[1,2],[1,3],[1,3],[1,3],[3,4],[-1,2],[0,2],[2,2],[-6,1],[-2,1],[-3,2],[1,2],[1,1],[6,5],[3,2],[3,1],[3,-1],[4,0],[3,1],[-4,3],[0,2],[-1,5],[0,3],[2,2],[3,2],[4,1],[3,1],[4,2],[3,1],[6,-2],[3,1],[3,1],[10,4],[4,1],[3,0],[6,-2],[5,-3]],[[6962,9394],[-8,-3],[-2,0],[-5,1],[-2,-1],[-3,2],[0,3],[1,2],[1,3],[0,8],[4,5],[5,2],[17,2],[2,0],[3,-2],[3,-2],[3,-4],[3,-2],[4,-3],[1,-4],[0,-2],[-8,-1],[-13,-3],[-6,-1]],[[7131,9414],[-2,0],[-12,2],[-4,3],[1,1],[3,0],[14,-6]],[[7097,9415],[-5,-2],[1,3],[5,4],[10,2],[4,-1],[0,-1],[-4,-4],[-2,-1],[-9,0]],[[8949,9440],[7,-2],[5,-3],[20,-14],[2,-3],[1,-3],[1,-12],[-1,-1],[-7,-1],[-10,2],[-7,0],[-7,0],[-6,2],[-15,1],[-11,5],[-12,3],[-3,1],[-7,-1],[-10,-5],[-3,0],[-4,0],[-3,4],[7,1],[6,1],[7,1],[5,5],[3,4],[6,8],[2,3],[3,2],[3,1],[3,0],[11,2],[7,0],[7,-1]],[[8459,9437],[-2,0],[-3,2],[-1,2],[0,1],[3,1],[3,-1],[2,-2],[1,0],[-3,-3]],[[7320,9450],[-1,-1],[-2,0],[-1,-1],[-7,2],[-9,1],[2,3],[7,1],[10,-2],[3,-2],[-2,-1]],[[7297,9451],[-3,-2],[-4,1],[-2,2],[-2,2],[2,1],[4,0],[2,0],[2,-3],[1,-1]],[[8782,9441],[-2,-2],[-2,3],[-9,8],[-2,3],[-5,3],[-2,2],[0,3],[7,-2],[11,-8],[6,-6],[-2,-4]],[[8916,9446],[-14,-5],[-3,1],[-6,4],[-2,11],[2,3],[3,1],[3,0],[13,1],[2,-1],[3,-1],[1,-2],[0,-2],[-1,-7],[-1,-3]],[[7354,9473],[-2,-4],[-7,2],[-2,1],[5,2],[3,2],[6,0],[-3,-3]],[[8149,9469],[-1,-3],[-2,-2],[-1,-2],[-2,-2],[-6,-3],[-4,-5],[-1,0],[-16,3],[-3,0],[-5,4],[-8,3],[-3,4],[1,1],[2,1],[7,-1],[2,1],[1,4],[0,3],[1,1],[2,2],[24,-4],[9,-3],[3,-2]],[[7406,9503],[3,-1],[7,1],[1,0],[2,-3],[-3,-4],[-2,-2],[-7,1],[-8,0],[-4,3],[2,2],[5,2],[3,1],[1,0]],[[7282,9528],[1,-2],[0,-2],[-1,-1],[-4,0],[-2,-5],[-2,1],[-1,3],[-4,-2],[-2,0],[-2,3],[-1,0],[-1,2],[6,5],[4,-3],[2,0],[0,3],[0,2],[3,1],[4,0],[0,-5]],[[9077,9525],[7,0],[11,4],[1,0],[26,-2],[2,-1],[1,-3],[-1,-1],[-1,-3],[4,-2],[8,0],[5,2],[16,-1],[13,-2],[5,-3],[3,-2],[3,-2],[3,2],[2,2],[2,0],[2,0],[-5,-13],[-2,-1],[-7,-3],[-14,-4],[-6,-1],[-16,0],[-21,1],[-5,2],[-4,1],[-6,5],[-3,1],[-10,2],[-4,1],[-6,3],[-6,3],[-15,5],[1,6],[2,5],[2,5],[3,5],[3,1],[6,-4],[-1,-5],[2,-3]],[[8775,9527],[-5,-1],[-8,0],[0,4],[2,2],[2,5],[-1,3],[0,5],[1,3],[3,4],[2,-2],[2,-4],[1,-2],[6,-4],[2,-1],[-6,-5],[0,-2],[1,-3],[-2,-2]],[[9246,9568],[-3,-2],[-6,4],[2,1],[5,2],[0,-1],[1,-1],[1,-3]],[[8889,9551],[3,-1],[4,1],[3,-1],[3,-7],[1,-1],[2,-1],[1,-1],[5,0],[2,1],[1,3],[0,3],[0,3],[0,4],[0,3],[1,2],[2,2],[7,4],[5,4],[7,-1],[8,-4],[12,-8],[6,-3],[7,-2],[7,0],[4,0],[7,2],[3,0],[44,-16],[1,-1],[2,-2],[-9,-2],[-7,-4],[-2,-3],[3,-3],[2,-3],[-14,-9],[-5,-3],[-5,-1],[-11,3],[-7,-1],[-6,2],[-7,6],[-3,3],[-2,4],[-1,7],[1,5],[4,2],[3,3],[0,2],[-1,3],[-11,0],[-7,-1],[-6,-2],[2,-12],[1,-4],[2,-2],[10,-13],[2,-1],[6,-3],[6,-5],[-10,-6],[-4,-2],[-4,-1],[-3,1],[-2,1],[-3,3],[-3,3],[-3,2],[-6,0],[-6,-2],[-7,-2],[-18,-2],[-5,-2],[-6,0],[-7,3],[-7,4],[-2,0],[-2,-1],[-2,-3],[-1,-4],[-2,-5],[-3,-3],[-3,-2],[-3,0],[-3,1],[-4,1],[-21,6],[-3,2],[-2,2],[-6,8],[-4,2],[-3,1],[-6,4],[-6,6],[-1,2],[-1,3],[1,3],[5,-1],[4,0],[-2,12],[1,11],[3,2],[9,-2],[-3,4],[-2,5],[1,3],[2,2],[4,1],[6,1],[2,1],[1,2],[3,2],[6,1],[11,4],[3,0],[3,-2],[2,-3],[3,-2],[9,-4],[6,-3],[8,-8]],[[7681,9577],[2,-1],[-1,-2],[-3,1],[-3,-2],[0,-1],[-2,-4],[-5,2],[-7,1],[-5,1],[-10,2],[0,2],[2,2],[6,-2],[5,2],[10,-1],[3,2],[8,-2]],[[7690,9573],[-2,-1],[-1,1],[-1,0],[0,3],[3,4],[0,1],[1,1],[3,-1],[2,-2],[-2,-4],[-3,-2]],[[8124,9597],[4,-4],[1,-2],[-2,-1],[0,-1],[-1,-2],[-1,0],[-4,2],[-2,3],[-4,1],[-5,3],[-1,1],[2,1],[7,-1],[3,1],[3,-1]],[[7710,9596],[-1,-1],[-3,0],[-3,3],[-1,3],[2,1],[6,-6]],[[9142,9599],[-21,0],[2,1],[7,4],[19,2],[-4,-2],[-1,-4],[-2,-1]],[[6882,9575],[-11,-4],[-7,-3],[-7,-3],[-6,-1],[-11,-4],[-18,-4],[-12,-4],[-12,-3],[-14,-4],[-13,-3],[-3,0],[-10,-4],[-7,-1],[-28,-9],[-12,-6],[-4,0],[-3,0],[-3,-2],[-3,-3],[-6,-4],[-3,-3],[-3,-2],[-2,-1],[-3,0],[-2,0],[-5,-3],[-1,-2],[6,-1],[1,-3],[-2,-1],[-4,-3],[-2,-2],[-4,-2],[-2,-1],[-7,0],[0,-3],[1,-2],[-1,-1],[-2,-2],[-2,0],[-10,5],[-2,-2],[0,-3],[-1,-3],[-1,-3],[-2,-1],[-3,-1],[-11,2],[-1,-2],[2,-3],[2,-5],[1,-2],[-1,-4],[-5,-5],[-19,-7],[0,-2],[2,-5],[1,-3],[-1,-2],[-2,-2],[-3,0],[-2,0],[-4,3],[-4,1],[0,-2],[5,-4],[2,-5],[-3,-2],[-9,-6],[-4,-8],[-9,-4],[-6,0],[-6,1],[-5,1],[-14,1],[-7,2],[-8,4],[-6,-1],[-6,-1],[-7,-4],[-5,7],[2,4],[-10,9],[-2,4],[2,2],[3,1],[6,4],[6,2],[6,1],[1,1],[3,4],[2,4],[3,2],[3,3],[9,13],[2,1],[18,3],[2,1],[-6,2],[-5,0],[-2,1],[-2,2],[-1,2],[2,2],[8,8],[8,6],[8,3],[-2,1],[-3,2],[-9,0],[-4,3],[-1,2],[0,2],[3,2],[3,2],[3,-1],[4,-1],[3,-1],[2,-3],[3,0],[8,9],[-1,2],[-1,3],[1,1],[4,1],[3,1],[6,-1],[9,-2],[0,1],[2,6],[2,3],[9,5],[-1,1],[0,3],[10,3],[7,3],[6,5],[3,1],[3,0],[7,2],[12,2],[7,2],[2,5],[5,2],[9,1],[3,-1],[2,-2],[4,0],[2,1],[1,2],[0,3],[0,4],[3,2],[1,1],[11,0],[6,0],[12,-3],[7,0],[8,0],[6,0],[15,4],[26,4],[7,3],[6,3],[4,1],[3,0],[3,1],[7,3],[3,1],[3,0],[3,2],[3,4],[2,3],[8,5],[14,5],[12,3],[7,2],[4,1],[10,-2],[13,-3],[6,-4],[4,-4],[2,-2],[0,-3],[-1,-3],[-1,-3],[1,-2],[-9,-7],[-10,-8],[-1,-1],[-11,-3]],[[7674,9620],[-1,-1],[-1,-1],[-4,1],[-6,-2],[-3,1],[-2,2],[-9,0],[-2,0],[4,2],[12,2],[19,7],[1,-3],[-1,-2],[-3,-3],[-4,-3]],[[7486,9630],[-6,-1],[-4,2],[-1,1],[2,3],[2,1],[10,1],[1,-2],[0,-1],[-4,-4]],[[7983,9633],[-3,0],[-1,3],[3,3],[3,0],[3,-1],[1,-1],[1,-1],[0,-2],[-7,-1]],[[6367,7853],[0,-3],[-3,0],[0,-4],[-1,-2],[-8,-5],[-2,0],[-1,-1],[0,-3],[0,-3],[2,-3],[-1,-2],[-1,0],[-2,1],[-1,2],[-1,0],[-2,0],[-6,-9],[-3,-3],[-3,-1],[-6,-3],[-2,0],[-2,1],[-1,-1],[0,-5],[-2,3],[-2,3],[-1,0],[1,-5],[1,-4],[-1,-2],[0,-2],[-1,-1],[-2,-1],[0,-7],[-1,-5],[-2,-4],[-2,-7],[-2,-3],[-1,-4],[-1,-5],[-1,1],[-1,3],[-1,-3],[0,-3],[-3,-3],[-3,-4],[-1,-6],[0,-3],[0,-3],[1,-2],[5,-2],[3,-2],[2,-5],[3,-4],[2,-5],[2,-6],[2,-13],[1,-12],[3,16],[2,2],[-1,-4],[-1,-7],[-2,-10],[0,-7],[0,-7],[0,-3],[-1,-10],[1,-2],[1,-2],[3,-4],[2,-5],[0,-8],[1,-2],[2,-2],[7,-15],[4,-10],[2,-5],[2,-8],[2,-1],[1,-2],[3,-3]],[[6110,7685],[-3,3],[-10,14],[-5,10],[-17,23],[-2,1],[-9,4],[-4,2],[-9,16],[-4,-2],[-4,1],[-2,1],[-2,2],[-2,4],[-2,6],[-2,4],[-7,6],[-9,3],[0,1],[0,2],[7,4],[2,2],[-4,3],[-1,1],[-2,1],[2,2],[2,1],[4,-2],[3,-5],[3,-2],[2,3],[10,3],[1,3],[0,4],[-1,0],[-1,0],[0,4],[2,5],[5,9],[2,11],[2,3],[2,-2],[0,-2],[0,-2],[2,3],[1,6],[4,0],[2,-1],[3,1],[-5,8],[-7,9],[-3,-1],[-1,2],[-3,7],[-2,6],[3,0],[3,-1],[5,4],[2,1],[3,-2],[5,0],[0,3],[-2,5],[5,4],[5,2],[9,6],[4,1],[1,2],[0,2],[-1,5],[-2,4],[-5,1],[-2,-6],[-7,-2],[-4,1],[3,3],[2,2],[1,1],[-5,-1],[-3,-4],[-7,-5]],[[6061,7896],[0,3],[0,2],[0,2],[1,2],[1,1],[0,1],[-1,0],[-1,1],[0,1],[0,2],[1,1],[0,2],[0,5],[1,4],[2,3],[4,1],[4,2],[2,3],[3,7],[2,1],[4,0],[3,-1],[7,0],[7,0],[2,1],[1,2],[0,4],[1,5],[2,7],[2,4],[0,2],[-1,1],[-1,0],[-1,1],[0,2],[1,1],[0,4],[0,3],[-1,4],[-2,1],[-3,2],[0,4],[1,4],[2,3],[1,1],[3,-1],[2,1],[1,1],[-1,2],[-3,1],[-3,2],[-2,3],[0,3],[2,1],[3,2],[3,4],[2,4],[2,3],[0,3],[0,3],[-2,4],[0,4],[1,2],[0,2],[-2,1],[-2,0],[-2,-1],[-3,0],[-4,5],[-4,4],[-3,0],[-2,1],[-1,2],[-1,3],[-1,1],[-2,0],[-2,-2],[-4,1],[-3,3],[-4,4],[-3,0],[-3,1],[-5,5],[-1,0],[-1,-2],[-1,-4],[0,-1],[-1,0],[-2,-1],[-2,3],[-7,8],[-3,6],[-1,5],[-2,2],[-2,4],[-2,1],[-3,-2],[-2,-1],[-1,-1],[-4,-1],[-7,-2],[-1,-3],[-2,-2],[-2,1],[-2,3],[-3,1],[-2,-1],[-2,2],[-1,3],[-2,2],[-3,1],[-4,1],[-2,-2],[-4,-3],[-2,1],[-1,4],[-2,1],[-2,5],[0,4],[0,2],[1,2],[0,3],[-1,2],[-1,2],[-1,6],[-1,2],[0,3],[1,2],[-1,1],[-1,0],[-2,0],[-1,1],[-1,3],[-1,4],[-1,1],[-2,0],[-3,-1],[-3,-1],[-1,0],[-3,2],[-4,2],[-7,0],[0,1],[0,1],[2,2],[-1,2],[-1,1],[0,4],[0,3],[-1,4],[-1,3],[-1,2],[0,2],[3,1],[4,2],[1,1],[0,2],[-8,12],[-3,10],[-2,5],[-3,4],[-2,2],[-4,-1],[-4,0],[-5,1],[-4,0],[-7,-5],[-2,-1],[-5,2],[-4,2],[-2,0],[-1,-1],[-1,-1],[-2,-10],[-2,-1],[-2,-2],[-3,0],[-1,0],[-3,1],[-3,2]],[[5778,8610],[1,4],[-1,5],[0,5],[1,3],[2,0],[2,-3],[3,-2],[3,2],[1,5],[2,2],[2,-2],[4,0],[3,0],[3,1],[0,1],[1,3],[2,3],[2,3],[15,-3],[12,-5],[1,2],[1,3],[-4,3],[-2,1],[-3,6],[-4,4],[-4,0],[-6,-1],[-8,1],[-7,8],[-5,2],[-3,7],[-1,3],[3,-3],[1,3],[0,4],[-2,2],[-2,2],[-9,-6],[-10,-2]],[[5857,9203],[5,-1],[11,-4],[3,0],[3,2],[3,5],[3,1],[3,-1],[1,1],[-2,5],[1,2],[11,-5],[5,-3],[10,-4],[2,-1],[0,-3],[0,-3],[-2,-1],[-5,0],[-16,4],[-2,-2],[2,-3],[4,-2],[2,-4],[7,0],[7,-1],[3,0],[1,-1],[-3,-4],[1,-1],[8,4],[4,1],[2,-1],[0,-3],[-1,-4],[0,-3],[-3,-6],[-3,-2],[-2,-3],[5,2],[3,2],[5,9],[2,1],[15,0],[4,0],[14,-5],[4,0],[5,0],[1,2],[2,1],[15,-5],[22,-11],[30,-18],[18,-16],[2,-3],[6,-2],[2,1],[3,-1],[21,-14],[7,-1],[-1,3],[-2,3],[2,-1],[3,-2],[3,-6],[5,-4],[5,-6],[4,-3],[4,-1],[3,-1],[5,-2],[3,-16],[2,-3],[0,-7],[4,-3],[2,0],[0,-5],[-2,-12],[-2,-5],[-19,-22],[-12,-8],[-22,-10],[-18,-4],[-7,0],[-14,2],[-7,2],[-10,5],[-8,3],[-6,1],[-11,1],[-24,5],[-4,2],[-15,10],[-6,-2],[-4,-1],[-2,4],[1,1],[0,1],[-8,3],[-7,0],[-4,3],[-4,1],[-2,-1],[-2,0],[-9,5],[-4,4],[-4,6],[1,2],[1,2],[-15,4],[-14,0],[3,-2],[6,-1],[4,-2],[4,-4],[-1,-5],[6,-5],[5,-5],[0,-1],[2,-1],[7,-2],[1,-4],[-1,-2],[1,-2],[5,-3],[3,-1],[4,-1],[-1,-4],[-4,-2],[-3,-1],[2,-1],[4,1],[15,-6],[8,-5],[8,-10],[3,-6],[0,-2],[-1,-3],[-1,-3],[0,-3],[-3,-9],[-2,-3],[-4,-4],[4,-6],[3,-7],[4,-10],[1,-4],[0,-7],[3,-2],[-1,-1],[-1,-2],[0,-9],[5,-7],[7,-4],[4,-1],[6,2],[4,-3],[9,-8],[5,-9],[2,-2],[9,-3],[7,-2],[12,-5],[1,-1],[6,5],[9,3],[3,5],[0,3],[-3,7],[0,7],[-3,2],[-3,2],[-9,-1],[-4,0],[-3,2],[-4,4],[-7,12],[-4,3],[-2,3],[-1,3],[0,5],[4,0],[3,3],[3,11],[5,1],[2,0],[11,-5],[13,-13],[3,-2],[3,0],[5,0],[1,-1],[3,-2],[2,-1],[12,-4],[14,-8],[6,0],[2,5],[0,2],[6,4],[4,1],[6,-1],[1,1],[-2,7],[-3,6],[-4,3],[-6,11],[-3,6],[-1,5],[0,5],[1,4],[15,9],[5,5],[5,7],[2,2],[8,2],[11,5],[9,8],[8,12],[4,3],[3,0],[4,-2],[4,-3],[5,-1],[6,1],[6,-1],[9,-5],[2,-2],[1,-2],[-3,-5],[0,-3],[2,2],[3,0],[3,-1],[3,-2],[2,-3],[3,-2],[0,3],[1,3],[-2,7],[4,10],[2,4],[5,11],[-1,7],[0,8],[-1,4],[-3,6],[-6,4],[-6,1],[-2,4],[0,4],[2,6],[5,14],[5,18],[0,5],[0,2],[0,2],[-1,6],[-1,4],[-21,17],[-1,1],[-1,2],[2,1],[2,0],[16,-8],[3,0],[26,2],[12,-2],[10,-4],[8,-11],[7,-10],[7,-8],[0,-7],[-7,-2],[-7,0],[-18,-3],[-4,-4],[-12,-13],[-1,-3],[1,-4],[5,-4],[12,-5],[5,-12],[4,-5],[3,-3],[2,0],[6,0],[5,-2],[1,-1],[1,1],[4,1],[23,6],[4,3],[2,3],[1,14],[2,4],[2,6],[-1,4],[0,4],[11,3],[11,3],[5,-1],[1,3],[-3,6],[-2,2],[2,1],[2,-1],[3,-1],[6,1],[21,11],[9,7],[5,2],[8,6],[4,2],[6,0],[7,3],[8,4],[11,4],[1,0],[2,-1],[5,-4],[-2,-2],[-1,-3],[2,-1],[2,-1],[2,1],[2,2],[5,2],[2,3],[-2,2],[-3,5],[-3,1],[-3,0],[10,7],[20,10],[11,5],[11,0],[8,0],[-3,-2],[-14,-2],[-2,-1],[0,-2],[3,0],[2,-2],[-2,-2],[-1,0],[-1,-6],[-2,-4],[4,-6],[0,-5],[-2,-3],[-4,1],[-4,-2],[-6,-2],[-1,-2],[-1,-2],[4,-1],[3,0],[11,-1],[1,0],[4,1],[4,1],[4,0],[3,1],[2,-1],[4,-5],[4,1],[2,10],[6,6],[8,5],[7,1],[7,3],[3,1],[7,-2],[9,0],[8,-3],[6,-1],[9,5],[20,15],[2,-3],[3,4],[16,5],[4,0],[0,-1],[1,-5],[3,-3],[5,-6],[-2,-2],[-3,-1],[-3,-4],[0,-10],[6,-2],[8,-3],[3,0],[3,1],[1,1],[1,2],[1,3],[0,2],[-2,5],[1,6],[7,0],[10,1],[4,4],[5,6],[3,5],[-2,9],[-6,-2],[-9,20],[-4,8],[3,4],[8,2],[7,7],[2,2],[3,0],[21,-5],[24,-1],[20,-4],[23,-8],[12,-6],[9,-6],[-1,-5],[4,2],[8,-4],[6,-2],[5,-2],[2,-3],[8,-3],[8,-4],[1,-1],[10,-3],[6,-1],[5,-7],[13,-10],[3,-4],[12,-6],[6,-5],[3,2],[9,12],[6,15],[3,7],[-6,1],[-5,-3],[-2,1],[-4,2],[-5,6],[-7,10],[-1,10],[-2,4],[-6,3],[-4,3],[-16,6],[-3,-2],[0,-4],[-1,-2],[-2,3],[-1,3],[0,5],[1,6],[2,10],[4,-1],[2,1],[3,5],[-1,4],[-2,2],[1,5],[2,11],[1,14],[-2,4],[-2,2],[-9,-2],[-3,1],[-1,2],[0,3],[3,3],[2,6],[-4,-1],[-2,2],[4,3],[4,9],[10,3],[7,4],[12,8],[9,8],[5,9],[4,10],[6,21],[6,16],[10,17],[6,1],[2,0],[1,-1],[-2,-1],[0,-2],[2,-1],[5,0],[8,1],[13,-1],[23,2],[4,-1],[8,-5],[5,1],[10,-3],[5,-2],[5,-3],[-1,-12],[-1,-8],[-3,-16],[-2,-3],[-5,-11],[-3,-8],[-4,-5],[-6,-3],[-1,-2],[0,-3],[6,-9],[13,-9],[4,-11],[1,-8],[-1,-21],[-2,-3],[-2,-3],[-3,-4],[2,-6],[2,-22],[0,-18],[-1,-6],[-1,-13],[0,-4],[1,-7],[3,-5],[4,-4],[10,-6],[10,-7],[1,-3],[1,-3],[-4,-3],[-6,-8],[-3,-6],[0,-5],[1,-7],[-1,-6],[-2,-6],[-3,-4],[-10,-6],[-21,-34],[-5,-4],[-8,2],[2,-5],[3,-7],[0,-4],[-6,0],[-8,-5],[-3,-3],[-6,-2],[-5,2],[-5,3],[1,3],[1,1],[4,2],[3,2],[-2,1],[-1,0],[-4,-4],[-4,0],[-6,4],[-4,4],[-2,1],[-3,-2],[-15,1],[-4,-1],[-2,-1],[1,-2],[2,-2],[1,-5],[1,-3],[6,-4],[8,-2],[8,-5],[10,-3],[23,1],[5,0],[6,-1],[10,-5],[4,0],[7,4],[2,10],[1,4],[26,14],[4,3],[8,8],[3,5],[2,14],[3,5],[17,16],[2,4],[1,8],[-1,5],[-1,5],[-3,8],[-3,5],[-3,7],[2,13],[3,6],[15,6],[13,2],[14,5],[6,1],[4,-1],[4,-5],[4,-7],[10,-10],[4,-7],[0,-9],[0,-22],[-2,-9],[4,-3],[2,-2],[5,-3],[3,-3],[3,-1],[6,-1],[16,1],[10,1],[-1,1],[-2,1],[-8,1],[-11,2],[-15,4],[-2,9],[0,6],[4,10],[2,2],[3,1],[4,1],[-1,7],[-2,6],[-3,9],[-4,16],[-5,0],[-4,3],[-19,9],[-18,7],[-12,1],[-4,-1],[-10,-7],[-7,-2],[-12,3],[-11,-1],[-4,1],[-1,4],[3,12],[-2,5],[-4,7],[-3,5],[0,5],[7,22],[3,5],[8,10],[3,8],[-1,4],[-16,24],[-4,9],[-2,2],[-4,4],[-6,3],[-2,4],[17,23],[7,4],[10,2],[5,3],[9,4],[5,4],[2,3],[1,4],[0,9],[-1,7],[-1,5],[-3,5],[-3,6],[2,1],[2,1],[6,0],[6,-3],[3,-7],[3,-6],[0,-4],[0,-3],[2,-4],[1,-2],[1,-3],[-1,-3],[-1,-1],[-3,-3],[-4,-11],[-4,-1],[0,-9],[7,-9],[-1,-7],[-2,-2],[-4,-4],[1,-3],[1,-2],[11,-4],[10,-3],[18,-1],[5,-4],[2,3],[17,-1],[13,-10],[7,-4],[6,-1],[11,1],[2,1],[2,3],[-5,0],[-3,-1],[-2,0],[-4,1],[-2,2],[-3,3],[-5,11],[-9,3],[-5,-1],[-6,0],[-11,6],[-6,2],[-13,6],[-3,3],[-3,5],[-3,8],[-2,5],[3,1],[8,4],[13,2],[5,-2],[13,-9],[7,-1],[11,5],[1,2],[-2,5],[-4,3],[-6,1],[-8,-2],[-2,2],[0,3],[1,2],[5,0],[3,2],[6,6],[7,3],[7,1],[26,-1],[15,-9],[15,-4],[6,-3],[2,-1],[1,-2],[1,-5],[18,-13],[5,-1],[11,-1],[13,3],[6,0],[6,-1],[4,-1],[3,-3],[-2,-4],[-1,-2],[-4,-7],[-1,-2],[-12,-7],[-5,-2],[-1,-9],[-1,-2],[0,-4],[2,-7],[0,-4],[-1,-6],[-3,-6],[0,-5],[1,-7],[1,2],[-1,4],[1,3],[6,8],[4,12],[4,3],[3,1],[4,-4],[1,-4],[0,-7],[0,-7],[-3,-10],[-5,-7],[-2,-4],[2,-3],[3,-3],[3,-1],[3,0],[1,1],[0,3],[-1,3],[0,4],[6,2],[6,2],[4,4],[1,3],[1,4],[-2,7],[-2,6],[-7,13],[-5,6],[3,10],[6,11],[2,3],[0,2],[1,3],[-1,3],[0,2],[-6,8],[-4,3],[-12,1],[-3,2],[-9,8],[-1,2],[-2,6],[-1,2],[-2,1],[-9,4],[-5,1],[-9,1],[-5,1],[-8,6],[0,2],[-3,7],[-1,4],[0,3],[3,5],[2,6],[-2,4],[-4,1],[-3,2],[-2,4],[-1,5],[0,3],[0,4],[1,3],[4,4],[-1,2],[1,3],[24,4],[10,1],[48,1],[3,1],[21,2],[9,2],[10,-2],[3,0],[7,1],[4,5],[11,2],[17,2],[8,0],[2,-2],[2,-2],[-9,-6],[-10,-6],[-7,-2],[-8,-5],[0,-2],[-1,-1],[1,-4],[0,-3],[8,-3],[6,-4],[5,-3],[5,-2],[1,1],[-16,10],[-5,2],[-1,3],[0,4],[2,1],[3,2],[1,1],[7,2],[20,3],[5,5],[2,3],[6,3],[-2,1],[-5,1],[-3,2],[-14,18],[-4,3],[-11,2],[-5,2],[5,6],[6,2],[4,0],[4,-2],[6,-5],[9,2],[-3,2],[-6,3],[-5,4],[-8,4],[-9,2],[-9,1],[3,6],[5,-1],[1,2],[3,3],[12,-8],[6,2],[5,4],[11,9],[1,4],[-5,3],[-4,1],[-6,0],[0,2],[2,3],[5,2],[14,-4],[23,9],[6,5],[16,6],[8,-1],[16,8],[23,3],[13,0],[11,4],[15,2],[6,2],[26,4],[14,3],[3,3],[-13,-2],[-3,2],[-3,-2],[-2,-1],[-6,3],[-2,-1],[-2,-2],[-2,0],[-2,0],[-1,4],[3,6],[3,-3],[5,4],[3,0],[8,-3],[5,3],[7,1],[8,-1],[3,0],[2,3],[13,-2],[9,1],[6,0],[10,-1],[4,-2],[-2,-4],[-10,-7],[3,-1],[5,3],[16,5],[3,-1],[-2,-4],[-1,-2],[10,2],[9,5],[4,1],[5,-3],[3,3],[1,3],[7,0],[3,3],[5,2],[4,1],[9,3],[3,-1],[6,-1],[5,-1],[11,-4],[1,-2],[2,0],[3,-3],[-3,-4],[-2,-6],[-4,-3],[2,0],[2,0],[4,4],[3,3],[-1,12],[-6,6],[-4,2],[-10,6],[-4,3],[-4,3],[2,2],[19,-3],[10,1],[11,0],[14,3],[6,-3],[7,0],[8,-2],[3,2],[-13,3],[-6,0],[-2,1],[2,4],[3,5],[-3,4],[-2,3],[-1,4],[3,5],[5,3],[3,4],[6,5],[31,18],[14,7],[6,1],[6,-1],[13,6],[4,0],[18,-5],[4,-3],[9,-2],[12,-2],[5,-2],[2,-2],[2,-4],[-9,-2],[-9,-6],[-14,-4],[-16,-2],[-3,-2],[31,-1],[9,1],[2,-6],[3,0],[9,2],[5,1],[10,-2],[2,1],[5,0],[9,-3],[4,-3],[-6,-6],[-7,-6],[-9,-9],[-2,1],[-5,0],[1,-4],[8,0],[4,-2],[9,2],[13,0],[2,0],[5,3],[2,5],[2,4],[4,1],[5,-1],[8,0],[20,1],[17,-2],[14,3],[18,-2],[7,-2],[6,-4],[5,-1],[5,-3],[4,-4],[-2,-3],[-2,-3],[5,3],[5,0],[3,-1],[6,-2],[1,-9],[2,-2],[1,-3],[-2,-3],[-1,-2],[4,1],[6,3],[2,1],[1,2],[-2,3],[-2,1],[2,1],[6,0],[2,-4],[2,-4],[4,-13],[8,2],[0,-4],[-3,-9],[-4,-6],[-1,-2],[-2,0],[0,4],[-1,2],[-2,1],[-7,1],[-14,8],[-4,1],[-1,-1],[0,-1],[8,-5],[6,-9],[6,2],[2,0],[3,-5],[6,-1],[4,-3],[-3,-9],[-19,-16],[-20,-10],[-9,-6],[-16,-5],[-11,-6],[-15,-5],[-4,-5],[-11,-3],[1,-2],[1,-2],[-1,-3],[-2,-2],[-8,-5],[-12,-3],[-24,-20],[-12,-4],[-14,0],[-3,-2],[-10,-12],[-3,-2],[-14,-2],[-14,-20],[-8,-7],[-7,-3],[7,0],[9,3],[10,7],[2,3],[1,3],[3,3],[5,2],[17,2],[8,-1],[10,0],[7,4],[4,1],[4,1],[2,2],[6,1],[14,3],[3,2],[4,5],[9,-2],[6,1],[16,9],[9,3],[3,3],[-2,1],[-2,1],[-9,-3],[-9,-1],[-9,1],[-1,1],[-2,4],[3,4],[3,3],[6,4],[5,1],[18,-4],[4,0],[2,6],[6,0],[6,-1],[-3,-2],[-6,-2],[2,-5],[3,-3],[11,-5],[9,-2],[7,0],[11,2],[2,2],[2,4],[-2,7],[2,-1],[3,-2],[4,-4],[4,-8],[3,-3],[-2,-4],[-6,-7],[4,-4],[6,-3],[0,-11],[-1,-6],[-3,-6],[-3,-2],[-3,-4],[0,-4],[1,-2],[4,-4],[10,-2],[1,2],[-2,1],[-7,2],[-3,1],[-2,4],[3,4],[3,4],[3,7],[1,5],[0,5],[2,2],[3,3],[2,0],[2,1],[-3,2],[-2,0],[-5,3],[-1,5],[10,1],[6,3],[21,1],[14,6],[32,-2],[23,-4],[31,-1],[12,-3],[1,-1],[1,-2],[-5,-1],[-8,0],[-3,-5],[2,-7],[15,-8],[13,-3],[9,-5],[4,0],[19,0],[11,-2],[10,2],[11,0],[4,-1],[4,-3],[6,-1],[8,-1],[4,1],[2,1],[-1,2],[-6,2],[1,2],[2,1],[11,-4],[4,0],[4,3],[3,4],[2,4],[1,1],[2,1],[1,1],[-3,4],[-4,4],[0,4],[-1,1],[-1,6],[3,6],[2,2],[9,-2],[4,3],[2,2],[10,2],[5,0],[7,-3],[23,-11],[-1,-4],[5,1],[3,2],[6,1],[4,2],[1,-1],[2,-1],[-1,-3],[-2,-2],[1,-2],[1,0],[7,-3],[7,5],[4,6],[2,1],[19,-4],[6,-2],[2,-1],[0,-2],[4,-2],[4,-1],[-1,-2],[0,-2],[9,0],[4,-2],[4,-3],[0,-2],[1,-2],[4,0],[1,0],[-1,-4],[-6,-4],[-3,-2],[-4,-3],[2,0],[10,-1],[6,-5],[0,-4],[-3,-2],[-9,-5],[-5,-2],[-3,-1],[-3,0],[4,-3],[16,0],[4,-3],[4,-7],[0,-9],[-4,-4],[-9,-1],[-13,10],[-8,4],[-11,7],[-2,-1],[3,-6],[5,-4],[10,-9],[15,-19],[4,1],[2,3],[1,3],[-1,4],[2,-2],[3,-4],[4,-6],[-6,0],[-8,-2],[-3,-2],[2,-4],[6,-1],[3,-4],[4,-6],[11,-17],[7,-3],[7,-7],[7,-3],[4,0],[2,4],[2,-1],[2,-8],[4,-3],[3,-1],[3,2],[5,3],[4,5],[5,11],[4,6],[4,2],[-1,3],[0,3],[3,8],[3,9],[3,5],[6,10],[3,2],[2,-4],[1,-4],[1,-2],[1,0],[8,-9],[8,-6],[8,-4],[11,-3],[17,1],[3,4],[6,3],[9,2],[6,3],[9,2],[5,-1],[9,-3],[20,-9],[5,-3],[3,-3],[7,-6],[4,-2],[4,-2],[1,1],[0,1],[-2,1],[-2,2],[5,2],[0,2],[2,1],[6,1],[-6,2],[-2,0],[-3,1],[0,3],[2,2],[2,4],[2,2],[3,2],[2,0],[6,-2],[4,4],[3,0],[6,-5],[6,-6],[3,0],[9,2],[10,1],[-2,3],[-6,9],[0,10],[-4,3],[-6,1],[8,3],[6,8],[4,1],[5,2],[-1,1],[-15,1],[-3,-1],[-2,-3],[-7,0],[-1,6],[0,4],[9,8],[4,1],[24,0],[7,2],[10,4],[-3,2],[0,5],[-9,7],[1,2],[1,1],[2,0],[14,-2],[6,-4],[15,-4],[41,-1],[4,-1],[18,-2],[7,-2],[17,-2],[8,-2],[7,-2],[10,-2],[5,-2],[-1,-5],[-21,1],[-7,2],[-9,0],[-3,-1],[-6,-5],[-6,-2],[-5,0],[3,-4],[5,-1],[16,5],[43,2],[7,0],[-1,-3],[-6,-7],[-5,-5],[-8,-5],[-3,0],[6,11],[-3,0],[-2,0],[-7,5],[-1,0],[-1,-1],[0,-2],[-2,-6],[3,-3],[0,-4],[-10,-3],[-4,0],[-4,2],[-1,0],[-1,-2],[1,-2],[0,-2],[-2,-2],[0,-2],[2,-3],[3,-1],[17,3],[8,4],[8,6],[15,16],[6,6],[4,2],[4,1],[27,-2],[16,-4],[15,-5],[7,-4],[6,-6],[1,-2],[0,-3],[-4,-3],[-16,-1],[-7,-2],[-2,-2],[0,-1],[-1,-2],[1,-1],[8,0],[7,-1],[10,-4],[1,-1],[3,-4],[1,0],[15,0],[1,-1],[1,-2],[-4,-4],[-4,-3],[-8,-7],[5,3],[16,5],[4,1],[5,0],[12,-5],[5,-4],[9,-11],[-3,-2],[-6,-1],[20,-8],[8,0],[19,2],[9,0],[17,6],[17,3],[16,1],[8,3],[22,0],[22,-1],[16,-2],[18,-6],[18,-9],[11,-8],[2,-2],[3,-6],[1,-5],[2,-6],[-1,-6],[-3,-3],[-1,-5],[0,-5],[-3,-7],[3,-5],[8,-3],[17,-4],[5,-3],[0,-8],[2,-8],[1,-13],[3,-4],[5,-3],[1,-4],[-6,-15],[-4,-3],[-4,-4],[7,2],[4,5],[3,10],[4,1],[2,4],[0,9],[-2,8],[0,5],[1,5],[12,9],[6,4],[5,2],[16,2],[7,2],[9,-1],[5,1],[7,1],[6,0],[10,-7],[35,-1],[6,-2],[23,-3],[2,0],[5,3],[15,11],[7,-1],[2,-2],[3,-4],[3,-3],[2,-7],[2,-10],[3,-2],[5,-1],[10,-4],[10,-4],[3,-10],[5,-7],[13,0],[13,2],[13,13],[0,5],[-3,7],[-5,7],[-4,12],[-11,2],[1,3],[4,4],[4,6],[1,5],[-1,10],[10,-1],[11,-1],[20,-4],[16,-2],[9,-3],[5,-3],[6,-2],[2,5],[3,2],[8,-4],[6,-1],[10,1],[13,-2],[14,1],[13,2],[5,0],[5,-2],[8,-6],[15,-7],[13,-2],[15,-6],[14,-3],[11,-4],[2,-1],[0,-2],[1,-2],[9,-2],[16,-14],[-9995,-2],[6,-2],[5,-2],[2,0],[2,0],[3,-3],[2,-2],[11,-4],[5,-5],[5,-5],[-2,1],[-4,4],[0,-4],[1,-3],[6,-3],[7,-2],[4,-2],[1,-2],[1,-4],[-1,-3],[4,1],[3,3],[-2,2],[-11,8],[-3,3],[4,-1],[15,-11],[5,-4],[-2,0],[-1,-3],[1,-1],[2,1],[3,1],[3,-2],[4,-2],[7,-4],[43,-25],[1,-4],[1,-2],[1,-3],[0,-4],[-4,-6],[7,1],[0,1],[2,2],[2,1],[2,-2],[2,-3],[-1,-5],[-1,-3],[0,-7],[1,-5],[2,-2],[1,-3],[0,-8],[-3,-3],[-1,-6],[2,0],[5,-1],[2,-1],[3,-3],[0,-2],[1,-4],[1,-3],[1,-2],[4,5],[1,1],[3,2],[2,-6],[-1,-8],[1,0],[1,0],[1,3],[1,1],[2,3],[2,4],[-2,3],[-2,2],[-5,1],[-3,3],[-1,3],[3,1],[2,2],[2,5],[-1,3],[0,3],[-2,4],[-2,2],[-3,1],[-2,2],[-2,0],[-3,1],[-1,1],[0,1],[3,1],[16,0],[6,2],[2,0],[3,-2],[9,-2],[0,-1],[-2,-1],[-3,-5],[0,-2],[0,-4],[2,0],[3,1],[-2,3],[0,3],[1,2],[1,0],[3,-3],[2,0],[9,-1],[3,0],[1,1],[-2,2],[-12,3],[0,2],[11,-3],[5,-2],[5,-1],[6,0],[7,-2],[6,-7],[6,-8],[6,-5],[6,-3],[10,-10],[2,-1],[1,-1],[-2,-2],[-2,-2],[3,1],[4,1],[1,0],[2,-1],[1,-2],[0,-2],[-1,-2],[10,0],[3,-1],[1,-5],[-3,-4],[-1,1],[-2,1],[-1,0],[-5,-1],[-6,-5],[-4,-3],[-1,-3],[1,-6],[-1,-4],[-3,-2],[-6,2],[-3,1],[-3,2],[-3,2],[-4,4],[-2,0],[-1,-1],[2,-2],[3,-3],[4,-4],[2,-5],[-1,-2],[-2,0],[-1,0],[-4,1],[-3,0],[-9,-1],[-3,-1],[-1,1],[-1,2],[-4,1],[-3,1],[-2,0],[-1,2],[-3,3],[-5,1],[-3,1],[-2,-1],[7,-4],[5,-7],[-1,-1],[0,-1],[3,-1],[2,1],[0,-2],[-1,-7],[-1,-1],[-10,-2],[2,-1],[3,-1],[3,1],[2,-1],[2,-5],[0,-5],[-2,-2],[-3,-2],[-5,-4],[-6,-1],[-3,0],[-3,0],[-1,-2],[-1,-2],[2,1],[3,0],[3,-2],[0,-2],[-3,-2],[0,-1],[1,-3],[-1,-2],[1,-1],[3,0],[4,-2],[4,-2],[1,-1],[1,-3],[1,-2],[-1,-1],[-8,0],[-1,0],[-1,3],[-1,2],[-3,1],[-1,-1],[1,-8],[-1,-2],[-2,-2],[-4,-1],[-3,1],[-3,4],[0,3],[2,2],[0,2],[-1,3],[-2,-3],[-2,-3],[-3,-4],[-2,0],[-2,0],[-5,3],[-2,2],[-6,7],[-3,4],[-7,4],[-7,4],[-6,2],[-3,0],[-3,-1],[-4,0],[-1,1],[-2,2],[-1,1],[-5,5],[-4,3],[0,3],[1,3],[-1,7],[-2,7],[-4,7],[-13,4],[-11,3],[-3,1],[-4,-1],[-8,-5],[-6,-1],[-17,0],[-3,0],[-2,3],[-1,3],[1,6],[0,2],[-1,1],[-1,0],[-3,3],[-3,4],[-3,4],[-2,5],[3,0],[3,-1],[0,1],[1,5],[2,3],[1,2],[2,7],[0,4],[-3,-2],[-3,-7],[-2,-2],[-2,-1],[-1,0],[-3,1],[-2,2],[0,6],[-1,2],[-1,-1],[-1,-3],[-2,0],[-2,-1],[1,-4],[0,-3],[-3,-2],[-5,0],[-2,3],[-2,-5],[-1,-5],[0,-6],[2,-6],[2,-3],[5,-4],[3,-3],[0,-3],[0,-4],[-3,-4],[-2,-3],[-3,-8],[-2,-4],[-8,-6],[9994,-2],[-5,-7],[-5,-6],[-9,-2],[-12,-9],[-5,-1],[-7,4],[-15,2],[-4,4],[-7,9],[-2,1],[-2,4],[-9,3],[-7,-2],[-6,2],[-2,-2],[3,-1],[6,-1],[8,1],[3,-1],[2,-3],[3,-5],[-2,-4],[-2,-1],[-7,4],[-8,-1],[-3,1],[-10,6],[-8,-6],[-11,-4],[-8,0],[-15,-6],[4,0],[11,4],[6,0],[10,2],[5,3],[2,2],[3,2],[4,-1],[2,-2],[1,-4],[2,-4],[-2,-3],[-2,-1],[-2,-3],[10,5],[6,-3],[3,1],[6,5],[9,3],[2,-1],[1,-1],[-2,-10],[1,-7],[7,-8],[7,-5],[3,0],[2,1],[1,4],[2,3],[2,-3],[2,-3],[3,-8],[0,-2],[-1,-4],[2,-2],[4,-1],[1,-7],[1,-10],[-2,-1],[-1,0],[-5,-3],[0,-1],[6,-1],[1,-2],[-1,-5],[0,-2],[2,-1],[1,3],[0,4],[0,2],[4,-8],[0,-4],[3,-3],[8,-6],[2,-2],[0,-4],[-2,-1],[-2,-3],[2,-4],[2,-3],[3,-1],[2,-6],[0,-4],[-3,-5],[-5,-6],[-3,-2],[-1,-4],[0,-5],[-3,1],[-2,1],[-26,11],[-10,2],[-9,1],[-1,0],[0,3],[0,2],[2,3],[-1,3],[-1,0],[-1,-2],[-3,0],[-2,2],[-2,0],[-1,-3],[0,-2],[0,-2],[1,-2],[5,-2],[-1,-2],[-7,-1],[-6,-2],[-7,-5],[-3,-4],[-20,-9],[-5,-4],[-2,0],[-2,-1],[-3,-4],[-10,-6],[-3,1],[-3,-5],[-2,-2],[-7,-1],[-4,-1],[-9,-7],[-5,3],[-7,-10],[-7,-8],[-2,0],[-5,3],[-2,-2],[1,-3],[2,-4],[-1,-1],[-2,1],[-2,0],[-1,-1],[0,-2],[-3,-4],[-2,0],[-3,-1],[-1,-3],[1,-3],[-5,-4],[-4,-5],[-2,0],[-2,-3],[-3,-1],[-3,0],[-6,-6],[-15,-12],[-5,-2],[-5,-3],[0,-3],[0,-3],[-3,-4],[-2,-13],[-1,-2],[-1,-2],[-5,1],[-5,5],[-2,2],[-1,2],[0,4],[-1,2],[-1,1],[-5,10],[-10,7],[-1,2],[-12,-2],[-4,0],[-5,2],[-9,-1],[-11,-4],[-4,-2],[-11,-4],[-7,-6],[-14,-20],[-4,-5],[-1,-1],[-3,0],[-1,4],[0,4],[1,6],[2,5],[1,10],[1,4],[1,4],[-5,-1],[-6,-7],[-10,-7],[-5,-1],[-4,-5],[-2,0],[-3,-2],[-1,-8],[-1,-5],[-2,-1],[-3,0],[-2,1],[-3,8],[-4,3],[-2,1],[-2,-1],[-3,-5],[-4,-4],[0,5],[-3,2],[-3,1],[-4,0],[-1,-1],[-1,-3],[-3,-3],[-2,-2],[-3,-3],[-1,-3],[-1,-4],[-2,-11],[0,-12],[-5,-10],[-2,1],[-1,-1],[-1,-1],[2,-6],[-1,-2],[-1,-1],[-2,-1],[-6,-8],[-5,-6],[-9,-15],[-3,-10],[-2,-11],[1,-6],[1,-3],[2,-3],[3,-2],[5,-3],[0,-2],[0,-2],[2,3],[2,8],[3,3],[2,-1],[12,-6],[2,-3],[0,-6],[-1,-2],[-2,-5],[-4,-5],[-5,-6],[-1,-5],[0,-2],[2,-8],[0,-5],[-1,-8],[0,-4],[2,-3],[2,-2],[3,1],[3,-1],[3,-2],[0,-7],[1,-7],[1,-12],[-2,-4],[-2,-2],[-4,-5],[-2,-1],[-4,2],[-5,10],[2,5],[5,4],[2,3],[2,4],[-3,0],[-2,-2],[-5,1],[-3,-2],[-2,-4],[1,-8],[-2,-1],[-4,-3],[-5,-3],[-2,-3],[-4,-14],[-4,-11],[-2,-9],[1,-8],[1,-8],[1,-4],[5,-8],[2,-7],[1,-8],[-4,-3],[-7,-9],[-2,-1],[-10,0],[-4,5],[-6,-2],[-4,-2],[-7,-6],[-6,-8],[-6,-6],[-2,-3],[-3,-7],[-2,-13],[1,-7],[1,-3],[1,-4],[-1,-6],[0,-4],[3,-6],[0,-8],[-2,0],[-5,6],[-5,0],[-12,-7],[-6,-4],[-5,-8],[-2,2],[-1,4],[-2,2],[-3,-1],[-1,-4],[4,-2],[1,-3],[-2,-10],[-2,-4],[1,-10],[0,-4],[-1,-5],[-4,-12],[-6,-16],[-8,-12],[-5,-4],[-3,-3],[-1,-4],[-8,-11],[-10,-12],[-3,-2],[0,4],[-1,4],[-1,6],[-4,5],[0,4],[-1,6],[0,25],[-3,26],[0,8],[-4,7],[-2,7],[-2,7],[0,8],[-4,42],[-1,11],[-6,34],[-2,20],[-2,19],[0,9],[3,25],[2,16],[7,36],[1,4],[1,1],[13,14],[6,8],[3,8],[4,10],[-1,5],[0,3],[-2,4],[-3,4],[1,2],[2,1],[3,2],[6,-3],[7,1],[6,13],[8,-2],[7,2],[2,-1],[1,4],[3,5],[7,7],[10,8],[5,5],[2,6],[4,5],[4,6],[7,18],[14,16],[6,9],[4,3],[4,1],[10,13],[7,10],[8,7],[3,5],[4,11],[2,3],[5,4],[13,7],[7,7],[11,1],[3,3],[3,1],[4,3],[-5,6],[1,3],[1,2],[8,7],[3,6],[-1,3],[0,1],[-5,3],[1,5],[1,5],[4,4],[1,10],[1,9],[3,15],[3,3],[8,7],[2,0],[6,-2],[7,-1],[2,-3],[1,2],[-1,3],[2,1],[4,-1],[-1,2],[-9,2],[-7,3],[-7,6],[-4,1],[-4,0],[-26,-8],[-1,-3],[-1,-3],[1,-5],[-1,-2],[-1,-1],[-2,-3],[-1,-6],[0,-6],[-3,-9],[0,-6],[6,-3],[1,-2],[-2,-4],[-1,-1],[-2,-3],[-1,-1],[-1,0],[-2,3],[-2,6],[-3,0],[-1,-1],[-1,-2],[-2,0],[-3,1],[-3,-1],[-6,-7],[-32,-33],[-3,-4],[-4,-8],[-8,-1],[-3,-1],[-3,-3],[-3,-2],[0,3],[1,3],[1,6],[4,11],[-3,1],[-2,0],[-5,-2],[-4,-4],[-2,1],[1,3],[3,7],[-1,6],[-1,3],[2,2],[6,12],[2,7],[2,8],[0,3],[0,3],[-2,0],[-1,0],[-13,-8],[-5,-2],[-1,3],[-3,2],[-3,6],[-3,1],[-3,-1],[-7,-4],[-8,-2],[-6,1],[-5,-4],[-2,0],[-8,2],[-9,0],[-3,-3],[-7,-4],[-6,-6],[-3,-2],[-3,-3],[-1,-12],[-4,-4],[-4,-3],[-8,-9],[-6,-13],[-3,-5],[-8,-8],[-13,-10],[-11,-16],[-4,-12],[-1,0],[-3,-3],[-1,-6],[0,-4],[-1,-3],[-2,-4],[2,-3],[1,-1],[3,1],[6,3],[11,-5],[5,-5],[0,-5],[0,-5],[-4,0],[-5,0],[-4,-3],[-6,5],[-3,-2],[-3,-5],[-7,-2],[-3,3],[-6,6],[-9,-1],[-2,-7],[-2,1],[-4,-1],[-5,-8],[-2,-1],[-7,1],[-5,5],[-2,0],[-4,-2],[-2,-5],[-11,-3],[-10,1],[-6,12],[11,5],[6,-1],[7,0],[8,4],[-3,3],[-2,1],[-4,-1],[-4,3],[-9,11],[-4,2],[-5,2],[-4,0],[-1,-1],[-2,-3],[-1,-3],[-1,0],[-3,0],[-3,2],[-4,0],[2,1],[3,2],[-6,2],[-3,3],[-4,1],[-15,6],[-6,0],[-4,-2],[-6,-6],[2,-4],[1,-2],[1,-2],[-2,0],[-6,-1],[-4,4],[-2,-5],[1,-4],[4,1],[2,-2],[-1,-5],[-6,-1],[-6,0],[-7,9],[-10,-2],[-5,-5],[-5,-1],[-13,5],[-7,1],[-7,4],[-3,-1],[-5,-12],[-6,-3],[-3,2],[-3,7],[-2,3],[-6,2],[-29,-2],[-10,2],[-8,0],[-9,-4],[-9,1],[-17,-7],[-7,-5],[-9,-9],[-7,-15],[-4,-5],[-8,-7],[-10,-6],[-5,-7],[-3,-5],[-5,-20],[-2,-3],[-12,-7],[-4,-8],[-1,-2],[-6,-4],[-3,-5],[-1,-2],[-8,-4],[-6,-10],[-8,-7],[-12,-19],[-2,-3],[-1,-5],[-1,-4],[-11,-17],[-3,-1],[-6,-8],[-5,-5],[-5,-5],[-6,-6],[-9,-7],[-3,-4],[-5,-9],[-12,-11],[-6,-3],[-8,-10],[0,-2],[-1,-3],[1,-7],[2,-1],[3,-1],[12,-6],[11,1],[9,0],[4,1],[2,0],[1,-4],[0,-6],[-2,-6],[-1,-16],[-1,-8],[1,-7],[2,-1],[3,3],[3,0],[4,-1],[3,12],[-3,1],[-2,5],[2,3],[6,5],[4,1],[4,-1],[-4,-7],[-2,-1],[-1,-1],[-2,-1],[4,-4],[4,-4],[6,-1],[-1,-2],[-4,-3],[-4,-9],[-6,-4],[-2,-3],[1,-2],[2,0],[11,1],[6,2],[8,7],[4,11],[3,3],[1,0],[1,-1],[0,-7],[-4,-9],[-3,-4],[-2,-4],[2,0],[4,0],[2,2],[4,10],[1,8],[0,10],[0,6],[0,4],[-1,4],[1,2],[11,-6],[6,-2],[11,5],[2,-1],[2,-3],[9,-9],[2,-3],[3,-11],[9,-12],[9,-6],[0,-2],[6,-7],[4,-3],[1,-6],[-2,-5],[-4,-5],[-8,5],[-2,0],[1,-3],[6,-8],[5,-4],[0,-10],[0,-6],[-4,-7],[1,-4],[5,-5],[2,-3],[2,-3],[-3,-7],[0,-8],[-3,-3],[-4,-8],[-5,-6],[-3,-12],[-4,-10],[0,-11],[-1,-3],[-4,-11],[-1,-15],[2,-24],[1,-1],[1,-2],[0,-1],[-1,-1],[-3,-7],[0,-5],[1,-4],[0,-10],[-2,-15],[-1,-2],[-1,-4],[0,-4],[-1,-2],[0,-4],[0,-3],[2,-2],[-5,-11],[-1,-14],[-2,-6],[-3,-6],[-7,-8],[-2,-5],[-4,-7],[-4,-5],[-6,-15],[-5,-14],[-11,-19],[-2,-4],[-1,-5],[-3,-9],[-1,-11],[-4,-5],[-3,-12],[-9,-19],[-2,-6],[-8,-10],[-7,-15],[-10,-12],[-2,-6],[-3,-6],[-4,-9],[-6,-8],[-1,-6],[-2,-5],[-4,-3],[-4,-3],[-9,-24],[-1,-4],[0,-3],[-7,-9],[-3,-9],[-6,-6],[-6,-8],[-15,-14],[-4,-5],[-9,-7],[-3,0],[-7,-4],[-5,-4],[-3,2],[-2,4],[-2,0],[-1,0],[-5,4],[-3,0],[-3,2],[-5,-1],[1,20],[-1,5],[-2,-4],[-5,-8],[-3,-1],[-2,0],[1,4],[3,7],[-1,1],[-1,0],[-4,-3],[-2,-3],[-6,-12],[-3,-10],[-3,-3],[-1,-4],[-3,-4],[-3,1],[-2,-1],[-6,3],[-1,-1],[3,-8],[-2,-11],[-2,-2]],[[7991,9684],[-3,-3],[-3,-1],[-4,2],[-10,0],[-16,3],[5,1],[26,1],[1,0],[4,-3]],[[7951,9688],[-3,0],[-4,1],[1,3],[8,0],[3,4],[5,0],[2,-1],[1,-2],[0,-1],[-1,0],[-5,0],[-1,-1],[-6,-3]],[[7857,9749],[-3,-5],[-1,-4],[-8,-13],[-1,-2],[5,2],[4,4],[3,4],[3,2],[3,0],[4,1],[6,3],[7,2],[4,0],[3,-2],[2,-3],[3,-3],[8,-2],[2,-1],[0,-2],[0,-3],[5,-2],[7,1],[3,-1],[4,-1],[2,-3],[1,-2],[1,-4],[1,-4],[0,-6],[-14,-8],[-2,-1],[-6,1],[-7,-1],[-16,-5],[-20,0],[-5,-4],[-2,0],[-2,1],[-1,1],[-12,-1],[-14,0],[-14,0],[-4,-3],[-14,-6],[-13,-4],[-6,-1],[-10,1],[-3,2],[-3,2],[4,2],[3,6],[4,3],[10,6],[1,2],[1,6],[2,2],[1,1],[1,3],[0,3],[1,3],[4,4],[2,2],[3,0],[7,0],[3,0],[-2,1],[-1,5],[0,2],[1,3],[2,1],[2,1],[1,5],[-1,1],[3,2],[1,3],[3,1],[7,2],[0,3],[1,2],[2,1],[3,0],[2,0],[2,-3],[3,-3],[3,0],[4,0],[-3,3],[1,4],[1,2],[1,1],[4,0],[10,-2],[7,-4],[2,-2],[-1,-1],[-3,0],[-2,-1]],[[7117,9772],[4,-2],[2,1],[25,-5],[5,-2],[2,-1],[-22,-1],[-5,0],[0,3],[-5,0],[-8,2],[-3,3],[0,1],[3,1],[2,0]],[[7781,9769],[-6,0],[0,4],[1,1],[3,0],[2,-1],[4,0],[-4,-4]],[[7574,9774],[-7,-1],[-8,1],[-13,6],[-9,2],[-6,4],[-2,5],[4,2],[6,2],[9,0],[12,-1],[11,-3],[25,-3],[9,-2],[-6,-5],[-6,-2],[-6,-2],[-6,-2],[-7,-1]],[[6427,9788],[1,0],[0,-1],[-10,1],[-17,-1],[-10,4],[10,3],[6,0],[7,3],[9,-3],[0,-2],[0,-1],[2,-1],[2,-2]],[[6657,9789],[-10,-2],[-3,1],[-1,1],[-2,1],[-5,1],[1,3],[1,1],[15,4],[7,-3],[4,-5],[-7,-2]],[[7712,9801],[7,-4],[3,-4],[-3,-1],[-3,-3],[-1,-3],[-4,-3],[-1,-4],[2,-1],[2,1],[4,4],[5,3],[6,-2],[2,1],[4,4],[0,3],[1,2],[2,1],[8,-1],[11,-1],[3,-2],[2,-1],[2,-2],[5,-1],[3,-1],[4,-3],[3,-4],[-4,-2],[-2,-4],[-1,-1],[-1,-2],[0,-3],[-1,-3],[-1,-2],[0,-1],[0,-5],[-1,-3],[-4,-3],[-4,0],[-6,2],[-2,0],[-2,-1],[8,-4],[6,-5],[6,-2],[2,0],[2,-6],[1,-2],[-11,-6],[-3,-1],[-17,-1],[-11,-2],[-4,0],[-6,2],[-4,-1],[-6,1],[-4,0],[-8,2],[-9,4],[-2,2],[-2,1],[-10,1],[-2,1],[-16,-1],[-2,1],[-5,5],[-3,0],[-8,-3],[-3,0],[-7,2],[-4,2],[0,1],[0,3],[-4,2],[-5,5],[-3,5],[-12,3],[-8,1],[-6,-1],[-5,3],[9,7],[12,4],[5,4],[6,4],[3,6],[10,4],[3,2],[4,3],[1,0],[8,-4],[2,1],[1,2],[3,2],[10,0],[8,-1],[4,1],[3,0],[20,2],[13,1],[2,0]],[[6390,9796],[-3,-1],[-10,5],[-1,1],[9,4],[10,-1],[2,-2],[-7,-4],[0,-2]],[[6540,9807],[-7,-2],[-5,0],[-1,1],[3,3],[4,1],[3,0],[2,-1],[1,-2]],[[6585,9812],[1,-2],[0,-7],[-1,-3],[0,-3],[-3,-1],[-22,0],[-10,1],[-3,1],[6,3],[2,2],[0,7],[1,1],[17,0],[2,2],[6,0],[4,-1]],[[6486,9802],[-18,0],[-7,0],[0,1],[-2,0],[-6,1],[-3,3],[1,1],[9,1],[3,1],[1,2],[4,3],[9,0],[4,0],[0,-2],[4,-3],[10,-3],[-2,-2],[-3,-1],[-4,-2]],[[6609,9799],[-4,-1],[-11,2],[-2,1],[-2,2],[-1,8],[0,2],[-1,1],[-3,3],[-2,2],[2,1],[12,-1],[27,-1],[13,-2],[4,-2],[4,-3],[-23,-1],[-4,-1],[0,-3],[0,-3],[-3,0],[-6,-4]],[[6511,9819],[-4,-3],[-13,3],[1,2],[2,0],[0,2],[-2,1],[1,3],[8,-2],[1,-1],[6,-1],[1,-3],[-1,-1]],[[6317,9841],[13,-3],[9,1],[3,0],[3,-1],[3,-1],[4,-4],[0,-5],[-2,0],[-16,2],[-7,5],[-2,1],[-3,-2],[-3,-3],[-3,0],[-3,-4],[-3,0],[-1,0],[-4,-3],[-9,0],[-2,-1],[-3,-4],[-3,-1],[-7,-1],[-2,3],[-1,3],[-2,1],[-9,-1],[-7,1],[-6,2],[-7,1],[6,2],[33,5],[13,1],[7,4],[9,2],[2,0]],[[6726,9840],[2,-3],[-1,-3],[-2,-3],[-1,-4],[-9,-1],[-2,-1],[-3,-3],[-8,-1],[-7,-5],[-9,1],[-12,3],[-11,-3],[-7,0],[-8,4],[-1,1],[-1,3],[1,2],[2,6],[3,3],[1,1],[2,2],[3,1],[11,1],[4,-1],[1,-2],[5,0],[10,1],[13,2],[8,2],[7,0],[7,-1],[2,-2]],[[6396,9845],[4,-1],[11,0],[3,-1],[15,-8],[3,-1],[4,-3],[-16,-5],[-5,-3],[-19,-1],[-12,-2],[-3,-1],[2,-3],[-6,-3],[-19,0],[-3,-1],[-3,-3],[0,-1],[6,0],[1,-1],[1,-1],[1,-2],[-1,-3],[-3,0],[-2,0],[-6,2],[-1,-1],[-1,-1],[-1,-3],[-3,-1],[-6,2],[-2,0],[-2,-2],[-2,0],[-6,-1],[-3,2],[3,2],[7,4],[-2,1],[-7,1],[-6,-1],[-3,-2],[-2,-1],[-7,0],[-4,3],[-3,2],[-3,2],[21,8],[7,4],[7,1],[8,1],[3,1],[3,0],[2,0],[4,-3],[13,0],[3,3],[0,5],[-1,4],[2,6],[8,3],[17,3],[4,0]],[[7222,9841],[-26,-3],[-2,2],[-1,1],[4,4],[3,2],[16,1],[13,-2],[4,-1],[-1,-2],[-1,-1],[-9,-1]],[[6698,9846],[-9,-1],[-14,2],[-7,1],[0,1],[2,1],[12,4],[24,1],[4,-3],[-3,-2],[-9,-4]],[[6519,9856],[21,-6],[20,1],[8,-2],[12,-5],[18,-5],[4,-2],[-3,-2],[-21,-5],[-14,-2],[-12,0],[-5,0],[-5,4],[-12,3],[-12,-1],[-1,2],[-3,1],[-4,0],[-9,2],[0,3],[5,2],[4,0],[1,4],[6,8],[2,0]],[[6628,9852],[4,-3],[1,-4],[3,-2],[0,-3],[-2,-3],[-6,-1],[-10,0],[-9,1],[-5,6],[-10,1],[-5,6],[5,2],[7,-1],[11,5],[1,0],[3,-1],[9,-2],[3,-1]],[[6409,9852],[-4,0],[-2,0],[-3,2],[-1,1],[-1,1],[3,1],[1,1],[1,0],[2,1],[3,0],[5,-1],[2,-2],[-5,-3],[-1,-1]],[[6760,9832],[-5,0],[-6,1],[-6,3],[-7,3],[2,2],[6,2],[9,4],[13,1],[7,0],[7,1],[2,2],[1,4],[1,3],[2,1],[7,2],[6,0],[7,-2],[4,-1],[3,-3],[2,-2],[0,-3],[0,-3],[2,-2],[-12,-6],[-13,-4],[-32,-3]],[[7543,9857],[-10,-4],[-34,3],[-2,2],[0,1],[4,3],[29,-1],[10,-1],[3,-3]],[[7681,9854],[1,-3],[3,-2],[2,-2],[18,-7],[8,-1],[4,-1],[1,-2],[-1,-4],[-3,0],[-2,-1],[-12,-2],[-3,-2],[-3,-4],[2,-1],[1,-2],[4,-7],[1,-2],[3,-1],[-3,-3],[-3,-1],[-37,-4],[-25,-2],[-8,-1],[-3,0],[-7,-3],[-12,-4],[-6,0],[-18,6],[-23,4],[-3,3],[-5,1],[-7,1],[-3,5],[4,4],[6,3],[10,1],[9,2],[7,5],[4,5],[8,5],[-14,-1],[-5,1],[1,1],[3,4],[1,1],[5,2],[3,4],[9,2],[3,1],[4,-1],[7,2],[7,1],[7,1],[6,1],[7,1],[6,3],[3,5],[17,0],[3,-1],[2,-3],[3,-1],[3,0],[8,-5],[2,-1]],[[6647,9867],[-6,-1],[-11,1],[-3,2],[1,1],[7,2],[5,0],[6,-2],[3,-2],[-2,-1]],[[6605,9881],[2,-3],[4,-1],[12,-1],[3,-3],[-5,-1],[-14,-2],[1,-3],[3,-3],[-3,-3],[-4,-2],[-9,-2],[-8,3],[-9,3],[-5,-2],[-4,-2],[-4,1],[-5,2],[-13,-2],[-4,2],[-3,5],[9,1],[10,-1],[7,5],[9,2],[7,5],[3,1],[8,0],[2,1],[8,1],[2,-1]],[[6767,9884],[-3,0],[-18,0],[-9,2],[-1,1],[-11,1],[4,2],[15,1],[25,-2],[2,-1],[0,-1],[-4,-3]],[[6619,9890],[-10,-1],[-1,1],[0,1],[1,1],[1,3],[4,2],[32,1],[4,-1],[-2,-3],[0,-1],[-29,-3]],[[5847,5122],[-1,-1],[0,-2],[1,-5],[3,-9],[2,-2],[2,-3],[1,-6],[1,-8],[-1,-9],[1,-7],[1,-4],[0,-6],[0,-7],[-1,-4],[-1,-1],[-1,-1],[-1,1],[-2,-1],[-2,-1],[-1,0]],[[5821,5104],[1,0],[6,3],[1,-1],[0,-6],[1,-1],[1,0],[1,1],[4,5],[1,3],[2,4],[2,4],[1,4],[1,2],[1,1],[2,-1],[1,0]],[[4526,6382],[-1,3],[2,30],[0,3]],[[6166,6147],[2,-1],[-1,2],[0,1],[1,3],[3,-6],[0,-6],[-1,-2],[0,2],[-1,1],[0,1],[-1,2],[-3,-1],[-2,2],[-2,5],[-1,4],[1,1],[1,2],[1,3],[-1,3],[2,0],[1,-4],[0,-7],[0,-2],[0,-1],[1,-2]],[[6024,6646],[-2,4],[-1,3],[-2,2],[-5,3],[-1,3],[1,2],[1,-2],[1,-2],[4,-3],[5,-8],[1,0],[-2,-2]],[[6016,6665],[0,-1],[-1,2],[0,5],[1,2],[0,-3],[0,-4],[0,-1]],[[6345,6828],[2,-6],[0,-5],[3,-13],[4,-10],[1,-3],[1,-6],[-1,-2],[0,-2],[3,-6],[5,-4],[2,-2],[2,-2],[-2,-3],[3,-7],[4,-8],[3,-1],[5,-12],[8,-7],[4,-9],[0,-1],[-1,1],[-2,2],[-1,-2],[1,-4],[0,-4],[2,-4],[2,-3],[1,-6],[-1,-12],[-1,0],[-1,1],[-1,0],[-1,0],[2,-9],[1,-6],[2,-6],[1,-7],[1,-4],[5,-8],[1,-7],[2,-12],[3,-7],[1,-6],[3,-4]],[[6423,6601],[2,-2],[2,0],[1,-2],[-2,-3],[-1,-8],[2,-1],[2,-1],[2,-1],[1,0]],[[6443,6278],[-6,-2],[-7,-2],[-7,-2],[-8,-2],[-7,-2],[-10,-3],[-9,-2],[-8,-2],[-8,-3],[-7,-2],[-4,-2],[-5,-5],[-8,-8],[-8,-7],[-4,-4],[-4,-11],[-2,-5],[-4,-9],[-3,-8],[-3,-8],[-1,-8],[-3,-12],[-2,-3],[-3,-3],[-3,-3],[-5,0],[-2,8],[-3,7],[-2,3],[-1,0],[-5,-1],[-5,-1],[-7,2],[-8,1],[-7,1],[-3,1],[-5,5],[-1,1],[-2,1],[-5,0],[-6,0],[-5,-2],[-6,1],[-5,-1],[-2,-2],[-2,0],[-2,-2],[-1,0],[-1,1],[-2,0],[-2,1],[-2,3],[-2,3],[-1,2],[-2,1],[-2,0],[-2,-2],[-1,-2],[-3,-5],[0,-2],[1,-4],[0,-1],[-2,-2],[0,-6],[-1,-2],[0,-7],[1,-6],[1,-2],[0,-2],[-1,-5],[-1,-1],[-1,-5],[-1,-2],[-2,-2],[-5,-8]],[[6188,6127],[0,4],[-2,7],[0,5],[-1,5],[-1,4],[-3,3],[0,6],[-2,5],[-2,4],[-2,8],[-1,10],[-6,14],[-9,12],[-2,7],[-5,14],[-2,12],[-5,13],[-1,5],[0,6],[-2,7],[0,5],[-6,23],[-2,4],[-2,5],[0,4],[0,3],[-4,4],[-4,9],[-11,16],[-6,2],[-4,5],[-3,8],[-4,12],[-6,14],[-5,19],[2,7],[0,5],[-2,9],[-1,6],[-2,6],[1,9],[1,10],[1,5],[0,6],[-1,11],[-1,6],[0,4],[-2,2],[-2,5],[2,0],[-3,6],[-1,3],[-1,9],[-1,6],[-5,15],[-2,9],[-5,11],[-5,9],[-4,3],[-1,4],[-3,0],[-3,5],[-2,0],[-3,1],[-3,10],[-2,9],[-5,11],[1,3],[2,5],[-1,7],[-1,4],[-2,9],[-6,20],[-2,3],[-2,3],[-2,9],[-1,8],[-4,3],[-8,29],[-4,9],[-2,7],[-5,11],[-2,11],[-5,10],[-5,17],[-6,18],[-3,3],[-7,1],[-3,1],[-3,-4],[0,5],[2,7],[3,14],[0,12],[4,37]],[[6024,6451],[0,-13],[1,-11],[4,-15],[4,-8],[1,-4],[0,-2],[0,-2],[-1,2],[-2,1],[0,-7],[1,-5],[0,-9],[1,-10],[-1,-9],[1,-16],[1,-19],[0,-12],[3,-29],[3,-15],[2,-4],[2,-2],[3,-1],[6,-8],[4,-9],[2,-4],[2,-5],[1,1],[1,1],[1,-4],[7,-8],[1,-4]],[[5946,5729],[-5,0],[-1,1],[0,1],[0,3],[0,4],[1,6],[2,7],[0,1],[0,2],[-1,1],[0,1],[1,4],[0,1],[0,2],[0,1],[-2,6],[0,1],[-12,21],[-2,5],[-1,0],[0,1],[-6,4],[0,1],[0,1],[1,3],[0,1],[0,1],[-3,42],[0,1],[0,1],[1,1],[0,1],[0,2],[1,8],[0,7],[1,11],[1,4],[-14,1],[0,-1],[0,-1],[0,-2],[0,-1],[0,-3],[1,-2],[0,-1],[0,-1],[-19,-1],[8,-16],[0,-1],[0,-1],[0,-6],[0,-10],[0,-6],[0,-3],[2,-8],[0,-1],[0,-2],[-14,-23],[0,-1],[-2,-10],[-1,-5],[-1,-2],[-3,-7],[-12,-25],[-2,-1],[-6,-1],[-3,0],[-1,0],[0,-1],[-1,-1],[-1,1],[-7,14],[-13,17],[-1,-2],[-8,-7],[-1,-2],[-1,-1],[0,-9],[-2,-4],[-2,-5],[-6,-2],[-4,-3],[-3,-4],[-1,-1],[-1,-2],[-2,-5],[-1,-4],[1,-4],[-22,0],[-2,3],[-3,13],[-2,-1],[-21,2],[-2,-2],[-6,-5],[-3,-1],[-3,2],[-11,26],[-2,3],[-1,1],[-1,5],[-3,3],[0,1],[-1,3],[0,6],[0,3],[-2,1],[-14,-6],[-2,1],[-3,-1],[-1,-1],[-1,-4],[-1,-3],[0,-4],[0,-3],[-1,-4],[-4,-8],[-1,-4],[0,-10],[0,-4],[-1,-3],[-2,-3],[0,-2],[0,-3],[-1,-7],[0,-2],[-2,-8],[-1,-2],[0,-6],[0,-1],[-7,-5],[-2,-2],[-1,-4],[-1,-2]],[[5634,5813],[1,6],[2,9],[0,5],[-1,4],[-2,4],[-2,0],[-1,2],[-1,2],[-2,2],[-1,4],[-1,5],[1,18],[-1,3],[-2,1],[0,1],[0,3],[-1,11],[-2,9],[1,4],[-2,7],[-3,3],[-3,-1],[-3,-1],[-2,0],[-2,1],[-1,3],[0,3],[0,4],[2,8],[2,6],[5,6],[1,3],[1,4],[0,4],[0,4],[-1,4],[-1,5],[-1,6],[0,4],[0,3],[1,3],[3,4],[0,1],[2,2],[1,1],[4,5],[1,2],[-1,2],[-1,2],[-1,3],[0,3],[-1,6],[0,3],[-1,3],[1,2],[2,3],[1,1],[3,2],[1,2],[1,4],[-1,3],[1,3],[2,6],[1,2],[2,3],[1,4],[1,4],[0,5],[-1,12],[3,6],[2,4],[4,0],[6,1],[4,2],[3,0],[7,-3],[0,1],[1,4],[0,8],[0,26],[0,26],[0,25],[0,26],[0,26],[0,25],[0,26],[0,26]],[[5943,5427],[-6,-14],[-5,-10],[-1,-1],[-1,-2],[-5,0],[-5,1],[-4,6],[-4,-4],[-3,-2],[-2,0],[-4,-1],[-5,-3],[-3,-3],[-1,-2],[-1,-5],[-1,0],[-1,0],[-1,2],[-3,3],[-2,5],[-1,4],[-1,2],[-5,-6],[-2,-1],[-2,0],[-4,3],[-3,3],[-2,0],[-3,-4],[-3,-5],[-2,-5],[-1,-3]],[[4535,5895],[-1,3],[-1,4],[1,3],[2,2],[4,3],[2,-2],[1,0],[0,2],[-1,1],[-2,2],[-1,3],[-2,-2],[-1,-3],[0,-1],[-2,-1],[0,2],[-1,3],[1,1],[0,11],[0,5],[0,5]],[[4539,5966],[0,6],[-2,5],[-3,4],[0,4],[1,3],[2,3],[1,2],[-1,-1],[-3,-1],[-1,-1],[0,6],[-2,6],[-3,11],[-3,5],[-2,9],[-3,4],[-2,1],[-2,0],[-1,-4],[-3,6],[4,2],[7,7],[9,22],[7,25],[1,6]],[[7887,5260],[-4,-3],[-5,3],[2,6],[3,1],[3,-2],[1,-1],[1,-2],[-1,-2]],[[4270,1818],[0,-3],[-4,3],[-1,1],[1,2],[3,0],[1,-1],[0,-2]],[[3969,2070],[3,-3],[2,2],[2,0],[1,-1],[1,-1],[2,0],[3,-4],[-1,-5],[3,1],[2,-3],[1,0],[1,1],[2,2],[1,-2],[1,-4],[2,-2],[1,-4],[2,-5],[1,-1],[2,0],[2,1],[-1,-5],[0,-4],[3,-3],[-2,-2],[-2,-3],[-4,-1],[-1,0],[-3,5],[-2,5],[-4,7],[-1,2],[0,1],[-4,1],[-3,2],[-2,3],[-1,2],[-1,2],[-3,0],[-2,2],[-3,2],[-9,7],[-4,-1],[-1,2],[0,3],[2,2],[-9,1],[-2,1],[2,1],[11,0],[4,0],[1,-1],[3,-3],[4,0]],[[4841,4262],[-2,0],[0,3],[2,3],[1,-1],[0,-3],[-1,-2]],[[4601,4724],[-1,0],[-1,1],[0,1],[1,2],[0,2],[1,0],[1,-2],[0,-1],[0,-1],[-1,-2]],[[9636,4512],[-2,-1],[-1,0],[-2,5],[1,1],[2,0],[0,-3],[2,-2]],[[9460,4504],[-2,-2],[-2,1],[-2,2],[-1,4],[-2,3],[-3,1],[-2,2],[0,1],[-2,1],[-1,2],[0,3],[1,1],[2,-1],[10,-12],[2,-3],[2,-3]],[[9614,4564],[-2,-1],[-1,0],[-2,0],[-2,-4],[-1,0],[-1,0],[-1,4],[0,1],[2,0],[0,3],[2,2],[3,1],[3,-1],[1,-1],[-1,-3],[0,-1]],[[9491,4586],[4,-4],[2,1],[3,-3],[2,2],[1,-3],[4,-12],[0,-4],[2,-3],[-2,0],[-2,1],[-3,-1],[-2,3],[-4,1],[-3,3],[-7,8],[0,5],[-1,2],[0,5],[-3,2],[-3,0],[0,3],[1,4],[2,0],[2,-2],[5,-6],[2,-2]],[[9486,4629],[1,-6],[0,-2],[-2,5],[-1,-2],[-1,2],[0,5],[0,5],[-1,4],[-1,5],[2,-1],[3,-15]],[[9437,4650],[6,-10],[2,1],[8,0],[5,-6],[3,-4],[1,-5],[2,-2],[2,-3],[0,-5],[0,-1],[-3,-2],[-1,-1],[-5,2],[-5,4],[-8,1],[-5,1],[-1,1],[-1,3],[-2,5],[-2,6],[0,3],[0,7],[0,2],[2,3],[2,0]],[[9448,4666],[2,-1],[1,0],[1,-3],[3,-5],[-1,-2],[-2,1],[-1,0],[0,2],[-3,3],[-2,0],[0,2],[2,3]],[[9421,4658],[-2,1],[-1,0],[-1,2],[1,3],[1,2],[1,-1],[1,-1],[1,0],[0,-4],[-1,-2]],[[9378,4679],[0,-2],[-2,1],[-3,3],[0,1],[2,1],[1,-1],[1,-1],[1,-2]],[[9394,4676],[-1,-1],[-1,3],[2,6],[1,-5],[0,-2],[-1,-1]],[[9391,4684],[-3,-5],[-2,2],[-1,3],[0,5],[0,1],[1,1],[1,1],[1,2],[3,-2],[1,-1],[-2,-3],[0,-1],[1,-1],[0,-2]],[[9371,4682],[0,-1],[-2,2],[-3,7],[1,3],[3,5],[1,1],[1,-3],[-1,-5],[-1,-1],[-1,-4],[2,-4]],[[9435,4694],[-1,-1],[-2,2],[-1,2],[0,3],[1,1],[2,-2],[0,-2],[1,-3]],[[9464,4705],[7,-17],[0,-3],[-1,-2],[0,-6],[1,-2],[1,-1],[4,-6],[1,-8],[0,-2],[1,-4],[0,-7],[4,-10],[0,-5],[-1,-2],[-1,1],[-3,12],[-5,5],[0,2],[-4,6],[-3,11],[-3,20],[1,5],[-3,10],[0,2],[2,0],[1,0],[0,1],[1,0]],[[9381,4709],[2,-5],[2,-10],[0,-4],[-2,0],[0,-2],[-2,5],[-3,1],[-1,3],[-1,7],[0,3],[-2,1],[-4,-1],[-1,-3],[-2,1],[-1,3],[1,3],[2,3],[1,3],[2,7],[2,1],[3,-2],[0,-9],[1,-3],[3,-2]],[[9349,4713],[0,-1],[-2,7],[0,3],[1,3],[1,-8],[0,-4]],[[9365,4717],[-1,-1],[-3,0],[-2,6],[0,5],[2,4],[2,0],[1,-1],[1,-4],[1,-4],[-1,-4],[0,-1]],[[9352,4727],[-1,0],[-1,3],[-1,1],[0,3],[-2,6],[-1,4],[2,4],[2,-3],[2,-4],[3,-2],[-1,-3],[-2,-6],[0,-3]],[[9440,4692],[0,-1],[-4,5],[-2,6],[-8,6],[-2,3],[-2,1],[-4,5],[-4,4],[-2,4],[-1,2],[-1,1],[-3,5],[-2,4],[-1,6],[-3,4],[0,2],[7,-3],[4,-7],[3,-4],[1,-3],[3,-3],[2,-1],[3,-4],[2,-1],[2,-2],[11,-17],[-1,-4],[1,-4],[1,-4]],[[9328,4775],[-3,-1],[-2,1],[1,5],[1,2],[4,-4],[-1,-3]],[[9374,4762],[1,-2],[-3,-4],[-2,2],[-1,2],[0,1],[-2,-1],[-4,2],[-5,8],[-6,16],[-6,8],[-1,3],[0,4],[1,2],[3,-2],[5,-7],[7,-7],[2,-4],[1,-9],[2,-3],[4,-7],[2,-1],[1,0],[1,-1]],[[4652,5612],[-1,-1],[-2,3],[-9,6],[2,3],[7,1],[2,-2],[1,-1],[0,-3],[0,-6]],[[4680,5582],[-1,2],[-5,8],[-6,6],[-11,9],[-4,2],[0,3],[1,6],[-2,7],[1,5],[-1,0],[-2,-3],[-3,1],[-3,5],[-1,1],[-1,2],[-1,12],[-1,5],[-2,3],[-4,1],[-1,7],[-2,5],[0,4],[2,-1],[1,-2],[2,-1],[3,6],[2,3],[0,3],[0,1],[-1,-2],[-4,1],[-1,-3],[-2,0],[-1,7],[0,4],[1,4],[3,1],[1,1],[-3,1],[-3,5],[-1,4]],[[2560,5956],[0,-1],[0,-6],[-1,-3],[-2,-3],[-2,-1],[-5,0],[-6,3],[-5,4],[-3,0],[1,-1],[2,-1],[3,-3],[-1,-1],[-10,6],[-11,11],[-7,2],[-8,3],[-4,7],[-4,3]],[[6359,5832],[0,-16],[0,-15],[0,-16],[0,-27],[0,-9],[0,-14],[0,-7],[-4,-12],[-5,-16],[-5,-16],[-5,-14],[-4,-13],[-4,-13]],[[6201,5846],[5,-9],[5,-18],[7,-14],[8,-13],[3,-5],[3,-2],[16,0],[11,12],[10,9],[3,2],[6,-2],[6,-1],[6,-3],[3,1],[11,10],[7,10],[5,4],[2,0],[7,-3],[8,1],[12,9],[4,2],[2,0],[7,-4],[1,0]],[[6359,5832],[3,1],[9,4],[7,6],[13,5],[10,11],[2,6],[3,7],[4,2],[11,-8],[2,-1],[-1,-5],[0,-5],[-2,-9],[-2,-9],[1,-15],[1,-24],[0,-4],[-1,-3],[0,-3],[-2,-1],[0,-2],[1,0],[3,2],[0,3],[0,2],[3,-3],[2,-2],[1,-3],[0,-2],[-4,1],[-1,2],[-5,-3],[-3,-3],[-1,-5],[0,-19],[-2,-12],[0,-16],[-4,-11],[-1,-8],[-6,-15],[-3,-13],[-1,-6],[-5,-18],[-7,-14],[-2,-17],[-3,-11],[-3,-10],[-6,-18],[-3,-12],[-4,-21],[-1,-14],[-11,-39],[-12,-31],[-7,-26],[-13,-31],[-17,-39],[-23,-47],[-7,-9],[-25,-29],[-16,-24],[-8,-17],[-9,-14],[-7,-13],[-21,-46],[-2,-5],[-2,-4],[-3,-7],[-2,-4],[-5,-13],[-3,-7],[-4,-6],[-1,-5],[-1,-5],[-1,-4],[-3,-13],[-3,-8],[-3,-7]],[[3440,7877],[-1,0],[-2,1],[1,1],[1,1],[1,0],[0,-1],[0,-1],[0,-1]],[[3437,7882],[-3,-3],[-1,2],[1,1],[1,4],[0,1],[-2,8],[1,1],[0,1],[2,-2],[0,-2],[-1,-5],[1,-3],[1,-2],[0,-1]],[[5184,5191],[-2,-4],[-1,1],[-1,3],[-1,6],[0,3],[2,3],[3,4],[1,0],[2,-4],[0,-5],[-3,-7]],[[5206,5274],[-1,-1],[-2,1],[0,2],[2,5],[0,1],[1,-1],[0,-1],[0,-2],[0,-4]],[[3411,5503],[0,-1],[1,7],[1,5],[0,6],[2,6],[2,3],[14,-3],[7,-3],[8,-5],[1,-6],[0,6],[0,5],[2,4],[5,2],[7,-2],[7,2],[8,0],[14,-5],[6,-3],[2,-3],[1,-5],[-1,-6],[-1,-6],[-2,-9]],[[5626,8010],[-1,-2],[-1,-3],[-1,-3],[-2,-3],[-1,-8],[-1,-3],[-4,-7],[-1,-9]],[[5377,7806],[1,1],[3,3]],[[5459,8426],[-2,-3],[-1,0],[-1,4],[0,10],[0,5],[6,18],[3,1],[4,11],[1,5],[2,4],[1,4],[0,2],[2,-1],[1,-1],[-2,-2],[0,-3],[0,-1],[-5,-13],[-1,-8],[-1,-2],[-7,-30]],[[5529,8515],[-2,-1],[-1,-4],[-2,-1],[-2,-1],[-1,-13],[4,-5],[-2,-1],[-2,-1],[-1,-2],[-1,-5],[-5,-3],[-1,-2],[-3,-4],[-1,-6],[-3,-3],[-2,-1],[1,5],[2,5],[-2,3],[-1,4],[-2,4],[2,3],[-1,7],[0,6],[2,3],[2,3],[4,6],[3,4],[6,2],[2,-2],[1,4],[1,1],[2,-1],[3,-4]],[[5532,8520],[-1,-4],[-1,1],[-2,2],[3,4],[4,0],[1,-1],[-4,-2]],[[5511,8584],[-1,-1],[-1,0],[1,3],[0,1],[2,1],[1,0],[-2,-4]],[[5516,8609],[-1,-2],[0,3],[0,2],[2,2],[2,-1],[0,-1],[-2,-2],[-1,-1]],[[5670,8974],[-7,-1],[-5,2],[-3,-1],[-5,0],[-6,-1],[-1,-2],[-2,-1],[-5,3],[-5,5],[-3,-4],[-2,-1],[-3,4],[-1,0],[-1,-1],[-1,-3],[-1,-2],[-1,-2],[0,-6],[0,-1],[-5,1],[0,-2],[1,0],[1,-1],[-2,-2],[-5,0],[0,-1],[1,-2],[-1,-2],[-1,-1],[-5,-1],[-4,0],[0,-1],[-1,-2],[1,-1],[1,-1],[1,-1],[0,-2],[-1,-1],[-4,4],[-1,0],[1,-2],[2,-2],[1,-2],[1,-3],[0,-2],[-4,-7],[-4,-4],[-3,-3],[-1,-4],[1,-2],[3,-3],[1,-6],[2,-5],[3,-4],[0,-3],[-1,-2],[-6,-5],[-7,-7],[-7,-18],[-2,-2],[-6,-3],[-3,-3],[-4,-3],[-8,-3],[-4,-5],[-2,-4],[-2,0],[-1,2],[-3,1],[0,-3],[0,-2],[-4,3],[-2,-3],[-1,-4],[-6,-7],[-6,1],[-1,-1],[2,-1],[0,-1],[-1,0],[-1,0],[-3,-1],[-2,0],[-1,-3],[-1,-4],[-3,-1],[-2,-1],[-1,-2],[5,0],[0,-2],[0,-2],[-1,-1],[-6,-3],[-1,-2],[-1,-2],[-2,0],[0,2],[0,1],[-4,0],[-1,3],[-1,-1],[1,-2],[1,-3],[1,-4],[-1,-2],[-1,-1],[1,-1],[2,-1],[0,-2],[-2,-1],[-3,-4],[-3,0],[-2,-3],[-2,0],[-2,2],[-3,1],[-1,-2],[0,-3],[2,-5],[3,-4],[2,-2],[-2,-1],[-1,-3],[-2,-8],[-1,-3],[-1,-6],[1,-5],[0,-2],[2,-3],[-4,0],[-4,2],[1,-4],[-3,-5],[1,-4],[0,-2],[0,-5],[1,-1],[0,-3],[-1,-2],[1,-1],[0,-6],[1,-10],[-1,-1],[2,-9],[0,-2],[0,-4],[3,-3],[2,0],[3,0],[1,-1],[1,-3],[1,-2],[2,0],[4,2],[2,1],[2,-5],[4,-6],[2,-2],[5,-2],[4,-5],[-1,-5],[2,-2],[5,-3],[2,-3],[1,-2],[1,-3],[2,-6],[-1,-4],[-2,-2],[-5,-4],[-2,-3],[-1,-2],[-5,-5],[-2,0],[-2,-3],[-2,-1],[-1,1],[-6,-4],[1,-2],[4,-1],[2,1],[2,2],[2,1],[1,-1],[2,2],[2,1],[1,-1],[2,-4],[-4,-2],[-2,0],[-1,-7],[-2,-2],[-1,-2],[-5,-2],[-3,-4],[-4,-3],[-2,1],[-3,-3],[-6,-3],[-3,-5],[-6,-4],[-4,-3],[-9,0],[-9,1],[-3,-2],[3,0],[2,-2],[2,1],[6,-1],[3,-1],[4,-5],[-3,-2],[-5,-1],[2,-8],[1,-5],[-2,-3],[0,-14],[-3,-1],[-1,-5],[1,-3],[0,-7],[1,-4],[1,-4],[-1,-4],[-4,-10],[0,-4],[1,-3],[1,-4],[-2,-8],[-2,-7],[-1,-6],[-4,-7],[-2,-5],[-4,-16],[-2,-3],[-3,-2],[-3,2],[-2,1],[-4,0],[-5,-2],[-7,1],[-8,0],[-2,-2],[1,-6],[-2,-1],[-3,2],[-3,-2],[-1,-2],[-4,-5],[-2,-3],[0,-6],[2,-6],[2,-6],[-5,-7],[-2,-1],[-8,2],[-13,-4],[-13,3],[2,4],[0,3],[1,5],[0,5],[0,3],[-1,3],[-3,5],[-7,14],[-2,6],[-1,3],[1,0],[5,-3],[2,0],[1,2],[-2,4],[-1,2],[-1,4],[3,1],[3,-1],[1,4],[-1,6],[-2,2],[-2,0],[-4,10],[-4,5],[-8,18],[-3,13],[-2,-2],[-2,6],[0,5],[-1,4],[-4,2],[0,3],[0,12],[-5,2],[-2,6],[-1,13],[-3,2],[-2,0],[0,3],[1,3],[-2,12],[0,10],[-1,4],[-1,3],[1,4],[0,2],[3,0],[3,-3]],[[5891,3638],[0,1],[-2,1],[-1,-1],[-1,-8],[0,-12],[0,-8],[-6,0],[-7,1],[-6,3],[-6,7],[-3,11],[-2,8],[-2,0],[0,1],[0,9],[0,9],[0,2],[4,12],[2,7],[2,6],[3,8],[4,5],[1,1],[1,0],[6,-7],[7,-7],[1,1],[1,1]],[[3249,6225],[0,-2],[0,-1],[-2,1],[-1,1],[0,1]],[[6542,4913],[0,-5],[-1,2],[-1,3],[-1,3],[-1,2],[2,3],[2,-8]],[[5999,7178],[-2,13],[-1,6],[0,6],[2,10],[-1,4],[0,3],[0,4],[-4,9],[2,16],[1,4]],[[5996,7253],[3,-1],[4,-4],[1,0],[1,6],[1,2],[3,2],[1,9],[1,2],[2,1],[2,0],[2,1],[0,2],[-3,11],[1,3],[1,11],[1,4],[1,2],[3,-1],[5,-2],[1,-3],[2,-3],[3,0],[4,0],[3,-1],[3,2],[5,4],[3,1],[2,2],[8,6],[3,0],[3,-1],[1,-1],[4,-4],[3,-4],[2,-2],[4,0],[6,0],[7,0],[4,1],[5,2],[9,5],[12,10],[7,6],[3,0],[4,0],[4,-1],[5,-1],[2,0],[5,1],[6,2],[4,2],[5,3],[3,5],[1,0],[1,-1],[1,0],[1,-3],[1,-7]],[[2990,6442],[4,-3],[2,1],[0,-1],[-1,-1],[-1,0],[-3,-1],[-1,0],[0,2],[0,3]],[[3009,6437],[-2,2],[-3,0],[0,3],[1,0],[4,-1],[1,-2],[-1,-2]],[[3003,6442],[0,-1],[-2,2],[0,2],[-1,0],[-1,1],[0,2],[3,0],[0,-5],[1,-1]],[[5045,5542],[-9,-4],[-4,-3]],[[7768,5559],[-1,0],[-1,5],[1,7],[2,-9],[-1,-3]],[[7751,5621],[1,-7],[-1,2],[-1,3],[0,4],[0,1],[1,-3]],[[7738,5641],[0,-1],[-2,11],[2,-3],[0,-7]],[[7733,5639],[0,-4],[-2,0],[-1,-3],[-1,8],[1,12],[0,2],[1,-3],[3,-1],[-1,-7],[0,-4]],[[7730,5705],[-2,0],[1,3],[0,2],[1,0],[0,-3],[0,-2]],[[7779,5736],[0,-3],[-1,-4],[-2,-3],[-1,4],[0,4],[1,2],[2,-1],[1,1]],[[7779,5742],[0,-1],[-1,2],[-1,2],[0,3],[1,0],[1,-3],[0,-3]],[[7849,5856],[0,-6],[-2,3],[1,3],[0,1],[1,-1]],[[7844,5874],[0,-1],[-1,1],[-2,0],[-1,8],[0,2],[1,-1],[2,-4],[1,-3],[0,-2]],[[7858,5858],[-1,4],[-2,7],[-1,7],[-3,8],[-2,3],[0,-3],[-1,-3],[-3,4],[-3,5],[-2,8],[-1,-2],[0,-2],[-3,6],[-2,6],[-3,1],[-2,2],[-1,3],[-3,3],[-8,-4],[-10,3],[-4,-3],[-1,2],[-1,3],[1,6],[0,13],[1,8],[0,7],[0,3],[1,4],[-2,2],[-7,4],[-1,2],[-2,-3],[-8,-2],[-4,-2],[-3,-5],[0,-6],[1,-5],[2,-7],[-3,-16],[-1,-4],[1,-20],[0,-10],[-2,-7],[-3,-7],[-1,-10],[-2,-6],[-2,-11],[-2,-14],[-1,-7],[-1,-12],[-6,-18],[-1,-11],[-2,-4],[1,-3],[0,-5],[-1,-14],[0,-12],[1,-6],[2,-12],[0,-3],[-1,-6],[3,-2],[1,-1],[9,6],[3,-1],[2,-6],[0,-4],[2,-26],[1,-4],[2,-5],[2,-5],[0,1],[0,2],[1,2],[1,-5],[2,-9],[5,-48],[1,-6],[1,-6],[-3,3],[-1,11],[0,4],[-1,1],[-2,0],[0,2],[1,3],[0,4],[-2,4],[-3,-3],[0,-7],[2,-6],[4,-13],[2,-5],[2,-2],[2,1],[3,-5],[3,-5],[6,-8],[4,1],[4,2],[3,-1],[3,-2],[3,-6],[5,-16],[8,-14]],[[7780,5555],[-7,18],[-4,7],[0,13],[-1,3],[-2,0],[-1,4],[1,7],[-2,-1],[-3,0],[-2,2],[-1,11],[-1,4],[-3,5],[-3,0],[-1,3],[1,7],[-2,4],[-3,4],[-3,2],[-2,11],[-2,3],[-1,2],[-3,-1],[0,-4],[-2,-4],[-2,0],[-1,3],[-2,11],[0,7],[0,13],[3,11],[1,19],[2,12],[1,4],[2,15],[4,21]],[[6962,7542],[-1,0],[-1,2],[-1,2],[1,1],[1,-2],[1,-2],[0,-1]],[[6882,7325],[1,4],[0,14],[1,5],[5,8],[2,7],[2,5],[2,2],[1,4],[2,5],[0,3],[0,3],[-1,1],[-2,4],[-3,5],[-1,5],[-1,6],[0,5],[2,13],[0,2],[-1,2],[-2,1],[-2,1],[-2,-1],[-3,0],[-2,1],[-1,1],[0,5],[-1,2],[0,1],[-6,2],[-2,2],[0,1],[2,13],[1,1],[1,2],[1,2],[5,4],[6,-2],[4,-1],[5,-1],[2,-1],[2,0],[2,0],[1,2],[2,4],[1,6],[1,5],[1,1],[2,-1],[0,1],[1,2],[0,1],[0,1],[1,-2],[1,0],[0,1],[0,2],[-1,1],[-1,4],[0,1],[1,1],[2,1],[2,0],[0,1],[0,2],[-1,1],[-4,-1],[-4,0],[-1,1],[1,1],[0,1],[9,3],[4,-1],[3,-1],[2,0],[-2,5],[2,1],[0,2],[-2,13],[1,2],[2,2],[0,5],[1,3],[1,2],[3,-2],[3,-5],[2,-1],[1,0],[1,1],[7,5],[4,3],[4,4],[1,2],[1,6],[1,0],[1,0],[4,-7],[2,-4],[0,-1],[-1,-1],[1,-1],[3,-3],[0,-1],[-1,-2],[0,-1],[-1,0],[-4,-6],[-5,-6],[0,-1],[0,-2],[0,-1],[1,-1],[2,-1],[2,-2],[0,-3],[1,-3],[2,-1],[7,2],[1,0]],[[6475,7419],[-1,-3],[-1,8],[-1,9],[1,3],[1,0],[-1,-4],[2,-13]],[[6497,7335],[0,4],[-2,15],[-1,14],[0,7],[1,14],[0,7],[0,6],[0,6],[1,7],[0,7],[0,5],[-2,4],[-2,5],[-1,3],[0,3],[-2,1],[-2,3],[-2,2],[-4,2],[-2,0],[-2,-2],[-1,-3],[-1,5],[0,5],[3,10],[2,-3],[2,-1],[3,0],[3,1],[0,3],[-2,2],[-1,2],[-1,4],[0,5],[1,5],[-1,1],[-1,1],[-3,0],[-5,2],[-4,0],[-1,-5],[3,-7],[-2,3],[-2,5],[-3,8],[-2,9],[0,11],[2,8],[1,8],[2,10],[1,11],[2,-5],[1,-4],[3,-4],[1,-1],[4,-1],[2,0],[3,3],[3,-1],[2,-4],[2,-5],[3,-1],[6,3],[3,1],[2,-1],[2,-1],[1,1],[-1,4],[-1,4],[2,2],[5,-2],[3,1],[0,1],[1,1],[0,4],[0,3],[0,3],[-1,3],[-2,4],[-9,10],[-3,4],[-2,5],[-2,7],[-1,8],[-1,5],[-3,13],[-1,2],[-2,0],[-3,1],[-4,-1],[-6,-2],[-3,0],[-1,-1],[-4,-5],[-2,-5],[-3,-11],[2,-3],[0,-2],[-1,-16],[1,-8],[-1,0],[0,2],[-2,7],[-4,10],[-3,14]],[[6554,7564],[8,-1],[6,0],[8,-1],[3,-1],[3,0],[1,0],[1,2],[1,1],[1,2],[0,1],[-1,1],[-2,3],[-1,13],[0,11],[2,3],[2,2],[3,8],[2,2],[2,2],[9,0],[3,2],[1,2],[2,6],[1,5],[1,2],[1,2],[2,0],[2,-1],[2,-1],[1,-1],[2,-2],[1,-3],[0,-2],[0,-1],[1,0],[1,0],[1,0],[0,1],[0,2],[-2,3],[-4,7],[-2,3],[-1,2],[0,1],[1,2],[2,2],[2,-1],[4,-1],[1,1],[2,6],[4,-6],[4,-7],[1,-1],[3,-1],[3,0],[1,-1],[1,-1],[2,-8],[2,-1],[3,-2],[8,0],[3,0],[2,-3],[2,-2],[0,-1],[0,-2],[-1,-1],[0,-4],[0,-3],[0,-1],[-1,-2],[1,-1],[4,-2],[1,-3],[1,-2],[1,-1],[-1,-2],[-2,1],[-1,-2],[0,-3],[1,-4],[1,-2],[-1,-3],[-1,-4],[0,-3],[0,-2],[4,-3],[7,-7],[1,0],[7,1],[3,1],[2,-1],[5,-2],[2,-1],[2,0],[2,1],[2,3],[0,1],[1,0],[2,0],[4,-2],[4,-4],[3,-4],[1,-4],[2,-8],[2,-12],[3,-8],[3,-4],[2,-8],[2,-17],[1,-4],[1,-1],[4,-5],[7,-9],[4,-4],[6,-8],[6,-7],[6,-11],[2,-2],[5,-6],[6,-6],[4,2],[6,-9],[2,-4],[1,-1],[5,-4],[7,-7],[9,-11],[6,-7],[2,0],[1,0],[2,1],[2,1],[3,-1],[3,-3],[2,-2],[3,-3],[2,-2],[1,-2],[6,-2],[0,-1],[1,-2],[0,-1],[-3,-9],[0,-11],[0,-8],[0,-6]],[[8445,4646],[4,5],[7,3]],[[8469,4669],[3,5],[3,8],[1,4],[4,3],[2,1],[12,5],[3,0],[7,0],[10,1],[2,1],[4,2],[3,2],[1,2],[2,2],[3,-2],[4,-1],[1,-2],[1,-1],[-5,-10],[-5,-7],[-4,-2],[-3,-2],[-3,-3],[-2,-5],[-3,-2],[-3,-1],[-3,-1],[-3,-3],[-3,-5],[-2,0],[-1,0],[-3,-2],[-9,-6],[-6,-8],[-4,-6]],[[8489,4715],[-2,-10],[-2,2],[3,6],[1,1],[0,1]],[[141,3957],[0,-9],[-1,4],[0,2],[1,3]],[[134,3964],[1,0],[0,2],[2,1],[0,-2],[-2,-6],[-2,2],[-3,4],[-1,3],[1,2],[0,-1],[1,-1],[2,-1],[1,-1],[-1,-1],[1,-1]],[[168,4110],[-1,-3],[-1,0],[-1,2],[0,1],[2,4],[1,0],[1,-1],[0,-1],[-1,-2]],[[3305,5768],[-5,-4],[-11,0],[-5,1],[-4,-1],[7,7],[1,3],[3,0],[0,1],[1,16],[0,4],[-1,2],[-1,1],[-2,2],[-1,1],[2,2],[3,1],[3,2],[5,0],[3,2],[5,0],[-3,-7],[-1,-3],[1,-6],[-1,-4],[1,-6],[1,-4],[-1,-3],[0,-6],[0,-1]],[[3312,5828],[-2,-1],[1,2],[2,4],[4,3],[1,0],[0,-3],[-6,-5]],[[5304,7126],[-1,0],[-1,-2],[-1,0],[-2,2],[-1,0],[-1,1],[1,7],[0,2],[5,0],[3,-4],[0,-1],[0,-1],[-1,-2],[-1,-2]],[[5313,7186],[-5,-5],[1,4],[3,4],[1,-1],[0,-2]],[[5238,7311],[7,4],[6,9],[2,2],[16,9],[2,-1],[2,-1],[-1,-3],[-1,-3],[2,-4],[1,2],[0,2],[0,3],[3,0],[3,-1],[3,-2],[-1,-10],[5,-10],[-2,-5],[4,-3],[3,4],[1,5],[6,3],[5,7],[3,1],[0,-6],[2,-5],[-2,-2],[-3,-6],[-5,-14],[-4,-4],[-3,-6],[-1,-4],[-1,-5],[1,-8],[3,-8],[2,-5],[3,-2],[6,-8],[0,-4],[1,-6],[0,-7],[2,-5],[-4,-12],[-3,-9],[-5,-12],[-4,-7],[-9,-12],[-2,-4],[-2,-4],[-1,-4],[1,-5],[3,-11],[4,-8],[4,-3],[7,1],[0,-4],[0,-6],[3,0],[2,1],[2,6],[3,-4],[2,-11],[3,-4],[1,-1],[-2,-1],[0,-1],[1,-1],[2,-1],[2,1],[3,-3]],[[5721,7496],[-7,-2],[-2,2],[2,3],[4,2],[1,0],[2,-3],[0,-2]],[[5996,7253],[2,4],[-2,10],[-2,8],[2,6],[4,6],[5,8],[0,5],[-1,4],[-1,2],[-2,4],[-4,-4],[-3,-4],[-2,-1],[-2,-2],[-1,-4],[-2,-3],[-4,-2],[-6,4],[-7,5],[-4,4],[-3,1],[-2,-1],[-9,-11],[-7,-15],[-2,-3],[-8,-6],[-4,-2],[-3,0],[-9,-3],[-5,0],[-4,-4],[-7,4],[-4,5],[-3,5],[-4,10],[-3,5],[-7,5],[-12,10],[-3,2],[-8,1],[-8,1],[-2,-4],[-1,-15],[-1,-5],[-1,-8],[-1,-2],[-1,-2],[-3,3],[-2,1],[-4,-3],[-8,-5],[-3,-1],[-9,6],[-4,4],[-2,4],[-1,7],[-1,4],[0,3],[-1,3],[-2,2],[-2,-3],[-2,0],[-3,2],[-6,6],[-5,0],[-3,-7],[-3,-2],[-2,-1],[0,2],[2,5],[-8,-1],[-4,-4],[-4,1],[-2,1],[0,2],[3,1],[2,2],[8,1],[2,1],[3,5],[3,5],[1,2],[-3,0],[-13,-2],[-9,1],[-1,-2],[-1,0],[-1,6],[2,2],[2,0],[4,2],[0,5],[-3,4],[-1,2],[-3,0],[-1,2],[-1,6],[-1,7],[-3,3],[1,2],[4,2],[1,9],[-1,5],[-2,1],[-6,4],[-2,0],[-2,5],[-3,3],[-2,-1],[-1,-2],[-2,1],[-2,3],[-3,2],[-1,2],[1,5],[2,0],[1,4],[-2,7],[0,3],[2,1],[2,0],[2,-4],[1,-4],[-1,-4],[1,-4],[1,-1],[1,4],[1,1],[1,-2],[3,-1],[6,2],[1,3],[-4,-1],[-2,2],[-2,5],[-1,4],[0,2],[-1,2],[1,2],[3,2],[3,7],[-1,1],[-2,1],[-1,0],[-2,2],[0,3],[1,2],[0,4],[-3,8],[-1,2],[0,3],[3,4],[3,6],[0,2],[-2,1],[-10,-3],[-4,-2],[-6,-1],[-1,3],[0,3],[2,5],[0,12],[1,7],[3,2],[5,10],[7,12],[8,0],[3,3],[4,0],[1,-2],[1,-3],[4,-3],[7,1],[1,1],[2,2],[-3,5],[1,2],[3,0],[3,-1],[0,-1],[-1,-2],[-1,-3],[1,-1],[9,2],[10,-2],[3,1],[7,0],[2,2],[-3,3],[-2,1],[-1,1],[-2,1],[5,6],[2,1],[13,4],[9,1],[1,2],[-2,0],[-12,2],[-3,3],[-4,5],[-1,1],[-1,3],[1,5],[1,5],[1,2],[5,0],[17,-4],[11,3],[13,-7],[13,2],[2,2],[3,10],[18,15],[6,8],[6,5],[12,5],[9,6],[3,1],[22,-3],[16,-1],[7,7],[4,-2],[0,-3],[-1,-2],[0,-3],[2,-6],[3,-4],[7,-5],[10,4],[2,0],[2,-1],[3,-15],[3,-5],[4,-4],[3,-1],[2,4],[1,2],[4,0],[6,-5],[2,-5],[10,-4],[9,-2],[4,-5],[14,-4],[4,1],[9,4],[16,5],[10,-7],[3,-1],[3,1],[3,-2],[4,1],[12,9],[3,4],[4,2],[4,2],[9,10],[2,5]],[[5778,7601],[-1,-6],[2,-8],[4,-10],[4,-5],[17,-12],[3,-1],[-1,-6],[-1,-4],[-1,-3],[-5,-2],[-14,5],[-3,1],[-2,-1],[-5,-4],[-5,1],[-7,-2],[-2,-8],[-4,-9],[-8,-7],[-6,-4],[-8,-13],[-4,-8],[-2,-2],[-2,-1],[1,4],[1,3],[0,3],[0,4],[3,4],[2,3],[8,6],[2,5],[-6,0],[-6,-1],[-4,0],[-3,0],[-1,4],[-1,3]],[[8288,6596],[1,-4],[0,-2],[-4,1],[0,3],[1,-1],[2,3]],[[8361,6487],[-2,-7],[-2,-7],[0,-7],[0,-7],[0,-6],[-1,-6],[-3,1],[-1,5],[-1,7],[-2,9],[0,2],[-3,5],[-3,3],[-2,4],[1,-1],[-2,5],[-1,5],[-2,15],[-1,4],[-1,3],[0,3],[0,4],[1,5],[0,6],[0,7],[0,7],[1,3],[13,45],[4,9],[2,5],[2,5],[1,7],[2,6],[2,2],[7,5],[3,5],[2,2],[2,0],[1,-3],[1,-3],[2,-1],[3,-3],[1,-3],[1,-5],[-2,-4],[-1,-4],[0,-5],[0,-6],[0,-6],[-2,-14],[-3,-9],[-1,-5],[-1,-11],[-1,-11],[-1,-14],[-3,-14],[-1,-7],[-2,-5],[-3,-11],[-4,-9]],[[6102,4724],[-1,0],[-1,0],[-1,3],[2,2],[2,4],[3,6],[1,3],[1,1],[0,-4],[-2,-10],[-2,-1],[-2,-4]],[[6097,4828],[2,-12],[-1,-2],[-1,-2],[-1,0],[-1,2],[-1,4],[-1,-1],[-2,5],[-2,0],[-1,6],[0,5],[0,9],[2,5],[1,7],[2,-5],[0,-8],[2,-9],[1,-3],[1,-1]],[[6107,4901],[0,-3],[-1,-2],[1,-9],[-1,-6],[-1,-8],[-1,-3],[-2,1],[-1,1],[0,3],[1,14],[-1,11],[3,-1],[3,2]],[[6089,4914],[-1,-5],[-2,-12],[0,-5],[-1,-6],[-1,-4],[-2,-16],[-2,-6],[-2,-15],[-1,-11],[2,-8],[0,-7],[3,-7],[3,-3],[1,-3],[3,-7],[2,-8],[5,-3],[2,-9],[-1,-6],[-2,-4],[-2,-8],[-2,-10],[0,-16],[1,3],[3,-4],[0,-12],[-3,-13],[-1,-6],[0,-6],[2,-16],[3,-8],[0,-2],[-1,-2],[6,-15],[-1,-12],[2,-10],[1,-8],[1,-7],[0,-4],[-1,-5],[4,-1],[2,-4],[1,-4],[3,0],[1,-3],[3,-2],[4,-7],[2,-3],[0,-2],[0,-1]],[[5914,4642],[-2,1],[-3,4],[-4,3],[-3,3],[-2,3],[-3,2],[-3,0],[-2,3],[-3,1],[-2,0],[-1,2],[0,5],[-1,1],[-2,1],[-2,0],[-1,-1],[-1,1],[-1,2],[-2,4],[-1,5],[-2,3],[-3,3],[-7,0],[-2,1],[-1,2],[-2,5],[-2,5],[-2,7],[0,4]],[[5847,5122],[0,1],[2,-1],[2,1],[2,3],[2,0],[1,0],[3,0],[5,0],[5,0],[5,0],[5,0],[5,0],[5,0],[5,0],[5,0],[5,0],[5,0],[4,0],[5,0],[5,0],[5,0],[5,0],[5,0],[3,0]],[[5889,7845],[3,-3],[-3,1],[-9,3],[-4,2],[-1,3],[0,4],[2,-4],[1,-2],[11,-4]],[[6061,7896],[-1,0],[-10,0],[-8,-1],[-5,-9],[-4,0],[-4,-2],[-4,-3],[-4,-7],[-2,3],[-4,0],[-4,-1],[-4,-5],[-2,0],[-5,1],[-5,-3],[-12,-14],[-4,-10],[-2,-2],[-2,-2],[-2,-2],[-1,0],[6,8],[1,2],[1,2],[0,4],[-2,4],[-5,-10],[-2,-2],[-4,-3],[0,-6],[1,-5],[1,-7],[3,-10],[7,-15],[3,-5],[2,-2],[3,0],[5,4],[3,1],[5,-2],[2,3],[2,2],[3,0],[4,-1],[4,-3],[-1,-5],[-2,-4],[-1,-4],[-1,-6],[-4,-2],[-5,1],[-5,-2],[-2,2],[-1,2],[-3,2],[-3,1],[-2,-2],[-3,-7],[-6,-4],[-2,-6],[-5,2],[-5,-1],[-7,-5],[-5,-11],[-6,-6],[-5,-3],[-4,1],[-3,2],[-5,7],[0,3],[1,1],[1,3],[2,13],[0,5],[-1,6],[-5,6],[-4,-1],[-2,1],[-7,9],[-4,0],[-5,-1],[-1,1],[-2,3],[9,11],[9,9],[4,1],[5,4],[6,6],[-1,5],[-1,4],[-3,-1],[-2,-1],[-5,4],[-1,2],[-8,-3],[-4,1],[-8,-3],[-5,3],[-8,7],[-3,2],[-2,0],[-2,2],[2,1],[2,0],[2,1],[1,2],[0,2],[-5,2],[-4,1],[-2,2],[-2,2],[4,0],[5,-2],[7,0],[6,-2],[2,2],[4,4],[0,2],[-6,-3],[-6,2],[-2,2],[-2,4],[-1,5],[0,4],[0,7],[-2,6],[-1,4],[-2,3],[2,-7],[1,-5],[1,-4],[0,-12],[-1,-4],[-3,-1],[-3,0],[-4,2],[1,6],[-2,-2],[-2,-6],[-3,-1],[-5,0],[-9,-4],[-1,-4],[-1,-7],[-2,-3],[0,-2],[-4,-10],[-1,0],[-7,-13],[-1,-1],[-5,-3],[-3,-3],[-2,-1],[-4,1],[-2,-2],[0,-2],[0,-5],[2,-3],[1,-11],[0,-5]],[[3517,3240],[-1,-2],[-2,-4],[-1,-10],[-6,-13],[-1,-7],[-7,-8],[-4,-9],[-3,0],[-2,-4],[-15,-11],[-6,2],[-4,0],[-3,5],[-9,2],[-5,-2],[-7,-6],[-2,0],[-2,1],[-4,2],[-2,5],[-11,5],[-8,13],[-11,1],[-8,-2],[-1,2],[-1,3],[-1,5],[-7,11],[-6,11],[-1,12],[1,12],[2,14],[-1,5],[2,2],[2,1],[2,3],[2,6],[0,4],[-1,8],[-1,11],[-1,5]],[[678,6279],[-1,-3],[-2,0],[-5,6],[-1,3],[1,15],[-2,12],[-3,9],[2,5],[2,4],[3,7],[-2,8],[0,6],[1,1],[6,-7],[12,-10],[3,-6],[1,-8],[2,-1],[1,-5],[3,-4],[1,-3],[-1,-4],[-6,-7],[-7,-4],[-6,-9],[-2,-5]],[[643,6380],[-2,-1],[-1,0],[-1,4],[-2,5],[3,1],[2,-1],[1,-2],[1,-2],[-1,-4]],[[653,6389],[1,-1],[3,2],[2,1],[3,-4],[2,-3],[2,-3],[1,-2],[-1,-2],[-2,-4],[-4,-1],[-2,-2],[-3,1],[-1,0],[0,5],[-1,6],[-2,-1],[-1,2],[-3,5],[0,2],[1,5],[2,0],[2,-2],[1,-4]],[[633,6406],[6,-2],[1,1],[1,-1],[5,-1],[1,-1],[-1,-3],[-3,-2],[-5,2],[-7,1],[0,2],[1,2],[0,3],[1,-1]],[[617,6420],[1,-1],[1,1],[0,-5],[2,-2],[0,-2],[-1,-2],[-3,0],[-2,1],[-1,3],[-2,-1],[0,2],[0,1],[-1,0],[1,-3],[-3,-1],[-1,1],[-1,3],[-3,7],[0,2],[-1,3],[5,1],[2,5],[2,1],[3,-9],[0,-2],[1,-2],[1,-1]],[[551,6442],[-1,-3],[-1,1],[0,2],[0,3],[2,3],[2,4],[1,-1],[-1,-2],[0,-3],[-2,-2],[0,-2]],[[573,6447],[-3,-3],[-1,1],[-3,1],[-1,2],[-2,2],[-2,3],[2,6],[4,5],[7,0],[1,-4],[0,-3],[-1,-3],[0,-5],[-1,-2]],[[2728,6598],[-1,-1],[0,1],[1,1],[1,0],[0,-1],[-1,0]],[[2734,6601],[-2,-1],[2,2],[0,4],[1,-3],[0,-1],[-1,-1]],[[2740,6604],[0,-2],[-1,1],[0,2],[-1,3],[0,1],[3,-3],[0,-1],[-1,-1]],[[2749,6607],[-2,-1],[-1,1],[1,1],[5,2],[-2,-2],[-1,-1]],[[2754,6612],[0,1],[1,2],[1,-1],[0,-1],[-2,-1]],[[2760,6618],[-1,0],[1,2],[0,-2]],[[2767,6632],[-6,-11],[1,3],[2,6],[1,2],[1,2],[2,3],[0,4],[2,2],[0,1],[-3,-12]],[[2721,6707],[-1,-1],[-2,1],[-1,2],[-1,4],[2,-4],[1,-1],[2,-1]],[[2720,6713],[0,-3],[-2,5],[-1,7],[2,-2],[1,-7]],[[2301,6691],[-1,-3],[-2,12],[-4,29],[0,16],[1,5],[1,-22],[4,-29],[1,-8]],[[2296,6756],[-1,-3],[0,5],[2,11],[5,15],[2,2],[-6,-16],[-2,-14]],[[2772,6755],[1,-4],[-3,10],[-3,15],[-2,12],[2,-3],[1,-7],[4,-23]],[[2305,6791],[-1,0],[2,4],[0,2],[2,6],[1,1],[1,-2],[-2,-5],[-3,-6]],[[2312,6805],[-1,0],[1,3],[2,2],[5,6],[2,0],[0,2],[1,1],[0,-3],[-4,-4],[-6,-7]],[[2360,6863],[-2,-1],[6,9],[2,3],[1,0],[-2,-5],[-5,-6]],[[2450,6883],[-1,-1],[-5,5],[0,2],[2,2],[2,0],[2,-2],[1,-1],[0,-1],[0,-2],[-1,-2]],[[2641,6891],[-3,-2],[-3,2],[2,0],[2,-1],[3,3],[2,2],[2,1],[-5,-5]],[[2531,6895],[-2,-3],[0,1],[1,3],[1,2],[0,-3]],[[2532,6901],[0,-2],[0,9],[-1,7],[1,-3],[1,-4],[-1,-7]],[[2521,6917],[0,-3],[-1,1],[-2,0],[1,1],[1,1],[0,1],[2,3],[0,-2],[-1,-2]],[[2540,6924],[-1,0],[-2,1],[-2,1],[0,1],[4,-2],[1,-1]],[[2553,6926],[-2,-1],[-4,0],[0,1],[1,0],[4,2],[1,-2]],[[2738,6968],[-1,-14],[-1,5],[0,4],[1,3],[1,2]],[[1712,7075],[-1,-1],[-2,1],[-2,6],[-1,4],[1,1],[1,-4],[3,-6],[1,-1]],[[1682,7097],[-1,0],[-2,0],[-1,4],[2,0],[1,-1],[1,-2],[0,-1]],[[1712,7107],[2,-4],[-2,0],[-2,0],[-1,2],[-1,3],[0,1],[-1,0],[-1,1],[0,1],[1,1],[4,-4],[1,-1]],[[1665,7137],[-2,0],[-1,0],[-2,6],[5,1],[2,-3],[-2,-4]],[[1658,7144],[-1,-1],[-3,1],[1,1],[1,1],[1,0],[1,-2]],[[1670,7147],[5,-3],[3,1],[1,-1],[0,-1],[-7,-3],[-2,2],[-1,2],[0,2],[1,1]],[[2873,7180],[-1,0],[-2,2],[1,0],[2,-2]],[[2875,7179],[-1,0],[2,7],[5,9],[2,1],[-4,-8],[-4,-9]],[[2895,7211],[-5,-4],[-1,0],[3,3],[3,1]],[[2901,7214],[-3,-2],[-1,1],[4,3],[2,11],[0,6],[-1,9],[0,2],[1,-3],[1,-9],[-1,-6],[-1,-10],[-1,-2]],[[2899,7249],[-1,-1],[-2,6],[2,-2],[1,-2],[0,-1]],[[2907,7366],[-1,-1],[4,12],[3,9],[1,4],[-1,-7],[-2,-6],[-4,-11]],[[2940,7469],[-3,-8],[0,1],[4,11],[-1,-4]],[[2939,7518],[-1,0],[1,5],[2,3],[1,-1],[0,-2],[0,-1],[-2,-3],[-1,-1]],[[2986,7545],[-2,-4],[1,-1],[2,2],[1,2],[4,3],[3,1],[1,0],[1,-2],[3,2],[2,1],[-12,-10],[-2,-1],[-4,-3],[-3,-2],[-2,0],[-12,-8],[-1,0],[-1,1],[-10,-4],[-4,0],[-4,-1],[3,3],[0,1],[-1,1],[-1,-1],[-2,-3],[-2,-1],[-1,4],[1,2],[1,3],[3,3],[3,3],[2,2],[1,-2],[0,2],[1,2],[1,1],[2,0],[2,0],[1,1],[1,0],[2,-1],[3,0],[2,2],[2,0],[6,1],[5,1],[3,2],[4,6],[3,1],[-4,-6],[-2,-3]],[[3056,7561],[-2,-1],[-5,2],[4,2],[1,0],[0,3],[0,1],[2,-5],[0,-2]],[[3041,7567],[-8,-3],[-1,2],[2,1],[3,4],[1,1],[3,-3],[0,-2]],[[3017,7573],[0,-1],[-1,3],[1,3],[1,-1],[-1,-4]],[[3021,7574],[-2,-2],[-1,0],[1,2],[0,4],[1,3],[0,1],[1,1],[0,-9]],[[3093,7729],[-1,-1],[-1,1],[0,2],[1,1],[0,1],[1,-1],[0,-3]],[[3106,7737],[-2,-1],[-2,1],[0,-3],[0,-1],[-2,1],[-1,1],[0,4],[2,4],[1,1],[2,-1],[2,-4],[0,-2]],[[1587,7903],[0,-1],[-1,2],[0,2],[0,1],[1,-4]],[[1600,7914],[0,-2],[-1,-1],[-1,1],[0,1],[-1,-1],[0,3],[0,4],[1,0],[1,-2],[1,-3]],[[1597,7925],[0,-1],[-2,1],[0,2],[0,2],[0,2],[1,0],[1,0],[0,-1],[0,-5]],[[1595,7958],[1,-8],[1,3],[4,-5],[0,-3],[-1,-1],[-1,1],[-1,1],[-1,1],[-2,1],[0,2],[-1,2],[0,4],[0,1],[-1,1],[-1,1],[-2,3],[1,3],[1,4],[1,2],[1,-1],[1,-1],[1,-2],[0,-2],[-4,-3],[2,-1],[0,-1],[1,-2]],[[1588,7973],[-2,1],[-1,1],[0,1],[1,4],[1,0],[0,-3],[1,-2],[0,-2]],[[1583,7977],[1,-2],[-3,2],[-2,1],[0,1],[-1,3],[1,1],[1,1],[3,-4],[0,-3]],[[1589,7987],[1,-1],[-2,-1],[-2,2],[0,-3],[0,-1],[-2,2],[-1,1],[1,2],[1,1],[1,0],[3,-2]],[[3135,7785],[0,-1],[1,-3],[0,-6],[-1,-2],[1,-4],[2,-1],[1,-1],[0,-1],[-6,-9],[-5,1],[-2,-2],[-3,-1],[-1,-4],[-2,0],[-2,0],[-1,1],[-2,-1],[-2,-7],[-1,1],[-1,-3],[-1,-1],[-1,-1],[-1,3],[0,3],[-1,1],[-2,1],[-1,0],[-1,-1],[-1,-2],[-2,-1],[-1,1],[-1,2],[-1,-3],[-1,-4],[1,-4],[-1,-3],[-1,1],[-1,2],[-3,2],[-3,0],[1,2],[2,4],[-1,0],[-1,0],[1,3],[0,4],[-1,-1],[-2,-4],[-3,-3],[0,-5],[-3,-10],[0,-4],[-2,-4],[-2,-3],[-4,1],[-2,-2],[-1,-3],[-1,-1],[-1,4],[0,1],[-1,-5],[-1,-1],[-1,4],[0,3],[-1,-2],[-1,-6],[-1,0],[0,2],[-1,1],[0,-3],[0,-3],[0,-2],[-1,1],[-1,2],[-2,-2],[-1,0],[0,2],[0,2],[-2,-1],[-4,-4],[-2,-6],[1,-1],[1,-1],[-5,-9],[-4,-7],[-4,-13],[-1,-1],[-1,-2],[-1,-8],[-2,-7],[1,-2],[1,-4],[1,-3],[1,0],[1,1],[1,0],[0,-2],[0,-1],[-1,-1],[-3,-2],[-2,-1],[-1,-3],[-2,-4],[-3,-6],[2,-2],[5,-2],[2,-2],[3,-11],[-1,-1],[0,-2],[3,-3],[1,-7],[2,-3],[4,-2],[5,3],[3,3],[0,3],[-2,6],[-1,3],[-2,2],[0,-2],[-1,2],[0,1],[1,1],[1,0],[1,-2],[4,-6],[1,-9],[0,-6],[0,-2],[-1,1],[-2,-1],[-10,-3],[-2,-2],[-5,-3],[0,1],[0,3],[0,6],[-1,1],[-8,-10],[-3,-1],[-2,-2],[-1,1],[0,7],[1,6],[-3,-3],[-1,2],[-1,2],[0,2],[-1,0],[0,-5],[-1,-4],[-1,-11],[-2,-4],[-7,-3],[-4,1],[-4,-1],[-6,-2],[-3,1],[-3,-2],[-10,0],[-2,1],[-3,-4],[-4,-3],[-11,-8],[-3,-4],[-3,-5],[-2,-2],[-1,-1],[-1,-3],[-1,-1],[1,5],[1,4],[1,9],[-1,6],[-1,3],[-1,2],[1,-7],[1,-8],[-1,-5],[-3,-9],[-1,-2],[-1,-2],[-1,0],[-1,-2],[-1,-2],[-1,-5],[0,-4],[6,-2],[1,2],[1,-3],[0,-4],[0,-5],[-1,-4],[-1,-6],[0,-9],[-1,-7],[0,2],[0,9],[-1,-1],[0,-2],[-2,-12],[-2,-7],[-2,-4],[-2,1],[0,-4],[0,-2],[-1,-4],[-1,-2],[-1,0],[-2,-2],[-1,-1],[0,-3],[-1,-2],[-4,-12],[-3,-3],[-1,0],[1,6],[0,6],[-2,2],[-2,1],[-2,0],[-3,5],[-3,3],[-5,8],[0,3],[0,4],[1,6],[2,5],[2,2],[5,2],[1,4],[1,3],[-2,-5],[-5,-2],[-2,-2],[-2,-3],[-1,-4],[-2,-4],[0,-3],[1,-2],[-1,-4],[2,-5],[3,-7],[0,-11],[3,-7],[3,-8],[3,-3],[0,-3],[-1,-5],[-2,-2],[2,0],[1,-1],[1,-4],[0,-5],[0,-2],[-1,-1],[0,2],[0,1],[-1,-1],[0,-1],[-1,-5],[0,-3],[-2,-1],[-2,-6],[-1,-4],[-7,-25],[0,-4],[-1,-1],[-2,-1],[-2,-3],[-1,-3],[-1,-7],[-3,-8],[-1,3],[0,3],[0,8],[3,13],[2,8],[2,3],[2,8],[-2,1],[-3,0],[0,3],[1,4],[-1,3],[-1,0],[-1,1],[1,3],[0,3],[0,3],[1,2],[-1,0],[-2,-3],[0,-1],[-1,3],[-1,-1],[0,-1],[-1,-1],[-2,2],[-2,2],[-2,5],[-1,3],[1,6],[2,1],[2,-1],[4,0],[-1,2],[-1,-1],[-3,5],[-1,3],[-2,1],[-1,-3],[-1,-1],[1,7],[2,0],[2,2],[-1,3],[-1,2],[-3,-2],[0,2],[1,4],[2,0],[1,-1],[2,5],[0,2],[-2,-3],[-1,7],[2,7],[3,3],[2,0],[3,1],[-2,1],[-1,1],[1,3],[1,0],[1,3],[-3,-1],[1,5],[-2,-1],[-1,-1],[-1,-2],[0,-3],[0,-2],[-1,-2],[-2,-1],[-1,2],[0,1],[-1,-5],[0,-1],[-2,4],[0,-1],[0,-1],[0,-2],[-2,-1],[0,-3],[0,-2],[-4,3],[0,-1],[2,-6],[2,-2],[0,-3],[-2,-2],[-2,2],[1,-4],[1,-3],[-1,-3],[0,-3],[0,-3],[0,-3],[1,-12],[1,-3],[1,-3],[1,-3],[-2,-1],[-2,3],[-1,2],[-2,6],[-1,2],[0,2],[0,-5],[1,-4],[6,-11],[1,-4],[1,-3],[0,-3],[-2,2],[-1,3],[-4,3],[-5,2],[-3,7],[1,-3],[-1,-3],[-2,4],[-1,2],[0,3],[-2,0],[-3,-3],[-2,1],[0,5],[1,3],[2,6],[2,3],[1,4],[0,7],[0,-7],[-2,-3],[-2,-2],[-2,-5],[-1,-4],[-1,-8],[1,-2],[1,-1],[4,2],[2,-1],[3,-9],[8,-4],[2,-2],[3,-5],[3,-3],[2,-4],[0,-2],[-1,-3],[0,-4],[-1,-3],[-3,0],[-1,0],[-8,15],[-1,1],[-4,8],[-3,4],[-1,0],[5,-8],[2,-5],[4,-7],[2,-4],[2,-5],[2,-2],[5,-3],[-2,-3],[3,-2],[1,-3],[-1,-4],[-4,1],[0,-3],[1,-2],[-2,-1],[-2,2],[-6,11],[0,-1],[0,-2],[4,-7],[3,-5],[2,-2],[3,-3],[0,-3],[1,-3],[-2,-2],[-2,-2],[-1,3],[-1,2],[-3,4],[-1,5],[-2,-1],[-8,6],[-7,1],[1,-1],[0,-1],[6,-1],[2,-3],[4,-2],[3,-1],[1,-7],[4,-5],[0,-4],[3,0],[4,3],[3,-1],[4,-1],[1,-3],[0,-6],[2,-6],[3,-24],[6,-21],[1,-3],[-2,3],[-4,13],[-2,10],[-2,17],[-1,4],[-1,1],[0,-1],[-1,-2],[1,-2],[-1,-5],[0,-3],[2,-3],[1,-6],[2,-9],[-2,3],[-2,2],[-3,2],[-3,2],[1,-3],[-1,-4],[-2,1],[-1,1],[1,-4],[-2,1],[-2,0],[-1,-4],[-2,-2],[-2,-1],[-3,4],[-1,4],[-1,5],[0,-6],[1,-6],[-1,-4],[4,-1],[3,1],[4,0],[2,0],[2,2],[4,-1],[0,-6],[0,-5],[-1,-5],[1,0],[2,1],[0,10],[4,4],[1,0],[1,-3],[0,-4],[1,-4],[-1,-7],[-5,-8],[-4,-7],[-2,-2],[-3,1],[-3,2],[-2,0],[-1,0],[-1,2],[0,4],[-1,1],[-1,0],[-1,-4],[-3,-1],[-4,1],[-4,4],[2,-4],[10,-7],[1,-2],[1,-2],[-1,-3],[-1,-3],[0,-3],[-1,-2],[-4,-5],[-2,1],[-6,9],[3,-8],[2,-3],[4,-2],[8,3],[3,-3],[-3,-5],[-2,-4],[-3,-1],[-2,-1],[-1,-2],[-2,0],[-2,0],[-5,-1],[-2,1],[-3,-5],[-1,-1],[-2,1],[-1,4],[-1,2],[0,-8],[1,-2],[0,-2],[-4,-4],[-3,-5],[-2,-2],[-1,-2],[-3,-8],[-1,-6],[-1,-6],[0,3],[0,4],[-1,6],[0,-10],[-1,-5],[-11,0],[-5,-2],[-7,-9],[-3,-4],[-6,-14],[-1,-9],[-1,4],[0,2],[0,3],[-2,-5],[2,-8],[-1,-3],[-4,-5],[-3,-1],[-2,-1],[-1,-6],[-3,-5],[-2,-2],[-4,2],[1,-5],[-1,-4],[-2,-2],[-3,-2],[-2,0],[-1,-1],[-1,-2],[-3,-2],[-2,1],[-3,1],[-2,-2],[3,-2],[1,-3],[0,-4],[-1,-1],[-2,-3],[0,1],[-1,2],[0,4],[-1,-1],[0,-2],[-1,-1],[-3,7],[0,-5],[1,-4],[1,-2],[1,-1],[0,-2],[-2,-4],[0,-1],[-2,0],[-1,-3],[0,-2],[-1,-5],[-4,-3],[-1,0],[0,-1],[0,-2],[1,-2],[0,-1],[-1,-2],[-2,-1],[-1,-2],[1,-2],[0,-1],[0,-2],[-2,-3],[0,-2],[1,0],[1,0],[-1,-3],[-1,-3],[-1,-3],[-3,-1],[0,-2],[2,-1],[1,-2],[-2,-6],[-2,1],[-1,1],[0,-4],[0,-3],[0,-4],[-1,-6],[-1,-2],[0,-4],[1,-4],[1,-5],[2,-22],[1,-7],[3,-20],[4,-20],[6,-23],[9,-28],[1,-4],[-1,-4],[-1,-3],[0,-6],[1,-5],[1,-6],[2,-10],[-1,2],[-3,14],[-1,8],[1,12],[-1,-1],[-1,-3],[0,-5],[-1,-2],[-1,7],[0,3],[1,4],[0,1],[-2,2],[0,3],[0,3],[-1,1],[-1,0],[1,-7],[1,-4],[1,-10],[1,-7],[1,-5],[12,-56],[3,-7],[1,-5],[1,-11],[0,-14],[-2,-25],[0,-17],[0,2],[-1,0],[-2,-8],[-2,-7],[-1,-11],[-1,-5],[-3,-6],[-2,0],[-5,-4],[-3,1],[-5,-3],[-2,1],[-2,5],[0,2],[1,3],[1,0],[4,-5],[0,2],[-1,3],[-2,1],[-1,2],[-4,12],[-3,9],[0,6],[-6,3],[-4,5],[-3,10],[-1,16],[-2,2],[-1,2],[2,6],[2,5],[-2,-1],[-1,-2],[-1,-5],[-1,-1],[-1,1],[-1,9],[0,11],[2,4],[-3,0],[-2,-2],[0,-3],[0,-2],[-2,0],[-1,2],[-2,3],[-2,7],[-5,20],[-1,3],[-2,3],[1,1],[1,0],[3,9],[3,5],[1,4],[0,2],[-1,2],[-2,-2],[-1,1],[-1,4],[-2,1],[-1,-1],[1,-3],[1,-2],[0,-5],[0,-2],[-1,-2],[-2,1],[-1,-1],[-1,1],[0,3],[-1,4],[2,22],[3,15],[0,16],[0,2],[0,5],[-3,9],[-15,23],[-11,27],[-10,11],[-7,-3],[-1,-2],[-1,-2],[0,-3],[0,-2],[-2,1],[-3,-1],[-7,-7],[-2,0],[-3,-2],[-1,-1],[-5,-1],[-3,-2],[-2,1],[-1,4],[0,5],[1,-4],[1,-2],[1,1],[0,2],[-1,5],[-4,5],[-5,9],[1,-1],[1,2],[-2,3],[1,2],[1,3],[-2,0],[-2,-2],[0,-3],[0,-2],[-1,1],[-2,2],[-9,7],[-8,4],[6,1],[3,-1],[0,2],[-1,1],[-2,2],[-4,0],[-2,0],[-2,-1],[-2,-3],[-2,-1],[-8,-2],[-7,-2],[2,2],[1,2],[3,2],[1,4],[-1,4],[-1,-1],[-1,-3],[-1,2],[-2,0],[0,-5],[-2,-3],[-1,-4],[-5,-2],[-1,1],[2,3],[0,1],[-2,-1],[-3,-6],[-11,-2],[1,1],[2,1],[3,2],[-1,3],[-1,3],[-1,1],[-1,2],[0,6],[0,4],[-2,4],[-1,-1],[-1,-7],[-1,-8],[0,-3],[-4,0],[-2,0],[-10,-1],[-3,3],[-2,1],[-1,0],[-4,-3],[-5,-2],[-1,1],[-1,0],[-4,-7],[-4,-4],[-10,6],[-3,5],[-2,1],[-3,1],[-2,-6],[-3,-8],[4,-4],[3,-3],[5,2],[3,4],[2,0],[1,1],[1,2],[2,-2],[0,-2],[-1,-2],[-2,-2],[-1,-2],[2,-4],[3,-2],[1,1],[1,5],[2,3],[2,-1],[0,-2],[0,-2],[2,-3],[-1,-4],[1,-2],[-3,-2],[-2,0],[-2,-3],[1,-2],[-2,-1],[-1,1],[0,-1],[-1,-2],[0,-1],[1,-5],[2,-3],[2,-4],[8,-5],[2,0],[1,-5],[2,-1],[1,-1],[0,-4],[-3,-2],[0,-3],[-1,-2],[-1,2],[-1,2],[-3,-5],[-1,-1],[1,5],[-1,2],[-2,5],[-2,4],[-2,1],[-1,2],[-1,0],[-1,0],[-2,1],[-1,3],[0,2],[-2,3],[-8,4],[0,-2],[1,-1],[1,-1],[1,-2],[0,-5],[0,-3],[-1,-3],[0,-3],[-1,-3],[-2,-2],[-1,2],[-2,7],[-2,2],[-3,0],[-3,-1],[-2,-7],[-2,-1],[-7,3],[-8,6],[0,2],[1,0],[3,-1],[0,2],[-3,6],[0,3],[0,4],[-1,0],[-1,-3],[-5,2],[-2,3],[-3,8],[-4,0],[-2,5],[-3,-2],[-2,-2],[-2,-4],[1,-1],[2,-3],[-1,-2],[-5,-2],[-11,3],[-4,2],[-4,4],[-6,4],[-3,1],[-3,-1],[-9,0],[-2,-1],[-2,-2],[-1,2],[0,3],[1,0],[1,2],[1,4],[0,2],[-1,1],[-1,1],[-3,-10],[2,-5],[0,-2],[-6,-1],[-13,-11],[-5,-6],[0,2],[6,8],[-2,1],[-4,-2],[-1,1],[2,6],[-1,5],[-2,1],[-2,-5],[-1,0],[-2,2],[-1,0],[1,-10],[2,-4],[1,-6],[-4,-6],[-3,-5],[0,-5],[-4,-7],[-3,-4],[-7,-9],[-2,-1],[-4,-5],[-4,-3],[-5,-5],[-1,0],[2,4],[4,4],[-3,-1],[-5,2],[-2,0],[0,-1],[-2,-2],[-3,3],[0,2],[-1,2],[-1,0],[-1,-1],[4,-12],[1,-1],[1,-1],[-1,-3],[-2,-2],[-4,-2],[-2,5],[-1,-6],[0,-6],[-1,-1],[-2,-2],[0,1],[-1,2],[-1,-2],[-1,-1],[-2,0],[-2,-1],[0,-3],[0,-2],[3,2],[-1,-6],[-2,-6],[-3,-2],[-3,1],[-1,-1],[-1,-1],[4,-9],[-2,-15],[-2,-5],[-1,-1],[-1,0],[-5,5],[-2,3],[2,-10],[6,-2],[0,-4],[0,-3],[-1,-4],[-1,-5],[1,-3],[1,-9],[0,-4],[1,-12],[1,-5],[5,-19],[2,0],[0,-2],[0,-4]],[[1746,7058],[0,6],[-1,3],[-2,-2],[-1,8],[1,4],[0,4],[-2,9],[-4,12],[-9,14],[-5,4],[-3,6],[-2,2],[-3,0],[-1,-2],[-3,1],[0,7],[-3,9],[-3,1],[-6,0],[-9,5],[-2,3],[-1,5],[-4,5],[-6,4],[-3,-1],[-3,1],[-6,3],[-3,1],[-7,-1],[-2,0],[-2,4],[-2,3],[0,5],[0,4],[0,4],[-1,8],[1,7],[-1,3],[-1,2],[-4,3],[-1,4],[1,5],[-1,3],[-4,3],[-3,8],[-4,4],[-2,6],[-2,5],[-1,3],[-6,13],[-6,10],[-1,6],[0,8],[3,5],[1,5],[0,3],[-1,3],[-2,5],[-8,3],[-6,13],[0,9],[-3,10],[0,7],[0,6],[2,2],[1,-1],[0,-2],[1,-5],[2,-4],[2,-2],[1,-3],[2,-1],[1,-1],[-1,3],[0,1],[-1,5],[-2,6],[-2,3],[-1,7],[-1,1],[-1,2],[2,3],[3,2],[4,0],[10,0],[2,1],[2,0],[1,0],[-3,1],[-1,0],[-2,0],[-4,0],[-1,1],[-2,1],[-1,1],[-3,-4],[-2,1],[-3,3],[-2,1],[-2,-2],[-1,-9],[1,-7],[-2,0],[-1,2],[-3,2],[-2,2],[-3,5],[-2,2],[-2,-4],[0,2],[1,4],[0,8],[3,-6],[-1,4],[-2,5],[-2,1],[-2,8],[-5,5],[-4,8],[-7,14],[-1,12],[-3,14],[2,9],[-1,6],[-1,9],[-1,5],[-7,13],[-6,9],[0,7],[-1,7],[1,6],[2,7],[0,1],[1,0],[-1,-2],[1,0],[1,3],[0,1],[-1,0],[0,1],[1,2],[2,9],[0,10],[2,13],[-1,5],[-1,9],[-1,6],[-2,4],[1,6],[0,5],[-4,8],[-2,10],[0,5],[0,12],[-1,5],[-3,8],[2,7],[1,4],[3,19],[1,2],[1,0],[2,3],[-1,1],[-2,-2],[2,8],[1,6],[1,2],[1,21],[1,16],[1,6],[0,5],[0,7],[0,8],[3,36],[-1,4],[1,6],[-1,15],[1,17],[-1,3],[0,2],[2,-2],[6,0],[5,2],[1,-1],[2,-3],[2,0],[3,0],[-1,1],[-1,0],[-3,3],[-2,3],[-5,0],[-1,2],[-6,-2],[-1,2],[-4,-2],[1,6],[0,7],[0,6],[1,-5],[2,-5],[1,6],[0,7],[-1,3],[-4,2],[-1,7],[8,6],[-4,1],[-2,3],[-2,0],[0,-2],[0,-3],[-1,4],[0,4],[-1,7],[-3,11],[-2,15],[-2,7],[-5,7],[-1,4],[-1,10],[1,8],[-1,5],[2,0],[5,-4],[8,-4],[2,-2],[3,-2],[19,-3],[1,1],[3,1],[1,0],[3,-4],[1,0],[2,0],[1,1],[2,2],[1,-1],[0,-2],[0,-4],[2,-4],[1,-3],[-4,-9],[0,3],[-1,1],[-6,-14],[-2,-7],[-1,-3],[0,-2],[1,0],[2,1],[3,2],[0,1],[-2,-1],[-2,0],[1,3],[0,2],[2,4],[2,3],[2,3],[2,2],[1,4],[3,4],[1,1],[-1,4],[1,0],[1,0],[1,-6],[-1,-3],[-2,-3],[-1,-1],[1,-5],[-1,0],[-1,0],[3,-5],[0,-3],[1,-4],[-1,-6],[-1,-1],[-1,0],[-2,2],[-1,-5],[-1,0],[-1,6],[-3,-2],[-1,-3],[0,-4],[-2,-2],[4,-1],[2,1],[3,-2],[3,2],[0,2],[2,6],[1,1],[1,0],[1,1],[2,3],[0,2],[0,7],[0,5],[-1,1],[0,2],[0,1],[0,2],[0,2],[0,2],[0,2],[2,5],[0,2],[2,4],[0,2],[-2,2],[-1,2],[-1,3],[-1,1],[1,-5],[0,-1],[-3,3],[0,2],[-1,2],[1,2],[1,1],[2,1],[0,1],[-3,5],[-1,2],[-1,1],[-2,0],[0,1],[-1,1],[1,2],[1,0],[2,0],[1,1],[0,1],[0,2],[0,6],[-1,5],[-1,1],[-1,0],[-1,0],[-1,1],[-1,4],[-2,8]],[[9984,8143],[-5,0],[-10,9],[-5,3],[-3,3],[2,1],[6,-2],[5,-5],[2,-4],[3,-2],[4,-2],[1,-1]],[[103,8167],[-2,-3],[-1,1],[0,5],[1,1],[2,-3],[0,-1]],[[111,8168],[-2,-1],[-4,2],[1,3],[3,-2],[2,-2]],[[59,8159],[-1,-2],[-4,3],[-1,1],[3,2],[0,1],[0,1],[-2,2],[-3,3],[-1,2],[1,1],[1,1],[5,0],[2,-3],[2,-1],[4,-1],[-2,-2],[-1,-1],[-2,-5],[-1,-2]],[[79,8163],[-1,-1],[-1,-1],[-4,1],[-3,0],[-3,-1],[-2,-1],[0,2],[0,1],[9,3],[2,2],[2,2],[1,4],[1,1],[2,-2],[-1,-2],[-1,-2],[0,-1],[-1,-5]],[[95,8171],[0,-2],[3,1],[1,-1],[0,-4],[0,-1],[-1,-1],[-1,1],[-1,-2],[-6,-4],[-2,2],[-4,-4],[3,11],[3,1],[1,2],[-1,3],[2,5],[3,0],[1,-2],[0,-2],[-1,-3]],[[9959,8174],[-1,-1],[-1,3],[0,1],[1,2],[1,-1],[1,-2],[-1,-2]],[[9991,8173],[-2,-1],[-3,1],[-1,2],[0,3],[4,3],[4,-4],[-2,-4]],[[111,8179],[-1,-2],[-3,2],[-1,2],[0,1],[1,3],[2,0],[1,-1],[1,-2],[1,-1],[-1,-2]],[[9927,8172],[-2,-2],[-2,2],[0,1],[3,5],[3,0],[1,2],[1,5],[2,0],[1,0],[0,-3],[-2,-3],[0,-3],[-5,-4]],[[179,8187],[6,-3],[6,1],[3,-1],[0,-1],[-5,0],[-1,0],[-4,-1],[-2,-1],[-6,2],[-5,-1],[-1,0],[-1,1],[-2,2],[0,1],[1,0],[4,-1],[1,1],[3,1],[3,0]],[[209,8195],[-2,-1],[-2,1],[1,3],[1,1],[2,2],[3,-1],[1,-2],[-4,-3]],[[148,8181],[-15,-2],[-2,1],[2,1],[3,1],[5,2],[7,3],[5,3],[5,1],[1,3],[-4,2],[0,1],[2,2],[1,2],[4,2],[3,-3],[1,-2],[0,-2],[-1,-3],[-3,-1],[0,-2],[1,-3],[-6,-4],[-9,-2]],[[9825,8200],[-2,-1],[-1,2],[-6,1],[0,2],[3,1],[4,3],[3,-1],[-1,-2],[0,-5]],[[257,8212],[-1,-1],[-1,0],[0,3],[1,1],[3,4],[2,-1],[1,-1],[-1,-1],[0,-2],[-1,-1],[-1,0],[-2,-1]],[[286,8228],[0,-3],[-1,0],[-4,1],[-3,-1],[0,2],[0,1],[5,2],[2,0],[1,-1],[0,-1]],[[9799,8237],[5,-2],[3,1],[5,-3],[5,-5],[-1,-1],[-2,-1],[-1,0],[-4,0],[-2,0],[-4,-4],[-5,3],[-1,5],[-4,1],[-2,2],[5,4],[3,0]],[[334,8256],[-8,-6],[-3,-4],[-2,-5],[-2,-2],[-1,0],[-1,-2],[-3,-3],[-1,0],[-9,-7],[-1,0],[0,2],[3,2],[2,3],[2,4],[1,1],[1,2],[0,4],[0,2],[2,3],[2,1],[1,1],[4,-1],[2,2],[0,1],[-1,1],[0,2],[0,3],[1,3],[2,2],[3,2],[3,2],[3,0],[4,-3],[1,-2],[-1,-2],[-1,-3],[-3,-3]],[[383,8278],[-1,1],[0,2],[0,1],[2,2],[1,1],[1,0],[0,-1],[-1,-2],[-1,-2],[-1,-2]],[[372,8288],[1,-2],[2,1],[2,3],[1,3],[1,1],[1,-2],[2,-2],[-2,-3],[-5,-5],[-1,-4],[0,-1],[4,1],[1,0],[1,-1],[-1,-2],[-2,-1],[-3,-2],[-5,-5],[-2,-3],[-2,-1],[-3,-1],[-5,-2],[-3,-2],[-1,-1],[-1,-1],[-2,0],[-1,-1],[-1,-2],[-1,-1],[-2,0],[-1,-1],[-2,0],[-3,3],[0,1],[2,3],[2,1],[3,0],[3,3],[6,3],[2,2],[2,6],[1,1],[1,3],[3,0],[2,-3],[0,-1],[0,1],[1,2],[1,2],[-1,1],[-3,1],[-2,1],[-2,0],[-1,1],[-1,1],[0,2],[0,2],[1,2],[1,2],[2,1],[3,1],[3,1],[2,0],[1,0],[1,-6]],[[393,8298],[-1,-1],[-1,0],[0,1],[-3,-1],[-1,0],[-1,4],[0,1],[0,2],[2,1],[2,1],[2,0],[3,-3],[2,-2],[0,-1],[-1,-1],[-3,-1]],[[401,8302],[-1,0],[-1,3],[-1,4],[2,1],[1,1],[1,-1],[1,-3],[1,-1],[1,-1],[-1,0],[-3,-3]],[[485,8317],[-3,-1],[-2,1],[-3,3],[0,3],[5,-2],[1,-1],[2,-3]],[[492,8343],[-1,0],[-2,1],[-1,2],[0,2],[4,3],[1,0],[0,-2],[0,-1],[-1,-4],[0,-1]],[[459,8351],[3,-10],[1,-2],[2,-1],[2,-1],[1,-1],[2,-2],[0,-1],[-8,3],[-5,-5],[-1,-1],[-14,0],[-2,-1],[-2,-2],[-3,-5],[-2,-2],[-1,-1],[-4,-2],[-4,1],[-2,0],[-2,3],[-1,4],[0,2],[1,2],[4,3],[1,2],[5,11],[1,1],[2,1],[4,-1],[3,3],[8,5],[2,1],[5,0],[2,-1],[1,-1],[1,-2]],[[573,8350],[-1,0],[-1,4],[-1,1],[2,-1],[1,-2],[0,-2]],[[569,8360],[0,-4],[-1,-1],[0,1],[-2,-1],[-1,1],[1,2],[0,1],[1,0],[0,2],[0,1],[0,2],[1,1],[1,-5]],[[1352,8356],[2,-7],[1,-3],[-3,-1],[-2,1],[-1,0],[-1,2],[1,4],[-1,2],[-2,1],[-1,-2],[-1,4],[2,3],[-1,3],[0,3],[0,1],[2,0],[3,-3],[2,-8]],[[559,8359],[-2,-1],[0,-2],[-1,0],[-2,-2],[-3,-6],[-2,-1],[2,5],[0,2],[0,1],[0,4],[1,0],[1,0],[1,4],[2,0],[2,4],[1,0],[-1,-3],[2,-2],[0,-2],[-1,-1]],[[1309,8346],[1,-1],[1,0],[1,2],[2,0],[1,-1],[1,0],[0,-3],[-1,-5],[-1,-2],[0,-2],[-3,1],[-3,3],[-3,5],[-2,4],[0,2],[-1,1],[-2,7],[-2,5],[-2,0],[-2,2],[-1,3],[1,2],[3,1],[6,-6],[1,-3],[2,-3],[0,-4],[1,-2],[2,-6]],[[546,8371],[0,-4],[-4,3],[-1,1],[1,1],[3,0],[1,-1]],[[536,8370],[1,0],[1,0],[2,4],[0,-1],[-1,-4],[2,-4],[1,-2],[0,-1],[-3,-1],[-3,1],[-1,0],[-2,-2],[0,2],[-1,8],[0,1],[2,3],[1,1],[1,0],[1,-1],[0,-2],[-1,-2]],[[1297,8383],[1,-2],[0,-1],[-4,-3],[0,-1],[-1,-3],[-1,0],[-2,-3],[-3,-3],[1,9],[-3,4],[3,3],[2,-1],[3,0],[3,2],[1,-1]],[[679,8399],[-1,-2],[-3,0],[-1,1],[0,2],[3,4],[1,1],[1,-2],[0,-4]],[[1362,8380],[-1,-6],[-2,-7],[-3,-3],[-2,0],[-2,3],[-1,0],[-2,1],[-1,2],[1,3],[0,2],[-1,-2],[-2,-2],[-3,-2],[-2,-5],[-1,-3],[-2,4],[0,7],[-1,4],[3,5],[3,4],[1,15],[10,7],[0,-1],[4,-5],[3,-7],[1,-4],[0,-6],[0,-4]],[[1290,8429],[5,-1],[5,0],[1,-3],[2,-2],[0,-3],[0,-2],[0,-1],[0,-2],[0,-1],[9,-5],[5,-6],[1,-3],[1,-2],[2,-7],[4,-7],[2,-2],[1,-3],[-3,2],[-6,5],[-1,-3],[-1,-2],[-1,-2],[1,-1],[5,2],[4,-5],[1,-1],[2,-4],[0,-1],[-1,-3],[-1,-1],[2,-1],[4,1],[1,-1],[-1,-10],[1,-4],[0,-2],[-1,-2],[0,-2],[1,-2],[0,-2],[-1,-4],[-2,-1],[-2,0],[-1,1],[-2,4],[-2,6],[-1,1],[-3,1],[0,1],[-2,0],[-1,2],[0,4],[-1,3],[0,2],[-1,0],[-1,-1],[0,-3],[0,-3],[-3,2],[-3,8],[-4,6],[-2,2],[1,1],[2,1],[1,0],[1,1],[-4,7],[0,2],[2,3],[-2,1],[-4,-1],[-2,1],[-1,2],[-1,2],[-4,1],[-1,0],[-2,3],[-1,2],[0,1],[2,2],[2,0],[2,-2],[1,0],[2,2],[1,3],[2,2],[-1,2],[-1,3],[-2,1],[-5,-2],[-4,-3],[-1,1],[-1,2],[5,6],[2,3],[-1,1],[-1,3],[0,6],[1,1]],[[1312,8424],[-2,-1],[-2,1],[-4,5],[0,1],[1,2],[2,3],[1,0],[6,0],[1,-1],[1,-1],[0,-1],[-1,-2],[0,-1],[0,-2],[0,-1],[-3,-2]],[[1330,8416],[0,-10],[-2,1],[-1,0],[-2,-2],[-2,1],[-1,1],[0,1],[0,3],[-1,2],[-5,0],[-1,1],[-1,3],[0,4],[0,1],[3,1],[1,5],[1,1],[4,9],[1,-1],[3,-5],[4,-9],[-1,-7]],[[703,8434],[-2,-1],[0,1],[0,1],[0,1],[1,2],[3,4],[3,2],[1,0],[1,-2],[-2,-3],[-5,-5]],[[716,8439],[-1,0],[-2,1],[0,2],[3,2],[3,0],[0,-1],[0,-2],[-1,-1],[-2,-1]],[[285,8446],[3,-1],[2,0],[2,0],[0,-1],[-3,-3],[-1,0],[-4,3],[1,2]],[[1312,8440],[0,-1],[-3,0],[-2,1],[0,2],[0,2],[1,2],[1,3],[1,6],[5,-6],[2,-3],[0,-4],[-1,-1],[-3,0],[-1,-1]],[[1278,8458],[2,-4],[2,0],[2,-3],[1,-4],[-1,-3],[-1,1],[-1,-2],[-1,-6],[0,-5],[0,-6],[-2,-6],[0,-3],[-1,-1],[0,-1],[-1,1],[-1,1],[-2,-3],[-2,0],[-1,7],[1,12],[3,3],[-2,3],[-3,4],[0,2],[-3,6],[0,1],[0,6],[3,4],[4,1],[2,-2],[2,-2],[0,-1]],[[1295,8467],[2,-2],[1,2],[2,0],[3,-2],[3,-2],[1,-3],[0,-2],[-1,-4],[1,-4],[0,-2],[-1,-1],[-1,-2],[-1,0],[-2,4],[-3,6],[-3,2],[0,-1],[1,-1],[2,-4],[0,-2],[1,-3],[1,-1],[0,-3],[0,-2],[0,-2],[-1,-1],[0,-1],[-5,1],[-3,-2],[-3,1],[-1,1],[-1,2],[0,5],[-1,6],[1,5],[-3,5],[-1,3],[-3,2],[-2,2],[1,2],[2,2],[5,0],[9,-4]],[[750,8474],[-4,-2],[-3,-3],[-1,-2],[-2,3],[0,5],[2,3],[10,-1],[0,-1],[0,-1],[0,-1],[-2,0]],[[273,8478],[-3,-3],[-2,1],[-1,2],[0,1],[8,2],[-2,-3]],[[1251,8487],[2,-6],[2,-5],[1,-6],[3,-12],[1,-5],[0,-2],[1,-7],[-1,-1],[0,-2],[-1,-2],[1,-5],[0,-7],[-1,-5],[-2,1],[-2,3],[-1,2],[-3,8],[-1,3],[0,3],[1,2],[1,1],[1,3],[-1,0],[-3,-1],[-2,3],[-2,1],[1,5],[-1,1],[-3,-2],[-1,2],[-1,1],[0,3],[1,2],[3,5],[0,1],[-2,1],[-2,2],[-1,6],[-2,3],[-1,0],[-3,-10],[-2,-2],[-4,-2],[1,3],[1,3],[-2,7],[0,3],[1,2],[3,1],[2,1],[1,2],[0,2],[2,6],[1,1],[3,0],[6,-6],[2,-1],[3,-4]],[[743,8516],[-1,-2],[0,1],[-2,2],[-3,2],[-1,2],[-1,1],[2,1],[3,-2],[2,-2],[1,-3]],[[753,8514],[0,-3],[1,1],[4,3],[3,1],[2,0],[3,-2],[0,-1],[0,-1],[-2,-3],[0,-2],[2,-3],[5,-2],[1,-1],[0,-1],[-4,-5],[-1,-2],[-1,0],[-6,1],[-5,2],[-3,0],[-2,-2],[1,-1],[5,0],[2,-2],[0,-2],[1,-2],[-1,-1],[-2,-1],[-3,0],[-3,-2],[-2,-2],[-6,-1],[-4,-3],[-2,-2],[-1,-2],[-1,-2],[-4,-1],[2,-1],[0,-1],[0,-2],[0,-1],[-3,-6],[-6,-5],[-2,0],[0,1],[-1,1],[0,1],[8,9],[0,1],[-3,0],[-3,3],[-2,-2],[-1,0],[1,2],[1,3],[0,1],[-1,1],[-2,0],[-3,0],[-2,0],[-1,-2],[0,-1],[3,1],[1,-1],[0,-1],[1,-2],[0,-2],[-1,-2],[-1,-3],[-2,0],[-5,7],[-2,10],[-3,7],[-1,2],[1,5],[4,6],[4,2],[3,3],[3,0],[2,0],[2,-1],[1,-2],[0,-1],[0,-1],[2,-2],[1,-5],[3,-4],[1,-2],[2,-2],[-2,4],[-1,4],[-1,9],[0,3],[1,0],[3,0],[0,1],[-4,3],[-1,3],[-1,1],[0,2],[2,3],[1,0],[1,1],[2,-1],[1,-1],[2,-5],[1,-2],[1,0],[1,1],[1,2],[1,1],[1,0],[3,-1],[1,1],[0,1],[0,3],[1,1],[0,1],[-1,3],[1,1],[7,-2],[2,-2],[-1,-5]],[[1230,8539],[4,-6],[0,-1],[-1,-4],[-2,-1],[0,-2],[2,-1],[1,1],[4,5],[1,2],[1,0],[5,-2],[5,-3],[1,-2],[1,-3],[-1,-8],[-4,-1],[-2,0],[-2,1],[-3,-3],[3,-2],[7,0],[3,-5],[0,-3],[-1,-6],[-4,1],[-4,4],[-8,5],[-2,0],[-1,-1],[0,-3],[0,-6],[-2,-4],[-6,2],[-3,5],[-2,8],[-8,9],[-3,2],[-3,6],[2,4],[0,3],[1,1],[3,2],[1,4],[2,-3],[3,-4],[0,3],[1,3],[3,0],[2,0],[1,3],[3,1],[2,-1]],[[1269,8538],[0,-2],[-4,0],[-4,3],[-2,2],[1,2],[3,1],[4,-3],[2,-3]],[[1259,8534],[7,-1],[5,0],[5,-9],[3,-7],[1,-5],[1,-4],[2,-5],[-1,-1],[-2,4],[-2,6],[-1,2],[-1,1],[-1,3],[-2,5],[0,2],[-1,2],[-1,0],[-1,0],[-1,-1],[0,-4],[1,-4],[5,-10],[4,-6],[0,-2],[1,-5],[-2,-2],[2,-5],[0,-1],[0,-1],[-5,-2],[-5,-9],[-4,-5],[-3,-1],[-1,1],[-1,2],[0,3],[-1,3],[2,2],[2,11],[0,4],[-3,5],[-2,4],[-1,5],[-1,15],[-1,5],[-1,4],[-2,3],[-1,4],[0,3],[0,2],[2,-2],[3,-6],[2,-3]],[[766,8545],[1,0],[1,3],[1,0],[3,-3],[2,1],[2,-4],[1,0],[1,1],[0,-1],[0,-3],[-2,-4],[-1,-1],[-2,1],[-2,2],[0,2],[-1,0],[-2,-3],[0,-1],[1,-2],[0,-1],[-2,0],[-2,0],[-2,-2],[-1,1],[0,3],[-1,0],[-1,-4],[-1,-2],[-3,-2],[0,-1],[-2,0],[-2,-1],[-2,0],[-9,4],[-2,2],[8,8],[4,4],[2,-1],[2,-1],[1,1],[0,3],[-2,3],[0,1],[5,2],[2,0],[2,-1],[1,-1],[2,-3]],[[764,8552],[-1,0],[-2,2],[-1,2],[1,1],[4,3],[2,0],[1,-1],[0,-2],[-1,-1],[-3,-4]],[[530,8558],[-2,-1],[-2,0],[-2,6],[1,0],[3,4],[6,3],[2,0],[-6,-12]],[[984,8629],[-1,0],[2,4],[3,4],[2,2],[3,2],[0,-2],[-4,-4],[-5,-6]],[[888,8643],[-1,-1],[-6,1],[1,3],[5,2],[4,-3],[-3,-2]],[[896,8629],[-3,-1],[-1,2],[2,4],[1,2],[1,1],[4,5],[4,3],[3,5],[4,8],[1,2],[1,1],[3,-2],[2,-3],[-1,-2],[-9,-10],[-1,-1],[-1,-4],[-1,-1],[-1,-1],[-1,-1],[0,-3],[-1,-1],[-2,0],[-1,-1],[-1,-1],[-2,-1]],[[385,8662],[3,-3],[1,0],[4,1],[2,-1],[1,-1],[1,-2],[0,-3],[0,-3],[0,-5],[0,-1],[2,-3],[1,-3],[0,-3],[-5,-1],[-5,-1],[-4,-2],[-1,-2],[1,-2],[-1,-1],[-1,1],[-2,2],[-3,1],[-8,2],[-10,7],[-4,1],[-4,5],[-4,7],[3,1],[2,0],[12,-1],[1,5],[2,1],[3,1],[4,3],[1,0],[2,-1],[3,1],[2,1],[1,-1]],[[969,8659],[-1,-1],[-2,0],[-2,1],[5,4],[0,-1],[0,-3]],[[933,8666],[1,-2],[5,0],[2,0],[1,-1],[-1,-1],[-2,-1],[-6,-3],[-5,-3],[-1,0],[-1,4],[-1,1],[0,2],[0,1],[1,2],[2,2],[1,0],[4,-1]],[[898,8666],[0,-2],[-1,-1],[1,-3],[-1,-5],[-1,-3],[-1,-1],[0,-1],[-1,0],[0,1],[0,2],[-2,0],[0,4],[1,1],[0,2],[0,1],[2,5],[0,1],[0,-2],[1,0],[1,3],[1,-2]],[[777,8661],[-1,-1],[2,3],[1,6],[1,-1],[1,-1],[-3,-6],[-1,0]],[[202,8666],[6,-4],[3,1],[3,-4],[2,-2],[-5,2],[-6,0],[-9,7],[-4,2],[1,4],[4,3],[1,-6],[4,-3]],[[891,8687],[-4,0],[-1,1],[-1,0],[1,3],[0,1],[2,1],[2,-1],[0,-2],[1,-3]],[[237,8849],[1,-1],[2,0],[5,0],[4,-2],[4,1],[6,4],[3,1],[4,1],[3,-1],[4,-3],[1,-1],[1,-2],[1,-3],[1,-2],[7,-3],[4,-1],[1,-1],[1,-2],[4,-1],[3,0],[2,0],[7,0],[7,-3],[-1,-5],[-2,-3],[-7,1],[-8,-1],[-3,-3],[-2,-3],[0,-4],[-2,-1],[-1,-1],[-1,2],[-2,6],[-1,2],[-1,1],[-4,1],[-3,2],[-3,0],[-1,2],[-1,3],[-1,1],[-3,3],[-3,1],[-9,4],[-3,1],[-3,-1],[-3,-2],[-3,-2],[-3,-2],[-3,0],[-4,1],[-3,2],[-1,2],[-1,3],[0,3],[1,3],[1,7],[3,1],[5,-5]],[[386,8998],[-1,0],[0,1],[3,2],[6,3],[-4,-3],[-4,-3]],[[1388,8403],[-1,-3],[-1,-3],[-1,-4],[0,-4],[0,-4],[0,-3],[2,-7],[1,-3],[0,-3],[-4,-9],[-1,-5],[0,-2]],[[1373,8338],[-1,2],[-7,1],[-2,8],[-1,6],[-2,6],[0,1],[1,4],[7,3],[0,1],[-2,1],[-1,1],[-1,6],[0,5],[0,4],[-1,7],[-1,4],[-5,9],[0,2],[2,3],[1,2],[-7,-4],[-10,-5],[-4,-3],[-1,-1],[0,-1],[1,-3],[0,-1],[-1,-2],[-1,-5],[-2,-5],[-1,-1],[-4,2],[-1,1],[-2,7],[0,2],[2,2],[2,3],[2,5],[5,14],[2,0],[6,2],[-8,2],[-2,0],[-1,2],[-1,3],[-1,3],[-3,1],[-2,2],[-2,3],[-1,2],[-1,2],[0,3],[-1,1],[-2,1],[-1,1],[0,6],[-5,2],[-1,2],[-3,4],[-1,2],[0,2],[1,4],[-1,1],[-2,0],[-16,7],[1,9],[-3,13],[-3,5],[1,2],[1,1],[1,0],[6,-4],[5,-4],[1,1],[-9,9],[-2,3],[0,3],[0,2],[0,1],[9,-1],[-8,3],[-2,0],[-2,-4],[-1,-1],[-2,1],[-2,5],[-2,3],[-4,5],[-1,3],[0,5],[0,4],[3,10],[2,2],[0,1],[-1,0],[-1,-1],[-2,-5],[-3,-7],[-2,-3],[-2,1],[-2,3],[-4,4],[-5,1],[-3,4],[-5,11],[0,5],[-1,2],[-2,1],[-2,3],[-2,14],[-3,9],[-1,5],[0,5],[-1,-4],[-1,-2],[-2,0],[2,-4],[1,-2],[-1,0],[-2,0],[3,-7],[2,-10],[2,-8],[1,-6],[1,-5],[1,-4],[2,-10],[0,-2],[0,-1],[-1,-2],[-1,-1],[-5,1],[-1,3],[-3,4],[-3,2],[-8,-1],[-1,1],[0,3],[1,7],[-1,2],[-4,10],[0,2],[6,4],[-3,1],[-2,-2],[-1,1],[-2,6],[-1,2],[0,1],[0,-6],[1,-3],[0,-2],[0,-2],[-1,-2],[-1,-1],[-1,0],[-2,1],[-2,2],[-2,1],[-1,1],[-1,3],[-2,2],[-7,2],[-4,3],[-1,-1],[2,-3],[0,-2],[-1,0],[-2,-3],[0,-1],[2,1],[3,0],[4,-2],[3,-2],[1,-1],[1,-2],[0,-1],[4,-2],[0,-1],[-2,-4],[4,0],[3,-1],[3,-5],[1,-3],[1,-4],[-1,-2],[-1,0],[-10,-2],[-3,-4],[-1,0],[-2,1],[-5,4],[-6,3],[-13,11],[0,3],[-1,1],[-2,1],[-3,2],[-3,5],[-2,3],[0,3],[-2,3],[-6,6],[-3,2],[-3,1],[-2,1],[-1,1],[1,1],[0,1],[-5,1],[-5,3],[-13,8],[-6,5],[-4,2],[-2,1],[0,2],[1,1],[2,1],[2,1],[3,5],[0,2],[-2,4],[0,3],[0,2],[0,2],[0,1],[2,1],[0,1],[1,-1],[4,-4],[0,-2],[0,-6],[1,-8],[0,1],[0,2],[1,5],[0,2],[1,2],[1,1],[3,0],[2,0],[-7,4],[-4,6],[-1,0],[-3,1],[-2,-3],[-7,-8],[-2,-1],[-8,-5],[-6,-1],[-6,1],[-5,1],[-14,7],[-2,2],[3,5],[0,1],[-1,4],[-1,2],[-1,0],[0,-1],[0,-3],[-1,-1],[-2,-2],[-4,-1],[-12,4],[-13,3],[-11,0],[-15,-2],[-9,-3],[-5,0],[-4,1],[-1,1],[3,1],[-1,2],[-2,3],[-4,3],[-6,1],[-3,1],[-1,1],[-2,1],[-3,2],[-1,2],[1,7],[1,4],[1,3],[3,5],[-1,0],[-4,-4],[-3,-3],[-4,-5],[-1,-2],[-3,-2],[-3,0],[-6,3],[-4,2],[-3,0],[-2,0],[3,3],[1,2],[2,4],[0,1],[-13,1],[0,2],[0,1],[-1,1],[-2,1],[-2,-1],[-5,-2],[-1,2],[0,1],[2,0],[2,3],[-3,2],[-2,2],[-1,1],[0,6],[1,3],[8,4],[-2,1],[-6,0],[-4,-3],[-4,-4],[-3,-2],[-1,1],[-2,0],[-3,0],[-1,-1],[-1,-2],[-1,-1],[-1,-1],[-1,1],[-1,1],[-3,2],[-1,1],[-1,-1],[-1,-3],[-1,-1],[-4,-1],[-2,0],[-3,3],[0,1],[1,3],[6,12],[-1,0],[-2,-2],[-4,-5],[-2,-1],[-3,0],[-1,0],[-2,0],[-2,-1],[-1,-2],[-1,-1],[1,0],[3,1],[2,1],[0,-1],[-2,-5],[-2,-5],[-1,-1],[-2,0],[-3,-1],[0,-1],[5,-4],[1,-1],[2,-1],[1,-1],[-1,-4],[-1,-2],[-1,0],[-3,0],[-1,-1],[-3,-2],[-1,-2],[3,1],[3,1],[4,0],[3,1],[1,2],[2,-1],[2,-2],[1,-2],[-1,-2],[-1,-2],[-3,0],[-1,-2],[-1,-1],[0,-3],[0,-3],[0,-6],[-1,-1],[-1,0],[-1,-1],[-3,-8],[-1,-1],[-1,1],[-1,0],[-1,-1],[-2,-1],[-3,0],[-3,0],[-4,2],[-2,1],[-1,2],[-4,-2],[-1,0],[-3,6],[0,-1],[-1,-5],[-1,-2],[-2,-4],[-2,-8],[0,1],[-2,7],[-1,1],[-2,-4],[0,-1],[0,-5],[-5,2],[-1,0],[1,-4],[0,-1],[-6,-7],[-2,0],[-1,1],[-1,0],[-4,-3],[-1,0],[-2,2],[-1,0],[0,-2],[0,-3],[-2,-3],[-4,-5],[-2,-2],[-1,-4],[-3,2],[-4,1],[1,-2],[0,-1],[-2,-1],[-2,0],[-2,1],[-3,-1],[-4,-2],[-3,0],[-5,4],[-1,0],[0,2],[1,3],[1,2],[1,2],[4,3],[5,1],[3,2],[4,4],[2,3],[4,8],[-1,1],[-9,-8],[-1,0],[-2,0],[-7,2],[-1,2],[-1,3],[2,8],[1,4],[3,6],[5,6],[1,5],[3,11],[0,5],[-1,6],[0,3],[1,1],[10,6],[5,4],[9,7],[3,0],[1,-3],[3,-1],[2,-2],[3,1],[4,1],[6,0],[13,-5],[3,0],[0,1],[-2,3],[-9,1],[-3,2],[-11,7],[-2,3],[1,1],[2,2],[1,1],[1,1],[1,3],[3,3],[3,3],[8,5],[-3,0],[-5,-1],[-2,-1],[-4,-3],[-1,-2],[-2,-5],[-1,-1],[-4,0],[-10,-1],[-2,3],[-2,0],[-9,-6],[-3,-3],[-3,-4],[-3,-2],[-5,-2],[-4,-2],[-4,-4],[-1,-3],[0,-1],[1,-5],[-1,-1],[-3,0],[-3,-3],[-8,-9],[-1,-3],[0,-1],[1,-3],[0,-1],[-3,-3],[-4,-4],[-3,-2],[-2,0],[-2,1],[-4,3],[-3,0],[0,-1],[4,-2],[4,-4],[2,-3],[1,-2],[0,-3],[-1,-2],[-2,-5],[-3,-1],[-7,-1],[-2,-2],[-1,0],[5,-2],[0,-1],[0,-4],[-2,-1],[-4,-2],[-3,-1],[-1,1],[1,2],[0,1],[-2,1],[-1,-1],[-5,-5],[-1,0],[2,-1],[0,-1],[-3,-3],[-1,-3],[-2,-2],[-7,-6],[0,-2],[-2,-5],[-1,-5],[2,-2],[6,-2],[3,-1],[4,-2],[6,-4],[3,-3],[0,-2],[0,-1],[-1,-2],[-2,-4],[-5,-6],[-2,-1],[-4,-2],[-1,-1],[-4,-5],[-2,-3],[1,-3],[-1,-1],[-6,-4],[0,-1],[2,0],[0,-3],[-1,-4],[-1,-1],[-3,0],[-5,-2],[0,-3],[-12,-3],[-2,-5],[-2,-2],[-4,-5],[-3,-1],[-3,-1],[-2,-2],[0,-2],[-1,-1],[-3,-3],[-1,-3],[-1,-1],[-5,-1],[-1,-1],[-1,-4],[-1,0],[-2,1],[-2,-1],[-6,-5],[-1,-2],[0,-1],[1,-1],[2,-3],[-1,-2],[-2,-6],[0,-1],[-3,-1],[-1,-4],[-2,1],[-2,-1],[-1,-2],[-2,-1],[-1,0],[-2,-2],[-2,-3],[-2,-2],[-2,-1],[-2,0],[-1,0],[-2,0],[-1,-1],[-2,-2],[-1,-5],[-1,-2],[-1,-1],[-2,1],[-3,1],[-2,-1],[-5,-3],[-1,-2],[3,0],[1,-1],[0,-1],[-1,0],[-3,0],[-1,-1],[-2,-1],[-5,-2],[-1,-1],[-4,-5],[0,-2],[2,1],[2,-1],[2,-2],[0,-1],[1,-3],[-4,-5],[-1,-2],[-1,-1],[-1,6],[0,1],[-1,0],[-1,-2],[-3,-6],[-2,-3],[-18,-9],[-2,-2],[-1,-3],[0,-3],[-2,-3],[-1,-1],[0,1],[0,8],[-1,2],[-1,1],[-1,0],[-1,0],[-2,-2],[-1,-1],[-1,0],[-3,-1],[-5,-6],[-4,-2],[-1,-1],[-1,-3],[-1,-1],[-2,0],[-2,1],[-1,-1],[-2,-3],[-1,0],[-3,1],[-2,-1],[-2,-3],[-2,-2],[-2,-1],[-6,-1],[-2,1],[-1,1],[0,3],[1,3],[1,2],[1,1],[2,0],[3,-1],[0,1],[-1,1],[-3,2],[-3,1],[-2,-1],[-2,-1],[-1,-2],[-1,-2],[-1,-6],[-1,-2],[-6,-11],[-3,-3],[-3,0],[-1,-1],[-2,-3],[-1,-1],[-2,0],[-1,0],[-1,1],[0,1],[1,1],[0,2],[-2,4],[-1,2],[-3,0],[0,-2],[1,-8],[0,-2],[-2,-2],[-4,-3],[-1,0],[-4,5],[-3,1],[0,-1],[0,-4],[0,-3],[-3,-3],[-2,-2],[-1,0],[0,3],[1,4],[0,3],[0,3],[0,2],[0,2],[5,4],[2,1],[1,-2],[1,0],[2,1],[1,1],[0,2],[2,3],[4,3],[4,6],[4,8],[6,7],[6,6],[6,5],[14,7],[1,-1],[-1,-2],[0,-1],[2,0],[5,1],[2,1],[0,-1],[-1,-2],[-3,-2],[1,-1],[4,-7],[1,-1],[1,0],[1,1],[-1,5],[2,1],[3,0],[2,-1],[1,-1],[1,-1],[3,-1],[1,0],[1,2],[-1,2],[-5,4],[-1,1],[0,3],[0,3],[2,4],[2,6],[2,4],[4,5],[3,2],[7,8],[14,7],[4,5],[5,5],[2,1],[0,-2],[0,-2],[3,-1],[2,0],[1,0],[1,2],[-1,3],[0,4],[0,3],[1,2],[2,4],[3,5],[4,6],[3,3],[2,1],[3,2],[4,6],[1,1],[3,1],[1,0],[1,-2],[1,0],[3,-1],[2,1],[0,1],[-2,0],[-1,1],[-1,4],[-2,2],[-1,2],[1,4],[2,8],[0,9],[1,6],[4,1],[6,2],[-4,2],[-1,0],[-3,1],[-1,6],[0,4],[2,4],[6,8],[8,6],[-1,0],[-1,2],[3,11],[3,10],[-4,-9],[-5,-6],[-15,-7],[-10,-7],[-4,-1],[-3,1],[-3,6],[-1,3],[-2,3],[1,6],[1,3],[3,1],[4,-2],[3,0],[-4,3],[-6,3],[-2,-1],[-2,-5],[-3,-3],[-2,1],[-1,2],[1,-5],[-2,-6],[-1,-4],[3,-12],[-1,-4],[-4,-2],[-4,4],[-8,14],[-2,4],[-6,7],[-2,-1],[-3,-3],[-2,-1],[-7,5],[-3,3],[-3,5],[-4,-2],[-4,-3],[-4,-5],[-3,0],[-8,-4],[-1,0],[-1,-3],[-1,-1],[-1,-4],[-11,-3],[-11,2],[4,2],[4,2],[4,4],[-2,6],[0,3],[0,4],[4,5],[-4,0],[-3,-2],[-3,5],[-1,7],[3,5],[2,4],[1,5],[0,4],[-3,7],[-6,16],[-3,11],[-5,6],[4,10],[4,9],[5,4],[0,1],[-3,0],[-2,-1],[-2,-3],[-1,-2],[-6,-12],[-4,-5],[-2,-2],[4,-2],[0,-2],[1,-4],[-1,-5],[-1,-3],[-4,0],[-4,-4],[-10,-4],[-13,-3],[-6,1],[-7,5],[0,3],[1,2],[-10,9],[-5,9],[-4,0],[-3,3],[-4,3],[0,3],[1,3],[-3,1],[-3,0],[-3,1],[9,11],[3,8],[3,1],[3,-1],[5,-3],[4,-1],[2,-2],[1,-3],[-2,-4],[-1,-3],[2,1],[5,5],[3,4],[2,-1],[1,0],[2,-5],[3,-4],[5,4],[3,5],[-2,3],[-3,1],[-8,2],[2,1],[5,0],[2,2],[-2,2],[-3,2],[-6,-6],[-13,0],[-9,3],[-8,0],[-2,0],[-1,2],[5,5],[3,2],[0,2],[-2,0],[-4,-1],[-1,2],[0,3],[-1,0],[-1,-2],[-2,1],[-2,2],[1,1],[2,3],[-1,0],[-2,0],[-1,-3],[0,-3],[0,-4],[-3,0],[-2,0],[-2,4],[-2,8],[-4,2],[-2,4],[3,5],[-1,2],[-3,1],[-4,-3],[-1,3],[-1,2],[0,4],[1,0],[1,-1],[7,2],[1,1],[-6,3],[-1,4],[2,1],[4,1],[7,1],[-3,4],[-1,2],[0,3],[1,5],[7,11],[7,10],[2,2],[4,2],[3,-1],[3,-2],[0,1],[-1,0],[-1,4],[4,2],[3,4],[0,2],[-3,-2],[-3,-3],[0,3],[-1,7],[1,7],[1,3],[3,3],[7,1],[1,-1],[0,2],[-4,4],[2,3],[1,2],[8,3],[5,-1],[6,-3],[3,-4],[0,-2],[-1,-1],[-2,-2],[-1,-1],[1,-1],[2,3],[4,3],[2,-2],[2,-2],[2,0],[6,2],[4,2],[4,5],[5,4],[7,11],[2,4],[3,1],[2,-1],[1,-3],[3,-1],[13,0],[6,2],[5,4],[5,6],[3,4],[1,5],[-2,6],[-2,6],[-2,13],[-6,8],[-5,2],[-3,0],[2,5],[6,0],[4,1],[4,2],[1,2],[1,4],[0,5],[-1,2],[-2,2],[-3,4],[-2,1],[-1,0],[-8,-7],[-5,0],[-3,1],[-3,-4],[-9,-4],[-4,-4],[-9,-9],[-2,-4],[-2,0],[-2,8],[-9,8],[-3,-3],[1,-2],[2,-2],[4,-1],[-2,-2],[-1,-3],[-3,2],[-6,5],[-7,2],[-16,0],[-11,-5],[-1,1],[-1,1],[-2,-1],[0,-2],[-2,-1],[-2,-1],[-4,1],[-9,3],[-19,4],[-5,2],[-5,6],[1,4],[2,2],[-1,5],[-3,2],[-8,8],[-3,4],[1,0],[1,-1],[3,-1],[6,2],[2,5],[5,1],[4,0],[-1,1],[-1,1],[-11,3],[-2,-1],[-20,5],[-16,8],[-2,2],[-1,4],[2,3],[2,2],[0,-2],[1,-2],[9,4],[5,6],[9,1],[2,2],[3,3],[4,5],[6,3],[4,3],[5,1],[4,-2],[2,-1],[8,0],[2,1],[1,1],[1,1],[-8,4],[1,3],[1,2],[9,5],[7,2],[4,0],[11,6],[6,2],[11,1],[9,1],[2,-3],[-4,1],[-3,-1],[2,0],[2,-2],[-1,-2],[-3,-7],[0,-5],[-2,-2],[-2,-2],[10,-8],[14,0],[8,1],[5,-2],[4,-1],[10,1],[8,-1],[3,0],[7,12],[3,2],[3,-2],[4,-2],[3,1],[2,-3],[-1,6],[-2,3],[-11,4],[-8,-2],[-3,2],[1,5],[-8,11],[-4,3],[-4,0],[-2,4],[-2,5],[4,2],[3,1],[3,-2],[3,-7],[3,-1],[0,-6],[3,-6],[9,-6],[7,2],[5,0],[3,-1],[8,-6],[3,0],[12,3],[0,5],[-1,3],[-3,3],[-7,-1],[-6,4],[-6,-1],[-9,-6],[-5,2],[-3,3],[-5,4],[-1,6],[4,6],[3,4],[-2,2],[-7,2],[-12,-2],[0,2],[0,3],[-5,-5],[-5,1],[-7,-1],[-15,5],[-5,5],[-2,5],[-4,11],[-5,8],[-35,25],[-16,6],[-8,8],[-5,1],[-4,1],[-6,2],[4,3],[3,1],[-3,-3],[2,-1],[3,2],[2,2],[3,9],[3,12],[-1,5],[19,-1],[13,1],[5,1],[16,2],[4,2],[8,4],[9,8],[8,10],[1,3],[1,-1],[1,0],[1,4],[1,9],[4,9],[16,19],[8,8],[3,3],[2,3],[2,-3],[1,0],[1,-1],[-2,-1],[-3,-2],[-3,-2],[-1,-1],[2,0],[6,2],[4,2],[18,4],[10,7],[0,1],[14,9],[2,-1],[3,-1],[-4,-5],[2,-2],[-2,-6],[5,0],[1,-3],[1,2],[-1,4],[1,4],[1,2],[3,-1],[9,3],[-10,0],[-6,6],[-4,0],[11,9],[11,5],[2,0],[1,-1],[0,-1],[-2,-1],[-2,-2],[1,-2],[1,0],[5,1],[2,2],[11,0],[3,1],[1,1],[13,0],[3,1],[8,5],[8,6],[3,3],[7,8],[5,5],[9,5],[2,-1],[-3,-1],[-2,-2],[3,-3],[18,-6],[4,0],[2,-4],[-1,-3],[-5,-4],[-9,-4],[2,-1],[2,-4],[3,0],[5,1],[3,2],[8,7],[2,4],[2,1],[6,-1],[3,-2],[4,-3],[-1,-4],[-2,-2],[6,-2],[5,-1],[6,-2],[7,4],[6,1],[6,0],[7,2],[13,-3],[3,1],[5,-1],[5,-2],[2,-2],[-5,-4],[-1,-5],[2,-2],[3,0],[1,-3],[2,0],[11,0],[-1,-1],[0,-2],[-4,-3],[20,-2],[3,2],[4,0],[9,3],[3,-1],[4,-3],[4,0],[3,0],[8,4],[9,0],[4,-1],[4,1],[11,-5],[5,0],[5,-6],[3,0],[4,2],[3,0],[3,-2],[4,-1],[3,-3],[2,-2],[18,-2],[9,1],[13,-1],[6,-1],[6,0],[11,-6],[6,-1],[1,-2],[16,-1],[5,3],[10,1],[9,3],[5,0],[6,-1],[2,0],[2,1],[14,-4],[8,-6],[3,-4],[17,-6],[5,-3],[3,-3],[2,-1],[1,1],[6,0],[2,0]],[[3296,5915],[-1,0],[1,1],[0,1],[0,-1],[0,-1]],[[3299,5932],[0,-1],[-1,1],[1,0],[0,1],[-1,0],[0,1],[1,0],[0,1],[1,1],[0,-1],[-1,-1],[0,-2]],[[3300,5942],[0,-1],[-2,4],[0,4],[1,3],[1,1],[1,0],[1,-3],[-1,-6],[-1,-2]],[[3305,5695],[-1,-2],[-1,6],[1,2],[3,4],[1,1],[0,-1],[0,-1],[1,-2],[0,-3],[-1,-3],[-3,-1]],[[3310,5710],[-3,-2],[0,2],[1,2],[2,1],[0,1],[1,1],[1,0],[1,-1],[-2,-2],[-1,-2]],[[3188,5812],[-1,-1],[-3,1],[-1,2],[0,2],[3,0],[2,-3],[0,-1]],[[3226,5825],[1,-8],[0,-1],[-3,-5],[-2,0],[-2,0],[-1,1],[-2,3],[-1,-1],[-4,1],[-1,1],[1,4],[3,2],[1,0],[1,-2],[2,-2],[2,-1],[1,4],[3,6],[1,-2]],[[3019,5867],[-1,-3],[-2,-3],[-2,-2],[-11,-5],[-1,-2],[-1,-2],[0,-5],[0,-4],[3,-13],[1,-3],[5,-7],[-1,-1],[-2,0],[1,-9],[3,-6],[0,-4],[-2,-13],[-4,-7],[-2,-9],[-2,-3],[-4,-17],[3,-10],[0,-5],[3,-7],[2,-3],[1,-2],[0,-5],[1,-7],[1,-4],[2,-1],[3,0],[6,4],[2,2],[1,4],[3,7],[0,10],[1,11],[-1,7],[-3,11],[-2,7],[-3,7],[-2,12],[-1,3],[-1,6],[-1,9],[3,3],[-1,7],[6,2],[12,12],[8,3],[9,7],[2,3],[2,5],[1,1],[4,-5],[3,2],[1,4],[-2,7],[-2,0],[-8,-3],[-1,4],[0,2],[-2,9],[1,7],[2,6],[2,2],[3,2],[3,-3],[1,-4],[1,-3],[1,-9],[1,-10],[1,-6],[2,-5],[2,0],[1,1],[9,1],[5,-3],[6,-2],[6,-7],[6,-8],[1,-7],[1,-6],[1,-4],[-1,-4],[1,-7],[1,-6],[3,-5],[7,-1],[8,3],[13,3],[4,2],[20,1],[4,-3],[1,-3],[0,-3],[6,-12],[6,-2],[5,-4],[4,-2],[6,-3],[2,0],[3,1],[2,0],[19,21],[10,0],[1,1],[1,2],[-3,3],[-8,1],[-3,-2],[-1,5],[2,0],[9,2],[11,-1],[8,4],[5,0],[2,0],[7,2],[13,-3],[10,2],[-1,-3],[-4,-2],[-5,-1],[-4,-5],[-9,1],[-6,-2],[2,-1],[0,-5],[1,-1],[1,0],[2,-4],[0,-3],[1,-5],[-1,-5],[-1,-3],[2,1],[2,3],[0,2],[0,3],[1,-1],[1,-1],[3,-15],[3,-8],[0,1],[1,0],[0,1],[1,4],[1,-2],[1,-1],[0,3],[0,4],[0,2],[1,0],[1,-1],[2,-1],[3,-5],[2,-5],[0,-3],[1,-1],[1,-2],[1,-2],[0,4],[-1,3],[0,3],[4,0],[1,5],[2,-3],[6,-12],[2,-2],[6,-3],[4,-6],[2,-5],[-1,-6],[-4,-2],[-1,-4],[-1,-3],[0,-4],[-1,-4],[-1,-1],[0,-6],[-2,-7],[-2,-7],[-10,0],[3,-3],[2,-2],[4,-6],[3,5],[4,0],[5,5],[2,1],[9,-3],[2,4],[2,1],[4,-1],[5,-4]],[[3205,6244],[-2,0],[1,2],[2,0],[1,0],[-2,-2]],[[3211,6247],[-1,0],[0,1],[0,2],[3,0],[-2,-3]],[[3214,6263],[0,-2],[-2,2],[-1,0],[-1,1],[3,0],[1,-1]],[[3201,6209],[2,-3],[3,0],[-3,-2],[-6,-1],[0,4],[4,2]],[[3204,6241],[-2,-2],[-1,1],[-1,0],[1,2],[3,-1]],[[3198,6240],[-2,-1],[-3,3],[3,1],[1,-1],[1,-2]],[[7961,5684],[-1,0],[-1,1],[3,4],[0,-3],[0,-1],[-1,-1]],[[7890,5782],[0,-3],[0,-6],[-1,-7],[0,-3],[0,-2],[-2,13],[-3,5],[0,2],[1,0],[3,3],[1,0],[1,-2]],[[7976,5783],[-2,-4],[0,3],[2,2],[0,1],[1,0],[-1,-2]],[[7972,6379],[-1,0],[-2,4],[1,3],[3,-2],[0,-1],[0,-1],[0,-2],[-1,-1]],[[7968,6383],[-1,-1],[-1,2],[-1,2],[1,3],[1,-4],[1,-2]],[[7986,6389],[-2,-1],[-1,0],[2,3],[1,3],[1,1],[0,-3],[-1,-3]],[[7988,6406],[-4,-7],[-1,0],[1,8],[1,2],[2,-3],[1,0]],[[7998,6423],[-1,-1],[-3,0],[-3,-5],[-2,-2],[-3,-2],[-3,-3],[-1,-5],[0,-4],[-1,-4],[-5,-7],[-1,1],[-1,2],[-2,0],[-1,-1],[-1,0],[-2,-2],[-2,1],[-1,2],[-1,0],[-1,0],[-1,-2],[2,-9],[1,-4],[-6,-12],[1,-8],[-2,-6],[-3,-4],[-7,-13],[-3,0],[-2,-3],[-5,-20],[0,-7],[0,-5],[0,-5],[-2,-9],[-2,-5],[-1,-5],[3,-11],[1,-1],[1,-6],[1,-4],[2,-4],[4,-11],[3,-3],[2,-3],[5,-9],[3,-7],[-2,-4],[1,-9],[-3,3],[0,-1],[4,-5],[6,-17],[5,-8],[6,-10],[1,-9],[5,-6],[6,-9],[-1,-2],[2,-2],[4,-5],[2,-4],[1,-5],[1,-1],[1,1],[2,1],[1,-1],[2,-5],[2,-4],[1,-4],[1,0],[1,0],[0,-4],[0,-2],[3,-7],[2,-6],[3,-11],[3,-5],[2,-4],[2,-2],[2,-12],[1,-10],[3,-12],[1,-5],[0,-9],[2,-10],[1,-6],[1,-7],[0,-3],[1,-3],[1,-11],[0,-5],[-1,5],[0,-15],[1,-8],[0,-10],[1,-4],[1,-11],[2,-4],[0,-14],[0,-6],[-1,4],[-2,4],[-1,-2],[-2,-4],[2,-14],[-2,1],[0,-20],[1,-4],[0,-3],[0,-2],[-1,3],[0,3],[0,-1],[0,-2],[-1,-3],[-1,-4],[1,-4],[0,-3],[0,-3],[-1,-4],[-3,0],[-1,-8],[0,-7],[-5,-1],[-3,-7],[-4,-3],[-4,-6],[-4,-6],[-3,-1],[-2,-2],[-3,-10],[-4,-1],[-8,-8],[-3,-4],[-2,-2],[-3,-3],[-1,1],[-1,3],[-3,1],[-2,4],[0,4],[0,2],[-1,-3],[-1,-10],[0,-2],[-1,-1],[-3,3],[-2,6],[-4,-4],[2,-1],[1,0],[1,-1],[1,-4],[0,-2],[0,-2],[-3,-1],[-5,1],[3,-4],[4,-2],[1,-3],[0,-2],[-2,-3],[-1,-4],[0,-2],[0,-3],[-2,-2],[-1,0],[-3,4],[-9,17],[2,-5],[9,-19],[1,-6],[1,-4],[-1,-2],[-2,-3],[-3,0],[-5,7],[-7,17],[-3,2],[8,-19],[1,-5],[1,-5],[0,-3],[-1,-3],[-18,-17],[-3,-8],[-2,-9],[-4,-5],[-2,-5],[-6,-3],[-3,1],[3,9],[-2,3],[0,22],[1,24],[1,12],[3,3],[2,2],[1,3],[-1,3],[-1,4],[-2,2],[-3,0],[-2,5],[-1,0],[-2,-1],[-2,2],[0,3],[-3,4],[-2,4]],[[7929,6229],[-2,2],[-2,0]],[[9718,4021],[-1,-3],[-1,0],[-2,2],[0,3],[3,0],[1,-2]],[[9707,4058],[-1,-6],[-3,2],[-2,4],[-1,4],[0,8],[2,1],[1,-1],[0,-7],[4,-5]],[[9703,4093],[-2,-3],[-1,0],[-7,7],[0,2],[0,7],[1,4],[2,1],[1,0],[1,-6],[3,-2],[-2,-2],[3,-4],[1,-4]],[[9678,4173],[3,-8],[1,0],[-2,-6],[-3,-1],[-4,2],[1,2],[-1,2],[-1,0],[-1,-1],[-1,1],[1,3],[2,6],[1,0],[1,0],[3,0]],[[9678,4217],[1,0],[-1,-3],[-3,3],[-3,-1],[-1,0],[-1,2],[-1,4],[0,4],[2,2],[1,-3],[1,-1],[1,-1],[2,-4],[2,-2]],[[9674,4243],[-3,-1],[-5,2],[-1,3],[-1,2],[1,2],[2,1],[3,6],[1,-3],[1,-6],[1,-2],[1,-2],[0,-2]],[[9649,4257],[2,-2],[1,-2],[4,-6],[1,0],[1,-3],[1,-1],[1,-4],[1,-3],[-2,-4],[-4,2],[-2,-5],[-3,1],[0,3],[-1,6],[-1,9],[0,5],[-1,3],[-2,-2],[-1,-1],[-2,5],[1,8],[0,3],[2,0],[2,-2],[2,-10]],[[9644,4278],[0,-1],[-3,3],[0,4],[3,-1],[0,-5]],[[9672,4264],[-1,0],[0,3],[-2,14],[1,12],[1,-2],[2,-23],[0,-3],[-1,-1]],[[9663,4295],[-2,-3],[-3,0],[-1,2],[4,8],[5,2],[-3,-9]],[[9671,4301],[-1,-4],[-1,4],[0,18],[0,1],[0,1],[2,-13],[0,-7]],[[9631,4330],[2,-19],[2,0],[1,1],[1,4],[1,7],[1,1],[1,0],[-1,-3],[1,-5],[1,-3],[1,-1],[1,-15],[1,-3],[-1,-2],[-2,-6],[-5,1],[-3,-4],[-2,0],[0,4],[-1,3],[-2,6],[0,12],[-3,20],[0,6],[1,6],[1,1],[2,-6],[2,-5]],[[9654,4362],[-1,-3],[-3,1],[-1,1],[0,5],[1,2],[2,1],[3,-2],[-1,-5]],[[9652,4383],[-1,-1],[-1,1],[-1,7],[0,2],[2,2],[2,-4],[0,-2],[0,-2],[0,-1],[-1,-1],[0,-1]],[[54,4359],[-1,0],[-2,0],[-1,4],[1,1],[1,-1],[1,-2],[1,-1],[0,-1]],[[107,4416],[-1,-1],[0,3],[0,3],[1,1],[1,-2],[-1,-4]],[[237,4375],[-7,0],[-4,2],[-1,0],[-4,6],[0,3],[2,2],[3,1],[7,-5],[1,-3],[2,-1],[1,-1],[0,-3],[0,-1]],[[213,4408],[3,-5],[1,-7],[-1,-7],[-3,1],[-4,-1],[-2,0],[-3,9],[-2,4],[-1,3],[3,0],[4,2],[5,1]],[[6493,5912],[1,-1],[3,2],[8,0],[9,-6],[-2,-2],[-1,-2],[-4,-2],[-4,-5],[-11,-3],[-4,2],[-3,4],[-5,7],[2,4],[1,1],[1,2],[2,3],[3,0],[4,-4]],[[6187,5973],[-2,-2],[1,5],[2,1],[-1,-4]],[[6188,5989],[0,-2],[-1,1],[-2,3],[2,3],[1,-3],[0,-2]],[[6182,6065],[0,-1],[-1,2],[1,5],[1,2],[0,-4],[0,-2],[-1,-2]],[[6474,6143],[-14,-11],[-4,-4],[-3,-6],[-3,-7],[-1,-12],[1,-11],[0,-6],[-4,-4],[-3,-3],[-4,-5],[-2,-1],[-2,-3],[-2,-3],[-8,-6],[-9,-5],[-13,-6],[-5,-6],[-5,-5],[-7,-1],[-10,-6],[-6,-5],[-7,-8],[-1,-3],[-1,-5],[-3,-5],[-4,-9],[-3,-4],[-2,0],[-4,-2],[-5,-1],[-8,3],[-2,-2],[-1,-3],[-6,-6],[-7,-11],[-4,-3],[-8,-4],[-5,-5],[-3,-1],[-5,-1],[-8,0],[-8,-2],[-7,-3],[-4,-6],[-4,-10],[-6,-4],[-2,-3],[-2,-7],[-4,-2],[-3,-1],[-4,3],[-7,-8],[-3,-2],[-4,0],[-3,-2],[-2,0],[-3,4],[-6,4],[-4,-3],[0,8],[-7,25],[2,21],[0,3],[-2,10],[-4,9],[0,11],[-1,8],[-1,8],[0,2],[0,2],[-2,13],[0,2],[-1,3],[1,2],[0,2],[-1,4],[-1,7],[-6,6],[1,6],[2,-2],[1,-2],[0,4],[0,2],[-2,16],[3,22],[-1,20]],[[6051,2480],[-1,-1],[-6,1],[0,2],[1,3],[1,2],[3,-1],[2,-3],[1,-1],[-1,-2]],[[5913,3637],[-1,-13],[-4,-21],[-1,-9],[-4,-34],[-4,-18],[-3,-7],[-7,-12],[-2,-3],[-2,-1],[-3,-2],[-12,-25],[-5,-13],[-4,-17],[-4,-10],[-6,-21],[-5,-16],[-5,-15],[-9,-20],[-4,-6],[-3,-3],[-7,-12],[-9,-19],[-8,-16],[-11,-19],[-7,-9],[-10,-16],[-2,-2],[-11,-16],[-8,-9],[-13,-11],[-5,-3],[-13,3],[-5,-1],[-4,-7],[0,-9],[-2,-2],[-3,1],[-8,4],[-5,-1],[-3,-5],[-2,-6],[-6,-1],[-12,7],[-13,4],[-3,0],[-7,-5],[-2,0],[-10,1],[-5,3],[-5,0],[-4,-3],[-5,-1],[-12,-17],[-7,0],[-6,-2],[-2,0],[-6,2],[-2,0],[-2,-1],[-3,-3],[-7,-1],[-3,-3],[-11,-16],[-3,1],[-2,1],[-6,0],[-7,9],[-2,-1],[0,3],[0,4],[-1,3],[-1,2],[-3,-1],[-1,4],[-4,1],[-2,-1],[-1,-1],[-1,4],[1,3],[-1,4],[0,4],[-2,2],[-1,0],[-3,0],[-2,0],[-1,-2],[-1,-3],[0,-11],[-1,3],[-2,7],[0,6],[0,8],[3,3],[0,5],[-1,5],[-3,11],[-1,6],[-3,3],[-2,9],[-3,3],[-1,6],[-2,5],[-1,8],[2,4],[1,3],[2,-4],[3,2],[3,5],[2,9],[1,13],[-1,9],[-3,21],[-1,6],[-6,15],[-8,21],[-9,33],[-4,20],[-7,40],[-6,23],[-7,21],[-1,1]],[[5815,3905],[0,1],[8,2],[7,-2],[8,-6],[8,-2],[7,1],[5,1],[5,-1],[3,-2],[3,-4]],[[5844,4283],[-4,0],[-7,0],[-8,0],[-6,-3],[-6,-5],[-7,-7],[-2,-3],[-1,-2],[-1,-3],[-1,-6],[0,-9],[-1,-7],[-2,-6],[-10,-8],[-6,-6],[-7,-7],[-5,-10],[-3,-11],[-5,-15],[-6,-12],[-6,-14],[-7,-4],[-5,1],[-7,5],[-5,1],[-4,-3],[-4,1],[-4,5],[-2,2],[-3,-1],[-3,0],[-5,3]]],"transform":{"scale":[0.036003600360036005,0.01736158967459246],"translate":[-180,-89.99892578124998]}} \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/data/map/countries_formatted.topojson b/framework/src/onos/web/gui/src/main/webapp/data/map/countries_formatted.topojson
new file mode 100644
index 00000000..6afdb129
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/data/map/countries_formatted.topojson
@@ -0,0 +1,347863 @@
+{
+ "type": "Topology",
+ "objects": {
+ "countries": {
+ "type": "GeometryCollection",
+ "geometries": [
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Netherlands",
+ "sov_a3": "NL1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Country",
+ "admin": "Aruba",
+ "adm0_a3": "ABW",
+ "geou_dif": 0,
+ "geounit": "Aruba",
+ "gu_a3": "ABW",
+ "su_dif": 0,
+ "subunit": "Aruba",
+ "su_a3": "ABW",
+ "brk_diff": 0,
+ "name": "Aruba",
+ "name_long": "Aruba",
+ "brk_a3": "ABW",
+ "brk_name": "Aruba",
+ "brk_group": null,
+ "abbrev": "Aruba",
+ "postal": "AW",
+ "formal_en": "Aruba",
+ "formal_fr": null,
+ "note_adm0": "Neth.",
+ "note_brk": null,
+ "name_sort": "Aruba",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 2,
+ "mapcolor9": 2,
+ "mapcolor13": 9,
+ "pop_est": 103065,
+ "gdp_md_est": 2258,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "AW",
+ "iso_a3": "ABW",
+ "iso_n3": "533",
+ "un_a3": "533",
+ "wb_a2": "AW",
+ "wb_a3": "ABW",
+ "woe_id": -99,
+ "adm0_a3_is": "ABW",
+ "adm0_a3_us": "ABW",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": 4,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ 0
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Afghanistan",
+ "sov_a3": "AFG",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Afghanistan",
+ "adm0_a3": "AFG",
+ "geou_dif": 0,
+ "geounit": "Afghanistan",
+ "gu_a3": "AFG",
+ "su_dif": 0,
+ "subunit": "Afghanistan",
+ "su_a3": "AFG",
+ "brk_diff": 0,
+ "name": "Afghanistan",
+ "name_long": "Afghanistan",
+ "brk_a3": "AFG",
+ "brk_name": "Afghanistan",
+ "brk_group": null,
+ "abbrev": "Afg.",
+ "postal": "AF",
+ "formal_en": "Islamic State of Afghanistan",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Afghanistan",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 6,
+ "mapcolor9": 8,
+ "mapcolor13": 7,
+ "pop_est": 28400000,
+ "gdp_md_est": 22270,
+ "pop_year": -99,
+ "lastcensus": 1979,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "AF",
+ "iso_a3": "AFG",
+ "iso_n3": "004",
+ "un_a3": "004",
+ "wb_a2": "AF",
+ "wb_a3": "AFG",
+ "woe_id": -99,
+ "adm0_a3_is": "AFG",
+ "adm0_a3_us": "AFG",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Southern Asia",
+ "region_wb": "South Asia",
+ "name_len": 11,
+ "long_len": 11,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Angola",
+ "sov_a3": "AGO",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Angola",
+ "adm0_a3": "AGO",
+ "geou_dif": 0,
+ "geounit": "Angola",
+ "gu_a3": "AGO",
+ "su_dif": 0,
+ "subunit": "Angola",
+ "su_a3": "AGO",
+ "brk_diff": 0,
+ "name": "Angola",
+ "name_long": "Angola",
+ "brk_a3": "AGO",
+ "brk_name": "Angola",
+ "brk_group": null,
+ "abbrev": "Ang.",
+ "postal": "AO",
+ "formal_en": "People's Republic of Angola",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Angola",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 2,
+ "mapcolor9": 6,
+ "mapcolor13": 1,
+ "pop_est": 12799293,
+ "gdp_md_est": 110300,
+ "pop_year": -99,
+ "lastcensus": 1970,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "AO",
+ "iso_a3": "AGO",
+ "iso_n3": "024",
+ "un_a3": "024",
+ "wb_a2": "AO",
+ "wb_a3": "AGO",
+ "woe_id": -99,
+ "adm0_a3_is": "AGO",
+ "adm0_a3_us": "AGO",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Middle Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 8,
+ 9,
+ 10,
+ 11
+ ]
+ ],
+ [
+ [
+ 12,
+ 13,
+ 14
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "United Kingdom",
+ "sov_a3": "GB1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Anguilla",
+ "adm0_a3": "AIA",
+ "geou_dif": 0,
+ "geounit": "Anguilla",
+ "gu_a3": "AIA",
+ "su_dif": 0,
+ "subunit": "Anguilla",
+ "su_a3": "AIA",
+ "brk_diff": 0,
+ "name": "Anguilla",
+ "name_long": "Anguilla",
+ "brk_a3": "AIA",
+ "brk_name": "Anguilla",
+ "brk_group": null,
+ "abbrev": "Ang.",
+ "postal": "AI",
+ "formal_en": null,
+ "formal_fr": null,
+ "note_adm0": "U.K.",
+ "note_brk": null,
+ "name_sort": "Anguilla",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 6,
+ "mapcolor9": 6,
+ "mapcolor13": 3,
+ "pop_est": 14436,
+ "gdp_md_est": 108.9,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "AI",
+ "iso_a3": "AIA",
+ "iso_n3": "660",
+ "un_a3": "660",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "AIA",
+ "adm0_a3_us": "AIA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ 15
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Albania",
+ "sov_a3": "ALB",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Albania",
+ "adm0_a3": "ALB",
+ "geou_dif": 0,
+ "geounit": "Albania",
+ "gu_a3": "ALB",
+ "su_dif": 0,
+ "subunit": "Albania",
+ "su_a3": "ALB",
+ "brk_diff": 0,
+ "name": "Albania",
+ "name_long": "Albania",
+ "brk_a3": "ALB",
+ "brk_name": "Albania",
+ "brk_group": null,
+ "abbrev": "Alb.",
+ "postal": "AL",
+ "formal_en": "Republic of Albania",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Albania",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 4,
+ "mapcolor9": 1,
+ "mapcolor13": 6,
+ "pop_est": 3639453,
+ "gdp_md_est": 21810,
+ "pop_year": -99,
+ "lastcensus": 2001,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "AL",
+ "iso_a3": "ALB",
+ "iso_n3": "008",
+ "un_a3": "008",
+ "wb_a2": "AL",
+ "wb_a3": "ALB",
+ "woe_id": -99,
+ "adm0_a3_is": "ALB",
+ "adm0_a3_us": "ALB",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Southern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 16,
+ 17,
+ 18,
+ 19,
+ 20
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Finland",
+ "sov_a3": "FI1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Country",
+ "admin": "Aland",
+ "adm0_a3": "ALD",
+ "geou_dif": 0,
+ "geounit": "Aland",
+ "gu_a3": "ALD",
+ "su_dif": 0,
+ "subunit": "Aland",
+ "su_a3": "ALD",
+ "brk_diff": 0,
+ "name": "Aland",
+ "name_long": "Aland Islands",
+ "brk_a3": "ALD",
+ "brk_name": "Aland",
+ "brk_group": null,
+ "abbrev": "Aland",
+ "postal": "AI",
+ "formal_en": "Åland Islands",
+ "formal_fr": null,
+ "note_adm0": "Fin.",
+ "note_brk": null,
+ "name_sort": "Aland",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 1,
+ "mapcolor9": 4,
+ "mapcolor13": 6,
+ "pop_est": 27153,
+ "gdp_md_est": 1563,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "AX",
+ "iso_a3": "ALA",
+ "iso_n3": "248",
+ "un_a3": "248",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "ALA",
+ "adm0_a3_us": "ALD",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Northern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 5,
+ "long_len": 13,
+ "abbrev_len": 5,
+ "tiny": 5,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ [
+ 21
+ ]
+ ],
+ [
+ [
+ 22
+ ]
+ ],
+ [
+ [
+ 23
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Andorra",
+ "sov_a3": "AND",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Andorra",
+ "adm0_a3": "AND",
+ "geou_dif": 0,
+ "geounit": "Andorra",
+ "gu_a3": "AND",
+ "su_dif": 0,
+ "subunit": "Andorra",
+ "su_a3": "AND",
+ "brk_diff": 0,
+ "name": "Andorra",
+ "name_long": "Andorra",
+ "brk_a3": "AND",
+ "brk_name": "Andorra",
+ "brk_group": null,
+ "abbrev": "And.",
+ "postal": "AND",
+ "formal_en": "Principality of Andorra",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Andorra",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 4,
+ "mapcolor9": 1,
+ "mapcolor13": 8,
+ "pop_est": 83888,
+ "gdp_md_est": 3660,
+ "pop_year": -99,
+ "lastcensus": 1989,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "AD",
+ "iso_a3": "AND",
+ "iso_n3": "020",
+ "un_a3": "020",
+ "wb_a2": "AD",
+ "wb_a3": "ADO",
+ "woe_id": -99,
+ "adm0_a3_is": "AND",
+ "adm0_a3_us": "AND",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Southern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": 5,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 24,
+ 25
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "United Arab Emirates",
+ "sov_a3": "ARE",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "United Arab Emirates",
+ "adm0_a3": "ARE",
+ "geou_dif": 0,
+ "geounit": "United Arab Emirates",
+ "gu_a3": "ARE",
+ "su_dif": 0,
+ "subunit": "United Arab Emirates",
+ "su_a3": "ARE",
+ "brk_diff": 0,
+ "name": "United Arab Emirates",
+ "name_long": "United Arab Emirates",
+ "brk_a3": "ARE",
+ "brk_name": "United Arab Emirates",
+ "brk_group": null,
+ "abbrev": "U.A.E.",
+ "postal": "AE",
+ "formal_en": "United Arab Emirates",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "United Arab Emirates",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 1,
+ "mapcolor9": 3,
+ "mapcolor13": 3,
+ "pop_est": 4798491,
+ "gdp_md_est": 184300,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "AE",
+ "iso_a3": "ARE",
+ "iso_n3": "784",
+ "un_a3": "784",
+ "wb_a2": "AE",
+ "wb_a3": "ARE",
+ "woe_id": -99,
+ "adm0_a3_is": "ARE",
+ "adm0_a3_us": "ARE",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Western Asia",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 20,
+ "long_len": 20,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 26
+ ]
+ ],
+ [
+ [
+ 27
+ ]
+ ],
+ [
+ [
+ 28
+ ]
+ ],
+ [
+ [
+ 29
+ ]
+ ],
+ [
+ [
+ 30,
+ 31,
+ 32,
+ 33,
+ 34
+ ],
+ [
+ 35
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Argentina",
+ "sov_a3": "ARG",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Argentina",
+ "adm0_a3": "ARG",
+ "geou_dif": 0,
+ "geounit": "Argentina",
+ "gu_a3": "ARG",
+ "su_dif": 0,
+ "subunit": "Argentina",
+ "su_a3": "ARG",
+ "brk_diff": 0,
+ "name": "Argentina",
+ "name_long": "Argentina",
+ "brk_a3": "ARG",
+ "brk_name": "Argentina",
+ "brk_group": null,
+ "abbrev": "Arg.",
+ "postal": "AR",
+ "formal_en": "Argentine Republic",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Argentina",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 1,
+ "mapcolor9": 3,
+ "mapcolor13": 13,
+ "pop_est": 40913584,
+ "gdp_md_est": 573900,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "5. Emerging region: G20",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "AR",
+ "iso_a3": "ARG",
+ "iso_n3": "032",
+ "un_a3": "032",
+ "wb_a2": "AR",
+ "wb_a3": "ARG",
+ "woe_id": -99,
+ "adm0_a3_is": "ARG",
+ "adm0_a3_us": "ARG",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "South America",
+ "region_un": "Americas",
+ "subregion": "South America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 9,
+ "long_len": 9,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 36
+ ]
+ ],
+ [
+ [
+ 37,
+ 38
+ ]
+ ],
+ [
+ [
+ 39
+ ]
+ ],
+ [
+ [
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Armenia",
+ "sov_a3": "ARM",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Armenia",
+ "adm0_a3": "ARM",
+ "geou_dif": 0,
+ "geounit": "Armenia",
+ "gu_a3": "ARM",
+ "su_dif": 0,
+ "subunit": "Armenia",
+ "su_a3": "ARM",
+ "brk_diff": 0,
+ "name": "Armenia",
+ "name_long": "Armenia",
+ "brk_a3": "ARM",
+ "brk_name": "Armenia",
+ "brk_group": null,
+ "abbrev": "Arm.",
+ "postal": "ARM",
+ "formal_en": "Republic of Armenia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Armenia",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 1,
+ "mapcolor9": 2,
+ "mapcolor13": 10,
+ "pop_est": 2967004,
+ "gdp_md_est": 18770,
+ "pop_year": -99,
+ "lastcensus": 2001,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "AM",
+ "iso_a3": "ARM",
+ "iso_n3": "051",
+ "un_a3": "051",
+ "wb_a2": "AM",
+ "wb_a3": "ARM",
+ "woe_id": -99,
+ "adm0_a3_is": "ARM",
+ "adm0_a3_us": "ARM",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Western Asia",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 46
+ ]
+ ],
+ [
+ [
+ 47,
+ 48,
+ 49,
+ 50,
+ 51
+ ],
+ [
+ 52
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "United States of America",
+ "sov_a3": "US1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "American Samoa",
+ "adm0_a3": "ASM",
+ "geou_dif": 0,
+ "geounit": "American Samoa",
+ "gu_a3": "ASM",
+ "su_dif": 0,
+ "subunit": "American Samoa",
+ "su_a3": "ASM",
+ "brk_diff": 0,
+ "name": "American Samoa",
+ "name_long": "American Samoa",
+ "brk_a3": "ASM",
+ "brk_name": "American Samoa",
+ "brk_group": null,
+ "abbrev": "Am. Samoa",
+ "postal": "AS",
+ "formal_en": "American Samoa",
+ "formal_fr": null,
+ "note_adm0": "U.S.A.",
+ "note_brk": null,
+ "name_sort": "American Samoa",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 5,
+ "mapcolor9": 1,
+ "mapcolor13": 1,
+ "pop_est": 65628,
+ "gdp_md_est": 575.3,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "AS",
+ "iso_a3": "ASM",
+ "iso_n3": "016",
+ "un_a3": "016",
+ "wb_a2": "AS",
+ "wb_a3": "ASM",
+ "woe_id": -99,
+ "adm0_a3_is": "ASM",
+ "adm0_a3_us": "ASM",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Polynesia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 14,
+ "long_len": 14,
+ "abbrev_len": 9,
+ "tiny": 3,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ 53
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Antarctica",
+ "sov_a3": "ATA",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Indeterminate",
+ "admin": "Antarctica",
+ "adm0_a3": "ATA",
+ "geou_dif": 0,
+ "geounit": "Antarctica",
+ "gu_a3": "ATA",
+ "su_dif": 0,
+ "subunit": "Antarctica",
+ "su_a3": "ATA",
+ "brk_diff": 0,
+ "name": "Antarctica",
+ "name_long": "Antarctica",
+ "brk_a3": "ATA",
+ "brk_name": "Antarctica",
+ "brk_group": null,
+ "abbrev": "Ant.",
+ "postal": "AQ",
+ "formal_en": null,
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": "Multiple claims held in abeyance",
+ "name_sort": "Antarctica",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 5,
+ "mapcolor9": 1,
+ "mapcolor13": -99,
+ "pop_est": 3802,
+ "gdp_md_est": 760.4,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "AQ",
+ "iso_a3": "ATA",
+ "iso_n3": "010",
+ "un_a3": "-099",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "ATA",
+ "adm0_a3_us": "ATA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Antarctica",
+ "region_un": "Antarctica",
+ "subregion": "Antarctica",
+ "region_wb": "Antarctica",
+ "name_len": 10,
+ "long_len": 10,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 54
+ ]
+ ],
+ [
+ [
+ 55
+ ]
+ ],
+ [
+ [
+ 56
+ ]
+ ],
+ [
+ [
+ 57
+ ]
+ ],
+ [
+ [
+ 58
+ ]
+ ],
+ [
+ [
+ 59
+ ]
+ ],
+ [
+ [
+ 60
+ ]
+ ],
+ [
+ [
+ 61
+ ]
+ ],
+ [
+ [
+ 62
+ ]
+ ],
+ [
+ [
+ 63
+ ]
+ ],
+ [
+ [
+ 64
+ ]
+ ],
+ [
+ [
+ 65
+ ]
+ ],
+ [
+ [
+ 66
+ ]
+ ],
+ [
+ [
+ 67
+ ]
+ ],
+ [
+ [
+ 68
+ ]
+ ],
+ [
+ [
+ 69
+ ]
+ ],
+ [
+ [
+ 70
+ ]
+ ],
+ [
+ [
+ 71
+ ]
+ ],
+ [
+ [
+ 72
+ ]
+ ],
+ [
+ [
+ 73
+ ]
+ ],
+ [
+ [
+ 74
+ ]
+ ],
+ [
+ [
+ 75
+ ]
+ ],
+ [
+ [
+ 76
+ ]
+ ],
+ [
+ [
+ 77
+ ]
+ ],
+ [
+ [
+ 78
+ ]
+ ],
+ [
+ [
+ 79
+ ]
+ ],
+ [
+ [
+ 80
+ ]
+ ],
+ [
+ [
+ 81
+ ]
+ ],
+ [
+ [
+ 82
+ ]
+ ],
+ [
+ [
+ 83
+ ]
+ ],
+ [
+ [
+ 84
+ ]
+ ],
+ [
+ [
+ 85
+ ]
+ ],
+ [
+ [
+ 86
+ ]
+ ],
+ [
+ [
+ 87
+ ]
+ ],
+ [
+ [
+ 88
+ ]
+ ],
+ [
+ [
+ 89
+ ]
+ ],
+ [
+ [
+ 90
+ ]
+ ],
+ [
+ [
+ 91
+ ]
+ ],
+ [
+ [
+ 92
+ ]
+ ],
+ [
+ [
+ 93
+ ]
+ ],
+ [
+ [
+ 94
+ ]
+ ],
+ [
+ [
+ 95
+ ]
+ ],
+ [
+ [
+ 96
+ ]
+ ],
+ [
+ [
+ 97
+ ]
+ ],
+ [
+ [
+ 98
+ ]
+ ],
+ [
+ [
+ 99
+ ]
+ ],
+ [
+ [
+ 100
+ ]
+ ],
+ [
+ [
+ 101
+ ]
+ ],
+ [
+ [
+ 102
+ ]
+ ],
+ [
+ [
+ 103
+ ]
+ ],
+ [
+ [
+ 104
+ ]
+ ],
+ [
+ [
+ 105
+ ]
+ ],
+ [
+ [
+ 106
+ ]
+ ],
+ [
+ [
+ 107
+ ]
+ ],
+ [
+ [
+ 108
+ ]
+ ],
+ [
+ [
+ 109
+ ]
+ ],
+ [
+ [
+ 110
+ ]
+ ],
+ [
+ [
+ 111
+ ]
+ ],
+ [
+ [
+ 112
+ ]
+ ],
+ [
+ [
+ 113
+ ]
+ ],
+ [
+ [
+ 114
+ ]
+ ],
+ [
+ [
+ 115
+ ]
+ ],
+ [
+ [
+ 116
+ ]
+ ],
+ [
+ [
+ 117
+ ]
+ ],
+ [
+ [
+ 118
+ ]
+ ],
+ [
+ [
+ 119
+ ]
+ ],
+ [
+ [
+ 120
+ ]
+ ],
+ [
+ [
+ 121
+ ]
+ ],
+ [
+ [
+ 122
+ ]
+ ],
+ [
+ [
+ 123
+ ]
+ ],
+ [
+ [
+ 124
+ ]
+ ],
+ [
+ [
+ 125
+ ]
+ ],
+ [
+ [
+ 126
+ ]
+ ],
+ [
+ [
+ 127
+ ]
+ ],
+ [
+ [
+ 128
+ ]
+ ],
+ [
+ [
+ 129
+ ]
+ ],
+ [
+ [
+ 130
+ ]
+ ],
+ [
+ [
+ 131
+ ]
+ ],
+ [
+ [
+ 132
+ ]
+ ],
+ [
+ [
+ 133
+ ]
+ ],
+ [
+ [
+ 134
+ ]
+ ],
+ [
+ [
+ 135
+ ]
+ ],
+ [
+ [
+ 136
+ ]
+ ],
+ [
+ [
+ 137
+ ]
+ ],
+ [
+ [
+ 138
+ ]
+ ],
+ [
+ [
+ 139
+ ]
+ ],
+ [
+ [
+ 140
+ ]
+ ],
+ [
+ [
+ 141
+ ]
+ ],
+ [
+ [
+ 142
+ ]
+ ],
+ [
+ [
+ 143
+ ]
+ ],
+ [
+ [
+ 144
+ ]
+ ],
+ [
+ [
+ 145
+ ]
+ ],
+ [
+ [
+ 146
+ ]
+ ],
+ [
+ [
+ 147
+ ]
+ ],
+ [
+ [
+ 148
+ ]
+ ],
+ [
+ [
+ 149
+ ]
+ ],
+ [
+ [
+ 150
+ ]
+ ],
+ [
+ [
+ 151
+ ]
+ ],
+ [
+ [
+ 152
+ ]
+ ],
+ [
+ [
+ 153
+ ]
+ ],
+ [
+ [
+ 154
+ ]
+ ],
+ [
+ [
+ 155
+ ]
+ ],
+ [
+ [
+ 156
+ ]
+ ],
+ [
+ [
+ 157
+ ]
+ ],
+ [
+ [
+ 158
+ ]
+ ],
+ [
+ [
+ 159
+ ]
+ ],
+ [
+ [
+ 160
+ ]
+ ],
+ [
+ [
+ 161
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "France",
+ "sov_a3": "FR1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "French Southern and Antarctic Lands",
+ "adm0_a3": "ATF",
+ "geou_dif": 0,
+ "geounit": "French Southern and Antarctic Lands",
+ "gu_a3": "ATF",
+ "su_dif": 0,
+ "subunit": "French Southern and Antarctic Lands",
+ "su_a3": "ATF",
+ "brk_diff": 0,
+ "name": "Fr. S. Antarctic Lands",
+ "name_long": "French Southern and Antarctic Lands",
+ "brk_a3": "ATF",
+ "brk_name": "Fr. S. and Antarctic Lands",
+ "brk_group": null,
+ "abbrev": "Fr. S.A.L.",
+ "postal": "TF",
+ "formal_en": "Territory of the French Southern and Antarctic Lands",
+ "formal_fr": null,
+ "note_adm0": "Fr.",
+ "note_brk": null,
+ "name_sort": "French Southern and Antarctic Lands",
+ "name_alt": null,
+ "mapcolor7": 7,
+ "mapcolor8": 5,
+ "mapcolor9": 9,
+ "mapcolor13": 11,
+ "pop_est": 140,
+ "gdp_md_est": 16,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "TF",
+ "iso_a3": "ATF",
+ "iso_n3": "260",
+ "un_a3": "-099",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "ATF",
+ "adm0_a3_us": "ATF",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Seven seas (open ocean)",
+ "region_un": "Seven seas (open ocean)",
+ "subregion": "Seven seas (open ocean)",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 22,
+ "long_len": 35,
+ "abbrev_len": 10,
+ "tiny": 2,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ [
+ 162
+ ]
+ ],
+ [
+ [
+ 163
+ ]
+ ],
+ [
+ [
+ 164
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Antigua and Barbuda",
+ "sov_a3": "ATG",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Antigua and Barbuda",
+ "adm0_a3": "ATG",
+ "geou_dif": 0,
+ "geounit": "Antigua and Barbuda",
+ "gu_a3": "ATG",
+ "su_dif": 0,
+ "subunit": "Antigua and Barbuda",
+ "su_a3": "ATG",
+ "brk_diff": 0,
+ "name": "Antigua and Barb.",
+ "name_long": "Antigua and Barbuda",
+ "brk_a3": "ATG",
+ "brk_name": "Antigua and Barb.",
+ "brk_group": null,
+ "abbrev": "Ant.B.",
+ "postal": "AG",
+ "formal_en": "Antigua and Barbuda",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Antigua and Barbuda",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 2,
+ "mapcolor9": 5,
+ "mapcolor13": 5,
+ "pop_est": 85632,
+ "gdp_md_est": 1657,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "AG",
+ "iso_a3": "ATG",
+ "iso_n3": "028",
+ "un_a3": "028",
+ "wb_a2": "AG",
+ "wb_a3": "ATG",
+ "woe_id": -99,
+ "adm0_a3_is": "ATG",
+ "adm0_a3_us": "ATG",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 17,
+ "long_len": 19,
+ "abbrev_len": 6,
+ "tiny": 4,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 165
+ ]
+ ],
+ [
+ [
+ 166
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Australia",
+ "sov_a3": "AU1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Country",
+ "admin": "Australia",
+ "adm0_a3": "AUS",
+ "geou_dif": 0,
+ "geounit": "Australia",
+ "gu_a3": "AUS",
+ "su_dif": 0,
+ "subunit": "Australia",
+ "su_a3": "AUS",
+ "brk_diff": 0,
+ "name": "Australia",
+ "name_long": "Australia",
+ "brk_a3": "AUS",
+ "brk_name": "Australia",
+ "brk_group": null,
+ "abbrev": "Auz.",
+ "postal": "AU",
+ "formal_en": "Commonwealth of Australia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Australia",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 2,
+ "mapcolor9": 2,
+ "mapcolor13": 7,
+ "pop_est": 21262641,
+ "gdp_md_est": 800200,
+ "pop_year": -99,
+ "lastcensus": 2006,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "AU",
+ "iso_a3": "AUS",
+ "iso_n3": "036",
+ "un_a3": "036",
+ "wb_a2": "AU",
+ "wb_a3": "AUS",
+ "woe_id": -99,
+ "adm0_a3_is": "AUS",
+ "adm0_a3_us": "AUS",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Australia and New Zealand",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 9,
+ "long_len": 9,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 167
+ ]
+ ],
+ [
+ [
+ 168
+ ]
+ ],
+ [
+ [
+ 169
+ ]
+ ],
+ [
+ [
+ 170
+ ]
+ ],
+ [
+ [
+ 171
+ ]
+ ],
+ [
+ [
+ 172
+ ]
+ ],
+ [
+ [
+ 173
+ ]
+ ],
+ [
+ [
+ 174
+ ]
+ ],
+ [
+ [
+ 175
+ ]
+ ],
+ [
+ [
+ 176
+ ]
+ ],
+ [
+ [
+ 177
+ ]
+ ],
+ [
+ [
+ 178
+ ]
+ ],
+ [
+ [
+ 179
+ ]
+ ],
+ [
+ [
+ 180
+ ]
+ ],
+ [
+ [
+ 181
+ ]
+ ],
+ [
+ [
+ 182
+ ]
+ ],
+ [
+ [
+ 183
+ ]
+ ],
+ [
+ [
+ 184
+ ]
+ ],
+ [
+ [
+ 185
+ ]
+ ],
+ [
+ [
+ 186
+ ]
+ ],
+ [
+ [
+ 187
+ ]
+ ],
+ [
+ [
+ 188
+ ]
+ ],
+ [
+ [
+ 189
+ ]
+ ],
+ [
+ [
+ 190
+ ]
+ ],
+ [
+ [
+ 191
+ ]
+ ],
+ [
+ [
+ 192
+ ]
+ ],
+ [
+ [
+ 193
+ ]
+ ],
+ [
+ [
+ 194
+ ]
+ ],
+ [
+ [
+ 195
+ ]
+ ],
+ [
+ [
+ 196
+ ]
+ ],
+ [
+ [
+ 197
+ ]
+ ],
+ [
+ [
+ 198
+ ]
+ ],
+ [
+ [
+ 199
+ ]
+ ],
+ [
+ [
+ 200
+ ]
+ ],
+ [
+ [
+ 201
+ ]
+ ],
+ [
+ [
+ 202
+ ]
+ ],
+ [
+ [
+ 203
+ ]
+ ],
+ [
+ [
+ 204
+ ]
+ ],
+ [
+ [
+ 205
+ ]
+ ],
+ [
+ [
+ 206
+ ]
+ ],
+ [
+ [
+ 207
+ ]
+ ],
+ [
+ [
+ 208
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Austria",
+ "sov_a3": "AUT",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Austria",
+ "adm0_a3": "AUT",
+ "geou_dif": 0,
+ "geounit": "Austria",
+ "gu_a3": "AUT",
+ "su_dif": 0,
+ "subunit": "Austria",
+ "su_a3": "AUT",
+ "brk_diff": 0,
+ "name": "Austria",
+ "name_long": "Austria",
+ "brk_a3": "AUT",
+ "brk_name": "Austria",
+ "brk_group": null,
+ "abbrev": "Aust.",
+ "postal": "A",
+ "formal_en": "Republic of Austria",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Austria",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 1,
+ "mapcolor9": 3,
+ "mapcolor13": 4,
+ "pop_est": 8210281,
+ "gdp_md_est": 329500,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "AT",
+ "iso_a3": "AUT",
+ "iso_n3": "040",
+ "un_a3": "040",
+ "wb_a2": "AT",
+ "wb_a3": "AUT",
+ "woe_id": -99,
+ "adm0_a3_is": "AUT",
+ "adm0_a3_us": "AUT",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Western Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 209,
+ 210,
+ 211,
+ 212,
+ 213,
+ 214,
+ 215,
+ 216,
+ 217
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Azerbaijan",
+ "sov_a3": "AZE",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Azerbaijan",
+ "adm0_a3": "AZE",
+ "geou_dif": 0,
+ "geounit": "Azerbaijan",
+ "gu_a3": "AZE",
+ "su_dif": 0,
+ "subunit": "Azerbaijan",
+ "su_a3": "AZE",
+ "brk_diff": 0,
+ "name": "Azerbaijan",
+ "name_long": "Azerbaijan",
+ "brk_a3": "AZE",
+ "brk_name": "Azerbaijan",
+ "brk_group": null,
+ "abbrev": "Aze.",
+ "postal": "AZ",
+ "formal_en": "Republic of Azerbaijan",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Azerbaijan",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 6,
+ "mapcolor9": 5,
+ "mapcolor13": 8,
+ "pop_est": 8238672,
+ "gdp_md_est": 77610,
+ "pop_year": -99,
+ "lastcensus": 2009,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "AZ",
+ "iso_a3": "AZE",
+ "iso_n3": "031",
+ "un_a3": "031",
+ "wb_a2": "AZ",
+ "wb_a3": "AZE",
+ "woe_id": -99,
+ "adm0_a3_is": "AZE",
+ "adm0_a3_us": "AZE",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Western Asia",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 10,
+ "long_len": 10,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 218,
+ 219,
+ -49
+ ]
+ ],
+ [
+ [
+ -53
+ ]
+ ],
+ [
+ [
+ 220,
+ 221,
+ -52,
+ 222,
+ 223
+ ],
+ [
+ -47
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Burundi",
+ "sov_a3": "BDI",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Burundi",
+ "adm0_a3": "BDI",
+ "geou_dif": 0,
+ "geounit": "Burundi",
+ "gu_a3": "BDI",
+ "su_dif": 0,
+ "subunit": "Burundi",
+ "su_a3": "BDI",
+ "brk_diff": 0,
+ "name": "Burundi",
+ "name_long": "Burundi",
+ "brk_a3": "BDI",
+ "brk_name": "Burundi",
+ "brk_group": null,
+ "abbrev": "Bur.",
+ "postal": "BI",
+ "formal_en": "Republic of Burundi",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Burundi",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 2,
+ "mapcolor9": 5,
+ "mapcolor13": 8,
+ "pop_est": 8988091,
+ "gdp_md_est": 3102,
+ "pop_year": -99,
+ "lastcensus": 2008,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "BI",
+ "iso_a3": "BDI",
+ "iso_n3": "108",
+ "un_a3": "108",
+ "wb_a2": "BI",
+ "wb_a3": "BDI",
+ "woe_id": -99,
+ "adm0_a3_is": "BDI",
+ "adm0_a3_us": "BDI",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Eastern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 224,
+ 225,
+ 226
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Belgium",
+ "sov_a3": "BEL",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Belgium",
+ "adm0_a3": "BEL",
+ "geou_dif": 0,
+ "geounit": "Belgium",
+ "gu_a3": "BEL",
+ "su_dif": 0,
+ "subunit": "Belgium",
+ "su_a3": "BEL",
+ "brk_diff": 0,
+ "name": "Belgium",
+ "name_long": "Belgium",
+ "brk_a3": "BEL",
+ "brk_name": "Belgium",
+ "brk_group": null,
+ "abbrev": "Belg.",
+ "postal": "B",
+ "formal_en": "Kingdom of Belgium",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Belgium",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 2,
+ "mapcolor9": 1,
+ "mapcolor13": 8,
+ "pop_est": 10414336,
+ "gdp_md_est": 389300,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "BE",
+ "iso_a3": "BEL",
+ "iso_n3": "056",
+ "un_a3": "056",
+ "wb_a2": "BE",
+ "wb_a3": "BEL",
+ "woe_id": -99,
+ "adm0_a3_is": "BEL",
+ "adm0_a3_us": "BEL",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Western Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 227,
+ 228,
+ 229,
+ 230,
+ 231,
+ 232,
+ 233
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Benin",
+ "sov_a3": "BEN",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Benin",
+ "adm0_a3": "BEN",
+ "geou_dif": 0,
+ "geounit": "Benin",
+ "gu_a3": "BEN",
+ "su_dif": 0,
+ "subunit": "Benin",
+ "su_a3": "BEN",
+ "brk_diff": 0,
+ "name": "Benin",
+ "name_long": "Benin",
+ "brk_a3": "BEN",
+ "brk_name": "Benin",
+ "brk_group": null,
+ "abbrev": "Benin",
+ "postal": "BJ",
+ "formal_en": "Republic of Benin",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Benin",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 2,
+ "mapcolor9": 2,
+ "mapcolor13": 12,
+ "pop_est": 8791832,
+ "gdp_md_est": 12830,
+ "pop_year": -99,
+ "lastcensus": 2002,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "BJ",
+ "iso_a3": "BEN",
+ "iso_n3": "204",
+ "un_a3": "204",
+ "wb_a2": "BJ",
+ "wb_a3": "BEN",
+ "woe_id": -99,
+ "adm0_a3_is": "BEN",
+ "adm0_a3_us": "BEN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Western Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 234,
+ 235,
+ 236,
+ 237,
+ 238
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Burkina Faso",
+ "sov_a3": "BFA",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Burkina Faso",
+ "adm0_a3": "BFA",
+ "geou_dif": 0,
+ "geounit": "Burkina Faso",
+ "gu_a3": "BFA",
+ "su_dif": 0,
+ "subunit": "Burkina Faso",
+ "su_a3": "BFA",
+ "brk_diff": 0,
+ "name": "Burkina Faso",
+ "name_long": "Burkina Faso",
+ "brk_a3": "BFA",
+ "brk_name": "Burkina Faso",
+ "brk_group": null,
+ "abbrev": "B.F.",
+ "postal": "BF",
+ "formal_en": "Burkina Faso",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Burkina Faso",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 1,
+ "mapcolor9": 5,
+ "mapcolor13": 11,
+ "pop_est": 15746232,
+ "gdp_md_est": 17820,
+ "pop_year": -99,
+ "lastcensus": 2006,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "BF",
+ "iso_a3": "BFA",
+ "iso_n3": "854",
+ "un_a3": "854",
+ "wb_a2": "BF",
+ "wb_a3": "BFA",
+ "woe_id": -99,
+ "adm0_a3_is": "BFA",
+ "adm0_a3_us": "BFA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Western Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 12,
+ "long_len": 12,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 239,
+ -238,
+ 240,
+ 241,
+ 242,
+ 243
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Bangladesh",
+ "sov_a3": "BGD",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Bangladesh",
+ "adm0_a3": "BGD",
+ "geou_dif": 0,
+ "geounit": "Bangladesh",
+ "gu_a3": "BGD",
+ "su_dif": 0,
+ "subunit": "Bangladesh",
+ "su_a3": "BGD",
+ "brk_diff": 0,
+ "name": "Bangladesh",
+ "name_long": "Bangladesh",
+ "brk_a3": "BGD",
+ "brk_name": "Bangladesh",
+ "brk_group": null,
+ "abbrev": "Bang.",
+ "postal": "BD",
+ "formal_en": "People's Republic of Bangladesh",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Bangladesh",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 4,
+ "mapcolor9": 7,
+ "mapcolor13": 7,
+ "pop_est": 156050883,
+ "gdp_md_est": 224000,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "BD",
+ "iso_a3": "BGD",
+ "iso_n3": "050",
+ "un_a3": "050",
+ "wb_a2": "BD",
+ "wb_a3": "BGD",
+ "woe_id": -99,
+ "adm0_a3_is": "BGD",
+ "adm0_a3_us": "BGD",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Southern Asia",
+ "region_wb": "South Asia",
+ "name_len": 10,
+ "long_len": 10,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 244
+ ]
+ ],
+ [
+ [
+ 245
+ ]
+ ],
+ [
+ [
+ 246
+ ]
+ ],
+ [
+ [
+ 247
+ ]
+ ],
+ [
+ [
+ 248
+ ]
+ ],
+ [
+ [
+ 249
+ ]
+ ],
+ [
+ [
+ 250,
+ 251,
+ 252
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Bulgaria",
+ "sov_a3": "BGR",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Bulgaria",
+ "adm0_a3": "BGR",
+ "geou_dif": 0,
+ "geounit": "Bulgaria",
+ "gu_a3": "BGR",
+ "su_dif": 0,
+ "subunit": "Bulgaria",
+ "su_a3": "BGR",
+ "brk_diff": 0,
+ "name": "Bulgaria",
+ "name_long": "Bulgaria",
+ "brk_a3": "BGR",
+ "brk_name": "Bulgaria",
+ "brk_group": null,
+ "abbrev": "Bulg.",
+ "postal": "BG",
+ "formal_en": "Republic of Bulgaria",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Bulgaria",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 5,
+ "mapcolor9": 1,
+ "mapcolor13": 8,
+ "pop_est": 7204687,
+ "gdp_md_est": 93750,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "BG",
+ "iso_a3": "BGR",
+ "iso_n3": "100",
+ "un_a3": "100",
+ "wb_a2": "BG",
+ "wb_a3": "BGR",
+ "woe_id": -99,
+ "adm0_a3_is": "BGR",
+ "adm0_a3_us": "BGR",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Eastern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 253,
+ 254,
+ 255,
+ 256,
+ 257,
+ 258
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Bahrain",
+ "sov_a3": "BHR",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Bahrain",
+ "adm0_a3": "BHR",
+ "geou_dif": 0,
+ "geounit": "Bahrain",
+ "gu_a3": "BHR",
+ "su_dif": 0,
+ "subunit": "Bahrain",
+ "su_a3": "BHR",
+ "brk_diff": 0,
+ "name": "Bahrain",
+ "name_long": "Bahrain",
+ "brk_a3": "BHR",
+ "brk_name": "Bahrain",
+ "brk_group": null,
+ "abbrev": "Bahr.",
+ "postal": "BH",
+ "formal_en": "Kingdom of Bahrain",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Bahrain",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 1,
+ "mapcolor9": 1,
+ "mapcolor13": 9,
+ "pop_est": 727785,
+ "gdp_md_est": 26820,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "BH",
+ "iso_a3": "BHR",
+ "iso_n3": "048",
+ "un_a3": "048",
+ "wb_a2": "BH",
+ "wb_a3": "BHR",
+ "woe_id": -99,
+ "adm0_a3_is": "BHR",
+ "adm0_a3_us": "BHR",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Western Asia",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 5,
+ "tiny": 2,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 259
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "The Bahamas",
+ "sov_a3": "BHS",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "The Bahamas",
+ "adm0_a3": "BHS",
+ "geou_dif": 0,
+ "geounit": "The Bahamas",
+ "gu_a3": "BHS",
+ "su_dif": 0,
+ "subunit": "The Bahamas",
+ "su_a3": "BHS",
+ "brk_diff": 0,
+ "name": "Bahamas",
+ "name_long": "Bahamas",
+ "brk_a3": "BHS",
+ "brk_name": "Bahamas",
+ "brk_group": null,
+ "abbrev": "Bhs.",
+ "postal": "BS",
+ "formal_en": "Commonwealth of the Bahamas",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Bahamas, The",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 1,
+ "mapcolor9": 2,
+ "mapcolor13": 5,
+ "pop_est": 309156,
+ "gdp_md_est": 9093,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "BS",
+ "iso_a3": "BHS",
+ "iso_n3": "044",
+ "un_a3": "044",
+ "wb_a2": "BS",
+ "wb_a3": "BHS",
+ "woe_id": -99,
+ "adm0_a3_is": "BHS",
+ "adm0_a3_us": "BHS",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 260
+ ]
+ ],
+ [
+ [
+ 261
+ ]
+ ],
+ [
+ [
+ 262
+ ]
+ ],
+ [
+ [
+ 263
+ ]
+ ],
+ [
+ [
+ 264
+ ]
+ ],
+ [
+ [
+ 265
+ ]
+ ],
+ [
+ [
+ 266
+ ]
+ ],
+ [
+ [
+ 267
+ ]
+ ],
+ [
+ [
+ 268
+ ]
+ ],
+ [
+ [
+ 269
+ ]
+ ],
+ [
+ [
+ 270
+ ]
+ ],
+ [
+ [
+ 271
+ ]
+ ],
+ [
+ [
+ 272
+ ]
+ ],
+ [
+ [
+ 273
+ ]
+ ],
+ [
+ [
+ 274
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Bosnia and Herzegovina",
+ "sov_a3": "BIH",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Bosnia and Herzegovina",
+ "adm0_a3": "BIH",
+ "geou_dif": 0,
+ "geounit": "Bosnia and Herzegovina",
+ "gu_a3": "BIH",
+ "su_dif": 0,
+ "subunit": "Bosnia and Herzegovina",
+ "su_a3": "BIH",
+ "brk_diff": 0,
+ "name": "Bosnia and Herz.",
+ "name_long": "Bosnia and Herzegovina",
+ "brk_a3": "BIH",
+ "brk_name": "Bosnia and Herz.",
+ "brk_group": null,
+ "abbrev": "B.H.",
+ "postal": "BiH",
+ "formal_en": "Bosnia and Herzegovina",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Bosnia and Herzegovina",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 1,
+ "mapcolor9": 1,
+ "mapcolor13": 2,
+ "pop_est": 4613414,
+ "gdp_md_est": 29700,
+ "pop_year": -99,
+ "lastcensus": 1991,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "BA",
+ "iso_a3": "BIH",
+ "iso_n3": "070",
+ "un_a3": "070",
+ "wb_a2": "BA",
+ "wb_a3": "BIH",
+ "woe_id": -99,
+ "adm0_a3_is": "BIH",
+ "adm0_a3_us": "BIH",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Southern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 16,
+ "long_len": 22,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 275,
+ 276,
+ 277,
+ 278,
+ 279
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "France",
+ "sov_a3": "FR1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Saint Barthelemy",
+ "adm0_a3": "BLM",
+ "geou_dif": 0,
+ "geounit": "Saint Barthelemy",
+ "gu_a3": "BLM",
+ "su_dif": 0,
+ "subunit": "Saint Barthelemy",
+ "su_a3": "BLM",
+ "brk_diff": 0,
+ "name": "St-Barthélemy",
+ "name_long": "Saint-Barthélemy",
+ "brk_a3": "BLM",
+ "brk_name": "St-Barthélemy",
+ "brk_group": null,
+ "abbrev": "St. B.",
+ "postal": "BL",
+ "formal_en": "Saint-Barthélemy",
+ "formal_fr": null,
+ "note_adm0": "Fr.",
+ "note_brk": null,
+ "name_sort": "St-Barthélemy",
+ "name_alt": null,
+ "mapcolor7": 7,
+ "mapcolor8": 5,
+ "mapcolor9": 9,
+ "mapcolor13": 11,
+ "pop_est": 7448,
+ "gdp_md_est": 255,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "BL",
+ "iso_a3": "BLM",
+ "iso_n3": "652",
+ "un_a3": "652",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "BLM",
+ "adm0_a3_us": "BLM",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 13,
+ "long_len": 16,
+ "abbrev_len": 6,
+ "tiny": 4,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ 280
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Belarus",
+ "sov_a3": "BLR",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Belarus",
+ "adm0_a3": "BLR",
+ "geou_dif": 0,
+ "geounit": "Belarus",
+ "gu_a3": "BLR",
+ "su_dif": 0,
+ "subunit": "Belarus",
+ "su_a3": "BLR",
+ "brk_diff": 0,
+ "name": "Belarus",
+ "name_long": "Belarus",
+ "brk_a3": "BLR",
+ "brk_name": "Belarus",
+ "brk_group": null,
+ "abbrev": "Bela.",
+ "postal": "BY",
+ "formal_en": "Republic of Belarus",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Belarus",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 1,
+ "mapcolor9": 5,
+ "mapcolor13": 11,
+ "pop_est": 9648533,
+ "gdp_md_est": 114100,
+ "pop_year": -99,
+ "lastcensus": 2009,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "BY",
+ "iso_a3": "BLR",
+ "iso_n3": "112",
+ "un_a3": "112",
+ "wb_a2": "BY",
+ "wb_a3": "BLR",
+ "woe_id": -99,
+ "adm0_a3_is": "BLR",
+ "adm0_a3_us": "BLR",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Eastern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 281,
+ 282,
+ 283,
+ 284,
+ 285
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Belize",
+ "sov_a3": "BLZ",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Belize",
+ "adm0_a3": "BLZ",
+ "geou_dif": 0,
+ "geounit": "Belize",
+ "gu_a3": "BLZ",
+ "su_dif": 0,
+ "subunit": "Belize",
+ "su_a3": "BLZ",
+ "brk_diff": 0,
+ "name": "Belize",
+ "name_long": "Belize",
+ "brk_a3": "BLZ",
+ "brk_name": "Belize",
+ "brk_group": null,
+ "abbrev": "Belize",
+ "postal": "BZ",
+ "formal_en": "Belize",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Belize",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 4,
+ "mapcolor9": 5,
+ "mapcolor13": 7,
+ "pop_est": 307899,
+ "gdp_md_est": 2536,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "BZ",
+ "iso_a3": "BLZ",
+ "iso_n3": "084",
+ "un_a3": "084",
+ "wb_a2": "BZ",
+ "wb_a3": "BLZ",
+ "woe_id": -99,
+ "adm0_a3_is": "BLZ",
+ "adm0_a3_us": "BLZ",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Central America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 286
+ ]
+ ],
+ [
+ [
+ 287
+ ]
+ ],
+ [
+ [
+ 288,
+ 289,
+ 290
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "United Kingdom",
+ "sov_a3": "GB1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Bermuda",
+ "adm0_a3": "BMU",
+ "geou_dif": 0,
+ "geounit": "Bermuda",
+ "gu_a3": "BMU",
+ "su_dif": 0,
+ "subunit": "Bermuda",
+ "su_a3": "BMU",
+ "brk_diff": 0,
+ "name": "Bermuda",
+ "name_long": "Bermuda",
+ "brk_a3": "BMU",
+ "brk_name": "Bermuda",
+ "brk_group": null,
+ "abbrev": "Berm.",
+ "postal": "BM",
+ "formal_en": "The Bermudas or Somers Isles",
+ "formal_fr": null,
+ "note_adm0": "U.K.",
+ "note_brk": null,
+ "name_sort": "Bermuda",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 6,
+ "mapcolor9": 6,
+ "mapcolor13": 3,
+ "pop_est": 67837,
+ "gdp_md_est": 4500,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "BM",
+ "iso_a3": "BMU",
+ "iso_n3": "060",
+ "un_a3": "060",
+ "wb_a2": "BM",
+ "wb_a3": "BMU",
+ "woe_id": -99,
+ "adm0_a3_is": "BMU",
+ "adm0_a3_us": "BMU",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Northern America",
+ "region_wb": "North America",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 5,
+ "tiny": 4,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ 291
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Bolivia",
+ "sov_a3": "BOL",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Bolivia",
+ "adm0_a3": "BOL",
+ "geou_dif": 0,
+ "geounit": "Bolivia",
+ "gu_a3": "BOL",
+ "su_dif": 0,
+ "subunit": "Bolivia",
+ "su_a3": "BOL",
+ "brk_diff": 0,
+ "name": "Bolivia",
+ "name_long": "Bolivia",
+ "brk_a3": "BOL",
+ "brk_name": "Bolivia",
+ "brk_group": null,
+ "abbrev": "Bolivia",
+ "postal": "BO",
+ "formal_en": "Plurinational State of Bolivia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Bolivia",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 5,
+ "mapcolor9": 2,
+ "mapcolor13": 3,
+ "pop_est": 9775246,
+ "gdp_md_est": 43270,
+ "pop_year": -99,
+ "lastcensus": 2001,
+ "gdp_year": -99,
+ "economy": "5. Emerging region: G20",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "BO",
+ "iso_a3": "BOL",
+ "iso_n3": "068",
+ "un_a3": "068",
+ "wb_a2": "BO",
+ "wb_a3": "BOL",
+ "woe_id": -99,
+ "adm0_a3_is": "BOL",
+ "adm0_a3_us": "BOL",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "South America",
+ "region_un": "Americas",
+ "subregion": "South America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 7,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 292,
+ -46,
+ 293,
+ 294,
+ 295
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Brazil",
+ "sov_a3": "BRA",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Brazil",
+ "adm0_a3": "BRA",
+ "geou_dif": 0,
+ "geounit": "Brazil",
+ "gu_a3": "BRA",
+ "su_dif": 0,
+ "subunit": "Brazil",
+ "su_a3": "BRA",
+ "brk_diff": 0,
+ "name": "Brazil",
+ "name_long": "Brazil",
+ "brk_a3": "BRA",
+ "brk_name": "Brazil",
+ "brk_group": null,
+ "abbrev": "Brazil",
+ "postal": "BR",
+ "formal_en": "Federative Republic of Brazil",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Brazil",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 6,
+ "mapcolor9": 5,
+ "mapcolor13": 7,
+ "pop_est": 198739269,
+ "gdp_md_est": 1993000,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "3. Emerging region: BRIC",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "BR",
+ "iso_a3": "BRA",
+ "iso_n3": "076",
+ "un_a3": "076",
+ "wb_a2": "BR",
+ "wb_a3": "BRA",
+ "woe_id": -99,
+ "adm0_a3_is": "BRA",
+ "adm0_a3_us": "BRA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "South America",
+ "region_un": "Americas",
+ "subregion": "South America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 296
+ ]
+ ],
+ [
+ [
+ 297
+ ]
+ ],
+ [
+ [
+ 298
+ ]
+ ],
+ [
+ [
+ 299
+ ]
+ ],
+ [
+ [
+ 300
+ ]
+ ],
+ [
+ [
+ 301
+ ]
+ ],
+ [
+ [
+ 302
+ ]
+ ],
+ [
+ [
+ 303
+ ]
+ ],
+ [
+ [
+ 304
+ ]
+ ],
+ [
+ [
+ 305
+ ]
+ ],
+ [
+ [
+ 306
+ ]
+ ],
+ [
+ [
+ 307
+ ]
+ ],
+ [
+ [
+ 308
+ ]
+ ],
+ [
+ [
+ 309
+ ]
+ ],
+ [
+ [
+ 310
+ ]
+ ],
+ [
+ [
+ 311
+ ]
+ ],
+ [
+ [
+ 312,
+ 313,
+ 314,
+ 315,
+ -42,
+ 316,
+ -296,
+ 317,
+ 318,
+ 319,
+ 320
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Barbados",
+ "sov_a3": "BRB",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Barbados",
+ "adm0_a3": "BRB",
+ "geou_dif": 0,
+ "geounit": "Barbados",
+ "gu_a3": "BRB",
+ "su_dif": 0,
+ "subunit": "Barbados",
+ "su_a3": "BRB",
+ "brk_diff": 0,
+ "name": "Barbados",
+ "name_long": "Barbados",
+ "brk_a3": "BRB",
+ "brk_name": "Barbados",
+ "brk_group": null,
+ "abbrev": "Barb.",
+ "postal": "BB",
+ "formal_en": "Barbados",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Barbados",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 1,
+ "mapcolor9": 5,
+ "mapcolor13": 3,
+ "pop_est": 284589,
+ "gdp_md_est": 5425,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "BB",
+ "iso_a3": "BRB",
+ "iso_n3": "052",
+ "un_a3": "052",
+ "wb_a2": "BB",
+ "wb_a3": "BRB",
+ "woe_id": -99,
+ "adm0_a3_is": "BRB",
+ "adm0_a3_us": "BRB",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 5,
+ "tiny": 3,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 321
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Brunei",
+ "sov_a3": "BRN",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Brunei",
+ "adm0_a3": "BRN",
+ "geou_dif": 0,
+ "geounit": "Brunei",
+ "gu_a3": "BRN",
+ "su_dif": 0,
+ "subunit": "Brunei",
+ "su_a3": "BRN",
+ "brk_diff": 0,
+ "name": "Brunei",
+ "name_long": "Brunei Darussalam",
+ "brk_a3": "BRN",
+ "brk_name": "Brunei",
+ "brk_group": null,
+ "abbrev": "Brunei",
+ "postal": "BN",
+ "formal_en": "Negara Brunei Darussalam",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Brunei",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 6,
+ "mapcolor9": 6,
+ "mapcolor13": 12,
+ "pop_est": 388190,
+ "gdp_md_est": 20250,
+ "pop_year": -99,
+ "lastcensus": 2001,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "BN",
+ "iso_a3": "BRN",
+ "iso_n3": "096",
+ "un_a3": "096",
+ "wb_a2": "BN",
+ "wb_a3": "BRN",
+ "woe_id": -99,
+ "adm0_a3_is": "BRN",
+ "adm0_a3_us": "BRN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "South-Eastern Asia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 6,
+ "long_len": 17,
+ "abbrev_len": 6,
+ "tiny": 2,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 322,
+ 323
+ ]
+ ],
+ [
+ [
+ 324,
+ 325
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Bhutan",
+ "sov_a3": "BTN",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Bhutan",
+ "adm0_a3": "BTN",
+ "geou_dif": 0,
+ "geounit": "Bhutan",
+ "gu_a3": "BTN",
+ "su_dif": 0,
+ "subunit": "Bhutan",
+ "su_a3": "BTN",
+ "brk_diff": 0,
+ "name": "Bhutan",
+ "name_long": "Bhutan",
+ "brk_a3": "BTN",
+ "brk_name": "Bhutan",
+ "brk_group": null,
+ "abbrev": "Bhutan",
+ "postal": "BT",
+ "formal_en": "Kingdom of Bhutan",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Bhutan",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 6,
+ "mapcolor9": 1,
+ "mapcolor13": 8,
+ "pop_est": 691141,
+ "gdp_md_est": 3524,
+ "pop_year": -99,
+ "lastcensus": 2005,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "BT",
+ "iso_a3": "BTN",
+ "iso_n3": "064",
+ "un_a3": "064",
+ "wb_a2": "BT",
+ "wb_a3": "BTN",
+ "woe_id": -99,
+ "adm0_a3_is": "BTN",
+ "adm0_a3_us": "BTN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Southern Asia",
+ "region_wb": "South Asia",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 326,
+ 327
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Botswana",
+ "sov_a3": "BWA",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Botswana",
+ "adm0_a3": "BWA",
+ "geou_dif": 0,
+ "geounit": "Botswana",
+ "gu_a3": "BWA",
+ "su_dif": 0,
+ "subunit": "Botswana",
+ "su_a3": "BWA",
+ "brk_diff": 0,
+ "name": "Botswana",
+ "name_long": "Botswana",
+ "brk_a3": "BWA",
+ "brk_name": "Botswana",
+ "brk_group": null,
+ "abbrev": "Bwa.",
+ "postal": "BW",
+ "formal_en": "Republic of Botswana",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Botswana",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 5,
+ "mapcolor9": 7,
+ "mapcolor13": 3,
+ "pop_est": 1990876,
+ "gdp_md_est": 27060,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "BW",
+ "iso_a3": "BWA",
+ "iso_n3": "072",
+ "un_a3": "072",
+ "wb_a2": "BW",
+ "wb_a3": "BWA",
+ "woe_id": -99,
+ "adm0_a3_is": "BWA",
+ "adm0_a3_us": "BWA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Southern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 328,
+ 329,
+ 330
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Central African Republic",
+ "sov_a3": "CAF",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Central African Republic",
+ "adm0_a3": "CAF",
+ "geou_dif": 0,
+ "geounit": "Central African Republic",
+ "gu_a3": "CAF",
+ "su_dif": 0,
+ "subunit": "Central African Republic",
+ "su_a3": "CAF",
+ "brk_diff": 0,
+ "name": "Central African Rep.",
+ "name_long": "Central African Republic",
+ "brk_a3": "CAF",
+ "brk_name": "Central African Rep.",
+ "brk_group": null,
+ "abbrev": "C.A.R.",
+ "postal": "CF",
+ "formal_en": "Central African Republic",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Central African Republic",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 6,
+ "mapcolor9": 6,
+ "mapcolor13": 9,
+ "pop_est": 4511488,
+ "gdp_md_est": 3198,
+ "pop_year": -99,
+ "lastcensus": 2003,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "CF",
+ "iso_a3": "CAF",
+ "iso_n3": "140",
+ "un_a3": "140",
+ "wb_a2": "CF",
+ "wb_a3": "CAF",
+ "woe_id": -99,
+ "adm0_a3_is": "CAF",
+ "adm0_a3_us": "CAF",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Middle Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 20,
+ "long_len": 24,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 331,
+ 332,
+ 333,
+ 334,
+ 335,
+ 336
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Canada",
+ "sov_a3": "CAN",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Canada",
+ "adm0_a3": "CAN",
+ "geou_dif": 0,
+ "geounit": "Canada",
+ "gu_a3": "CAN",
+ "su_dif": 0,
+ "subunit": "Canada",
+ "su_a3": "CAN",
+ "brk_diff": 0,
+ "name": "Canada",
+ "name_long": "Canada",
+ "brk_a3": "CAN",
+ "brk_name": "Canada",
+ "brk_group": null,
+ "abbrev": "Can.",
+ "postal": "CA",
+ "formal_en": "Canada",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Canada",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 6,
+ "mapcolor9": 2,
+ "mapcolor13": 2,
+ "pop_est": 33487208,
+ "gdp_md_est": 1300000,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "1. Developed region: G7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "CA",
+ "iso_a3": "CAN",
+ "iso_n3": "124",
+ "un_a3": "124",
+ "wb_a2": "CA",
+ "wb_a3": "CAN",
+ "woe_id": -99,
+ "adm0_a3_is": "CAN",
+ "adm0_a3_us": "CAN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Northern America",
+ "region_wb": "North America",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 337
+ ]
+ ],
+ [
+ [
+ 338
+ ]
+ ],
+ [
+ [
+ 339
+ ]
+ ],
+ [
+ [
+ 340
+ ]
+ ],
+ [
+ [
+ 341
+ ]
+ ],
+ [
+ [
+ 342
+ ]
+ ],
+ [
+ [
+ 343
+ ]
+ ],
+ [
+ [
+ 344
+ ]
+ ],
+ [
+ [
+ 345
+ ]
+ ],
+ [
+ [
+ 346
+ ]
+ ],
+ [
+ [
+ 347
+ ]
+ ],
+ [
+ [
+ 348
+ ]
+ ],
+ [
+ [
+ 349
+ ]
+ ],
+ [
+ [
+ 350
+ ]
+ ],
+ [
+ [
+ 351
+ ]
+ ],
+ [
+ [
+ 352,
+ 353
+ ]
+ ],
+ [
+ [
+ 354
+ ]
+ ],
+ [
+ [
+ 355
+ ]
+ ],
+ [
+ [
+ 356
+ ]
+ ],
+ [
+ [
+ 357
+ ]
+ ],
+ [
+ [
+ 358
+ ]
+ ],
+ [
+ [
+ 359
+ ]
+ ],
+ [
+ [
+ 360
+ ]
+ ],
+ [
+ [
+ 361
+ ]
+ ],
+ [
+ [
+ 362
+ ]
+ ],
+ [
+ [
+ 363
+ ]
+ ],
+ [
+ [
+ 364
+ ]
+ ],
+ [
+ [
+ 365
+ ]
+ ],
+ [
+ [
+ 366
+ ]
+ ],
+ [
+ [
+ 367
+ ]
+ ],
+ [
+ [
+ 368
+ ]
+ ],
+ [
+ [
+ 369
+ ]
+ ],
+ [
+ [
+ 370
+ ]
+ ],
+ [
+ [
+ 371
+ ]
+ ],
+ [
+ [
+ 372
+ ]
+ ],
+ [
+ [
+ 373
+ ]
+ ],
+ [
+ [
+ 374
+ ]
+ ],
+ [
+ [
+ 375
+ ]
+ ],
+ [
+ [
+ 376
+ ]
+ ],
+ [
+ [
+ 377
+ ]
+ ],
+ [
+ [
+ 378
+ ]
+ ],
+ [
+ [
+ 379
+ ]
+ ],
+ [
+ [
+ 380
+ ]
+ ],
+ [
+ [
+ 381,
+ 382
+ ]
+ ],
+ [
+ [
+ 383
+ ]
+ ],
+ [
+ [
+ 384
+ ]
+ ],
+ [
+ [
+ 385
+ ]
+ ],
+ [
+ [
+ 386
+ ]
+ ],
+ [
+ [
+ 387
+ ]
+ ],
+ [
+ [
+ 388
+ ]
+ ],
+ [
+ [
+ 389
+ ]
+ ],
+ [
+ [
+ 390
+ ]
+ ],
+ [
+ [
+ 391
+ ]
+ ],
+ [
+ [
+ 392
+ ]
+ ],
+ [
+ [
+ 393
+ ]
+ ],
+ [
+ [
+ 394
+ ]
+ ],
+ [
+ [
+ 395
+ ]
+ ],
+ [
+ [
+ 396
+ ]
+ ],
+ [
+ [
+ 397
+ ]
+ ],
+ [
+ [
+ 398
+ ]
+ ],
+ [
+ [
+ 399
+ ]
+ ],
+ [
+ [
+ 400
+ ]
+ ],
+ [
+ [
+ 401
+ ]
+ ],
+ [
+ [
+ 402
+ ]
+ ],
+ [
+ [
+ 403
+ ]
+ ],
+ [
+ [
+ 404
+ ]
+ ],
+ [
+ [
+ 405
+ ]
+ ],
+ [
+ [
+ 406
+ ]
+ ],
+ [
+ [
+ 407
+ ]
+ ],
+ [
+ [
+ 408
+ ]
+ ],
+ [
+ [
+ 409
+ ]
+ ],
+ [
+ [
+ 410
+ ]
+ ],
+ [
+ [
+ 411
+ ]
+ ],
+ [
+ [
+ 412
+ ]
+ ],
+ [
+ [
+ 413
+ ]
+ ],
+ [
+ [
+ 414
+ ]
+ ],
+ [
+ [
+ 415
+ ]
+ ],
+ [
+ [
+ 416
+ ]
+ ],
+ [
+ [
+ 417
+ ]
+ ],
+ [
+ [
+ 418
+ ]
+ ],
+ [
+ [
+ 419
+ ]
+ ],
+ [
+ [
+ 420
+ ]
+ ],
+ [
+ [
+ 421
+ ]
+ ],
+ [
+ [
+ 422
+ ]
+ ],
+ [
+ [
+ 423
+ ]
+ ],
+ [
+ [
+ 424
+ ]
+ ],
+ [
+ [
+ 425
+ ]
+ ],
+ [
+ [
+ 426
+ ]
+ ],
+ [
+ [
+ 427
+ ]
+ ],
+ [
+ [
+ 428
+ ]
+ ],
+ [
+ [
+ 429
+ ]
+ ],
+ [
+ [
+ 430
+ ]
+ ],
+ [
+ [
+ 431
+ ]
+ ],
+ [
+ [
+ 432
+ ]
+ ],
+ [
+ [
+ 433
+ ]
+ ],
+ [
+ [
+ 434
+ ]
+ ],
+ [
+ [
+ 435
+ ]
+ ],
+ [
+ [
+ 436
+ ]
+ ],
+ [
+ [
+ 437
+ ]
+ ],
+ [
+ [
+ 438
+ ]
+ ],
+ [
+ [
+ 439,
+ 440,
+ 441,
+ 442
+ ]
+ ],
+ [
+ [
+ 443
+ ]
+ ],
+ [
+ [
+ 444
+ ]
+ ],
+ [
+ [
+ 445
+ ]
+ ],
+ [
+ [
+ 446
+ ]
+ ],
+ [
+ [
+ 447
+ ]
+ ],
+ [
+ [
+ 448
+ ]
+ ],
+ [
+ [
+ 449
+ ]
+ ],
+ [
+ [
+ 450
+ ]
+ ],
+ [
+ [
+ 451
+ ]
+ ],
+ [
+ [
+ 452
+ ]
+ ],
+ [
+ [
+ 453
+ ]
+ ],
+ [
+ [
+ 454
+ ]
+ ],
+ [
+ [
+ 455
+ ]
+ ],
+ [
+ [
+ 456
+ ]
+ ],
+ [
+ [
+ 457
+ ]
+ ],
+ [
+ [
+ 458
+ ]
+ ],
+ [
+ [
+ 459
+ ]
+ ],
+ [
+ [
+ 460
+ ]
+ ],
+ [
+ [
+ 461
+ ]
+ ],
+ [
+ [
+ 462
+ ]
+ ],
+ [
+ [
+ 463
+ ]
+ ],
+ [
+ [
+ 464
+ ]
+ ],
+ [
+ [
+ 465
+ ]
+ ],
+ [
+ [
+ 466
+ ]
+ ],
+ [
+ [
+ 467
+ ]
+ ],
+ [
+ [
+ 468
+ ]
+ ],
+ [
+ [
+ 469
+ ]
+ ],
+ [
+ [
+ 470
+ ]
+ ],
+ [
+ [
+ 471
+ ]
+ ],
+ [
+ [
+ 472
+ ]
+ ],
+ [
+ [
+ 473
+ ]
+ ],
+ [
+ [
+ 474
+ ]
+ ],
+ [
+ [
+ 475
+ ]
+ ],
+ [
+ [
+ 476
+ ]
+ ],
+ [
+ [
+ 477
+ ]
+ ],
+ [
+ [
+ 478
+ ]
+ ],
+ [
+ [
+ 479
+ ]
+ ],
+ [
+ [
+ 480
+ ]
+ ],
+ [
+ [
+ 481
+ ]
+ ],
+ [
+ [
+ 482
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Switzerland",
+ "sov_a3": "CHE",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Switzerland",
+ "adm0_a3": "CHE",
+ "geou_dif": 0,
+ "geounit": "Switzerland",
+ "gu_a3": "CHE",
+ "su_dif": 0,
+ "subunit": "Switzerland",
+ "su_a3": "CHE",
+ "brk_diff": 0,
+ "name": "Switzerland",
+ "name_long": "Switzerland",
+ "brk_a3": "CHE",
+ "brk_name": "Switzerland",
+ "brk_group": null,
+ "abbrev": "Switz.",
+ "postal": "CH",
+ "formal_en": "Swiss Confederation",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Switzerland",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 2,
+ "mapcolor9": 7,
+ "mapcolor13": 3,
+ "pop_est": 7604467,
+ "gdp_md_est": 316700,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "CH",
+ "iso_a3": "CHE",
+ "iso_n3": "756",
+ "un_a3": "756",
+ "wb_a2": "CH",
+ "wb_a3": "CHE",
+ "woe_id": -99,
+ "adm0_a3_is": "CHE",
+ "adm0_a3_us": "CHE",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Western Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 11,
+ "long_len": 11,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -216,
+ 483,
+ -214,
+ 484,
+ 485,
+ 486
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Chile",
+ "sov_a3": "CHL",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Chile",
+ "adm0_a3": "CHL",
+ "geou_dif": 0,
+ "geounit": "Chile",
+ "gu_a3": "CHL",
+ "su_dif": 0,
+ "subunit": "Chile",
+ "su_a3": "CHL",
+ "brk_diff": 0,
+ "name": "Chile",
+ "name_long": "Chile",
+ "brk_a3": "CHL",
+ "brk_name": "Chile",
+ "brk_group": null,
+ "abbrev": "Chile",
+ "postal": "CL",
+ "formal_en": "Republic of Chile",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Chile",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 1,
+ "mapcolor9": 5,
+ "mapcolor13": 9,
+ "pop_est": 16601707,
+ "gdp_md_est": 244500,
+ "pop_year": -99,
+ "lastcensus": 2002,
+ "gdp_year": -99,
+ "economy": "5. Emerging region: G20",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "CL",
+ "iso_a3": "CHL",
+ "iso_n3": "152",
+ "un_a3": "152",
+ "wb_a2": "CL",
+ "wb_a3": "CHL",
+ "woe_id": -99,
+ "adm0_a3_is": "CHL",
+ "adm0_a3_us": "CHL",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "South America",
+ "region_un": "Americas",
+ "subregion": "South America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 487
+ ]
+ ],
+ [
+ [
+ 488
+ ]
+ ],
+ [
+ [
+ 489
+ ]
+ ],
+ [
+ [
+ 490
+ ]
+ ],
+ [
+ [
+ 491
+ ]
+ ],
+ [
+ [
+ 492
+ ]
+ ],
+ [
+ [
+ 493
+ ]
+ ],
+ [
+ [
+ 494
+ ]
+ ],
+ [
+ [
+ 495
+ ]
+ ],
+ [
+ [
+ -38,
+ 496
+ ]
+ ],
+ [
+ [
+ 497
+ ]
+ ],
+ [
+ [
+ 498
+ ]
+ ],
+ [
+ [
+ 499
+ ]
+ ],
+ [
+ [
+ 500
+ ]
+ ],
+ [
+ [
+ 501
+ ]
+ ],
+ [
+ [
+ 502
+ ]
+ ],
+ [
+ [
+ 503
+ ]
+ ],
+ [
+ [
+ 504
+ ]
+ ],
+ [
+ [
+ 505
+ ]
+ ],
+ [
+ [
+ 506
+ ]
+ ],
+ [
+ [
+ 507
+ ]
+ ],
+ [
+ [
+ 508
+ ]
+ ],
+ [
+ [
+ 509
+ ]
+ ],
+ [
+ [
+ 510
+ ]
+ ],
+ [
+ [
+ 511
+ ]
+ ],
+ [
+ [
+ 512
+ ]
+ ],
+ [
+ [
+ 513
+ ]
+ ],
+ [
+ [
+ 514
+ ]
+ ],
+ [
+ [
+ 515
+ ]
+ ],
+ [
+ [
+ 516
+ ]
+ ],
+ [
+ [
+ -45,
+ 517,
+ 518,
+ -294
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "China",
+ "sov_a3": "CH1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Country",
+ "admin": "China",
+ "adm0_a3": "CHN",
+ "geou_dif": 0,
+ "geounit": "China",
+ "gu_a3": "CHN",
+ "su_dif": 0,
+ "subunit": "China",
+ "su_a3": "CHN",
+ "brk_diff": 0,
+ "name": "China",
+ "name_long": "China",
+ "brk_a3": "CHN",
+ "brk_name": "China",
+ "brk_group": null,
+ "abbrev": "China",
+ "postal": "CN",
+ "formal_en": "People's Republic of China",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "China",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 4,
+ "mapcolor9": 4,
+ "mapcolor13": 3,
+ "pop_est": 1338612970,
+ "gdp_md_est": 7973000,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "3. Emerging region: BRIC",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "CN",
+ "iso_a3": "CHN",
+ "iso_n3": "156",
+ "un_a3": "156",
+ "wb_a2": "CN",
+ "wb_a3": "CHN",
+ "woe_id": -99,
+ "adm0_a3_is": "CHN",
+ "adm0_a3_us": "CHN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Eastern Asia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 519
+ ]
+ ],
+ [
+ [
+ 520
+ ]
+ ],
+ [
+ [
+ 521
+ ]
+ ],
+ [
+ [
+ 522
+ ]
+ ],
+ [
+ [
+ 523
+ ]
+ ],
+ [
+ [
+ 524
+ ]
+ ],
+ [
+ [
+ 525
+ ]
+ ],
+ [
+ [
+ 526
+ ]
+ ],
+ [
+ [
+ 527
+ ]
+ ],
+ [
+ [
+ 528
+ ]
+ ],
+ [
+ [
+ 529
+ ]
+ ],
+ [
+ [
+ 530
+ ]
+ ],
+ [
+ [
+ 531,
+ 532,
+ 533,
+ 534,
+ 535,
+ 536,
+ 537,
+ 538,
+ 539,
+ 540,
+ -328,
+ 541,
+ 542,
+ 543,
+ 544,
+ 545,
+ 546,
+ 547,
+ 548,
+ 549,
+ 550,
+ 551,
+ 552,
+ 553,
+ 554,
+ 555,
+ 556,
+ -2,
+ 557,
+ 558,
+ 559,
+ 560,
+ 561,
+ 562
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Ivory Coast",
+ "sov_a3": "CIV",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Ivory Coast",
+ "adm0_a3": "CIV",
+ "geou_dif": 0,
+ "geounit": "Ivory Coast",
+ "gu_a3": "CIV",
+ "su_dif": 0,
+ "subunit": "Ivory Coast",
+ "su_a3": "CIV",
+ "brk_diff": 0,
+ "name": "Côte d'Ivoire",
+ "name_long": "Côte d'Ivoire",
+ "brk_a3": "CIV",
+ "brk_name": "Côte d'Ivoire",
+ "brk_group": null,
+ "abbrev": "I.C.",
+ "postal": "CI",
+ "formal_en": "Republic of Ivory Coast",
+ "formal_fr": "Republic of Cote D'Ivoire",
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Côte d'Ivoire",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 6,
+ "mapcolor9": 3,
+ "mapcolor13": 3,
+ "pop_est": 20617068,
+ "gdp_md_est": 33850,
+ "pop_year": -99,
+ "lastcensus": 1998,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "CI",
+ "iso_a3": "CIV",
+ "iso_n3": "384",
+ "un_a3": "384",
+ "wb_a2": "CI",
+ "wb_a3": "CIV",
+ "woe_id": -99,
+ "adm0_a3_is": "CIV",
+ "adm0_a3_us": "CIV",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Western Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 13,
+ "long_len": 13,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 563,
+ 564
+ ]
+ ],
+ [
+ [
+ -243,
+ 565,
+ 566,
+ 567,
+ 568,
+ 569
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Cameroon",
+ "sov_a3": "CMR",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Cameroon",
+ "adm0_a3": "CMR",
+ "geou_dif": 0,
+ "geounit": "Cameroon",
+ "gu_a3": "CMR",
+ "su_dif": 0,
+ "subunit": "Cameroon",
+ "su_a3": "CMR",
+ "brk_diff": 0,
+ "name": "Cameroon",
+ "name_long": "Cameroon",
+ "brk_a3": "CMR",
+ "brk_name": "Cameroon",
+ "brk_group": null,
+ "abbrev": "Cam.",
+ "postal": "CM",
+ "formal_en": "Republic of Cameroon",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Cameroon",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 4,
+ "mapcolor9": 1,
+ "mapcolor13": 3,
+ "pop_est": 18879301,
+ "gdp_md_est": 42750,
+ "pop_year": -99,
+ "lastcensus": 2005,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "CM",
+ "iso_a3": "CMR",
+ "iso_n3": "120",
+ "un_a3": "120",
+ "wb_a2": "CM",
+ "wb_a3": "CMR",
+ "woe_id": -99,
+ "adm0_a3_is": "CMR",
+ "adm0_a3_us": "CMR",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Middle Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -336,
+ 570,
+ 571,
+ 572,
+ 573,
+ 574,
+ 575
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Democratic Republic of the Congo",
+ "sov_a3": "COD",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Democratic Republic of the Congo",
+ "adm0_a3": "COD",
+ "geou_dif": 0,
+ "geounit": "Democratic Republic of the Congo",
+ "gu_a3": "COD",
+ "su_dif": 0,
+ "subunit": "Democratic Republic of the Congo",
+ "su_a3": "COD",
+ "brk_diff": 0,
+ "name": "Dem. Rep. Congo",
+ "name_long": "Democratic Republic of the Congo",
+ "brk_a3": "COD",
+ "brk_name": "Democratic Republic of the Congo",
+ "brk_group": null,
+ "abbrev": "D.R.C.",
+ "postal": "DRC",
+ "formal_en": "Democratic Republic of the Congo",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Congo, Dem. Rep.",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 4,
+ "mapcolor9": 4,
+ "mapcolor13": 7,
+ "pop_est": 68692542,
+ "gdp_md_est": 20640,
+ "pop_year": -99,
+ "lastcensus": 1984,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "CD",
+ "iso_a3": "COD",
+ "iso_n3": "180",
+ "un_a3": "180",
+ "wb_a2": "ZR",
+ "wb_a3": "ZAR",
+ "woe_id": -99,
+ "adm0_a3_is": "COD",
+ "adm0_a3_us": "COD",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Middle Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 15,
+ "long_len": 32,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 576,
+ 577,
+ 578,
+ -226,
+ 579,
+ 580,
+ -12,
+ 581,
+ -15,
+ 582,
+ -334
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Republic of Congo",
+ "sov_a3": "COG",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Republic of Congo",
+ "adm0_a3": "COG",
+ "geou_dif": 0,
+ "geounit": "Republic of Congo",
+ "gu_a3": "COG",
+ "su_dif": 0,
+ "subunit": "Republic of Congo",
+ "su_a3": "COG",
+ "brk_diff": 0,
+ "name": "Congo",
+ "name_long": "Republic of Congo",
+ "brk_a3": "COG",
+ "brk_name": "Republic of Congo",
+ "brk_group": null,
+ "abbrev": "Rep. Congo",
+ "postal": "CG",
+ "formal_en": "Republic of Congo",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Congo, Rep.",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 1,
+ "mapcolor9": 3,
+ "mapcolor13": 10,
+ "pop_est": 4012809,
+ "gdp_md_est": 15350,
+ "pop_year": -99,
+ "lastcensus": 2007,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "CG",
+ "iso_a3": "COG",
+ "iso_n3": "178",
+ "un_a3": "178",
+ "wb_a2": "CG",
+ "wb_a3": "COG",
+ "woe_id": -99,
+ "adm0_a3_is": "COG",
+ "adm0_a3_us": "COG",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Middle Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 5,
+ "long_len": 17,
+ "abbrev_len": 10,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -583,
+ -14,
+ 583,
+ 584,
+ -571,
+ -335
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "New Zealand",
+ "sov_a3": "NZ1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Cook Islands",
+ "adm0_a3": "COK",
+ "geou_dif": 0,
+ "geounit": "Cook Islands",
+ "gu_a3": "COK",
+ "su_dif": 0,
+ "subunit": "Cook Islands",
+ "su_a3": "COK",
+ "brk_diff": 0,
+ "name": "Cook Is.",
+ "name_long": "Cook Islands",
+ "brk_a3": "COK",
+ "brk_name": "Cook Is.",
+ "brk_group": null,
+ "abbrev": "Cook Is.",
+ "postal": "CK",
+ "formal_en": null,
+ "formal_fr": null,
+ "note_adm0": "Assoc. with N.Z.",
+ "note_brk": null,
+ "name_sort": "Cook Islands",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 3,
+ "mapcolor9": 4,
+ "mapcolor13": 4,
+ "pop_est": 11870,
+ "gdp_md_est": 183.2,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "CK",
+ "iso_a3": "COK",
+ "iso_n3": "184",
+ "un_a3": "184",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "COK",
+ "adm0_a3_us": "COK",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Polynesia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 8,
+ "long_len": 12,
+ "abbrev_len": 8,
+ "tiny": 3,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ 585
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Colombia",
+ "sov_a3": "COL",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Colombia",
+ "adm0_a3": "COL",
+ "geou_dif": 0,
+ "geounit": "Colombia",
+ "gu_a3": "COL",
+ "su_dif": 0,
+ "subunit": "Colombia",
+ "su_a3": "COL",
+ "brk_diff": 0,
+ "name": "Colombia",
+ "name_long": "Colombia",
+ "brk_a3": "COL",
+ "brk_name": "Colombia",
+ "brk_group": null,
+ "abbrev": "Col.",
+ "postal": "CO",
+ "formal_en": "Republic of Colombia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Colombia",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 1,
+ "mapcolor9": 3,
+ "mapcolor13": 1,
+ "pop_est": 45644023,
+ "gdp_md_est": 395400,
+ "pop_year": -99,
+ "lastcensus": 2006,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "CO",
+ "iso_a3": "COL",
+ "iso_n3": "170",
+ "un_a3": "170",
+ "wb_a2": "CO",
+ "wb_a3": "COL",
+ "woe_id": -99,
+ "adm0_a3_is": "COL",
+ "adm0_a3_us": "COL",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "South America",
+ "region_un": "Americas",
+ "subregion": "South America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 586
+ ]
+ ],
+ [
+ [
+ 587,
+ -319,
+ 588,
+ 589,
+ 590,
+ 591,
+ 592
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Comoros",
+ "sov_a3": "COM",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Comoros",
+ "adm0_a3": "COM",
+ "geou_dif": 0,
+ "geounit": "Comoros",
+ "gu_a3": "COM",
+ "su_dif": 0,
+ "subunit": "Comoros",
+ "su_a3": "COM",
+ "brk_diff": 0,
+ "name": "Comoros",
+ "name_long": "Comoros",
+ "brk_a3": "COM",
+ "brk_name": "Comoros",
+ "brk_group": null,
+ "abbrev": "Com.",
+ "postal": "KM",
+ "formal_en": "Union of the Comoros",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Comoros",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 1,
+ "mapcolor9": 4,
+ "mapcolor13": 10,
+ "pop_est": 752438,
+ "gdp_md_est": 751.2,
+ "pop_year": -99,
+ "lastcensus": 2003,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "KM",
+ "iso_a3": "COM",
+ "iso_n3": "174",
+ "un_a3": "174",
+ "wb_a2": "KM",
+ "wb_a3": "COM",
+ "woe_id": -99,
+ "adm0_a3_is": "COM",
+ "adm0_a3_us": "COM",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Eastern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": 2,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 593
+ ]
+ ],
+ [
+ [
+ 594
+ ]
+ ],
+ [
+ [
+ 595
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Cape Verde",
+ "sov_a3": "CPV",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Cape Verde",
+ "adm0_a3": "CPV",
+ "geou_dif": 0,
+ "geounit": "Cape Verde",
+ "gu_a3": "CPV",
+ "su_dif": 0,
+ "subunit": "Cape Verde",
+ "su_a3": "CPV",
+ "brk_diff": 0,
+ "name": "Cape Verde",
+ "name_long": "Cape Verde",
+ "brk_a3": "CPV",
+ "brk_name": "Cape Verde",
+ "brk_group": null,
+ "abbrev": "C.Vd.",
+ "postal": "CV",
+ "formal_en": "Republic of Cape Verde",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Cape Verde",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 1,
+ "mapcolor9": 4,
+ "mapcolor13": 11,
+ "pop_est": 429474,
+ "gdp_md_est": 1626,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "CV",
+ "iso_a3": "CPV",
+ "iso_n3": "132",
+ "un_a3": "132",
+ "wb_a2": "CV",
+ "wb_a3": "CPV",
+ "woe_id": -99,
+ "adm0_a3_is": "CPV",
+ "adm0_a3_us": "CPV",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Western Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 10,
+ "long_len": 10,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 596
+ ]
+ ],
+ [
+ [
+ 597
+ ]
+ ],
+ [
+ [
+ 598
+ ]
+ ],
+ [
+ [
+ 599
+ ]
+ ],
+ [
+ [
+ 600
+ ]
+ ],
+ [
+ [
+ 601
+ ]
+ ],
+ [
+ [
+ 602
+ ]
+ ],
+ [
+ [
+ 603
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Costa Rica",
+ "sov_a3": "CRI",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Costa Rica",
+ "adm0_a3": "CRI",
+ "geou_dif": 0,
+ "geounit": "Costa Rica",
+ "gu_a3": "CRI",
+ "su_dif": 0,
+ "subunit": "Costa Rica",
+ "su_a3": "CRI",
+ "brk_diff": 0,
+ "name": "Costa Rica",
+ "name_long": "Costa Rica",
+ "brk_a3": "CRI",
+ "brk_name": "Costa Rica",
+ "brk_group": null,
+ "abbrev": "C.R.",
+ "postal": "CR",
+ "formal_en": "Republic of Costa Rica",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Costa Rica",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 2,
+ "mapcolor9": 4,
+ "mapcolor13": 2,
+ "pop_est": 4253877,
+ "gdp_md_est": 48320,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "5. Emerging region: G20",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "CR",
+ "iso_a3": "CRI",
+ "iso_n3": "188",
+ "un_a3": "188",
+ "wb_a2": "CR",
+ "wb_a3": "CRI",
+ "woe_id": -99,
+ "adm0_a3_is": "CRI",
+ "adm0_a3_us": "CRI",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Central America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 10,
+ "long_len": 10,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 604,
+ 605,
+ 606,
+ 607
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Cuba",
+ "sov_a3": "CUB",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Cuba",
+ "adm0_a3": "CUB",
+ "geou_dif": 0,
+ "geounit": "Cuba",
+ "gu_a3": "CUB",
+ "su_dif": 0,
+ "subunit": "Cuba",
+ "su_a3": "CUB",
+ "brk_diff": 0,
+ "name": "Cuba",
+ "name_long": "Cuba",
+ "brk_a3": "CUB",
+ "brk_name": "Cuba",
+ "brk_group": null,
+ "abbrev": "Cuba",
+ "postal": "CU",
+ "formal_en": "Republic of Cuba",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Cuba",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 5,
+ "mapcolor9": 3,
+ "mapcolor13": 4,
+ "pop_est": 11451652,
+ "gdp_md_est": 108200,
+ "pop_year": -99,
+ "lastcensus": 2002,
+ "gdp_year": -99,
+ "economy": "5. Emerging region: G20",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "CU",
+ "iso_a3": "CUB",
+ "iso_n3": "192",
+ "un_a3": "192",
+ "wb_a2": "CU",
+ "wb_a3": "CUB",
+ "woe_id": -99,
+ "adm0_a3_is": "CUB",
+ "adm0_a3_us": "CUB",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 4,
+ "long_len": 4,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 608
+ ]
+ ],
+ [
+ [
+ 609
+ ]
+ ],
+ [
+ [
+ 610
+ ]
+ ],
+ [
+ [
+ 611
+ ]
+ ],
+ [
+ [
+ 612
+ ]
+ ],
+ [
+ [
+ 613
+ ]
+ ],
+ [
+ [
+ 614
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Netherlands",
+ "sov_a3": "NL1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Country",
+ "admin": "Curaçao",
+ "adm0_a3": "CUW",
+ "geou_dif": 0,
+ "geounit": "Curaçao",
+ "gu_a3": "CUW",
+ "su_dif": 0,
+ "subunit": "Curaçao",
+ "su_a3": "CUW",
+ "brk_diff": 0,
+ "name": "Curaçao",
+ "name_long": "Curaçao",
+ "brk_a3": "CUW",
+ "brk_name": "Curaçao",
+ "brk_group": null,
+ "abbrev": "Cur.",
+ "postal": "CW",
+ "formal_en": "Curaçao",
+ "formal_fr": null,
+ "note_adm0": "Neth.",
+ "note_brk": null,
+ "name_sort": "Curaçao",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 2,
+ "mapcolor9": 2,
+ "mapcolor13": 9,
+ "pop_est": 141766,
+ "gdp_md_est": 2838,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "CW",
+ "iso_a3": "CUW",
+ "iso_n3": "531",
+ "un_a3": "531",
+ "wb_a2": "CW",
+ "wb_a3": "CUW",
+ "woe_id": -99,
+ "adm0_a3_is": "CUW",
+ "adm0_a3_us": "CUW",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": 4,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ 615
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "United Kingdom",
+ "sov_a3": "GB1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Cayman Islands",
+ "adm0_a3": "CYM",
+ "geou_dif": 0,
+ "geounit": "Cayman Islands",
+ "gu_a3": "CYM",
+ "su_dif": 0,
+ "subunit": "Cayman Islands",
+ "su_a3": "CYM",
+ "brk_diff": 0,
+ "name": "Cayman Is.",
+ "name_long": "Cayman Islands",
+ "brk_a3": "CYM",
+ "brk_name": "Cayman Is.",
+ "brk_group": null,
+ "abbrev": "Cym. Is.",
+ "postal": "KY",
+ "formal_en": "Cayman Islands",
+ "formal_fr": null,
+ "note_adm0": "U.K.",
+ "note_brk": null,
+ "name_sort": "Cayman Islands",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 6,
+ "mapcolor9": 6,
+ "mapcolor13": 3,
+ "pop_est": 49035,
+ "gdp_md_est": 1939,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "5. Emerging region: G20",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "KY",
+ "iso_a3": "CYM",
+ "iso_n3": "136",
+ "un_a3": "136",
+ "wb_a2": "KY",
+ "wb_a3": "CYM",
+ "woe_id": -99,
+ "adm0_a3_is": "CYM",
+ "adm0_a3_us": "CYM",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 10,
+ "long_len": 14,
+ "abbrev_len": 8,
+ "tiny": 2,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ [
+ 616
+ ]
+ ],
+ [
+ [
+ 617
+ ]
+ ],
+ [
+ [
+ 618
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Northern Cyprus",
+ "sov_a3": "CYN",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Northern Cyprus",
+ "adm0_a3": "CYN",
+ "geou_dif": 0,
+ "geounit": "Northern Cyprus",
+ "gu_a3": "CYN",
+ "su_dif": 0,
+ "subunit": "Northern Cyprus",
+ "su_a3": "CYN",
+ "brk_diff": 1,
+ "name": "N. Cyprus",
+ "name_long": "Northern Cyprus",
+ "brk_a3": "B20",
+ "brk_name": "N. Cyprus",
+ "brk_group": null,
+ "abbrev": "N. Cy.",
+ "postal": "CN",
+ "formal_en": "Turkish Republic of Northern Cyprus",
+ "formal_fr": null,
+ "note_adm0": "Self admin.",
+ "note_brk": "Self admin.; Claimed by Cyprus",
+ "name_sort": "Cyprus, Northern",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 1,
+ "mapcolor9": 4,
+ "mapcolor13": 8,
+ "pop_est": 265100,
+ "gdp_md_est": 3600,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "-99",
+ "iso_a3": "-99",
+ "iso_n3": "-99",
+ "un_a3": "-099",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "CYP",
+ "adm0_a3_us": "CYP",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Western Asia",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 9,
+ "long_len": 15,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 619,
+ 620
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Cyprus",
+ "sov_a3": "CYP",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Cyprus",
+ "adm0_a3": "CYP",
+ "geou_dif": 0,
+ "geounit": "Cyprus",
+ "gu_a3": "CYP",
+ "su_dif": 0,
+ "subunit": "Cyprus",
+ "su_a3": "CYP",
+ "brk_diff": 0,
+ "name": "Cyprus",
+ "name_long": "Cyprus",
+ "brk_a3": "CYP",
+ "brk_name": "Cyprus",
+ "brk_group": null,
+ "abbrev": "Cyp.",
+ "postal": "CY",
+ "formal_en": "Republic of Cyprus",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Cyprus",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 2,
+ "mapcolor9": 3,
+ "mapcolor13": 7,
+ "pop_est": 531640,
+ "gdp_md_est": 22700,
+ "pop_year": -99,
+ "lastcensus": 2001,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "CY",
+ "iso_a3": "CYP",
+ "iso_n3": "196",
+ "un_a3": "196",
+ "wb_a2": "CY",
+ "wb_a3": "CYP",
+ "woe_id": -99,
+ "adm0_a3_is": "CYP",
+ "adm0_a3_us": "CYP",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Western Asia",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -620,
+ 621
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Czech Republic",
+ "sov_a3": "CZE",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Czech Republic",
+ "adm0_a3": "CZE",
+ "geou_dif": 0,
+ "geounit": "Czech Republic",
+ "gu_a3": "CZE",
+ "su_dif": 0,
+ "subunit": "Czech Republic",
+ "su_a3": "CZE",
+ "brk_diff": 0,
+ "name": "Czech Rep.",
+ "name_long": "Czech Republic",
+ "brk_a3": "CZE",
+ "brk_name": "Czech Rep.",
+ "brk_group": null,
+ "abbrev": "Cz. Rep.",
+ "postal": "CZ",
+ "formal_en": "Czech Republic",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Czech Republic",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 1,
+ "mapcolor9": 2,
+ "mapcolor13": 6,
+ "pop_est": 10211904,
+ "gdp_md_est": 265200,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "CZ",
+ "iso_a3": "CZE",
+ "iso_n3": "203",
+ "un_a3": "203",
+ "wb_a2": "CZ",
+ "wb_a3": "CZE",
+ "woe_id": -99,
+ "adm0_a3_is": "CZE",
+ "adm0_a3_us": "CZE",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Eastern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 10,
+ "long_len": 14,
+ "abbrev_len": 8,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 622,
+ 623,
+ -218,
+ 624
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Germany",
+ "sov_a3": "DEU",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Germany",
+ "adm0_a3": "DEU",
+ "geou_dif": 0,
+ "geounit": "Germany",
+ "gu_a3": "DEU",
+ "su_dif": 0,
+ "subunit": "Germany",
+ "su_a3": "DEU",
+ "brk_diff": 0,
+ "name": "Germany",
+ "name_long": "Germany",
+ "brk_a3": "DEU",
+ "brk_name": "Germany",
+ "brk_group": null,
+ "abbrev": "Ger.",
+ "postal": "D",
+ "formal_en": "Federal Republic of Germany",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Germany",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 5,
+ "mapcolor9": 5,
+ "mapcolor13": 1,
+ "pop_est": 82329758,
+ "gdp_md_est": 2918000,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "1. Developed region: G7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "DE",
+ "iso_a3": "DEU",
+ "iso_n3": "276",
+ "un_a3": "276",
+ "wb_a2": "DE",
+ "wb_a3": "DEU",
+ "woe_id": -99,
+ "adm0_a3_is": "DEU",
+ "adm0_a3_us": "DEU",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Western Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 625,
+ 626
+ ]
+ ],
+ [
+ [
+ 627
+ ]
+ ],
+ [
+ [
+ 628
+ ]
+ ],
+ [
+ [
+ 629
+ ]
+ ],
+ [
+ [
+ 630,
+ 631,
+ -625,
+ -217,
+ -487,
+ 632,
+ 633,
+ -229,
+ 634,
+ 635,
+ 636
+ ]
+ ],
+ [
+ [
+ 637
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Djibouti",
+ "sov_a3": "DJI",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Djibouti",
+ "adm0_a3": "DJI",
+ "geou_dif": 0,
+ "geounit": "Djibouti",
+ "gu_a3": "DJI",
+ "su_dif": 0,
+ "subunit": "Djibouti",
+ "su_a3": "DJI",
+ "brk_diff": 0,
+ "name": "Djibouti",
+ "name_long": "Djibouti",
+ "brk_a3": "DJI",
+ "brk_name": "Djibouti",
+ "brk_group": null,
+ "abbrev": "Dji.",
+ "postal": "DJ",
+ "formal_en": "Republic of Djibouti",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Djibouti",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 2,
+ "mapcolor9": 4,
+ "mapcolor13": 8,
+ "pop_est": 516055,
+ "gdp_md_est": 1885,
+ "pop_year": -99,
+ "lastcensus": 2009,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "DJ",
+ "iso_a3": "DJI",
+ "iso_n3": "262",
+ "un_a3": "262",
+ "wb_a2": "DJ",
+ "wb_a3": "DJI",
+ "woe_id": -99,
+ "adm0_a3_is": "DJI",
+ "adm0_a3_us": "DJI",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Eastern Africa",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 638,
+ 639,
+ 640,
+ 641
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Dominica",
+ "sov_a3": "DMA",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Dominica",
+ "adm0_a3": "DMA",
+ "geou_dif": 0,
+ "geounit": "Dominica",
+ "gu_a3": "DMA",
+ "su_dif": 0,
+ "subunit": "Dominica",
+ "su_a3": "DMA",
+ "brk_diff": 0,
+ "name": "Dominica",
+ "name_long": "Dominica",
+ "brk_a3": "DMA",
+ "brk_name": "Dominica",
+ "brk_group": null,
+ "abbrev": "D'inca",
+ "postal": "DM",
+ "formal_en": "Commonwealth of Dominica",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Dominica",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 5,
+ "mapcolor9": 2,
+ "mapcolor13": 12,
+ "pop_est": 72660,
+ "gdp_md_est": 719.6,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "DM",
+ "iso_a3": "DMA",
+ "iso_n3": "212",
+ "un_a3": "212",
+ "wb_a2": "DM",
+ "wb_a3": "DMA",
+ "woe_id": -99,
+ "adm0_a3_is": "DMA",
+ "adm0_a3_us": "DMA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 6,
+ "tiny": 4,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 642
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Denmark",
+ "sov_a3": "DN1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Country",
+ "admin": "Denmark",
+ "adm0_a3": "DNK",
+ "geou_dif": 0,
+ "geounit": "Denmark",
+ "gu_a3": "DNK",
+ "su_dif": 0,
+ "subunit": "Denmark",
+ "su_a3": "DNK",
+ "brk_diff": 0,
+ "name": "Denmark",
+ "name_long": "Denmark",
+ "brk_a3": "DNK",
+ "brk_name": "Denmark",
+ "brk_group": null,
+ "abbrev": "Den.",
+ "postal": "DK",
+ "formal_en": "Kingdom of Denmark",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Denmark",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 1,
+ "mapcolor9": 3,
+ "mapcolor13": 12,
+ "pop_est": 5500510,
+ "gdp_md_est": 203600,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "DK",
+ "iso_a3": "DNK",
+ "iso_n3": "208",
+ "un_a3": "208",
+ "wb_a2": "DK",
+ "wb_a3": "DNK",
+ "woe_id": -99,
+ "adm0_a3_is": "DNK",
+ "adm0_a3_us": "DNK",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Northern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 643
+ ]
+ ],
+ [
+ [
+ 644
+ ]
+ ],
+ [
+ [
+ 645
+ ]
+ ],
+ [
+ [
+ 646
+ ]
+ ],
+ [
+ [
+ 647
+ ]
+ ],
+ [
+ [
+ 648
+ ]
+ ],
+ [
+ [
+ 649
+ ]
+ ],
+ [
+ [
+ 650
+ ]
+ ],
+ [
+ [
+ 651
+ ]
+ ],
+ [
+ [
+ 652
+ ]
+ ],
+ [
+ [
+ 653
+ ]
+ ],
+ [
+ [
+ -637,
+ 654
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Dominican Republic",
+ "sov_a3": "DOM",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Dominican Republic",
+ "adm0_a3": "DOM",
+ "geou_dif": 0,
+ "geounit": "Dominican Republic",
+ "gu_a3": "DOM",
+ "su_dif": 0,
+ "subunit": "Dominican Republic",
+ "su_a3": "DOM",
+ "brk_diff": 0,
+ "name": "Dominican Rep.",
+ "name_long": "Dominican Republic",
+ "brk_a3": "DOM",
+ "brk_name": "Dominican Rep.",
+ "brk_group": null,
+ "abbrev": "Dom. Rep.",
+ "postal": "DO",
+ "formal_en": "Dominican Republic",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Dominican Republic",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 2,
+ "mapcolor9": 5,
+ "mapcolor13": 7,
+ "pop_est": 9650054,
+ "gdp_md_est": 78000,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "DO",
+ "iso_a3": "DOM",
+ "iso_n3": "214",
+ "un_a3": "214",
+ "wb_a2": "DO",
+ "wb_a3": "DOM",
+ "woe_id": -99,
+ "adm0_a3_is": "DOM",
+ "adm0_a3_us": "DOM",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 14,
+ "long_len": 18,
+ "abbrev_len": 9,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 655,
+ 656
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Algeria",
+ "sov_a3": "DZA",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Algeria",
+ "adm0_a3": "DZA",
+ "geou_dif": 0,
+ "geounit": "Algeria",
+ "gu_a3": "DZA",
+ "su_dif": 0,
+ "subunit": "Algeria",
+ "su_a3": "DZA",
+ "brk_diff": 0,
+ "name": "Algeria",
+ "name_long": "Algeria",
+ "brk_a3": "DZA",
+ "brk_name": "Algeria",
+ "brk_group": null,
+ "abbrev": "Alg.",
+ "postal": "DZ",
+ "formal_en": "People's Democratic Republic of Algeria",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Algeria",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 1,
+ "mapcolor9": 6,
+ "mapcolor13": 3,
+ "pop_est": 34178188,
+ "gdp_md_est": 232900,
+ "pop_year": -99,
+ "lastcensus": 2008,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "DZ",
+ "iso_a3": "DZA",
+ "iso_n3": "012",
+ "un_a3": "012",
+ "wb_a2": "DZ",
+ "wb_a3": "DZA",
+ "woe_id": -99,
+ "adm0_a3_is": "DZA",
+ "adm0_a3_us": "DZA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Northern Africa",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 657,
+ 658,
+ 659,
+ 660,
+ 661,
+ 662,
+ 663,
+ 664
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Ecuador",
+ "sov_a3": "ECU",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Ecuador",
+ "adm0_a3": "ECU",
+ "geou_dif": 0,
+ "geounit": "Ecuador",
+ "gu_a3": "ECU",
+ "su_dif": 0,
+ "subunit": "Ecuador",
+ "su_a3": "ECU",
+ "brk_diff": 0,
+ "name": "Ecuador",
+ "name_long": "Ecuador",
+ "brk_a3": "ECU",
+ "brk_name": "Ecuador",
+ "brk_group": null,
+ "abbrev": "Ecu.",
+ "postal": "EC",
+ "formal_en": "Republic of Ecuador",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Ecuador",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 5,
+ "mapcolor9": 2,
+ "mapcolor13": 12,
+ "pop_est": 14573101,
+ "gdp_md_est": 107700,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "EC",
+ "iso_a3": "ECU",
+ "iso_n3": "218",
+ "un_a3": "218",
+ "wb_a2": "EC",
+ "wb_a3": "ECU",
+ "woe_id": -99,
+ "adm0_a3_is": "ECU",
+ "adm0_a3_us": "ECU",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "South America",
+ "region_un": "Americas",
+ "subregion": "South America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 665
+ ]
+ ],
+ [
+ [
+ 666
+ ]
+ ],
+ [
+ [
+ 667
+ ]
+ ],
+ [
+ [
+ 668
+ ]
+ ],
+ [
+ [
+ 669
+ ]
+ ],
+ [
+ [
+ 670
+ ]
+ ],
+ [
+ [
+ 671
+ ]
+ ],
+ [
+ [
+ 672
+ ]
+ ],
+ [
+ [
+ 673,
+ 674,
+ -590
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Egypt",
+ "sov_a3": "EGY",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Egypt",
+ "adm0_a3": "EGY",
+ "geou_dif": 0,
+ "geounit": "Egypt",
+ "gu_a3": "EGY",
+ "su_dif": 0,
+ "subunit": "Egypt",
+ "su_a3": "EGY",
+ "brk_diff": 0,
+ "name": "Egypt",
+ "name_long": "Egypt",
+ "brk_a3": "EGY",
+ "brk_name": "Egypt",
+ "brk_group": null,
+ "abbrev": "Egypt",
+ "postal": "EG",
+ "formal_en": "Arab Republic of Egypt",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Egypt, Arab Rep.",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 6,
+ "mapcolor9": 7,
+ "mapcolor13": 2,
+ "pop_est": 83082869,
+ "gdp_md_est": 443700,
+ "pop_year": -99,
+ "lastcensus": 2006,
+ "gdp_year": -99,
+ "economy": "5. Emerging region: G20",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "EG",
+ "iso_a3": "EGY",
+ "iso_n3": "818",
+ "un_a3": "818",
+ "wb_a2": "EG",
+ "wb_a3": "EGY",
+ "woe_id": -99,
+ "adm0_a3_is": "EGY",
+ "adm0_a3_us": "EGY",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Northern Africa",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 675,
+ 676,
+ 677,
+ 678,
+ 679,
+ 680
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Eritrea",
+ "sov_a3": "ERI",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Eritrea",
+ "adm0_a3": "ERI",
+ "geou_dif": 0,
+ "geounit": "Eritrea",
+ "gu_a3": "ERI",
+ "su_dif": 0,
+ "subunit": "Eritrea",
+ "su_a3": "ERI",
+ "brk_diff": 0,
+ "name": "Eritrea",
+ "name_long": "Eritrea",
+ "brk_a3": "ERI",
+ "brk_name": "Eritrea",
+ "brk_group": null,
+ "abbrev": "Erit.",
+ "postal": "ER",
+ "formal_en": "State of Eritrea",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Eritrea",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 1,
+ "mapcolor9": 2,
+ "mapcolor13": 12,
+ "pop_est": 5647168,
+ "gdp_md_est": 3945,
+ "pop_year": -99,
+ "lastcensus": 1984,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "ER",
+ "iso_a3": "ERI",
+ "iso_n3": "232",
+ "un_a3": "232",
+ "wb_a2": "ER",
+ "wb_a3": "ERI",
+ "woe_id": -99,
+ "adm0_a3_is": "ERI",
+ "adm0_a3_us": "ERI",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Eastern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 681
+ ]
+ ],
+ [
+ [
+ 682
+ ]
+ ],
+ [
+ [
+ 683,
+ -641,
+ 684,
+ 685
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Spain",
+ "sov_a3": "ESP",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Spain",
+ "adm0_a3": "ESP",
+ "geou_dif": 0,
+ "geounit": "Spain",
+ "gu_a3": "ESP",
+ "su_dif": 0,
+ "subunit": "Spain",
+ "su_a3": "ESP",
+ "brk_diff": 0,
+ "name": "Spain",
+ "name_long": "Spain",
+ "brk_a3": "ESP",
+ "brk_name": "Spain",
+ "brk_group": null,
+ "abbrev": "Sp.",
+ "postal": "E",
+ "formal_en": "Kingdom of Spain",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Spain",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 5,
+ "mapcolor9": 5,
+ "mapcolor13": 5,
+ "pop_est": 40525002,
+ "gdp_md_est": 1403000,
+ "pop_year": -99,
+ "lastcensus": 2001,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "ES",
+ "iso_a3": "ESP",
+ "iso_n3": "724",
+ "un_a3": "724",
+ "wb_a2": "ES",
+ "wb_a3": "ESP",
+ "woe_id": -99,
+ "adm0_a3_is": "ESP",
+ "adm0_a3_us": "ESP",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Southern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 3,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 686
+ ]
+ ],
+ [
+ [
+ 687
+ ]
+ ],
+ [
+ [
+ 688
+ ]
+ ],
+ [
+ [
+ 689
+ ]
+ ],
+ [
+ [
+ 690
+ ]
+ ],
+ [
+ [
+ 691
+ ]
+ ],
+ [
+ [
+ 692
+ ]
+ ],
+ [
+ [
+ 693
+ ]
+ ],
+ [
+ [
+ 694
+ ]
+ ],
+ [
+ [
+ 695
+ ]
+ ],
+ [
+ [
+ 696
+ ]
+ ],
+ [
+ [
+ 697,
+ -25,
+ 698,
+ 699,
+ 700,
+ 701
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Estonia",
+ "sov_a3": "EST",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Estonia",
+ "adm0_a3": "EST",
+ "geou_dif": 0,
+ "geounit": "Estonia",
+ "gu_a3": "EST",
+ "su_dif": 0,
+ "subunit": "Estonia",
+ "su_a3": "EST",
+ "brk_diff": 0,
+ "name": "Estonia",
+ "name_long": "Estonia",
+ "brk_a3": "EST",
+ "brk_name": "Estonia",
+ "brk_group": null,
+ "abbrev": "Est.",
+ "postal": "EST",
+ "formal_en": "Republic of Estonia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Estonia",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 2,
+ "mapcolor9": 1,
+ "mapcolor13": 10,
+ "pop_est": 1299371,
+ "gdp_md_est": 27410,
+ "pop_year": -99,
+ "lastcensus": 2000,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "EE",
+ "iso_a3": "EST",
+ "iso_n3": "233",
+ "un_a3": "233",
+ "wb_a2": "EE",
+ "wb_a3": "EST",
+ "woe_id": -99,
+ "adm0_a3_is": "EST",
+ "adm0_a3_us": "EST",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Northern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 702
+ ]
+ ],
+ [
+ [
+ 703
+ ]
+ ],
+ [
+ [
+ 704
+ ]
+ ],
+ [
+ [
+ 705,
+ 706,
+ 707
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Ethiopia",
+ "sov_a3": "ETH",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Ethiopia",
+ "adm0_a3": "ETH",
+ "geou_dif": 0,
+ "geounit": "Ethiopia",
+ "gu_a3": "ETH",
+ "su_dif": 0,
+ "subunit": "Ethiopia",
+ "su_a3": "ETH",
+ "brk_diff": 0,
+ "name": "Ethiopia",
+ "name_long": "Ethiopia",
+ "brk_a3": "ETH",
+ "brk_name": "Ethiopia",
+ "brk_group": null,
+ "abbrev": "Eth.",
+ "postal": "ET",
+ "formal_en": "Federal Democratic Republic of Ethiopia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Ethiopia",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 4,
+ "mapcolor9": 1,
+ "mapcolor13": 13,
+ "pop_est": 85237338,
+ "gdp_md_est": 68770,
+ "pop_year": -99,
+ "lastcensus": 2007,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "ET",
+ "iso_a3": "ETH",
+ "iso_n3": "231",
+ "un_a3": "231",
+ "wb_a2": "ET",
+ "wb_a3": "ETH",
+ "woe_id": -99,
+ "adm0_a3_is": "ETH",
+ "adm0_a3_us": "ETH",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Eastern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -640,
+ 708,
+ 709,
+ 710,
+ 711,
+ 712,
+ -685
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Finland",
+ "sov_a3": "FI1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Country",
+ "admin": "Finland",
+ "adm0_a3": "FIN",
+ "geou_dif": 0,
+ "geounit": "Finland",
+ "gu_a3": "FIN",
+ "su_dif": 0,
+ "subunit": "Finland",
+ "su_a3": "FIN",
+ "brk_diff": 0,
+ "name": "Finland",
+ "name_long": "Finland",
+ "brk_a3": "FIN",
+ "brk_name": "Finland",
+ "brk_group": null,
+ "abbrev": "Fin.",
+ "postal": "FIN",
+ "formal_en": "Republic of Finland",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Finland",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 1,
+ "mapcolor9": 4,
+ "mapcolor13": 6,
+ "pop_est": 5250275,
+ "gdp_md_est": 193500,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "FI",
+ "iso_a3": "FIN",
+ "iso_n3": "246",
+ "un_a3": "246",
+ "wb_a2": "FI",
+ "wb_a3": "FIN",
+ "woe_id": -99,
+ "adm0_a3_is": "FIN",
+ "adm0_a3_us": "FIN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Northern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 713
+ ]
+ ],
+ [
+ [
+ 714
+ ]
+ ],
+ [
+ [
+ 715
+ ]
+ ],
+ [
+ [
+ 716
+ ]
+ ],
+ [
+ [
+ 717
+ ]
+ ],
+ [
+ [
+ 718
+ ]
+ ],
+ [
+ [
+ 719
+ ]
+ ],
+ [
+ [
+ 720,
+ 721,
+ 722,
+ 723
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Fiji",
+ "sov_a3": "FJI",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Fiji",
+ "adm0_a3": "FJI",
+ "geou_dif": 0,
+ "geounit": "Fiji",
+ "gu_a3": "FJI",
+ "su_dif": 0,
+ "subunit": "Fiji",
+ "su_a3": "FJI",
+ "brk_diff": 0,
+ "name": "Fiji",
+ "name_long": "Fiji",
+ "brk_a3": "FJI",
+ "brk_name": "Fiji",
+ "brk_group": null,
+ "abbrev": "Fiji",
+ "postal": "FJ",
+ "formal_en": "Republic of Fiji",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Fiji",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 1,
+ "mapcolor9": 2,
+ "mapcolor13": 2,
+ "pop_est": 944720,
+ "gdp_md_est": 3579,
+ "pop_year": -99,
+ "lastcensus": 2007,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "FJ",
+ "iso_a3": "FJI",
+ "iso_n3": "242",
+ "un_a3": "242",
+ "wb_a2": "FJ",
+ "wb_a3": "FJI",
+ "woe_id": -99,
+ "adm0_a3_is": "FJI",
+ "adm0_a3_us": "FJI",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Melanesia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 4,
+ "long_len": 4,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 724
+ ]
+ ],
+ [
+ [
+ 725
+ ]
+ ],
+ [
+ [
+ 726
+ ]
+ ],
+ [
+ [
+ 727
+ ]
+ ],
+ [
+ [
+ 728
+ ]
+ ],
+ [
+ [
+ 729
+ ]
+ ],
+ [
+ [
+ 730
+ ]
+ ],
+ [
+ [
+ 731
+ ]
+ ],
+ [
+ [
+ 732
+ ]
+ ],
+ [
+ [
+ 733
+ ]
+ ],
+ [
+ [
+ 734
+ ]
+ ],
+ [
+ [
+ 735
+ ]
+ ],
+ [
+ [
+ 736
+ ]
+ ],
+ [
+ [
+ 737
+ ]
+ ],
+ [
+ [
+ 738
+ ]
+ ],
+ [
+ [
+ 739
+ ]
+ ],
+ [
+ [
+ 740
+ ]
+ ],
+ [
+ [
+ 741
+ ]
+ ],
+ [
+ [
+ 742
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "United Kingdom",
+ "sov_a3": "GB1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Falkland Islands",
+ "adm0_a3": "FLK",
+ "geou_dif": 0,
+ "geounit": "Falkland Islands",
+ "gu_a3": "FLK",
+ "su_dif": 0,
+ "subunit": "Falkland Islands",
+ "su_a3": "FLK",
+ "brk_diff": 1,
+ "name": "Falkland Is.",
+ "name_long": "Falkland Islands",
+ "brk_a3": "B12",
+ "brk_name": "Falkland Is.",
+ "brk_group": null,
+ "abbrev": "Flk. Is.",
+ "postal": "FK",
+ "formal_en": "Falkland Islands",
+ "formal_fr": null,
+ "note_adm0": "U.K.",
+ "note_brk": "Admin. by U.K.; Claimed by Argentina",
+ "name_sort": "Falkland Islands",
+ "name_alt": "Islas Malvinas",
+ "mapcolor7": 6,
+ "mapcolor8": 6,
+ "mapcolor9": 6,
+ "mapcolor13": 3,
+ "pop_est": 3140,
+ "gdp_md_est": 105.1,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "FK",
+ "iso_a3": "FLK",
+ "iso_n3": "238",
+ "un_a3": "238",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "FLK",
+ "adm0_a3_us": "FLK",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "South America",
+ "region_un": "Americas",
+ "subregion": "South America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 12,
+ "long_len": 16,
+ "abbrev_len": 8,
+ "tiny": -99,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ [
+ 743
+ ]
+ ],
+ [
+ [
+ 744
+ ]
+ ],
+ [
+ [
+ 745
+ ]
+ ],
+ [
+ [
+ 746
+ ]
+ ],
+ [
+ [
+ 747
+ ]
+ ],
+ [
+ [
+ 748
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "France",
+ "sov_a3": "FR1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Country",
+ "admin": "France",
+ "adm0_a3": "FRA",
+ "geou_dif": 0,
+ "geounit": "France",
+ "gu_a3": "FRA",
+ "su_dif": 0,
+ "subunit": "France",
+ "su_a3": "FRA",
+ "brk_diff": 0,
+ "name": "France",
+ "name_long": "France",
+ "brk_a3": "FRA",
+ "brk_name": "France",
+ "brk_group": null,
+ "abbrev": "Fr.",
+ "postal": "F",
+ "formal_en": "French Republic",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "France",
+ "name_alt": null,
+ "mapcolor7": 7,
+ "mapcolor8": 5,
+ "mapcolor9": 9,
+ "mapcolor13": 11,
+ "pop_est": 64057792,
+ "gdp_md_est": 2128000,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "1. Developed region: G7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "FR",
+ "iso_a3": "FRA",
+ "iso_n3": "250",
+ "un_a3": "250",
+ "wb_a2": "FR",
+ "wb_a3": "FRA",
+ "woe_id": -99,
+ "adm0_a3_is": "FRA",
+ "adm0_a3_us": "FRA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Western Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 3,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 749
+ ]
+ ],
+ [
+ [
+ 750
+ ]
+ ],
+ [
+ [
+ -314,
+ 751,
+ 752
+ ]
+ ],
+ [
+ [
+ 753
+ ]
+ ],
+ [
+ [
+ 754
+ ]
+ ],
+ [
+ [
+ 755
+ ]
+ ],
+ [
+ [
+ 756
+ ]
+ ],
+ [
+ [
+ 757
+ ]
+ ],
+ [
+ [
+ 758
+ ]
+ ],
+ [
+ [
+ 759,
+ -633,
+ -486,
+ 760,
+ 761,
+ 762,
+ 763,
+ -699,
+ -26,
+ -698,
+ 764,
+ -231
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Denmark",
+ "sov_a3": "DN1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Faroe Islands",
+ "adm0_a3": "FRO",
+ "geou_dif": 0,
+ "geounit": "Faroe Islands",
+ "gu_a3": "FRO",
+ "su_dif": 0,
+ "subunit": "Faroe Islands",
+ "su_a3": "FRO",
+ "brk_diff": 0,
+ "name": "Faeroe Is.",
+ "name_long": "Faeroe Islands",
+ "brk_a3": "FRO",
+ "brk_name": "Faeroe Islands",
+ "brk_group": null,
+ "abbrev": "Faeroe Is.",
+ "postal": "FO",
+ "formal_en": "Føroyar Is. (Faeroe Is.)",
+ "formal_fr": null,
+ "note_adm0": "Den.",
+ "note_brk": null,
+ "name_sort": "Faeroe Islands",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 1,
+ "mapcolor9": 3,
+ "mapcolor13": 12,
+ "pop_est": 48856,
+ "gdp_md_est": 1000,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "FO",
+ "iso_a3": "FRO",
+ "iso_n3": "234",
+ "un_a3": "234",
+ "wb_a2": "FO",
+ "wb_a3": "FRO",
+ "woe_id": -99,
+ "adm0_a3_is": "FRO",
+ "adm0_a3_us": "FRO",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Northern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 10,
+ "long_len": 14,
+ "abbrev_len": 10,
+ "tiny": 3,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ [
+ 765
+ ]
+ ],
+ [
+ [
+ 766
+ ]
+ ],
+ [
+ [
+ 767
+ ]
+ ],
+ [
+ [
+ 768
+ ]
+ ],
+ [
+ [
+ 769
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Federated States of Micronesia",
+ "sov_a3": "FSM",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Federated States of Micronesia",
+ "adm0_a3": "FSM",
+ "geou_dif": 0,
+ "geounit": "Federated States of Micronesia",
+ "gu_a3": "FSM",
+ "su_dif": 0,
+ "subunit": "Federated States of Micronesia",
+ "su_a3": "FSM",
+ "brk_diff": 0,
+ "name": "Micronesia",
+ "name_long": "Federated States of Micronesia",
+ "brk_a3": "FSM",
+ "brk_name": "Micronesia",
+ "brk_group": null,
+ "abbrev": "F.S.M.",
+ "postal": "FSM",
+ "formal_en": "Federated States of Micronesia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Micronesia, Federated States of",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 2,
+ "mapcolor9": 4,
+ "mapcolor13": 13,
+ "pop_est": 107434,
+ "gdp_md_est": 238.1,
+ "pop_year": -99,
+ "lastcensus": 2000,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "FM",
+ "iso_a3": "FSM",
+ "iso_n3": "583",
+ "un_a3": "583",
+ "wb_a2": "FM",
+ "wb_a3": "FSM",
+ "woe_id": -99,
+ "adm0_a3_is": "FSM",
+ "adm0_a3_us": "FSM",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Micronesia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 10,
+ "long_len": 30,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 770
+ ]
+ ],
+ [
+ [
+ 771
+ ]
+ ],
+ [
+ [
+ 772
+ ]
+ ],
+ [
+ [
+ 773
+ ]
+ ],
+ [
+ [
+ 774
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Gabon",
+ "sov_a3": "GAB",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Gabon",
+ "adm0_a3": "GAB",
+ "geou_dif": 0,
+ "geounit": "Gabon",
+ "gu_a3": "GAB",
+ "su_dif": 0,
+ "subunit": "Gabon",
+ "su_a3": "GAB",
+ "brk_diff": 0,
+ "name": "Gabon",
+ "name_long": "Gabon",
+ "brk_a3": "GAB",
+ "brk_name": "Gabon",
+ "brk_group": null,
+ "abbrev": "Gabon",
+ "postal": "GA",
+ "formal_en": "Gabonese Republic",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Gabon",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 2,
+ "mapcolor9": 5,
+ "mapcolor13": 5,
+ "pop_est": 1514993,
+ "gdp_md_est": 21110,
+ "pop_year": -99,
+ "lastcensus": 2003,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "GA",
+ "iso_a3": "GAB",
+ "iso_n3": "266",
+ "un_a3": "266",
+ "wb_a2": "GA",
+ "wb_a3": "GAB",
+ "woe_id": -99,
+ "adm0_a3_is": "GAB",
+ "adm0_a3_us": "GAB",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Middle Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": 3,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -585,
+ 775,
+ 776,
+ -572
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "United Kingdom",
+ "sov_a3": "GB1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Country",
+ "admin": "United Kingdom",
+ "adm0_a3": "GBR",
+ "geou_dif": 0,
+ "geounit": "United Kingdom",
+ "gu_a3": "GBR",
+ "su_dif": 0,
+ "subunit": "United Kingdom",
+ "su_a3": "GBR",
+ "brk_diff": 0,
+ "name": "United Kingdom",
+ "name_long": "United Kingdom",
+ "brk_a3": "GBR",
+ "brk_name": "United Kingdom",
+ "brk_group": null,
+ "abbrev": "U.K.",
+ "postal": "GB",
+ "formal_en": "United Kingdom of Great Britain and Northern Ireland",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "United Kingdom",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 6,
+ "mapcolor9": 6,
+ "mapcolor13": 3,
+ "pop_est": 62262000,
+ "gdp_md_est": 1977704,
+ "pop_year": 0,
+ "lastcensus": 2011,
+ "gdp_year": 2009,
+ "economy": "1. Developed region: G7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "GB",
+ "iso_a3": "GBR",
+ "iso_n3": "826",
+ "un_a3": "826",
+ "wb_a2": "GB",
+ "wb_a3": "GBR",
+ "woe_id": -99,
+ "adm0_a3_is": "GBR",
+ "adm0_a3_us": "GBR",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Northern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 14,
+ "long_len": 14,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 777
+ ]
+ ],
+ [
+ [
+ 778
+ ]
+ ],
+ [
+ [
+ 779,
+ 780
+ ]
+ ],
+ [
+ [
+ 781
+ ]
+ ],
+ [
+ [
+ 782
+ ]
+ ],
+ [
+ [
+ 783
+ ]
+ ],
+ [
+ [
+ 784
+ ]
+ ],
+ [
+ [
+ 785
+ ]
+ ],
+ [
+ [
+ 786
+ ]
+ ],
+ [
+ [
+ 787
+ ]
+ ],
+ [
+ [
+ 788
+ ]
+ ],
+ [
+ [
+ 789
+ ]
+ ],
+ [
+ [
+ 790
+ ]
+ ],
+ [
+ [
+ 791
+ ]
+ ],
+ [
+ [
+ 792
+ ]
+ ],
+ [
+ [
+ 793
+ ]
+ ],
+ [
+ [
+ 794
+ ]
+ ],
+ [
+ [
+ 795
+ ]
+ ],
+ [
+ [
+ 796
+ ]
+ ],
+ [
+ [
+ 797
+ ]
+ ],
+ [
+ [
+ 798
+ ]
+ ],
+ [
+ [
+ 799
+ ]
+ ],
+ [
+ [
+ 800
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Georgia",
+ "sov_a3": "GEO",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Georgia",
+ "adm0_a3": "GEO",
+ "geou_dif": 0,
+ "geounit": "Georgia",
+ "gu_a3": "GEO",
+ "su_dif": 0,
+ "subunit": "Georgia",
+ "su_a3": "GEO",
+ "brk_diff": 0,
+ "name": "Georgia",
+ "name_long": "Georgia",
+ "brk_a3": "GEO",
+ "brk_name": "Georgia",
+ "brk_group": null,
+ "abbrev": "Geo.",
+ "postal": "GE",
+ "formal_en": "Georgia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Georgia",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 1,
+ "mapcolor9": 3,
+ "mapcolor13": 2,
+ "pop_est": 4615807,
+ "gdp_md_est": 21510,
+ "pop_year": -99,
+ "lastcensus": 2002,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "GE",
+ "iso_a3": "GEO",
+ "iso_n3": "268",
+ "un_a3": "268",
+ "wb_a2": "GE",
+ "wb_a3": "GEO",
+ "woe_id": -99,
+ "adm0_a3_is": "GEO",
+ "adm0_a3_us": "GEO",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Western Asia",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -223,
+ -51,
+ 801,
+ 802,
+ 803
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 4,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "United Kingdom",
+ "sov_a3": "GB1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Country",
+ "admin": "Guernsey",
+ "adm0_a3": "GGY",
+ "geou_dif": 0,
+ "geounit": "Guernsey",
+ "gu_a3": "GGY",
+ "su_dif": 0,
+ "subunit": "Guernsey",
+ "su_a3": "GGY",
+ "brk_diff": 0,
+ "name": "Guernsey",
+ "name_long": "Guernsey",
+ "brk_a3": "GGY",
+ "brk_name": "Guernsey",
+ "brk_group": "Channel Islands",
+ "abbrev": "Guern.",
+ "postal": "GG",
+ "formal_en": "Bailiwick of Guernsey",
+ "formal_fr": null,
+ "note_adm0": "U.K. crown dependency",
+ "note_brk": null,
+ "name_sort": "Guernsey",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 6,
+ "mapcolor9": 6,
+ "mapcolor13": 3,
+ "pop_est": 68633,
+ "gdp_md_est": 2742,
+ "pop_year": -99,
+ "lastcensus": 2001,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "GG",
+ "iso_a3": "GGY",
+ "iso_n3": "831",
+ "un_a3": "831",
+ "wb_a2": "JG",
+ "wb_a3": "CHI",
+ "woe_id": -99,
+ "adm0_a3_is": "GGY",
+ "adm0_a3_us": "GGY",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Northern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ 804
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Ghana",
+ "sov_a3": "GHA",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Ghana",
+ "adm0_a3": "GHA",
+ "geou_dif": 0,
+ "geounit": "Ghana",
+ "gu_a3": "GHA",
+ "su_dif": 0,
+ "subunit": "Ghana",
+ "su_a3": "GHA",
+ "brk_diff": 0,
+ "name": "Ghana",
+ "name_long": "Ghana",
+ "brk_a3": "GHA",
+ "brk_name": "Ghana",
+ "brk_group": null,
+ "abbrev": "Ghana",
+ "postal": "GH",
+ "formal_en": "Republic of Ghana",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Ghana",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 3,
+ "mapcolor9": 1,
+ "mapcolor13": 4,
+ "pop_est": 23832495,
+ "gdp_md_est": 34200,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "GH",
+ "iso_a3": "GHA",
+ "iso_n3": "288",
+ "un_a3": "288",
+ "wb_a2": "GH",
+ "wb_a3": "GHA",
+ "woe_id": -99,
+ "adm0_a3_is": "GHA",
+ "adm0_a3_us": "GHA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Western Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 805,
+ 806,
+ -564,
+ 807,
+ -566,
+ -242
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Guinea",
+ "sov_a3": "GIN",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Guinea",
+ "adm0_a3": "GIN",
+ "geou_dif": 0,
+ "geounit": "Guinea",
+ "gu_a3": "GIN",
+ "su_dif": 0,
+ "subunit": "Guinea",
+ "su_a3": "GIN",
+ "brk_diff": 0,
+ "name": "Guinea",
+ "name_long": "Guinea",
+ "brk_a3": "GIN",
+ "brk_name": "Guinea",
+ "brk_group": null,
+ "abbrev": "Gin.",
+ "postal": "GN",
+ "formal_en": "Republic of Guinea",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Guinea",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 3,
+ "mapcolor9": 7,
+ "mapcolor13": 2,
+ "pop_est": 10057975,
+ "gdp_md_est": 10600,
+ "pop_year": -99,
+ "lastcensus": 1996,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "GN",
+ "iso_a3": "GIN",
+ "iso_n3": "324",
+ "un_a3": "324",
+ "wb_a2": "GN",
+ "wb_a3": "GIN",
+ "woe_id": -99,
+ "adm0_a3_is": "GIN",
+ "adm0_a3_us": "GIN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Western Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 808,
+ -569,
+ 809,
+ 810,
+ 811,
+ 812,
+ 813
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Gambia",
+ "sov_a3": "GMB",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Gambia",
+ "adm0_a3": "GMB",
+ "geou_dif": 0,
+ "geounit": "Gambia",
+ "gu_a3": "GMB",
+ "su_dif": 0,
+ "subunit": "Gambia",
+ "su_a3": "GMB",
+ "brk_diff": 0,
+ "name": "Gambia",
+ "name_long": "The Gambia",
+ "brk_a3": "GMB",
+ "brk_name": "Gambia",
+ "brk_group": null,
+ "abbrev": "Gambia",
+ "postal": "GM",
+ "formal_en": "Republic of the Gambia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Gambia, The",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 4,
+ "mapcolor9": 1,
+ "mapcolor13": 8,
+ "pop_est": 1782893,
+ "gdp_md_est": 2272,
+ "pop_year": -99,
+ "lastcensus": 2003,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "GM",
+ "iso_a3": "GMB",
+ "iso_n3": "270",
+ "un_a3": "270",
+ "wb_a2": "GM",
+ "wb_a3": "GMB",
+ "woe_id": -99,
+ "adm0_a3_is": "GMB",
+ "adm0_a3_us": "GMB",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Western Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 6,
+ "long_len": 10,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 814,
+ 815
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Guinea Bissau",
+ "sov_a3": "GNB",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Guinea Bissau",
+ "adm0_a3": "GNB",
+ "geou_dif": 0,
+ "geounit": "Guinea Bissau",
+ "gu_a3": "GNB",
+ "su_dif": 0,
+ "subunit": "Guinea Bissau",
+ "su_a3": "GNB",
+ "brk_diff": 0,
+ "name": "Guinea-Bissau",
+ "name_long": "Guinea-Bissau",
+ "brk_a3": "GNB",
+ "brk_name": "Guinea-Bissau",
+ "brk_group": null,
+ "abbrev": "GnB.",
+ "postal": "GW",
+ "formal_en": "Republic of Guinea-Bissau",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Guinea-Bissau",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 5,
+ "mapcolor9": 3,
+ "mapcolor13": 4,
+ "pop_est": 1533964,
+ "gdp_md_est": 904.2,
+ "pop_year": -99,
+ "lastcensus": 2009,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "GW",
+ "iso_a3": "GNB",
+ "iso_n3": "624",
+ "un_a3": "624",
+ "wb_a2": "GW",
+ "wb_a3": "GNB",
+ "woe_id": -99,
+ "adm0_a3_is": "GNB",
+ "adm0_a3_us": "GNB",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Western Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 13,
+ "long_len": 13,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 816
+ ]
+ ],
+ [
+ [
+ 817
+ ]
+ ],
+ [
+ [
+ 818
+ ]
+ ],
+ [
+ [
+ 819
+ ]
+ ],
+ [
+ [
+ 820
+ ]
+ ],
+ [
+ [
+ 821
+ ]
+ ],
+ [
+ [
+ 822,
+ 823,
+ -813
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Equatorial Guinea",
+ "sov_a3": "GNQ",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Equatorial Guinea",
+ "adm0_a3": "GNQ",
+ "geou_dif": 0,
+ "geounit": "Equatorial Guinea",
+ "gu_a3": "GNQ",
+ "su_dif": 0,
+ "subunit": "Equatorial Guinea",
+ "su_a3": "GNQ",
+ "brk_diff": 0,
+ "name": "Eq. Guinea",
+ "name_long": "Equatorial Guinea",
+ "brk_a3": "GNQ",
+ "brk_name": "Eq. Guinea",
+ "brk_group": null,
+ "abbrev": "Eq. G.",
+ "postal": "GQ",
+ "formal_en": "Republic of Equatorial Guinea",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Equatorial Guinea",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 1,
+ "mapcolor9": 4,
+ "mapcolor13": 8,
+ "pop_est": 650702,
+ "gdp_md_est": 14060,
+ "pop_year": 0,
+ "lastcensus": 2002,
+ "gdp_year": 0,
+ "economy": "7. Least developed region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "GQ",
+ "iso_a3": "GNQ",
+ "iso_n3": "226",
+ "un_a3": "226",
+ "wb_a2": "GQ",
+ "wb_a3": "GNQ",
+ "woe_id": -99,
+ "adm0_a3_is": "GNQ",
+ "adm0_a3_us": "GNQ",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Middle Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 10,
+ "long_len": 17,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 824,
+ -573,
+ -777
+ ]
+ ],
+ [
+ [
+ 825
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Greece",
+ "sov_a3": "GRC",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Greece",
+ "adm0_a3": "GRC",
+ "geou_dif": 0,
+ "geounit": "Greece",
+ "gu_a3": "GRC",
+ "su_dif": 0,
+ "subunit": "Greece",
+ "su_a3": "GRC",
+ "brk_diff": 0,
+ "name": "Greece",
+ "name_long": "Greece",
+ "brk_a3": "GRC",
+ "brk_name": "Greece",
+ "brk_group": null,
+ "abbrev": "Greece",
+ "postal": "GR",
+ "formal_en": "Hellenic Republic",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Greece",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 2,
+ "mapcolor9": 2,
+ "mapcolor13": 9,
+ "pop_est": 10737428,
+ "gdp_md_est": 343000,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "GR",
+ "iso_a3": "GRC",
+ "iso_n3": "300",
+ "un_a3": "300",
+ "wb_a2": "GR",
+ "wb_a3": "GRC",
+ "woe_id": -99,
+ "adm0_a3_is": "GRC",
+ "adm0_a3_us": "GRC",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Southern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 826
+ ]
+ ],
+ [
+ [
+ 827
+ ]
+ ],
+ [
+ [
+ 828
+ ]
+ ],
+ [
+ [
+ 829
+ ]
+ ],
+ [
+ [
+ 830
+ ]
+ ],
+ [
+ [
+ 831
+ ]
+ ],
+ [
+ [
+ 832
+ ]
+ ],
+ [
+ [
+ 833
+ ]
+ ],
+ [
+ [
+ 834
+ ]
+ ],
+ [
+ [
+ 835
+ ]
+ ],
+ [
+ [
+ 836
+ ]
+ ],
+ [
+ [
+ 837
+ ]
+ ],
+ [
+ [
+ 838
+ ]
+ ],
+ [
+ [
+ 839
+ ]
+ ],
+ [
+ [
+ 840
+ ]
+ ],
+ [
+ [
+ 841
+ ]
+ ],
+ [
+ [
+ 842
+ ]
+ ],
+ [
+ [
+ 843
+ ]
+ ],
+ [
+ [
+ 844
+ ]
+ ],
+ [
+ [
+ 845
+ ]
+ ],
+ [
+ [
+ 846
+ ]
+ ],
+ [
+ [
+ 847
+ ]
+ ],
+ [
+ [
+ 848
+ ]
+ ],
+ [
+ [
+ 849
+ ]
+ ],
+ [
+ [
+ 850
+ ]
+ ],
+ [
+ [
+ 851
+ ]
+ ],
+ [
+ [
+ 852
+ ]
+ ],
+ [
+ [
+ 853
+ ]
+ ],
+ [
+ [
+ 854
+ ]
+ ],
+ [
+ [
+ 855
+ ]
+ ],
+ [
+ [
+ 856
+ ]
+ ],
+ [
+ [
+ 857
+ ]
+ ],
+ [
+ [
+ 858
+ ]
+ ],
+ [
+ [
+ 859
+ ]
+ ],
+ [
+ [
+ 860
+ ]
+ ],
+ [
+ [
+ 861
+ ]
+ ],
+ [
+ [
+ 862
+ ]
+ ],
+ [
+ [
+ 863
+ ]
+ ],
+ [
+ [
+ 864
+ ]
+ ],
+ [
+ [
+ 865,
+ -19,
+ 866,
+ -256,
+ 867
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Grenada",
+ "sov_a3": "GRD",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Grenada",
+ "adm0_a3": "GRD",
+ "geou_dif": 0,
+ "geounit": "Grenada",
+ "gu_a3": "GRD",
+ "su_dif": 0,
+ "subunit": "Grenada",
+ "su_a3": "GRD",
+ "brk_diff": 0,
+ "name": "Grenada",
+ "name_long": "Grenada",
+ "brk_a3": "GRD",
+ "brk_name": "Grenada",
+ "brk_group": null,
+ "abbrev": "Gren.",
+ "postal": "GD",
+ "formal_en": "Grenada",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Grenada",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 4,
+ "mapcolor9": 3,
+ "mapcolor13": 6,
+ "pop_est": 90739,
+ "gdp_md_est": 1161,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "GD",
+ "iso_a3": "GRD",
+ "iso_n3": "308",
+ "un_a3": "308",
+ "wb_a2": "GD",
+ "wb_a3": "GRD",
+ "woe_id": -99,
+ "adm0_a3_is": "GRD",
+ "adm0_a3_us": "GRD",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 868
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Denmark",
+ "sov_a3": "DN1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Country",
+ "admin": "Greenland",
+ "adm0_a3": "GRL",
+ "geou_dif": 0,
+ "geounit": "Greenland",
+ "gu_a3": "GRL",
+ "su_dif": 0,
+ "subunit": "Greenland",
+ "su_a3": "GRL",
+ "brk_diff": 0,
+ "name": "Greenland",
+ "name_long": "Greenland",
+ "brk_a3": "GRL",
+ "brk_name": "Greenland",
+ "brk_group": null,
+ "abbrev": "Grlnd.",
+ "postal": "GL",
+ "formal_en": "Greenland",
+ "formal_fr": null,
+ "note_adm0": "Den.",
+ "note_brk": null,
+ "name_sort": "Greenland",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 1,
+ "mapcolor9": 3,
+ "mapcolor13": 12,
+ "pop_est": 57600,
+ "gdp_md_est": 1100,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "GL",
+ "iso_a3": "GRL",
+ "iso_n3": "304",
+ "un_a3": "304",
+ "wb_a2": "GL",
+ "wb_a3": "GRL",
+ "woe_id": -99,
+ "adm0_a3_is": "GRL",
+ "adm0_a3_us": "GRL",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Northern America",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 9,
+ "long_len": 9,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ [
+ 869
+ ]
+ ],
+ [
+ [
+ 870
+ ]
+ ],
+ [
+ [
+ 871
+ ]
+ ],
+ [
+ [
+ 872
+ ]
+ ],
+ [
+ [
+ 873
+ ]
+ ],
+ [
+ [
+ 874
+ ]
+ ],
+ [
+ [
+ 875
+ ]
+ ],
+ [
+ [
+ 876
+ ]
+ ],
+ [
+ [
+ 877
+ ]
+ ],
+ [
+ [
+ 878
+ ]
+ ],
+ [
+ [
+ 879
+ ]
+ ],
+ [
+ [
+ 880
+ ]
+ ],
+ [
+ [
+ 881
+ ]
+ ],
+ [
+ [
+ 882
+ ]
+ ],
+ [
+ [
+ 883
+ ]
+ ],
+ [
+ [
+ 884
+ ]
+ ],
+ [
+ [
+ 885
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Guatemala",
+ "sov_a3": "GTM",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Guatemala",
+ "adm0_a3": "GTM",
+ "geou_dif": 0,
+ "geounit": "Guatemala",
+ "gu_a3": "GTM",
+ "su_dif": 0,
+ "subunit": "Guatemala",
+ "su_a3": "GTM",
+ "brk_diff": 0,
+ "name": "Guatemala",
+ "name_long": "Guatemala",
+ "brk_a3": "GTM",
+ "brk_name": "Guatemala",
+ "brk_group": null,
+ "abbrev": "Guat.",
+ "postal": "GT",
+ "formal_en": "Republic of Guatemala",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Guatemala",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 3,
+ "mapcolor9": 3,
+ "mapcolor13": 6,
+ "pop_est": 13276517,
+ "gdp_md_est": 68580,
+ "pop_year": -99,
+ "lastcensus": 2002,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "GT",
+ "iso_a3": "GTM",
+ "iso_n3": "320",
+ "un_a3": "320",
+ "wb_a2": "GT",
+ "wb_a3": "GTM",
+ "woe_id": -99,
+ "adm0_a3_is": "GTM",
+ "adm0_a3_us": "GTM",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Central America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 9,
+ "long_len": 9,
+ "abbrev_len": 5,
+ "tiny": 4,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -289,
+ 886,
+ 887,
+ 888,
+ 889,
+ 890
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "United States of America",
+ "sov_a3": "US1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Guam",
+ "adm0_a3": "GUM",
+ "geou_dif": 0,
+ "geounit": "Guam",
+ "gu_a3": "GUM",
+ "su_dif": 0,
+ "subunit": "Guam",
+ "su_a3": "GUM",
+ "brk_diff": 0,
+ "name": "Guam",
+ "name_long": "Guam",
+ "brk_a3": "GUM",
+ "brk_name": "Guam",
+ "brk_group": null,
+ "abbrev": "Guam",
+ "postal": "GU",
+ "formal_en": "Territory of Guam",
+ "formal_fr": null,
+ "note_adm0": "U.S.A.",
+ "note_brk": null,
+ "name_sort": "Guam",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 5,
+ "mapcolor9": 1,
+ "mapcolor13": 1,
+ "pop_est": 178430,
+ "gdp_md_est": 2500,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "GU",
+ "iso_a3": "GUM",
+ "iso_n3": "316",
+ "un_a3": "316",
+ "wb_a2": "GU",
+ "wb_a3": "GUM",
+ "woe_id": -99,
+ "adm0_a3_is": "GUM",
+ "adm0_a3_us": "GUM",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Micronesia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 4,
+ "long_len": 4,
+ "abbrev_len": 4,
+ "tiny": 2,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ 891
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Guyana",
+ "sov_a3": "GUY",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Guyana",
+ "adm0_a3": "GUY",
+ "geou_dif": 0,
+ "geounit": "Guyana",
+ "gu_a3": "GUY",
+ "su_dif": 0,
+ "subunit": "Guyana",
+ "su_a3": "GUY",
+ "brk_diff": 0,
+ "name": "Guyana",
+ "name_long": "Guyana",
+ "brk_a3": "GUY",
+ "brk_name": "Guyana",
+ "brk_group": null,
+ "abbrev": "Guy.",
+ "postal": "GY",
+ "formal_en": "Co-operative Republic of Guyana",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Guyana",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 1,
+ "mapcolor9": 4,
+ "mapcolor13": 8,
+ "pop_est": 772298,
+ "gdp_md_est": 2966,
+ "pop_year": -99,
+ "lastcensus": 2002,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "GY",
+ "iso_a3": "GUY",
+ "iso_n3": "328",
+ "un_a3": "328",
+ "wb_a2": "GY",
+ "wb_a3": "GUY",
+ "woe_id": -99,
+ "adm0_a3_is": "GUY",
+ "adm0_a3_us": "GUY",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "South America",
+ "region_un": "Americas",
+ "subregion": "South America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 892,
+ -321,
+ 893,
+ 894
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "China",
+ "sov_a3": "CH1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Country",
+ "admin": "Hong Kong S.A.R.",
+ "adm0_a3": "HKG",
+ "geou_dif": 0,
+ "geounit": "Hong Kong S.A.R.",
+ "gu_a3": "HKG",
+ "su_dif": 0,
+ "subunit": "Hong Kong S.A.R.",
+ "su_a3": "HKG",
+ "brk_diff": 0,
+ "name": "Hong Kong",
+ "name_long": "Hong Kong",
+ "brk_a3": "HKG",
+ "brk_name": "Hong Kong",
+ "brk_group": null,
+ "abbrev": "H.K.",
+ "postal": "HK",
+ "formal_en": "Hong Kong Special Administrative Region, PRC",
+ "formal_fr": null,
+ "note_adm0": "China",
+ "note_brk": null,
+ "name_sort": "Hong Kong SAR, China",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 4,
+ "mapcolor9": 4,
+ "mapcolor13": 3,
+ "pop_est": 7061200,
+ "gdp_md_est": 351119,
+ "pop_year": 2010,
+ "lastcensus": 2006,
+ "gdp_year": 2011,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": 0,
+ "fips_10": null,
+ "iso_a2": "HK",
+ "iso_a3": "HKG",
+ "iso_n3": "344",
+ "un_a3": "344",
+ "wb_a2": "HK",
+ "wb_a3": "HKG",
+ "woe_id": -99,
+ "adm0_a3_is": "HKG",
+ "adm0_a3_us": "HKG",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Eastern Asia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 9,
+ "long_len": 9,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ [
+ 895
+ ]
+ ],
+ [
+ [
+ 896
+ ]
+ ],
+ [
+ [
+ -534,
+ 897
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 5,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Australia",
+ "sov_a3": "AU1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Heard Island and McDonald Islands",
+ "adm0_a3": "HMD",
+ "geou_dif": 0,
+ "geounit": "Heard Island and McDonald Islands",
+ "gu_a3": "HMD",
+ "su_dif": 0,
+ "subunit": "Heard Island and McDonald Islands",
+ "su_a3": "HMD",
+ "brk_diff": 0,
+ "name": "Heard I. and McDonald Is.",
+ "name_long": "Heard I. and McDonald Islands",
+ "brk_a3": "HMD",
+ "brk_name": "Heard I. and McDonald Is.",
+ "brk_group": null,
+ "abbrev": "H.M.Is.",
+ "postal": "HM",
+ "formal_en": "Territory of Heard Island and McDonald Islands",
+ "formal_fr": null,
+ "note_adm0": "Auz.",
+ "note_brk": null,
+ "name_sort": "Heard Island and McDonald Islands",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 2,
+ "mapcolor9": 2,
+ "mapcolor13": 7,
+ "pop_est": -99,
+ "gdp_md_est": -99,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "HM",
+ "iso_a3": "HMD",
+ "iso_n3": "334",
+ "un_a3": "-099",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "HMD",
+ "adm0_a3_us": "HMD",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Seven seas (open ocean)",
+ "region_un": "Seven seas (open ocean)",
+ "subregion": "Seven seas (open ocean)",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 25,
+ "long_len": 29,
+ "abbrev_len": 7,
+ "tiny": -99,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ 898
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Honduras",
+ "sov_a3": "HND",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Honduras",
+ "adm0_a3": "HND",
+ "geou_dif": 0,
+ "geounit": "Honduras",
+ "gu_a3": "HND",
+ "su_dif": 0,
+ "subunit": "Honduras",
+ "su_a3": "HND",
+ "brk_diff": 0,
+ "name": "Honduras",
+ "name_long": "Honduras",
+ "brk_a3": "HND",
+ "brk_name": "Honduras",
+ "brk_group": null,
+ "abbrev": "Hond.",
+ "postal": "HN",
+ "formal_en": "Republic of Honduras",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Honduras",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 5,
+ "mapcolor9": 2,
+ "mapcolor13": 5,
+ "pop_est": 7792854,
+ "gdp_md_est": 33720,
+ "pop_year": -99,
+ "lastcensus": 2001,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "HN",
+ "iso_a3": "HND",
+ "iso_n3": "340",
+ "un_a3": "340",
+ "wb_a2": "HN",
+ "wb_a3": "HND",
+ "woe_id": -99,
+ "adm0_a3_is": "HND",
+ "adm0_a3_us": "HND",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Central America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 899,
+ 900,
+ 901,
+ -888,
+ 902
+ ]
+ ],
+ [
+ [
+ 903
+ ]
+ ],
+ [
+ [
+ 904
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Croatia",
+ "sov_a3": "HRV",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Croatia",
+ "adm0_a3": "HRV",
+ "geou_dif": 0,
+ "geounit": "Croatia",
+ "gu_a3": "HRV",
+ "su_dif": 0,
+ "subunit": "Croatia",
+ "su_a3": "HRV",
+ "brk_diff": 0,
+ "name": "Croatia",
+ "name_long": "Croatia",
+ "brk_a3": "HRV",
+ "brk_name": "Croatia",
+ "brk_group": null,
+ "abbrev": "Cro.",
+ "postal": "HR",
+ "formal_en": "Republic of Croatia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Croatia",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 4,
+ "mapcolor9": 5,
+ "mapcolor13": 1,
+ "pop_est": 4489409,
+ "gdp_md_est": 82390,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "HR",
+ "iso_a3": "HRV",
+ "iso_n3": "191",
+ "un_a3": "191",
+ "wb_a2": "HR",
+ "wb_a3": "HRV",
+ "woe_id": -99,
+ "adm0_a3_is": "HRV",
+ "adm0_a3_us": "HRV",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Southern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 905
+ ]
+ ],
+ [
+ [
+ 906
+ ]
+ ],
+ [
+ [
+ -278,
+ 907,
+ 908
+ ]
+ ],
+ [
+ [
+ 909
+ ]
+ ],
+ [
+ [
+ 910
+ ]
+ ],
+ [
+ [
+ 911
+ ]
+ ],
+ [
+ [
+ 912
+ ]
+ ],
+ [
+ [
+ 913
+ ]
+ ],
+ [
+ [
+ 914
+ ]
+ ],
+ [
+ [
+ 915
+ ]
+ ],
+ [
+ [
+ 916
+ ]
+ ],
+ [
+ [
+ 917
+ ]
+ ],
+ [
+ [
+ 918,
+ -280,
+ 919,
+ 920,
+ 921
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Haiti",
+ "sov_a3": "HTI",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Haiti",
+ "adm0_a3": "HTI",
+ "geou_dif": 0,
+ "geounit": "Haiti",
+ "gu_a3": "HTI",
+ "su_dif": 0,
+ "subunit": "Haiti",
+ "su_a3": "HTI",
+ "brk_diff": 0,
+ "name": "Haiti",
+ "name_long": "Haiti",
+ "brk_a3": "HTI",
+ "brk_name": "Haiti",
+ "brk_group": null,
+ "abbrev": "Haiti",
+ "postal": "HT",
+ "formal_en": "Republic of Haiti",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Haiti",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 1,
+ "mapcolor9": 7,
+ "mapcolor13": 2,
+ "pop_est": 9035536,
+ "gdp_md_est": 11500,
+ "pop_year": -99,
+ "lastcensus": 2003,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "HT",
+ "iso_a3": "HTI",
+ "iso_n3": "332",
+ "un_a3": "332",
+ "wb_a2": "HT",
+ "wb_a3": "HTI",
+ "woe_id": -99,
+ "adm0_a3_is": "HTI",
+ "adm0_a3_us": "HTI",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 922
+ ]
+ ],
+ [
+ [
+ -656,
+ 923
+ ]
+ ],
+ [
+ [
+ 924
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Hungary",
+ "sov_a3": "HUN",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Hungary",
+ "adm0_a3": "HUN",
+ "geou_dif": 0,
+ "geounit": "Hungary",
+ "gu_a3": "HUN",
+ "su_dif": 0,
+ "subunit": "Hungary",
+ "su_a3": "HUN",
+ "brk_diff": 0,
+ "name": "Hungary",
+ "name_long": "Hungary",
+ "brk_a3": "HUN",
+ "brk_name": "Hungary",
+ "brk_group": null,
+ "abbrev": "Hun.",
+ "postal": "HU",
+ "formal_en": "Republic of Hungary",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Hungary",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 6,
+ "mapcolor9": 1,
+ "mapcolor13": 5,
+ "pop_est": 9905596,
+ "gdp_md_est": 196600,
+ "pop_year": -99,
+ "lastcensus": 2001,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "HU",
+ "iso_a3": "HUN",
+ "iso_n3": "348",
+ "un_a3": "348",
+ "wb_a2": "HU",
+ "wb_a3": "HUN",
+ "woe_id": -99,
+ "adm0_a3_is": "HUN",
+ "adm0_a3_us": "HUN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Eastern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 925,
+ 926,
+ 927,
+ -922,
+ 928,
+ -211,
+ 929
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Indonesia",
+ "sov_a3": "IDN",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Indonesia",
+ "adm0_a3": "IDN",
+ "geou_dif": 0,
+ "geounit": "Indonesia",
+ "gu_a3": "IDN",
+ "su_dif": 0,
+ "subunit": "Indonesia",
+ "su_a3": "IDN",
+ "brk_diff": 0,
+ "name": "Indonesia",
+ "name_long": "Indonesia",
+ "brk_a3": "IDN",
+ "brk_name": "Indonesia",
+ "brk_group": null,
+ "abbrev": "Indo.",
+ "postal": "INDO",
+ "formal_en": "Republic of Indonesia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Indonesia",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 6,
+ "mapcolor9": 6,
+ "mapcolor13": 11,
+ "pop_est": 240271522,
+ "gdp_md_est": 914600,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "4. Emerging region: MIKT",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "ID",
+ "iso_a3": "IDN",
+ "iso_n3": "360",
+ "un_a3": "360",
+ "wb_a2": "ID",
+ "wb_a3": "IDN",
+ "woe_id": -99,
+ "adm0_a3_is": "IDN",
+ "adm0_a3_us": "IDN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "South-Eastern Asia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 9,
+ "long_len": 9,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 930
+ ]
+ ],
+ [
+ [
+ 931
+ ]
+ ],
+ [
+ [
+ 932
+ ]
+ ],
+ [
+ [
+ 933
+ ]
+ ],
+ [
+ [
+ 934,
+ 935,
+ 936,
+ 937
+ ]
+ ],
+ [
+ [
+ 938
+ ]
+ ],
+ [
+ [
+ 939
+ ]
+ ],
+ [
+ [
+ 940
+ ]
+ ],
+ [
+ [
+ 941
+ ]
+ ],
+ [
+ [
+ 942
+ ]
+ ],
+ [
+ [
+ 943
+ ]
+ ],
+ [
+ [
+ 944
+ ]
+ ],
+ [
+ [
+ 945
+ ]
+ ],
+ [
+ [
+ 946
+ ]
+ ],
+ [
+ [
+ 947
+ ]
+ ],
+ [
+ [
+ 948
+ ]
+ ],
+ [
+ [
+ 949
+ ]
+ ],
+ [
+ [
+ 950
+ ]
+ ],
+ [
+ [
+ 951
+ ]
+ ],
+ [
+ [
+ 952
+ ]
+ ],
+ [
+ [
+ 953
+ ]
+ ],
+ [
+ [
+ 954
+ ]
+ ],
+ [
+ [
+ 955
+ ]
+ ],
+ [
+ [
+ 956
+ ]
+ ],
+ [
+ [
+ 957
+ ]
+ ],
+ [
+ [
+ 958
+ ]
+ ],
+ [
+ [
+ 959
+ ]
+ ],
+ [
+ [
+ 960
+ ]
+ ],
+ [
+ [
+ 961
+ ]
+ ],
+ [
+ [
+ 962
+ ]
+ ],
+ [
+ [
+ 963
+ ]
+ ],
+ [
+ [
+ 964
+ ]
+ ],
+ [
+ [
+ 965
+ ]
+ ],
+ [
+ [
+ 966
+ ]
+ ],
+ [
+ [
+ 967
+ ]
+ ],
+ [
+ [
+ 968
+ ]
+ ],
+ [
+ [
+ 969
+ ]
+ ],
+ [
+ [
+ 970
+ ]
+ ],
+ [
+ [
+ 971
+ ]
+ ],
+ [
+ [
+ 972
+ ]
+ ],
+ [
+ [
+ 973
+ ]
+ ],
+ [
+ [
+ 974
+ ]
+ ],
+ [
+ [
+ 975
+ ]
+ ],
+ [
+ [
+ 976
+ ]
+ ],
+ [
+ [
+ 977
+ ]
+ ],
+ [
+ [
+ 978
+ ]
+ ],
+ [
+ [
+ 979
+ ]
+ ],
+ [
+ [
+ 980
+ ]
+ ],
+ [
+ [
+ 981
+ ]
+ ],
+ [
+ [
+ 982
+ ]
+ ],
+ [
+ [
+ 983
+ ]
+ ],
+ [
+ [
+ 984
+ ]
+ ],
+ [
+ [
+ 985
+ ]
+ ],
+ [
+ [
+ 986
+ ]
+ ],
+ [
+ [
+ 987
+ ]
+ ],
+ [
+ [
+ 988
+ ]
+ ],
+ [
+ [
+ 989
+ ]
+ ],
+ [
+ [
+ 990
+ ]
+ ],
+ [
+ [
+ 991
+ ]
+ ],
+ [
+ [
+ 992
+ ]
+ ],
+ [
+ [
+ 993
+ ]
+ ],
+ [
+ [
+ 994
+ ]
+ ],
+ [
+ [
+ 995
+ ]
+ ],
+ [
+ [
+ 996
+ ]
+ ],
+ [
+ [
+ 997
+ ]
+ ],
+ [
+ [
+ 998
+ ]
+ ],
+ [
+ [
+ 999
+ ]
+ ],
+ [
+ [
+ 1000
+ ]
+ ],
+ [
+ [
+ 1001
+ ]
+ ],
+ [
+ [
+ 1002
+ ]
+ ],
+ [
+ [
+ 1003
+ ]
+ ],
+ [
+ [
+ 1004
+ ]
+ ],
+ [
+ [
+ 1005
+ ]
+ ],
+ [
+ [
+ 1006
+ ]
+ ],
+ [
+ [
+ 1007
+ ]
+ ],
+ [
+ [
+ 1008
+ ]
+ ],
+ [
+ [
+ 1009
+ ]
+ ],
+ [
+ [
+ 1010
+ ]
+ ],
+ [
+ [
+ 1011
+ ]
+ ],
+ [
+ [
+ 1012
+ ]
+ ],
+ [
+ [
+ 1013
+ ]
+ ],
+ [
+ [
+ 1014
+ ]
+ ],
+ [
+ [
+ 1015
+ ]
+ ],
+ [
+ [
+ 1016
+ ]
+ ],
+ [
+ [
+ 1017
+ ]
+ ],
+ [
+ [
+ 1018
+ ]
+ ],
+ [
+ [
+ 1019
+ ]
+ ],
+ [
+ [
+ 1020
+ ]
+ ],
+ [
+ [
+ 1021,
+ 1022,
+ 1023
+ ]
+ ],
+ [
+ [
+ 1024
+ ]
+ ],
+ [
+ [
+ 1025
+ ]
+ ],
+ [
+ [
+ 1026
+ ]
+ ],
+ [
+ [
+ 1027
+ ]
+ ],
+ [
+ [
+ 1028
+ ]
+ ],
+ [
+ [
+ 1029
+ ]
+ ],
+ [
+ [
+ 1030
+ ]
+ ],
+ [
+ [
+ 1031
+ ]
+ ],
+ [
+ [
+ 1032
+ ]
+ ],
+ [
+ [
+ 1033
+ ]
+ ],
+ [
+ [
+ 1034
+ ]
+ ],
+ [
+ [
+ 1035
+ ]
+ ],
+ [
+ [
+ 1036
+ ]
+ ],
+ [
+ [
+ 1037
+ ]
+ ],
+ [
+ [
+ 1038
+ ]
+ ],
+ [
+ [
+ 1039
+ ]
+ ],
+ [
+ [
+ 1040
+ ]
+ ],
+ [
+ [
+ 1041
+ ]
+ ],
+ [
+ [
+ 1042
+ ]
+ ],
+ [
+ [
+ 1043
+ ]
+ ],
+ [
+ [
+ 1044
+ ]
+ ],
+ [
+ [
+ 1045
+ ]
+ ],
+ [
+ [
+ 1046
+ ]
+ ],
+ [
+ [
+ 1047
+ ]
+ ],
+ [
+ [
+ 1048
+ ]
+ ],
+ [
+ [
+ 1049
+ ]
+ ],
+ [
+ [
+ 1050
+ ]
+ ],
+ [
+ [
+ 1051
+ ]
+ ],
+ [
+ [
+ 1052
+ ]
+ ],
+ [
+ [
+ 1053
+ ]
+ ],
+ [
+ [
+ 1054
+ ]
+ ],
+ [
+ [
+ 1055
+ ]
+ ],
+ [
+ [
+ 1056
+ ]
+ ],
+ [
+ [
+ 1057
+ ]
+ ],
+ [
+ [
+ 1058
+ ]
+ ],
+ [
+ [
+ 1059
+ ]
+ ],
+ [
+ [
+ 1060
+ ]
+ ],
+ [
+ [
+ 1061
+ ]
+ ],
+ [
+ [
+ 1062,
+ 1063
+ ]
+ ],
+ [
+ [
+ 1064
+ ]
+ ],
+ [
+ [
+ 1065,
+ 1066
+ ]
+ ],
+ [
+ [
+ 1067
+ ]
+ ],
+ [
+ [
+ 1068
+ ]
+ ],
+ [
+ [
+ 1069
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "United Kingdom",
+ "sov_a3": "GB1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Country",
+ "admin": "Isle of Man",
+ "adm0_a3": "IMN",
+ "geou_dif": 0,
+ "geounit": "Isle of Man",
+ "gu_a3": "IMN",
+ "su_dif": 0,
+ "subunit": "Isle of Man",
+ "su_a3": "IMN",
+ "brk_diff": 0,
+ "name": "Isle of Man",
+ "name_long": "Isle of Man",
+ "brk_a3": "IMN",
+ "brk_name": "Isle of Man",
+ "brk_group": null,
+ "abbrev": "IoMan",
+ "postal": "IM",
+ "formal_en": null,
+ "formal_fr": null,
+ "note_adm0": "U.K. crown dependency",
+ "note_brk": null,
+ "name_sort": "Isle of Man",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 6,
+ "mapcolor9": 6,
+ "mapcolor13": 3,
+ "pop_est": 76512,
+ "gdp_md_est": 2719,
+ "pop_year": -99,
+ "lastcensus": 2006,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "IM",
+ "iso_a3": "IMN",
+ "iso_n3": "833",
+ "un_a3": "833",
+ "wb_a2": "IM",
+ "wb_a3": "IMY",
+ "woe_id": -99,
+ "adm0_a3_is": "IMN",
+ "adm0_a3_us": "IMN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Northern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 11,
+ "long_len": 11,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ 1070
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "India",
+ "sov_a3": "IND",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "India",
+ "adm0_a3": "IND",
+ "geou_dif": 0,
+ "geounit": "India",
+ "gu_a3": "IND",
+ "su_dif": 0,
+ "subunit": "India",
+ "su_a3": "IND",
+ "brk_diff": 0,
+ "name": "India",
+ "name_long": "India",
+ "brk_a3": "IND",
+ "brk_name": "India",
+ "brk_group": null,
+ "abbrev": "India",
+ "postal": "IND",
+ "formal_en": "Republic of India",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "India",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 3,
+ "mapcolor9": 2,
+ "mapcolor13": 2,
+ "pop_est": 1166079220,
+ "gdp_md_est": 3297000,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "3. Emerging region: BRIC",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "IN",
+ "iso_a3": "IND",
+ "iso_n3": "356",
+ "un_a3": "356",
+ "wb_a2": "IN",
+ "wb_a3": "IND",
+ "woe_id": -99,
+ "adm0_a3_is": "IND",
+ "adm0_a3_us": "IND",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Southern Asia",
+ "region_wb": "South Asia",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1071
+ ]
+ ],
+ [
+ [
+ 1072
+ ]
+ ],
+ [
+ [
+ 1073
+ ]
+ ],
+ [
+ [
+ 1074
+ ]
+ ],
+ [
+ [
+ 1075
+ ]
+ ],
+ [
+ [
+ 1076
+ ]
+ ],
+ [
+ [
+ 1077
+ ]
+ ],
+ [
+ [
+ 1078
+ ]
+ ],
+ [
+ [
+ 1079
+ ]
+ ],
+ [
+ [
+ 1080
+ ]
+ ],
+ [
+ [
+ 1081
+ ]
+ ],
+ [
+ [
+ 1082
+ ]
+ ],
+ [
+ [
+ 1083,
+ -549,
+ 1084,
+ -547,
+ 1085,
+ 1086,
+ -544,
+ 1087,
+ -542,
+ -327,
+ -541,
+ 1088,
+ -253,
+ 1089,
+ 1090,
+ 1091,
+ 1092,
+ -554,
+ 1093,
+ -552,
+ 1094,
+ -550
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 5,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Australia",
+ "sov_a3": "AU1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Indian Ocean Territories",
+ "adm0_a3": "IOA",
+ "geou_dif": 0,
+ "geounit": "Indian Ocean Territories",
+ "gu_a3": "IOA",
+ "su_dif": 0,
+ "subunit": "Indian Ocean Territories",
+ "su_a3": "IOA",
+ "brk_diff": 0,
+ "name": "Indian Ocean Ter.",
+ "name_long": "Indian Ocean Territories",
+ "brk_a3": "IOA",
+ "brk_name": "Indian Ocean Ter.",
+ "brk_group": null,
+ "abbrev": "Ind. Oc. Ter.",
+ "postal": "IOT",
+ "formal_en": null,
+ "formal_fr": null,
+ "note_adm0": "Auz.",
+ "note_brk": null,
+ "name_sort": "Indian Ocean Territories",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 2,
+ "mapcolor9": 2,
+ "mapcolor13": 7,
+ "pop_est": 2069,
+ "gdp_md_est": 31.035,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "-99",
+ "iso_a3": "-99",
+ "iso_n3": "-99",
+ "un_a3": "-099",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "AUS",
+ "adm0_a3_us": "AUS",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Seven seas (open ocean)",
+ "subregion": "Seven seas (open ocean)",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 17,
+ "long_len": 24,
+ "abbrev_len": 13,
+ "tiny": -99,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ [
+ 1095
+ ]
+ ],
+ [
+ [
+ 1096
+ ]
+ ],
+ [
+ [
+ 1097
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "United Kingdom",
+ "sov_a3": "GB1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "British Indian Ocean Territory",
+ "adm0_a3": "IOT",
+ "geou_dif": 0,
+ "geounit": "British Indian Ocean Territory",
+ "gu_a3": "IOT",
+ "su_dif": 0,
+ "subunit": "British Indian Ocean Territory",
+ "su_a3": "IOT",
+ "brk_diff": 1,
+ "name": "Br. Indian Ocean Ter.",
+ "name_long": "British Indian Ocean Territory",
+ "brk_a3": "B69",
+ "brk_name": "Br. Indian Ocean Ter.",
+ "brk_group": null,
+ "abbrev": "I.O.T.",
+ "postal": "IO",
+ "formal_en": null,
+ "formal_fr": null,
+ "note_adm0": "U.K.",
+ "note_brk": "Admin. by U.K.; Claimed by Mauritius and Seychelles",
+ "name_sort": "British Indian Ocean Territory",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 6,
+ "mapcolor9": 6,
+ "mapcolor13": 3,
+ "pop_est": 4000,
+ "gdp_md_est": 160,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "IO",
+ "iso_a3": "IOT",
+ "iso_n3": "086",
+ "un_a3": "-099",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "IOT",
+ "adm0_a3_us": "IOT",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Seven seas (open ocean)",
+ "region_un": "Seven seas (open ocean)",
+ "subregion": "Seven seas (open ocean)",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 21,
+ "long_len": 30,
+ "abbrev_len": 6,
+ "tiny": 5,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ 1098
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Ireland",
+ "sov_a3": "IRL",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Ireland",
+ "adm0_a3": "IRL",
+ "geou_dif": 0,
+ "geounit": "Ireland",
+ "gu_a3": "IRL",
+ "su_dif": 0,
+ "subunit": "Ireland",
+ "su_a3": "IRL",
+ "brk_diff": 0,
+ "name": "Ireland",
+ "name_long": "Ireland",
+ "brk_a3": "IRL",
+ "brk_name": "Ireland",
+ "brk_group": null,
+ "abbrev": "Ire.",
+ "postal": "IRL",
+ "formal_en": "Ireland",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Ireland",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 3,
+ "mapcolor9": 2,
+ "mapcolor13": 2,
+ "pop_est": 4203200,
+ "gdp_md_est": 188400,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "IE",
+ "iso_a3": "IRL",
+ "iso_n3": "372",
+ "un_a3": "372",
+ "wb_a2": "IE",
+ "wb_a3": "IRL",
+ "woe_id": -99,
+ "adm0_a3_is": "IRL",
+ "adm0_a3_us": "IRL",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Northern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1099
+ ]
+ ],
+ [
+ [
+ 1100,
+ -780
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Iran",
+ "sov_a3": "IRN",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Iran",
+ "adm0_a3": "IRN",
+ "geou_dif": 0,
+ "geounit": "Iran",
+ "gu_a3": "IRN",
+ "su_dif": 0,
+ "subunit": "Iran",
+ "su_a3": "IRN",
+ "brk_diff": 0,
+ "name": "Iran",
+ "name_long": "Iran",
+ "brk_a3": "IRN",
+ "brk_name": "Iran",
+ "brk_group": null,
+ "abbrev": "Iran",
+ "postal": "IRN",
+ "formal_en": "Islamic Republic of Iran",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Iran, Islamic Rep.",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 3,
+ "mapcolor9": 4,
+ "mapcolor13": 13,
+ "pop_est": 66429284,
+ "gdp_md_est": 841700,
+ "pop_year": -99,
+ "lastcensus": 2006,
+ "gdp_year": -99,
+ "economy": "5. Emerging region: G20",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "IR",
+ "iso_a3": "IRN",
+ "iso_n3": "364",
+ "un_a3": "364",
+ "wb_a2": "IR",
+ "wb_a3": "IRN",
+ "woe_id": -99,
+ "adm0_a3_is": "IRN",
+ "adm0_a3_us": "IRN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Southern Asia",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 4,
+ "long_len": 4,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1101
+ ]
+ ],
+ [
+ [
+ -48,
+ -222,
+ 1102,
+ 1103,
+ -5,
+ 1104,
+ 1105,
+ 1106,
+ 1107,
+ 1108,
+ -219
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Iraq",
+ "sov_a3": "IRQ",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Iraq",
+ "adm0_a3": "IRQ",
+ "geou_dif": 0,
+ "geounit": "Iraq",
+ "gu_a3": "IRQ",
+ "su_dif": 0,
+ "subunit": "Iraq",
+ "su_a3": "IRQ",
+ "brk_diff": 0,
+ "name": "Iraq",
+ "name_long": "Iraq",
+ "brk_a3": "IRQ",
+ "brk_name": "Iraq",
+ "brk_group": null,
+ "abbrev": "Iraq",
+ "postal": "IRQ",
+ "formal_en": "Republic of Iraq",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Iraq",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 4,
+ "mapcolor9": 3,
+ "mapcolor13": 1,
+ "pop_est": 31129225,
+ "gdp_md_est": 103900,
+ "pop_year": -99,
+ "lastcensus": 1997,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "IQ",
+ "iso_a3": "IRQ",
+ "iso_n3": "368",
+ "un_a3": "368",
+ "wb_a2": "IQ",
+ "wb_a3": "IRQ",
+ "woe_id": -99,
+ "adm0_a3_is": "IRQ",
+ "adm0_a3_us": "IRQ",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Western Asia",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 4,
+ "long_len": 4,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -1108,
+ 1109,
+ 1110,
+ 1111,
+ 1112,
+ 1113,
+ 1114
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Iceland",
+ "sov_a3": "ISL",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Iceland",
+ "adm0_a3": "ISL",
+ "geou_dif": 0,
+ "geounit": "Iceland",
+ "gu_a3": "ISL",
+ "su_dif": 0,
+ "subunit": "Iceland",
+ "su_a3": "ISL",
+ "brk_diff": 0,
+ "name": "Iceland",
+ "name_long": "Iceland",
+ "brk_a3": "ISL",
+ "brk_name": "Iceland",
+ "brk_group": null,
+ "abbrev": "Iceland",
+ "postal": "IS",
+ "formal_en": "Republic of Iceland",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Iceland",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 4,
+ "mapcolor9": 4,
+ "mapcolor13": 9,
+ "pop_est": 306694,
+ "gdp_md_est": 12710,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "IS",
+ "iso_a3": "ISL",
+ "iso_n3": "352",
+ "un_a3": "352",
+ "wb_a2": "IS",
+ "wb_a3": "ISL",
+ "woe_id": -99,
+ "adm0_a3_is": "ISL",
+ "adm0_a3_us": "ISL",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Northern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 7,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1115
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Israel",
+ "sov_a3": "ISR",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Israel",
+ "adm0_a3": "ISR",
+ "geou_dif": 0,
+ "geounit": "Israel",
+ "gu_a3": "ISR",
+ "su_dif": 0,
+ "subunit": "Israel",
+ "su_a3": "ISR",
+ "brk_diff": 0,
+ "name": "Israel",
+ "name_long": "Israel",
+ "brk_a3": "ISR",
+ "brk_name": "Israel",
+ "brk_group": null,
+ "abbrev": "Isr.",
+ "postal": "IS",
+ "formal_en": "State of Israel",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Israel",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 2,
+ "mapcolor9": 5,
+ "mapcolor13": 9,
+ "pop_est": 7233701,
+ "gdp_md_est": 201400,
+ "pop_year": -99,
+ "lastcensus": 2009,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "IL",
+ "iso_a3": "ISR",
+ "iso_n3": "376",
+ "un_a3": "376",
+ "wb_a2": "IL",
+ "wb_a3": "ISR",
+ "woe_id": -99,
+ "adm0_a3_is": "ISR",
+ "adm0_a3_us": "ISR",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Western Asia",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1116,
+ 1117,
+ 1118,
+ 1119,
+ -677,
+ 1120,
+ 1121,
+ 1122,
+ 1123
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Italy",
+ "sov_a3": "ITA",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Italy",
+ "adm0_a3": "ITA",
+ "geou_dif": 0,
+ "geounit": "Italy",
+ "gu_a3": "ITA",
+ "su_dif": 0,
+ "subunit": "Italy",
+ "su_a3": "ITA",
+ "brk_diff": 0,
+ "name": "Italy",
+ "name_long": "Italy",
+ "brk_a3": "ITA",
+ "brk_name": "Italy",
+ "brk_group": null,
+ "abbrev": "Italy",
+ "postal": "I",
+ "formal_en": "Italian Republic",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Italy",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 7,
+ "mapcolor9": 8,
+ "mapcolor13": 7,
+ "pop_est": 58126212,
+ "gdp_md_est": 1823000,
+ "pop_year": -99,
+ "lastcensus": 2012,
+ "gdp_year": -99,
+ "economy": "1. Developed region: G7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "IT",
+ "iso_a3": "ITA",
+ "iso_n3": "380",
+ "un_a3": "380",
+ "wb_a2": "IT",
+ "wb_a3": "ITA",
+ "woe_id": -99,
+ "adm0_a3_is": "ITA",
+ "adm0_a3_us": "ITA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Southern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1124
+ ]
+ ],
+ [
+ [
+ 1125
+ ]
+ ],
+ [
+ [
+ 1126
+ ]
+ ],
+ [
+ [
+ 1127
+ ]
+ ],
+ [
+ [
+ 1128
+ ]
+ ],
+ [
+ [
+ 1129
+ ]
+ ],
+ [
+ [
+ 1130
+ ]
+ ],
+ [
+ [
+ 1131,
+ 1132,
+ -761,
+ -485,
+ -213
+ ],
+ [
+ 1133
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Jamaica",
+ "sov_a3": "JAM",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Jamaica",
+ "adm0_a3": "JAM",
+ "geou_dif": 0,
+ "geounit": "Jamaica",
+ "gu_a3": "JAM",
+ "su_dif": 0,
+ "subunit": "Jamaica",
+ "su_a3": "JAM",
+ "brk_diff": 0,
+ "name": "Jamaica",
+ "name_long": "Jamaica",
+ "brk_a3": "JAM",
+ "brk_name": "Jamaica",
+ "brk_group": null,
+ "abbrev": "Jam.",
+ "postal": "J",
+ "formal_en": "Jamaica",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Jamaica",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 2,
+ "mapcolor9": 4,
+ "mapcolor13": 10,
+ "pop_est": 2825928,
+ "gdp_md_est": 20910,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "JM",
+ "iso_a3": "JAM",
+ "iso_n3": "388",
+ "un_a3": "388",
+ "wb_a2": "JM",
+ "wb_a3": "JAM",
+ "woe_id": -99,
+ "adm0_a3_is": "JAM",
+ "adm0_a3_us": "JAM",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1134
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 4,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "United Kingdom",
+ "sov_a3": "GB1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Country",
+ "admin": "Jersey",
+ "adm0_a3": "JEY",
+ "geou_dif": 0,
+ "geounit": "Jersey",
+ "gu_a3": "JEY",
+ "su_dif": 0,
+ "subunit": "Jersey",
+ "su_a3": "JEY",
+ "brk_diff": 0,
+ "name": "Jersey",
+ "name_long": "Jersey",
+ "brk_a3": "JEY",
+ "brk_name": "Jersey",
+ "brk_group": "Channel Islands",
+ "abbrev": "Jey.",
+ "postal": "JE",
+ "formal_en": "Bailiwick of Jersey",
+ "formal_fr": null,
+ "note_adm0": "U.K. crown dependency",
+ "note_brk": null,
+ "name_sort": "Jersey",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 6,
+ "mapcolor9": 6,
+ "mapcolor13": 3,
+ "pop_est": 91626,
+ "gdp_md_est": 5100,
+ "pop_year": -99,
+ "lastcensus": 2001,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "JE",
+ "iso_a3": "JEY",
+ "iso_n3": "832",
+ "un_a3": "832",
+ "wb_a2": "JG",
+ "wb_a3": "CHI",
+ "woe_id": -99,
+ "adm0_a3_is": "JEY",
+ "adm0_a3_us": "JEY",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Northern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ 1135
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Jordan",
+ "sov_a3": "JOR",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Jordan",
+ "adm0_a3": "JOR",
+ "geou_dif": 0,
+ "geounit": "Jordan",
+ "gu_a3": "JOR",
+ "su_dif": 0,
+ "subunit": "Jordan",
+ "su_a3": "JOR",
+ "brk_diff": 0,
+ "name": "Jordan",
+ "name_long": "Jordan",
+ "brk_a3": "JOR",
+ "brk_name": "Jordan",
+ "brk_group": null,
+ "abbrev": "Jord.",
+ "postal": "J",
+ "formal_en": "Hashemite Kingdom of Jordan",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Jordan",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 3,
+ "mapcolor9": 4,
+ "mapcolor13": 4,
+ "pop_est": 6342948,
+ "gdp_md_est": 31610,
+ "pop_year": -99,
+ "lastcensus": 2004,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "JO",
+ "iso_a3": "JOR",
+ "iso_n3": "400",
+ "un_a3": "400",
+ "wb_a2": "JO",
+ "wb_a3": "JOR",
+ "woe_id": -99,
+ "adm0_a3_is": "JOR",
+ "adm0_a3_us": "JOR",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Western Asia",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1136,
+ 1137,
+ -1119,
+ 1138,
+ -1117,
+ 1139,
+ -1113
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Japan",
+ "sov_a3": "JPN",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Japan",
+ "adm0_a3": "JPN",
+ "geou_dif": 0,
+ "geounit": "Japan",
+ "gu_a3": "JPN",
+ "su_dif": 0,
+ "subunit": "Japan",
+ "su_a3": "JPN",
+ "brk_diff": 0,
+ "name": "Japan",
+ "name_long": "Japan",
+ "brk_a3": "JPN",
+ "brk_name": "Japan",
+ "brk_group": null,
+ "abbrev": "Japan",
+ "postal": "J",
+ "formal_en": "Japan",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Japan",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 3,
+ "mapcolor9": 5,
+ "mapcolor13": 4,
+ "pop_est": 127078679,
+ "gdp_md_est": 4329000,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "1. Developed region: G7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "JP",
+ "iso_a3": "JPN",
+ "iso_n3": "392",
+ "un_a3": "392",
+ "wb_a2": "JP",
+ "wb_a3": "JPN",
+ "woe_id": -99,
+ "adm0_a3_is": "JPN",
+ "adm0_a3_us": "JPN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Eastern Asia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1140
+ ]
+ ],
+ [
+ [
+ 1141
+ ]
+ ],
+ [
+ [
+ 1142
+ ]
+ ],
+ [
+ [
+ 1143
+ ]
+ ],
+ [
+ [
+ 1144
+ ]
+ ],
+ [
+ [
+ 1145
+ ]
+ ],
+ [
+ [
+ 1146
+ ]
+ ],
+ [
+ [
+ 1147
+ ]
+ ],
+ [
+ [
+ 1148
+ ]
+ ],
+ [
+ [
+ 1149
+ ]
+ ],
+ [
+ [
+ 1150
+ ]
+ ],
+ [
+ [
+ 1151
+ ]
+ ],
+ [
+ [
+ 1152
+ ]
+ ],
+ [
+ [
+ 1153
+ ]
+ ],
+ [
+ [
+ 1154
+ ]
+ ],
+ [
+ [
+ 1155
+ ]
+ ],
+ [
+ [
+ 1156
+ ]
+ ],
+ [
+ [
+ 1157
+ ]
+ ],
+ [
+ [
+ 1158
+ ]
+ ],
+ [
+ [
+ 1159
+ ]
+ ],
+ [
+ [
+ 1160
+ ]
+ ],
+ [
+ [
+ 1161
+ ]
+ ],
+ [
+ [
+ 1162
+ ]
+ ],
+ [
+ [
+ 1163
+ ]
+ ],
+ [
+ [
+ 1164
+ ]
+ ],
+ [
+ [
+ 1165
+ ]
+ ],
+ [
+ [
+ 1166
+ ]
+ ],
+ [
+ [
+ 1167
+ ]
+ ],
+ [
+ [
+ 1168
+ ]
+ ],
+ [
+ [
+ 1169
+ ]
+ ],
+ [
+ [
+ 1170
+ ]
+ ],
+ [
+ [
+ 1171
+ ]
+ ],
+ [
+ [
+ 1172
+ ]
+ ],
+ [
+ [
+ 1173
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Kashmir",
+ "sov_a3": "KAS",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Indeterminate",
+ "admin": "Siachen Glacier",
+ "adm0_a3": "KAS",
+ "geou_dif": 0,
+ "geounit": "Siachen Glacier",
+ "gu_a3": "KAS",
+ "su_dif": 0,
+ "subunit": "Siachen Glacier",
+ "su_a3": "KAS",
+ "brk_diff": 1,
+ "name": "Siachen Glacier",
+ "name_long": "Siachen Glacier",
+ "brk_a3": "B45",
+ "brk_name": "Siachen Glacier",
+ "brk_group": "Jammu and Kashmir",
+ "abbrev": "Siachen",
+ "postal": "SG",
+ "formal_en": null,
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": "Claimed by Pakistan and India",
+ "name_sort": "Kashmir",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 7,
+ "mapcolor9": 6,
+ "mapcolor13": -99,
+ "pop_est": 6000,
+ "gdp_md_est": 15,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "-99",
+ "iso_a3": "-99",
+ "iso_n3": "-99",
+ "un_a3": "-099",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "-99",
+ "adm0_a3_us": "KAS",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Southern Asia",
+ "region_wb": "South Asia",
+ "name_len": 15,
+ "long_len": 15,
+ "abbrev_len": 7,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -1092,
+ 1174,
+ -556
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Kazakhstan",
+ "sov_a3": "KAZ",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Kazakhstan",
+ "adm0_a3": "KAZ",
+ "geou_dif": 0,
+ "geounit": "Kazakhstan",
+ "gu_a3": "KAZ",
+ "su_dif": 0,
+ "subunit": "Kazakhstan",
+ "su_a3": "KAZ",
+ "brk_diff": 0,
+ "name": "Kazakhstan",
+ "name_long": "Kazakhstan",
+ "brk_a3": "KAZ",
+ "brk_name": "Kazakhstan",
+ "brk_group": null,
+ "abbrev": "Kaz.",
+ "postal": "KZ",
+ "formal_en": "Republic of Kazakhstan",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Kazakhstan",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 1,
+ "mapcolor9": 6,
+ "mapcolor13": 1,
+ "pop_est": 15399437,
+ "gdp_md_est": 175800,
+ "pop_year": -99,
+ "lastcensus": 2009,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "KZ",
+ "iso_a3": "KAZ",
+ "iso_n3": "398",
+ "un_a3": "398",
+ "wb_a2": "KZ",
+ "wb_a3": "KAZ",
+ "woe_id": -99,
+ "adm0_a3_is": "KAZ",
+ "adm0_a3_us": "KAZ",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Central Asia",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 10,
+ "long_len": 10,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1175
+ ]
+ ],
+ [
+ [
+ 1176
+ ]
+ ],
+ [
+ [
+ 1177
+ ]
+ ],
+ [
+ [
+ -560,
+ 1178,
+ 1179,
+ 1180,
+ 1181,
+ 1182
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Kenya",
+ "sov_a3": "KEN",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Kenya",
+ "adm0_a3": "KEN",
+ "geou_dif": 0,
+ "geounit": "Kenya",
+ "gu_a3": "KEN",
+ "su_dif": 0,
+ "subunit": "Kenya",
+ "su_a3": "KEN",
+ "brk_diff": 0,
+ "name": "Kenya",
+ "name_long": "Kenya",
+ "brk_a3": "KEN",
+ "brk_name": "Kenya",
+ "brk_group": null,
+ "abbrev": "Ken.",
+ "postal": "KE",
+ "formal_en": "Republic of Kenya",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Kenya",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 2,
+ "mapcolor9": 7,
+ "mapcolor13": 3,
+ "pop_est": 39002772,
+ "gdp_md_est": 61510,
+ "pop_year": -99,
+ "lastcensus": 2009,
+ "gdp_year": -99,
+ "economy": "5. Emerging region: G20",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "KE",
+ "iso_a3": "KEN",
+ "iso_n3": "404",
+ "un_a3": "404",
+ "wb_a2": "KE",
+ "wb_a3": "KEN",
+ "woe_id": -99,
+ "adm0_a3_is": "KEN",
+ "adm0_a3_us": "KEN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Eastern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1183
+ ]
+ ],
+ [
+ [
+ 1184,
+ 1185,
+ 1186,
+ 1187,
+ 1188,
+ -711
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Kyrgyzstan",
+ "sov_a3": "KGZ",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Kyrgyzstan",
+ "adm0_a3": "KGZ",
+ "geou_dif": 0,
+ "geounit": "Kyrgyzstan",
+ "gu_a3": "KGZ",
+ "su_dif": 0,
+ "subunit": "Kyrgyzstan",
+ "su_a3": "KGZ",
+ "brk_diff": 0,
+ "name": "Kyrgyzstan",
+ "name_long": "Kyrgyzstan",
+ "brk_a3": "KGZ",
+ "brk_name": "Kyrgyzstan",
+ "brk_group": null,
+ "abbrev": "Kgz.",
+ "postal": "KG",
+ "formal_en": "Kyrgyz Republic",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Kyrgyz Republic",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 7,
+ "mapcolor9": 7,
+ "mapcolor13": 6,
+ "pop_est": 5431747,
+ "gdp_md_est": 11610,
+ "pop_year": -99,
+ "lastcensus": 2009,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "KG",
+ "iso_a3": "KGZ",
+ "iso_n3": "417",
+ "un_a3": "417",
+ "wb_a2": "KG",
+ "wb_a3": "KGZ",
+ "woe_id": -99,
+ "adm0_a3_is": "KGZ",
+ "adm0_a3_us": "KGZ",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Central Asia",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 10,
+ "long_len": 10,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -559,
+ 1189,
+ 1190,
+ -1179
+ ],
+ [
+ 1191
+ ],
+ [
+ 1192
+ ],
+ [
+ 1193
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Cambodia",
+ "sov_a3": "KHM",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Cambodia",
+ "adm0_a3": "KHM",
+ "geou_dif": 0,
+ "geounit": "Cambodia",
+ "gu_a3": "KHM",
+ "su_dif": 0,
+ "subunit": "Cambodia",
+ "su_a3": "KHM",
+ "brk_diff": 0,
+ "name": "Cambodia",
+ "name_long": "Cambodia",
+ "brk_a3": "KHM",
+ "brk_name": "Cambodia",
+ "brk_group": null,
+ "abbrev": "Camb.",
+ "postal": "KH",
+ "formal_en": "Kingdom of Cambodia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Cambodia",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 3,
+ "mapcolor9": 6,
+ "mapcolor13": 5,
+ "pop_est": 14494293,
+ "gdp_md_est": 27940,
+ "pop_year": -99,
+ "lastcensus": 2008,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "KH",
+ "iso_a3": "KHM",
+ "iso_n3": "116",
+ "un_a3": "116",
+ "wb_a2": "KH",
+ "wb_a3": "KHM",
+ "woe_id": -99,
+ "adm0_a3_is": "KHM",
+ "adm0_a3_us": "KHM",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "South-Eastern Asia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1194
+ ]
+ ],
+ [
+ [
+ 1195
+ ]
+ ],
+ [
+ [
+ 1196,
+ 1197,
+ 1198,
+ 1199
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Kiribati",
+ "sov_a3": "KIR",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Kiribati",
+ "adm0_a3": "KIR",
+ "geou_dif": 0,
+ "geounit": "Kiribati",
+ "gu_a3": "KIR",
+ "su_dif": 0,
+ "subunit": "Kiribati",
+ "su_a3": "KIR",
+ "brk_diff": 0,
+ "name": "Kiribati",
+ "name_long": "Kiribati",
+ "brk_a3": "KIR",
+ "brk_name": "Kiribati",
+ "brk_group": null,
+ "abbrev": "Kir.",
+ "postal": "KI",
+ "formal_en": "Republic of Kiribati",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Kiribati",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 7,
+ "mapcolor9": 6,
+ "mapcolor13": 12,
+ "pop_est": 112850,
+ "gdp_md_est": 579.5,
+ "pop_year": -99,
+ "lastcensus": 2005,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "KI",
+ "iso_a3": "KIR",
+ "iso_n3": "296",
+ "un_a3": "296",
+ "wb_a2": "KI",
+ "wb_a3": "KIR",
+ "woe_id": -99,
+ "adm0_a3_is": "KIR",
+ "adm0_a3_us": "KIR",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Micronesia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 4,
+ "tiny": 2,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1200
+ ]
+ ],
+ [
+ [
+ 1201
+ ]
+ ],
+ [
+ [
+ 1202
+ ]
+ ],
+ [
+ [
+ 1203
+ ]
+ ],
+ [
+ [
+ 1204
+ ]
+ ],
+ [
+ [
+ 1205
+ ]
+ ],
+ [
+ [
+ 1206
+ ]
+ ],
+ [
+ [
+ 1207
+ ]
+ ],
+ [
+ [
+ 1208
+ ]
+ ],
+ [
+ [
+ 1209
+ ]
+ ],
+ [
+ [
+ 1210
+ ]
+ ],
+ [
+ [
+ 1211
+ ]
+ ],
+ [
+ [
+ 1212
+ ]
+ ],
+ [
+ [
+ 1213
+ ]
+ ],
+ [
+ [
+ 1214
+ ]
+ ],
+ [
+ [
+ 1215
+ ]
+ ],
+ [
+ [
+ 1216
+ ]
+ ],
+ [
+ [
+ 1217
+ ]
+ ],
+ [
+ [
+ 1218
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Saint Kitts and Nevis",
+ "sov_a3": "KNA",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Saint Kitts and Nevis",
+ "adm0_a3": "KNA",
+ "geou_dif": 0,
+ "geounit": "Saint Kitts and Nevis",
+ "gu_a3": "KNA",
+ "su_dif": 0,
+ "subunit": "Saint Kitts and Nevis",
+ "su_a3": "KNA",
+ "brk_diff": 0,
+ "name": "St. Kitts and Nevis",
+ "name_long": "Saint Kitts and Nevis",
+ "brk_a3": "KNA",
+ "brk_name": "Saint Kitts and Nevis",
+ "brk_group": null,
+ "abbrev": "St.K.N.",
+ "postal": "KN",
+ "formal_en": "Federation of Saint Kitts and Nevis",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "St. Kitts and Nevis",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 4,
+ "mapcolor9": 1,
+ "mapcolor13": 8,
+ "pop_est": 40131,
+ "gdp_md_est": 777.7,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "KN",
+ "iso_a3": "KNA",
+ "iso_n3": "659",
+ "un_a3": "659",
+ "wb_a2": "KN",
+ "wb_a3": "KNA",
+ "woe_id": -99,
+ "adm0_a3_is": "KNA",
+ "adm0_a3_us": "KNA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 19,
+ "long_len": 21,
+ "abbrev_len": 7,
+ "tiny": 4,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1219
+ ]
+ ],
+ [
+ [
+ 1220
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "South Korea",
+ "sov_a3": "KOR",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "South Korea",
+ "adm0_a3": "KOR",
+ "geou_dif": 0,
+ "geounit": "South Korea",
+ "gu_a3": "KOR",
+ "su_dif": 0,
+ "subunit": "South Korea",
+ "su_a3": "KOR",
+ "brk_diff": 0,
+ "name": "Korea",
+ "name_long": "Republic of Korea",
+ "brk_a3": "KOR",
+ "brk_name": "Republic of Korea",
+ "brk_group": null,
+ "abbrev": "S.K.",
+ "postal": "KR",
+ "formal_en": "Republic of Korea",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Korea, Rep.",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 1,
+ "mapcolor9": 1,
+ "mapcolor13": 5,
+ "pop_est": 48508972,
+ "gdp_md_est": 1335000,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "4. Emerging region: MIKT",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "KR",
+ "iso_a3": "KOR",
+ "iso_n3": "410",
+ "un_a3": "410",
+ "wb_a2": "KR",
+ "wb_a3": "KOR",
+ "woe_id": -99,
+ "adm0_a3_is": "KOR",
+ "adm0_a3_us": "KOR",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Eastern Asia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 5,
+ "long_len": 17,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1221
+ ]
+ ],
+ [
+ [
+ 1222
+ ]
+ ],
+ [
+ [
+ 1223
+ ]
+ ],
+ [
+ [
+ 1224
+ ]
+ ],
+ [
+ [
+ 1225
+ ]
+ ],
+ [
+ [
+ 1226
+ ]
+ ],
+ [
+ [
+ 1227
+ ]
+ ],
+ [
+ [
+ 1228
+ ]
+ ],
+ [
+ [
+ 1229
+ ]
+ ],
+ [
+ [
+ 1230
+ ]
+ ],
+ [
+ [
+ 1231,
+ 1232
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Kosovo",
+ "sov_a3": "KOS",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Kosovo",
+ "adm0_a3": "KOS",
+ "geou_dif": 0,
+ "geounit": "Kosovo",
+ "gu_a3": "KOS",
+ "su_dif": 0,
+ "subunit": "Kosovo",
+ "su_a3": "KOS",
+ "brk_diff": 1,
+ "name": "Kosovo",
+ "name_long": "Kosovo",
+ "brk_a3": "B57",
+ "brk_name": "Kosovo",
+ "brk_group": null,
+ "abbrev": "Kos.",
+ "postal": "KO",
+ "formal_en": "Republic of Kosovo",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": "Self admin.; Claimed by Serbia",
+ "name_sort": "Kosovo",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 2,
+ "mapcolor9": 3,
+ "mapcolor13": 11,
+ "pop_est": 1804838,
+ "gdp_md_est": 5352,
+ "pop_year": -99,
+ "lastcensus": 1981,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "-99",
+ "iso_a3": "-99",
+ "iso_n3": "-99",
+ "un_a3": "-099",
+ "wb_a2": "KV",
+ "wb_a3": "KSV",
+ "woe_id": -99,
+ "adm0_a3_is": "SRB",
+ "adm0_a3_us": "KOS",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Southern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1233,
+ -17,
+ 1234,
+ 1235
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Kuwait",
+ "sov_a3": "KWT",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Kuwait",
+ "adm0_a3": "KWT",
+ "geou_dif": 0,
+ "geounit": "Kuwait",
+ "gu_a3": "KWT",
+ "su_dif": 0,
+ "subunit": "Kuwait",
+ "su_a3": "KWT",
+ "brk_diff": 0,
+ "name": "Kuwait",
+ "name_long": "Kuwait",
+ "brk_a3": "KWT",
+ "brk_name": "Kuwait",
+ "brk_group": null,
+ "abbrev": "Kwt.",
+ "postal": "KW",
+ "formal_en": "State of Kuwait",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Kuwait",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 2,
+ "mapcolor9": 2,
+ "mapcolor13": 2,
+ "pop_est": 2691158,
+ "gdp_md_est": 149100,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "KW",
+ "iso_a3": "KWT",
+ "iso_n3": "414",
+ "un_a3": "414",
+ "wb_a2": "KW",
+ "wb_a3": "KWT",
+ "woe_id": -99,
+ "adm0_a3_is": "KWT",
+ "adm0_a3_us": "KWT",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Western Asia",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1236
+ ]
+ ],
+ [
+ [
+ 1237,
+ -1111,
+ 1238
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Laos",
+ "sov_a3": "LAO",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Laos",
+ "adm0_a3": "LAO",
+ "geou_dif": 0,
+ "geounit": "Laos",
+ "gu_a3": "LAO",
+ "su_dif": 0,
+ "subunit": "Laos",
+ "su_a3": "LAO",
+ "brk_diff": 0,
+ "name": "Lao PDR",
+ "name_long": "Lao PDR",
+ "brk_a3": "LAO",
+ "brk_name": "Laos",
+ "brk_group": null,
+ "abbrev": "Laos",
+ "postal": "LA",
+ "formal_en": "Lao People's Democratic Republic",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Lao PDR",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 1,
+ "mapcolor9": 1,
+ "mapcolor13": 9,
+ "pop_est": 6834942,
+ "gdp_md_est": 13980,
+ "pop_year": -99,
+ "lastcensus": 2005,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "LA",
+ "iso_a3": "LAO",
+ "iso_n3": "418",
+ "un_a3": "418",
+ "wb_a2": "LA",
+ "wb_a3": "LAO",
+ "woe_id": -99,
+ "adm0_a3_is": "LAO",
+ "adm0_a3_us": "LAO",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "South-Eastern Asia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1239,
+ 1240,
+ 1241,
+ -1199,
+ 1242,
+ 1243,
+ -539
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Lebanon",
+ "sov_a3": "LBN",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Lebanon",
+ "adm0_a3": "LBN",
+ "geou_dif": 0,
+ "geounit": "Lebanon",
+ "gu_a3": "LBN",
+ "su_dif": 0,
+ "subunit": "Lebanon",
+ "su_a3": "LBN",
+ "brk_diff": 0,
+ "name": "Lebanon",
+ "name_long": "Lebanon",
+ "brk_a3": "LBN",
+ "brk_name": "Lebanon",
+ "brk_group": null,
+ "abbrev": "Leb.",
+ "postal": "LB",
+ "formal_en": "Lebanese Republic",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Lebanon",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 4,
+ "mapcolor9": 4,
+ "mapcolor13": 12,
+ "pop_est": 4017095,
+ "gdp_md_est": 44060,
+ "pop_year": -99,
+ "lastcensus": 1970,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "LB",
+ "iso_a3": "LBN",
+ "iso_n3": "422",
+ "un_a3": "422",
+ "wb_a2": "LB",
+ "wb_a3": "LBN",
+ "woe_id": -99,
+ "adm0_a3_is": "LBN",
+ "adm0_a3_us": "LBN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Western Asia",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": 4,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -1123,
+ 1244,
+ 1245
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Liberia",
+ "sov_a3": "LBR",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Liberia",
+ "adm0_a3": "LBR",
+ "geou_dif": 0,
+ "geounit": "Liberia",
+ "gu_a3": "LBR",
+ "su_dif": 0,
+ "subunit": "Liberia",
+ "su_a3": "LBR",
+ "brk_diff": 0,
+ "name": "Liberia",
+ "name_long": "Liberia",
+ "brk_a3": "LBR",
+ "brk_name": "Liberia",
+ "brk_group": null,
+ "abbrev": "Liberia",
+ "postal": "LR",
+ "formal_en": "Republic of Liberia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Liberia",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 3,
+ "mapcolor9": 4,
+ "mapcolor13": 9,
+ "pop_est": 3441790,
+ "gdp_md_est": 1526,
+ "pop_year": -99,
+ "lastcensus": 2008,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "LR",
+ "iso_a3": "LBR",
+ "iso_n3": "430",
+ "un_a3": "430",
+ "wb_a2": "LR",
+ "wb_a3": "LBR",
+ "woe_id": -99,
+ "adm0_a3_is": "LBR",
+ "adm0_a3_us": "LBR",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Western Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 7,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -568,
+ 1246,
+ 1247,
+ -810
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Libya",
+ "sov_a3": "LBY",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Libya",
+ "adm0_a3": "LBY",
+ "geou_dif": 0,
+ "geounit": "Libya",
+ "gu_a3": "LBY",
+ "su_dif": 0,
+ "subunit": "Libya",
+ "su_a3": "LBY",
+ "brk_diff": 0,
+ "name": "Libya",
+ "name_long": "Libya",
+ "brk_a3": "LBY",
+ "brk_name": "Libya",
+ "brk_group": null,
+ "abbrev": "Libya",
+ "postal": "LY",
+ "formal_en": "Libya",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Libya",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 2,
+ "mapcolor9": 2,
+ "mapcolor13": 11,
+ "pop_est": 6310434,
+ "gdp_md_est": 88830,
+ "pop_year": -99,
+ "lastcensus": 2006,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "LY",
+ "iso_a3": "LBY",
+ "iso_n3": "434",
+ "un_a3": "434",
+ "wb_a2": "LY",
+ "wb_a3": "LBY",
+ "woe_id": -99,
+ "adm0_a3_is": "LBY",
+ "adm0_a3_us": "LBY",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Northern Africa",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -680,
+ 1248,
+ 1249,
+ 1250,
+ -659,
+ 1251,
+ 1252
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Saint Lucia",
+ "sov_a3": "LCA",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Saint Lucia",
+ "adm0_a3": "LCA",
+ "geou_dif": 0,
+ "geounit": "Saint Lucia",
+ "gu_a3": "LCA",
+ "su_dif": 0,
+ "subunit": "Saint Lucia",
+ "su_a3": "LCA",
+ "brk_diff": 0,
+ "name": "Saint Lucia",
+ "name_long": "Saint Lucia",
+ "brk_a3": "LCA",
+ "brk_name": "Saint Lucia",
+ "brk_group": null,
+ "abbrev": "S.L.",
+ "postal": "LC",
+ "formal_en": "Saint Lucia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "St. Lucia",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 4,
+ "mapcolor9": 3,
+ "mapcolor13": 4,
+ "pop_est": 160267,
+ "gdp_md_est": 1778,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "LC",
+ "iso_a3": "LCA",
+ "iso_n3": "662",
+ "un_a3": "662",
+ "wb_a2": "LC",
+ "wb_a3": "LCA",
+ "woe_id": -99,
+ "adm0_a3_is": "LCA",
+ "adm0_a3_us": "LCA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 11,
+ "long_len": 11,
+ "abbrev_len": 4,
+ "tiny": 4,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1253
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Liechtenstein",
+ "sov_a3": "LIE",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Liechtenstein",
+ "adm0_a3": "LIE",
+ "geou_dif": 0,
+ "geounit": "Liechtenstein",
+ "gu_a3": "LIE",
+ "su_dif": 0,
+ "subunit": "Liechtenstein",
+ "su_a3": "LIE",
+ "brk_diff": 0,
+ "name": "Liechtenstein",
+ "name_long": "Liechtenstein",
+ "brk_a3": "LIE",
+ "brk_name": "Liechtenstein",
+ "brk_group": null,
+ "abbrev": "Liech.",
+ "postal": "FL",
+ "formal_en": "Principality of Liechtenstein",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Liechtenstein",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 4,
+ "mapcolor9": 2,
+ "mapcolor13": 9,
+ "pop_est": 34761,
+ "gdp_md_est": 4160,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "LI",
+ "iso_a3": "LIE",
+ "iso_n3": "438",
+ "un_a3": "438",
+ "wb_a2": "LI",
+ "wb_a3": "LIE",
+ "woe_id": -99,
+ "adm0_a3_is": "LIE",
+ "adm0_a3_us": "LIE",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Western Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 13,
+ "long_len": 13,
+ "abbrev_len": 6,
+ "tiny": 6,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -484,
+ -215
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Sri Lanka",
+ "sov_a3": "LKA",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Sri Lanka",
+ "adm0_a3": "LKA",
+ "geou_dif": 0,
+ "geounit": "Sri Lanka",
+ "gu_a3": "LKA",
+ "su_dif": 0,
+ "subunit": "Sri Lanka",
+ "su_a3": "LKA",
+ "brk_diff": 0,
+ "name": "Sri Lanka",
+ "name_long": "Sri Lanka",
+ "brk_a3": "LKA",
+ "brk_name": "Sri Lanka",
+ "brk_group": null,
+ "abbrev": "Sri L.",
+ "postal": "LK",
+ "formal_en": "Democratic Socialist Republic of Sri Lanka",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Sri Lanka",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 5,
+ "mapcolor9": 4,
+ "mapcolor13": 9,
+ "pop_est": 21324791,
+ "gdp_md_est": 91870,
+ "pop_year": -99,
+ "lastcensus": 2001,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "LK",
+ "iso_a3": "LKA",
+ "iso_n3": "144",
+ "un_a3": "144",
+ "wb_a2": "LK",
+ "wb_a3": "LKA",
+ "woe_id": -99,
+ "adm0_a3_is": "LKA",
+ "adm0_a3_us": "LKA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Southern Asia",
+ "region_wb": "South Asia",
+ "name_len": 9,
+ "long_len": 9,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1254
+ ]
+ ],
+ [
+ [
+ 1255
+ ]
+ ],
+ [
+ [
+ 1256
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Lesotho",
+ "sov_a3": "LSO",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Lesotho",
+ "adm0_a3": "LSO",
+ "geou_dif": 0,
+ "geounit": "Lesotho",
+ "gu_a3": "LSO",
+ "su_dif": 0,
+ "subunit": "Lesotho",
+ "su_a3": "LSO",
+ "brk_diff": 0,
+ "name": "Lesotho",
+ "name_long": "Lesotho",
+ "brk_a3": "LSO",
+ "brk_name": "Lesotho",
+ "brk_group": null,
+ "abbrev": "Les.",
+ "postal": "LS",
+ "formal_en": "Kingdom of Lesotho",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Lesotho",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 5,
+ "mapcolor9": 2,
+ "mapcolor13": 8,
+ "pop_est": 2130819,
+ "gdp_md_est": 3293,
+ "pop_year": -99,
+ "lastcensus": 2006,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "LS",
+ "iso_a3": "LSO",
+ "iso_n3": "426",
+ "un_a3": "426",
+ "wb_a2": "LS",
+ "wb_a3": "LSO",
+ "woe_id": -99,
+ "adm0_a3_is": "LSO",
+ "adm0_a3_us": "LSO",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Southern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1257
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Lithuania",
+ "sov_a3": "LTU",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Lithuania",
+ "adm0_a3": "LTU",
+ "geou_dif": 0,
+ "geounit": "Lithuania",
+ "gu_a3": "LTU",
+ "su_dif": 0,
+ "subunit": "Lithuania",
+ "su_a3": "LTU",
+ "brk_diff": 0,
+ "name": "Lithuania",
+ "name_long": "Lithuania",
+ "brk_a3": "LTU",
+ "brk_name": "Lithuania",
+ "brk_group": null,
+ "abbrev": "Lith.",
+ "postal": "LT",
+ "formal_en": "Republic of Lithuania",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Lithuania",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 3,
+ "mapcolor9": 3,
+ "mapcolor13": 9,
+ "pop_est": 3555179,
+ "gdp_md_est": 63330,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "LT",
+ "iso_a3": "LTU",
+ "iso_n3": "440",
+ "un_a3": "440",
+ "wb_a2": "LT",
+ "wb_a3": "LTU",
+ "woe_id": -99,
+ "adm0_a3_is": "LTU",
+ "adm0_a3_us": "LTU",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Northern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 9,
+ "long_len": 9,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1258,
+ 1259
+ ]
+ ],
+ [
+ [
+ -285,
+ 1260,
+ 1261,
+ 1262,
+ 1263
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Luxembourg",
+ "sov_a3": "LUX",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Luxembourg",
+ "adm0_a3": "LUX",
+ "geou_dif": 0,
+ "geounit": "Luxembourg",
+ "gu_a3": "LUX",
+ "su_dif": 0,
+ "subunit": "Luxembourg",
+ "su_a3": "LUX",
+ "brk_diff": 0,
+ "name": "Luxembourg",
+ "name_long": "Luxembourg",
+ "brk_a3": "LUX",
+ "brk_name": "Luxembourg",
+ "brk_group": null,
+ "abbrev": "Lux.",
+ "postal": "L",
+ "formal_en": "Grand Duchy of Luxembourg",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Luxembourg",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 7,
+ "mapcolor9": 3,
+ "mapcolor13": 7,
+ "pop_est": 491775,
+ "gdp_md_est": 39370,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "LU",
+ "iso_a3": "LUX",
+ "iso_n3": "442",
+ "un_a3": "442",
+ "wb_a2": "LU",
+ "wb_a3": "LUX",
+ "woe_id": -99,
+ "adm0_a3_is": "LUX",
+ "adm0_a3_us": "LUX",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Western Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 10,
+ "long_len": 10,
+ "abbrev_len": 4,
+ "tiny": 5,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -634,
+ -760,
+ -230
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Latvia",
+ "sov_a3": "LVA",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Latvia",
+ "adm0_a3": "LVA",
+ "geou_dif": 0,
+ "geounit": "Latvia",
+ "gu_a3": "LVA",
+ "su_dif": 0,
+ "subunit": "Latvia",
+ "su_a3": "LVA",
+ "brk_diff": 0,
+ "name": "Latvia",
+ "name_long": "Latvia",
+ "brk_a3": "LVA",
+ "brk_name": "Latvia",
+ "brk_group": null,
+ "abbrev": "Lat.",
+ "postal": "LV",
+ "formal_en": "Republic of Latvia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Latvia",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 7,
+ "mapcolor9": 6,
+ "mapcolor13": 13,
+ "pop_est": 2231503,
+ "gdp_md_est": 38860,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "LV",
+ "iso_a3": "LVA",
+ "iso_n3": "428",
+ "un_a3": "428",
+ "wb_a2": "LV",
+ "wb_a3": "LVA",
+ "woe_id": -99,
+ "adm0_a3_is": "LVA",
+ "adm0_a3_us": "LVA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Northern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1264,
+ -286,
+ -1264,
+ 1265,
+ -707
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "China",
+ "sov_a3": "CH1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Country",
+ "admin": "Macao S.A.R",
+ "adm0_a3": "MAC",
+ "geou_dif": 0,
+ "geounit": "Macao S.A.R",
+ "gu_a3": "MAC",
+ "su_dif": 0,
+ "subunit": "Macao S.A.R",
+ "su_a3": "MAC",
+ "brk_diff": 0,
+ "name": "Macao",
+ "name_long": "Macao",
+ "brk_a3": "MAC",
+ "brk_name": "Macao",
+ "brk_group": null,
+ "abbrev": "Mac.",
+ "postal": "MO",
+ "formal_en": "Macao Special Administrative Region, PRC",
+ "formal_fr": null,
+ "note_adm0": "China",
+ "note_brk": null,
+ "name_sort": "Macao SAR, China",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 4,
+ "mapcolor9": 4,
+ "mapcolor13": 3,
+ "pop_est": 559846,
+ "gdp_md_est": 18140,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "MO",
+ "iso_a3": "MAC",
+ "iso_n3": "446",
+ "un_a3": "446",
+ "wb_a2": "MO",
+ "wb_a3": "MAC",
+ "woe_id": -99,
+ "adm0_a3_is": "MAC",
+ "adm0_a3_us": "MAC",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Eastern Asia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ -536,
+ 1266
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "France",
+ "sov_a3": "FR1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Saint Martin",
+ "adm0_a3": "MAF",
+ "geou_dif": 0,
+ "geounit": "Saint Martin",
+ "gu_a3": "MAF",
+ "su_dif": 0,
+ "subunit": "Saint Martin",
+ "su_a3": "MAF",
+ "brk_diff": 0,
+ "name": "St-Martin",
+ "name_long": "Saint-Martin",
+ "brk_a3": "MAF",
+ "brk_name": "Saint-Martin",
+ "brk_group": null,
+ "abbrev": "St. M.",
+ "postal": "MF",
+ "formal_en": "Saint-Martin (French part)",
+ "formal_fr": null,
+ "note_adm0": "Fr.",
+ "note_brk": null,
+ "name_sort": "St. Martin (French part)",
+ "name_alt": null,
+ "mapcolor7": 7,
+ "mapcolor8": 5,
+ "mapcolor9": 9,
+ "mapcolor13": 11,
+ "pop_est": 36661,
+ "gdp_md_est": 449,
+ "pop_year": 2008,
+ "lastcensus": -99,
+ "gdp_year": 1999,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": 0,
+ "fips_10": null,
+ "iso_a2": "MF",
+ "iso_a3": "MAF",
+ "iso_n3": "663",
+ "un_a3": "663",
+ "wb_a2": "MF",
+ "wb_a3": "MAF",
+ "woe_id": -99,
+ "adm0_a3_is": "MAF",
+ "adm0_a3_us": "MAF",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 9,
+ "long_len": 12,
+ "abbrev_len": 6,
+ "tiny": 4,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ 1267,
+ 1268
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Morocco",
+ "sov_a3": "MAR",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Morocco",
+ "adm0_a3": "MAR",
+ "geou_dif": 0,
+ "geounit": "Morocco",
+ "gu_a3": "MAR",
+ "su_dif": 0,
+ "subunit": "Morocco",
+ "su_a3": "MAR",
+ "brk_diff": 0,
+ "name": "Morocco",
+ "name_long": "Morocco",
+ "brk_a3": "MAR",
+ "brk_name": "Morocco",
+ "brk_group": null,
+ "abbrev": "Mor.",
+ "postal": "MA",
+ "formal_en": "Kingdom of Morocco",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Morocco",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 2,
+ "mapcolor9": 3,
+ "mapcolor13": 9,
+ "pop_est": 34859364,
+ "gdp_md_est": 136600,
+ "pop_year": -99,
+ "lastcensus": 2004,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "MA",
+ "iso_a3": "MAR",
+ "iso_n3": "504",
+ "un_a3": "504",
+ "wb_a2": "MA",
+ "wb_a3": "MAR",
+ "woe_id": -99,
+ "adm0_a3_is": "MAR",
+ "adm0_a3_us": "MAR",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Northern Africa",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -664,
+ 1269,
+ 1270
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 6,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Monaco",
+ "sov_a3": "MCO",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Monaco",
+ "adm0_a3": "MCO",
+ "geou_dif": 0,
+ "geounit": "Monaco",
+ "gu_a3": "MCO",
+ "su_dif": 0,
+ "subunit": "Monaco",
+ "su_a3": "MCO",
+ "brk_diff": 0,
+ "name": "Monaco",
+ "name_long": "Monaco",
+ "brk_a3": "MCO",
+ "brk_name": "Monaco",
+ "brk_group": null,
+ "abbrev": "Mco.",
+ "postal": "MC",
+ "formal_en": "Principality of Monaco",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Monaco",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 1,
+ "mapcolor9": 2,
+ "mapcolor13": 12,
+ "pop_est": 32965,
+ "gdp_md_est": 976.3,
+ "pop_year": -99,
+ "lastcensus": 2008,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "MC",
+ "iso_a3": "MCO",
+ "iso_n3": "492",
+ "un_a3": "492",
+ "wb_a2": "MC",
+ "wb_a3": "MCO",
+ "woe_id": -99,
+ "adm0_a3_is": "MCO",
+ "adm0_a3_us": "MCO",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Western Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 4,
+ "tiny": 5,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1271,
+ -763
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Moldova",
+ "sov_a3": "MDA",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Moldova",
+ "adm0_a3": "MDA",
+ "geou_dif": 0,
+ "geounit": "Moldova",
+ "gu_a3": "MDA",
+ "su_dif": 0,
+ "subunit": "Moldova",
+ "su_a3": "MDA",
+ "brk_diff": 0,
+ "name": "Moldova",
+ "name_long": "Moldova",
+ "brk_a3": "MDA",
+ "brk_name": "Moldova",
+ "brk_group": null,
+ "abbrev": "Mda.",
+ "postal": "MD",
+ "formal_en": "Republic of Moldova",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Moldova",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 5,
+ "mapcolor9": 4,
+ "mapcolor13": 12,
+ "pop_est": 4320748,
+ "gdp_md_est": 10670,
+ "pop_year": -99,
+ "lastcensus": 2004,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "MD",
+ "iso_a3": "MDA",
+ "iso_n3": "498",
+ "un_a3": "498",
+ "wb_a2": "MD",
+ "wb_a3": "MDA",
+ "woe_id": -99,
+ "adm0_a3_is": "MDA",
+ "adm0_a3_us": "MDA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Eastern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1272,
+ 1273
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Madagascar",
+ "sov_a3": "MDG",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Madagascar",
+ "adm0_a3": "MDG",
+ "geou_dif": 0,
+ "geounit": "Madagascar",
+ "gu_a3": "MDG",
+ "su_dif": 0,
+ "subunit": "Madagascar",
+ "su_a3": "MDG",
+ "brk_diff": 0,
+ "name": "Madagascar",
+ "name_long": "Madagascar",
+ "brk_a3": "MDG",
+ "brk_name": "Madagascar",
+ "brk_group": null,
+ "abbrev": "Mad.",
+ "postal": "MG",
+ "formal_en": "Republic of Madagascar",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Madagascar",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 5,
+ "mapcolor9": 2,
+ "mapcolor13": 3,
+ "pop_est": 20653556,
+ "gdp_md_est": 20130,
+ "pop_year": -99,
+ "lastcensus": 1993,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "MG",
+ "iso_a3": "MDG",
+ "iso_n3": "450",
+ "un_a3": "450",
+ "wb_a2": "MG",
+ "wb_a3": "MDG",
+ "woe_id": -99,
+ "adm0_a3_is": "MDG",
+ "adm0_a3_us": "MDG",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Eastern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 10,
+ "long_len": 10,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1274
+ ]
+ ],
+ [
+ [
+ 1275
+ ]
+ ],
+ [
+ [
+ 1276
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Maldives",
+ "sov_a3": "MDV",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Maldives",
+ "adm0_a3": "MDV",
+ "geou_dif": 0,
+ "geounit": "Maldives",
+ "gu_a3": "MDV",
+ "su_dif": 0,
+ "subunit": "Maldives",
+ "su_a3": "MDV",
+ "brk_diff": 0,
+ "name": "Maldives",
+ "name_long": "Maldives",
+ "brk_a3": "MDV",
+ "brk_name": "Maldives",
+ "brk_group": null,
+ "abbrev": "Mald.",
+ "postal": "MV",
+ "formal_en": "Republic of Maldives",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Maldives",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 3,
+ "mapcolor9": 1,
+ "mapcolor13": 7,
+ "pop_est": 396334,
+ "gdp_md_est": 1716,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "MV",
+ "iso_a3": "MDV",
+ "iso_n3": "462",
+ "un_a3": "462",
+ "wb_a2": "MV",
+ "wb_a3": "MDV",
+ "woe_id": -99,
+ "adm0_a3_is": "MDV",
+ "adm0_a3_us": "B13",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Seven seas (open ocean)",
+ "region_un": "Asia",
+ "subregion": "Southern Asia",
+ "region_wb": "South Asia",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 5,
+ "tiny": 2,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1277
+ ]
+ ],
+ [
+ [
+ 1278
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Mexico",
+ "sov_a3": "MEX",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Mexico",
+ "adm0_a3": "MEX",
+ "geou_dif": 0,
+ "geounit": "Mexico",
+ "gu_a3": "MEX",
+ "su_dif": 0,
+ "subunit": "Mexico",
+ "su_a3": "MEX",
+ "brk_diff": 0,
+ "name": "Mexico",
+ "name_long": "Mexico",
+ "brk_a3": "MEX",
+ "brk_name": "Mexico",
+ "brk_group": null,
+ "abbrev": "Mex.",
+ "postal": "MX",
+ "formal_en": "United Mexican States",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Mexico",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 1,
+ "mapcolor9": 7,
+ "mapcolor13": 3,
+ "pop_est": 111211789,
+ "gdp_md_est": 1563000,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "4. Emerging region: MIKT",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "MX",
+ "iso_a3": "MEX",
+ "iso_n3": "484",
+ "un_a3": "484",
+ "wb_a2": "MX",
+ "wb_a3": "MEX",
+ "woe_id": -99,
+ "adm0_a3_is": "MEX",
+ "adm0_a3_us": "MEX",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Central America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1279
+ ]
+ ],
+ [
+ [
+ 1280
+ ]
+ ],
+ [
+ [
+ 1281
+ ]
+ ],
+ [
+ [
+ 1282
+ ]
+ ],
+ [
+ [
+ 1283
+ ]
+ ],
+ [
+ [
+ 1284
+ ]
+ ],
+ [
+ [
+ 1285
+ ]
+ ],
+ [
+ [
+ 1286
+ ]
+ ],
+ [
+ [
+ 1287
+ ]
+ ],
+ [
+ [
+ 1288
+ ]
+ ],
+ [
+ [
+ 1289
+ ]
+ ],
+ [
+ [
+ 1290
+ ]
+ ],
+ [
+ [
+ 1291
+ ]
+ ],
+ [
+ [
+ 1292
+ ]
+ ],
+ [
+ [
+ 1293
+ ]
+ ],
+ [
+ [
+ 1294,
+ -290,
+ -891,
+ 1295,
+ 1296
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 5,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Marshall Islands",
+ "sov_a3": "MHL",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Marshall Islands",
+ "adm0_a3": "MHL",
+ "geou_dif": 0,
+ "geounit": "Marshall Islands",
+ "gu_a3": "MHL",
+ "su_dif": 0,
+ "subunit": "Marshall Islands",
+ "su_a3": "MHL",
+ "brk_diff": 0,
+ "name": "Marshall Is.",
+ "name_long": "Marshall Islands",
+ "brk_a3": "MHL",
+ "brk_name": "Marshall Is.",
+ "brk_group": null,
+ "abbrev": "M. Is.",
+ "postal": "MH",
+ "formal_en": "Republic of the Marshall Islands",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Marshall Islands",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 5,
+ "mapcolor9": 5,
+ "mapcolor13": 3,
+ "pop_est": 64522,
+ "gdp_md_est": 133.5,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "MH",
+ "iso_a3": "MHL",
+ "iso_n3": "584",
+ "un_a3": "584",
+ "wb_a2": "MH",
+ "wb_a3": "MHL",
+ "woe_id": -99,
+ "adm0_a3_is": "MHL",
+ "adm0_a3_us": "MHL",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Micronesia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 12,
+ "long_len": 16,
+ "abbrev_len": 6,
+ "tiny": 2,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1297
+ ]
+ ],
+ [
+ [
+ 1298
+ ]
+ ],
+ [
+ [
+ 1299
+ ]
+ ],
+ [
+ [
+ 1300
+ ]
+ ],
+ [
+ [
+ 1301
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Macedonia",
+ "sov_a3": "MKD",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Macedonia",
+ "adm0_a3": "MKD",
+ "geou_dif": 0,
+ "geounit": "Macedonia",
+ "gu_a3": "MKD",
+ "su_dif": 0,
+ "subunit": "Macedonia",
+ "su_a3": "MKD",
+ "brk_diff": 0,
+ "name": "Macedonia",
+ "name_long": "Macedonia",
+ "brk_a3": "MKD",
+ "brk_name": "Macedonia",
+ "brk_group": null,
+ "abbrev": "Mkd.",
+ "postal": "MK",
+ "formal_en": "Former Yugoslav Republic of Macedonia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Macedonia, FYR",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 3,
+ "mapcolor9": 7,
+ "mapcolor13": 3,
+ "pop_est": 2066718,
+ "gdp_md_est": 18780,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "MK",
+ "iso_a3": "MKD",
+ "iso_n3": "807",
+ "un_a3": "807",
+ "wb_a2": "MK",
+ "wb_a3": "MKD",
+ "woe_id": -99,
+ "adm0_a3_is": "MKD",
+ "adm0_a3_us": "MKD",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Southern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 9,
+ "long_len": 9,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -257,
+ -867,
+ -18,
+ -1234,
+ 1302
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Mali",
+ "sov_a3": "MLI",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Mali",
+ "adm0_a3": "MLI",
+ "geou_dif": 0,
+ "geounit": "Mali",
+ "gu_a3": "MLI",
+ "su_dif": 0,
+ "subunit": "Mali",
+ "su_a3": "MLI",
+ "brk_diff": 0,
+ "name": "Mali",
+ "name_long": "Mali",
+ "brk_a3": "MLI",
+ "brk_name": "Mali",
+ "brk_group": null,
+ "abbrev": "Mali",
+ "postal": "ML",
+ "formal_en": "Republic of Mali",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Mali",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 4,
+ "mapcolor9": 1,
+ "mapcolor13": 7,
+ "pop_est": 12666987,
+ "gdp_md_est": 14590,
+ "pop_year": -99,
+ "lastcensus": 2009,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "ML",
+ "iso_a3": "MLI",
+ "iso_n3": "466",
+ "un_a3": "466",
+ "wb_a2": "ML",
+ "wb_a3": "MLI",
+ "woe_id": -99,
+ "adm0_a3_is": "MLI",
+ "adm0_a3_us": "MLI",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Western Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 4,
+ "long_len": 4,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1303,
+ -244,
+ -570,
+ -809,
+ 1304,
+ 1305,
+ -661
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Malta",
+ "sov_a3": "MLT",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Malta",
+ "adm0_a3": "MLT",
+ "geou_dif": 0,
+ "geounit": "Malta",
+ "gu_a3": "MLT",
+ "su_dif": 0,
+ "subunit": "Malta",
+ "su_a3": "MLT",
+ "brk_diff": 0,
+ "name": "Malta",
+ "name_long": "Malta",
+ "brk_a3": "MLT",
+ "brk_name": "Malta",
+ "brk_group": null,
+ "abbrev": "Malta",
+ "postal": "M",
+ "formal_en": "Republic of Malta",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Malta",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 4,
+ "mapcolor9": 1,
+ "mapcolor13": 8,
+ "pop_est": 405165,
+ "gdp_md_est": 9962,
+ "pop_year": -99,
+ "lastcensus": 2005,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "MT",
+ "iso_a3": "MLT",
+ "iso_n3": "470",
+ "un_a3": "470",
+ "wb_a2": "MT",
+ "wb_a3": "MLT",
+ "woe_id": -99,
+ "adm0_a3_is": "MLT",
+ "adm0_a3_us": "MLT",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Southern Europe",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": 3,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1306
+ ]
+ ],
+ [
+ [
+ 1307
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Myanmar",
+ "sov_a3": "MMR",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Myanmar",
+ "adm0_a3": "MMR",
+ "geou_dif": 0,
+ "geounit": "Myanmar",
+ "gu_a3": "MMR",
+ "su_dif": 0,
+ "subunit": "Myanmar",
+ "su_a3": "MMR",
+ "brk_diff": 0,
+ "name": "Myanmar",
+ "name_long": "Myanmar",
+ "brk_a3": "MMR",
+ "brk_name": "Myanmar",
+ "brk_group": null,
+ "abbrev": "Myan.",
+ "postal": "MM",
+ "formal_en": "Republic of the Union of Myanmar",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Myanmar",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 2,
+ "mapcolor9": 5,
+ "mapcolor13": 13,
+ "pop_est": 48137741,
+ "gdp_md_est": 55130,
+ "pop_year": -99,
+ "lastcensus": 1983,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "MM",
+ "iso_a3": "MMR",
+ "iso_n3": "104",
+ "un_a3": "104",
+ "wb_a2": "MM",
+ "wb_a3": "MMR",
+ "woe_id": -99,
+ "adm0_a3_is": "MMR",
+ "adm0_a3_us": "MMR",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "South-Eastern Asia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1308
+ ]
+ ],
+ [
+ [
+ 1309
+ ]
+ ],
+ [
+ [
+ 1310
+ ]
+ ],
+ [
+ [
+ 1311
+ ]
+ ],
+ [
+ [
+ 1312
+ ]
+ ],
+ [
+ [
+ 1313
+ ]
+ ],
+ [
+ [
+ 1314
+ ]
+ ],
+ [
+ [
+ 1315
+ ]
+ ],
+ [
+ [
+ 1316
+ ]
+ ],
+ [
+ [
+ 1317
+ ]
+ ],
+ [
+ [
+ 1318
+ ]
+ ],
+ [
+ [
+ 1319
+ ]
+ ],
+ [
+ [
+ 1320
+ ]
+ ],
+ [
+ [
+ 1321
+ ]
+ ],
+ [
+ [
+ 1322
+ ]
+ ],
+ [
+ [
+ 1323
+ ]
+ ],
+ [
+ [
+ 1324
+ ]
+ ],
+ [
+ [
+ 1325
+ ]
+ ],
+ [
+ [
+ -1244,
+ 1326,
+ 1327,
+ -251,
+ -1089,
+ -540
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Montenegro",
+ "sov_a3": "MNE",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Montenegro",
+ "adm0_a3": "MNE",
+ "geou_dif": 0,
+ "geounit": "Montenegro",
+ "gu_a3": "MNE",
+ "su_dif": 0,
+ "subunit": "Montenegro",
+ "su_a3": "MNE",
+ "brk_diff": 0,
+ "name": "Montenegro",
+ "name_long": "Montenegro",
+ "brk_a3": "MNE",
+ "brk_name": "Montenegro",
+ "brk_group": null,
+ "abbrev": "Mont.",
+ "postal": "ME",
+ "formal_en": "Montenegro",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Montenegro",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 1,
+ "mapcolor9": 4,
+ "mapcolor13": 5,
+ "pop_est": 672180,
+ "gdp_md_est": 6816,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "ME",
+ "iso_a3": "MNE",
+ "iso_n3": "499",
+ "un_a3": "499",
+ "wb_a2": "ME",
+ "wb_a3": "MNE",
+ "woe_id": -99,
+ "adm0_a3_is": "MNE",
+ "adm0_a3_us": "MNE",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Southern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 10,
+ "long_len": 10,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1328,
+ -1235,
+ -21,
+ 1329,
+ -908,
+ -277
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Mongolia",
+ "sov_a3": "MNG",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Mongolia",
+ "adm0_a3": "MNG",
+ "geou_dif": 0,
+ "geounit": "Mongolia",
+ "gu_a3": "MNG",
+ "su_dif": 0,
+ "subunit": "Mongolia",
+ "su_a3": "MNG",
+ "brk_diff": 0,
+ "name": "Mongolia",
+ "name_long": "Mongolia",
+ "brk_a3": "MNG",
+ "brk_name": "Mongolia",
+ "brk_group": null,
+ "abbrev": "Mong.",
+ "postal": "MN",
+ "formal_en": "Mongolia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Mongolia",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 5,
+ "mapcolor9": 5,
+ "mapcolor13": 6,
+ "pop_est": 3041142,
+ "gdp_md_est": 9476,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "MN",
+ "iso_a3": "MNG",
+ "iso_n3": "496",
+ "un_a3": "496",
+ "wb_a2": "MN",
+ "wb_a3": "MNG",
+ "woe_id": -99,
+ "adm0_a3_is": "MNG",
+ "adm0_a3_us": "MNG",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Eastern Asia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -562,
+ 1330
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "United States of America",
+ "sov_a3": "US1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Northern Mariana Islands",
+ "adm0_a3": "MNP",
+ "geou_dif": 0,
+ "geounit": "Northern Mariana Islands",
+ "gu_a3": "MNP",
+ "su_dif": 0,
+ "subunit": "Northern Mariana Islands",
+ "su_a3": "MNP",
+ "brk_diff": 0,
+ "name": "N. Mariana Is.",
+ "name_long": "Northern Mariana Islands",
+ "brk_a3": "MNP",
+ "brk_name": "N. Mariana Is.",
+ "brk_group": null,
+ "abbrev": "N.M.I.",
+ "postal": "MP",
+ "formal_en": "Commonwealth of the Northern Mariana Islands",
+ "formal_fr": null,
+ "note_adm0": "Commonwealth of U.S.A.",
+ "note_brk": null,
+ "name_sort": "Northern Mariana Islands",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 5,
+ "mapcolor9": 1,
+ "mapcolor13": 1,
+ "pop_est": 88662,
+ "gdp_md_est": 900,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "MP",
+ "iso_a3": "MNP",
+ "iso_n3": "580",
+ "un_a3": "580",
+ "wb_a2": "MP",
+ "wb_a3": "MNP",
+ "woe_id": -99,
+ "adm0_a3_is": "MNP",
+ "adm0_a3_us": "MNP",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Micronesia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 14,
+ "long_len": 24,
+ "abbrev_len": 6,
+ "tiny": 3,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ [
+ 1331
+ ]
+ ],
+ [
+ [
+ 1332
+ ]
+ ],
+ [
+ [
+ 1333
+ ]
+ ],
+ [
+ [
+ 1334
+ ]
+ ],
+ [
+ [
+ 1335
+ ]
+ ],
+ [
+ [
+ 1336
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Mozambique",
+ "sov_a3": "MOZ",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Mozambique",
+ "adm0_a3": "MOZ",
+ "geou_dif": 0,
+ "geounit": "Mozambique",
+ "gu_a3": "MOZ",
+ "su_dif": 0,
+ "subunit": "Mozambique",
+ "su_a3": "MOZ",
+ "brk_diff": 0,
+ "name": "Mozambique",
+ "name_long": "Mozambique",
+ "brk_a3": "MOZ",
+ "brk_name": "Mozambique",
+ "brk_group": null,
+ "abbrev": "Moz.",
+ "postal": "MZ",
+ "formal_en": "Republic of Mozambique",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Mozambique",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 2,
+ "mapcolor9": 1,
+ "mapcolor13": 4,
+ "pop_est": 21669278,
+ "gdp_md_est": 18940,
+ "pop_year": -99,
+ "lastcensus": 2007,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "MZ",
+ "iso_a3": "MOZ",
+ "iso_n3": "508",
+ "un_a3": "508",
+ "wb_a2": "MZ",
+ "wb_a3": "MOZ",
+ "woe_id": -99,
+ "adm0_a3_is": "MOZ",
+ "adm0_a3_us": "MOZ",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Eastern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 10,
+ "long_len": 10,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1337,
+ 1338,
+ 1339,
+ 1340,
+ 1341,
+ 1342,
+ 1343,
+ 1344
+ ],
+ [
+ 1345
+ ],
+ [
+ 1346
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Mauritania",
+ "sov_a3": "MRT",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Mauritania",
+ "adm0_a3": "MRT",
+ "geou_dif": 0,
+ "geounit": "Mauritania",
+ "gu_a3": "MRT",
+ "su_dif": 0,
+ "subunit": "Mauritania",
+ "su_a3": "MRT",
+ "brk_diff": 0,
+ "name": "Mauritania",
+ "name_long": "Mauritania",
+ "brk_a3": "MRT",
+ "brk_name": "Mauritania",
+ "brk_group": null,
+ "abbrev": "Mrt.",
+ "postal": "MR",
+ "formal_en": "Islamic Republic of Mauritania",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Mauritania",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 3,
+ "mapcolor9": 2,
+ "mapcolor13": 1,
+ "pop_est": 3129486,
+ "gdp_md_est": 6308,
+ "pop_year": -99,
+ "lastcensus": 2000,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "MR",
+ "iso_a3": "MRT",
+ "iso_n3": "478",
+ "un_a3": "478",
+ "wb_a2": "MR",
+ "wb_a3": "MRT",
+ "woe_id": -99,
+ "adm0_a3_is": "MRT",
+ "adm0_a3_us": "MRT",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Western Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 10,
+ "long_len": 10,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1347
+ ]
+ ],
+ [
+ [
+ 1348,
+ 1349,
+ 1350,
+ -662,
+ -1306
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "United Kingdom",
+ "sov_a3": "GB1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Montserrat",
+ "adm0_a3": "MSR",
+ "geou_dif": 0,
+ "geounit": "Montserrat",
+ "gu_a3": "MSR",
+ "su_dif": 0,
+ "subunit": "Montserrat",
+ "su_a3": "MSR",
+ "brk_diff": 0,
+ "name": "Montserrat",
+ "name_long": "Montserrat",
+ "brk_a3": "MSR",
+ "brk_name": "Montserrat",
+ "brk_group": null,
+ "abbrev": "Monts.",
+ "postal": "MS",
+ "formal_en": null,
+ "formal_fr": null,
+ "note_adm0": "U.K.",
+ "note_brk": null,
+ "name_sort": "Montserrat",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 6,
+ "mapcolor9": 6,
+ "mapcolor13": 3,
+ "pop_est": 5097,
+ "gdp_md_est": 29,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "MS",
+ "iso_a3": "MSR",
+ "iso_n3": "500",
+ "un_a3": "500",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "MSR",
+ "adm0_a3_us": "MSR",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 10,
+ "long_len": 10,
+ "abbrev_len": 6,
+ "tiny": 6,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ 1351
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Mauritius",
+ "sov_a3": "MUS",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Mauritius",
+ "adm0_a3": "MUS",
+ "geou_dif": 0,
+ "geounit": "Mauritius",
+ "gu_a3": "MUS",
+ "su_dif": 0,
+ "subunit": "Mauritius",
+ "su_a3": "MUS",
+ "brk_diff": 0,
+ "name": "Mauritius",
+ "name_long": "Mauritius",
+ "brk_a3": "MUS",
+ "brk_name": "Mauritius",
+ "brk_group": null,
+ "abbrev": "Mus.",
+ "postal": "MU",
+ "formal_en": "Republic of Mauritius",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Mauritius",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 3,
+ "mapcolor9": 5,
+ "mapcolor13": 7,
+ "pop_est": 1284264,
+ "gdp_md_est": 15270,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "MU",
+ "iso_a3": "MUS",
+ "iso_n3": "480",
+ "un_a3": "480",
+ "wb_a2": "MU",
+ "wb_a3": "MUS",
+ "woe_id": -99,
+ "adm0_a3_is": "MUS",
+ "adm0_a3_us": "MUS",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Seven seas (open ocean)",
+ "region_un": "Africa",
+ "subregion": "Eastern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 9,
+ "long_len": 9,
+ "abbrev_len": 4,
+ "tiny": 2,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1352
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Malawi",
+ "sov_a3": "MWI",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Malawi",
+ "adm0_a3": "MWI",
+ "geou_dif": 0,
+ "geounit": "Malawi",
+ "gu_a3": "MWI",
+ "su_dif": 0,
+ "subunit": "Malawi",
+ "su_a3": "MWI",
+ "brk_diff": 0,
+ "name": "Malawi",
+ "name_long": "Malawi",
+ "brk_a3": "MWI",
+ "brk_name": "Malawi",
+ "brk_group": null,
+ "abbrev": "Mal.",
+ "postal": "MW",
+ "formal_en": "Republic of Malawi",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Malawi",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 3,
+ "mapcolor9": 4,
+ "mapcolor13": 5,
+ "pop_est": 14268711,
+ "gdp_md_est": 11810,
+ "pop_year": -99,
+ "lastcensus": 2008,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "MW",
+ "iso_a3": "MWI",
+ "iso_n3": "454",
+ "un_a3": "454",
+ "wb_a2": "MW",
+ "wb_a3": "MWI",
+ "woe_id": -99,
+ "adm0_a3_is": "MWI",
+ "adm0_a3_us": "MWI",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Eastern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ -1347
+ ]
+ ],
+ [
+ [
+ -1346
+ ]
+ ],
+ [
+ [
+ -1343,
+ 1353,
+ 1354
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Malaysia",
+ "sov_a3": "MYS",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Malaysia",
+ "adm0_a3": "MYS",
+ "geou_dif": 0,
+ "geounit": "Malaysia",
+ "gu_a3": "MYS",
+ "su_dif": 0,
+ "subunit": "Malaysia",
+ "su_a3": "MYS",
+ "brk_diff": 0,
+ "name": "Malaysia",
+ "name_long": "Malaysia",
+ "brk_a3": "MYS",
+ "brk_name": "Malaysia",
+ "brk_group": null,
+ "abbrev": "Malay.",
+ "postal": "MY",
+ "formal_en": "Malaysia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Malaysia",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 4,
+ "mapcolor9": 3,
+ "mapcolor13": 6,
+ "pop_est": 25715819,
+ "gdp_md_est": 384300,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "MY",
+ "iso_a3": "MYS",
+ "iso_n3": "458",
+ "un_a3": "458",
+ "wb_a2": "MY",
+ "wb_a3": "MYS",
+ "woe_id": -99,
+ "adm0_a3_is": "MYS",
+ "adm0_a3_us": "MYS",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "South-Eastern Asia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1355
+ ]
+ ],
+ [
+ [
+ 1356
+ ]
+ ],
+ [
+ [
+ 1357
+ ]
+ ],
+ [
+ [
+ -1064,
+ 1358
+ ]
+ ],
+ [
+ [
+ 1359
+ ]
+ ],
+ [
+ [
+ 1360
+ ]
+ ],
+ [
+ [
+ 1361,
+ 1362
+ ]
+ ],
+ [
+ [
+ -1067,
+ 1363,
+ -325,
+ -324,
+ 1364
+ ]
+ ],
+ [
+ [
+ 1365
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Namibia",
+ "sov_a3": "NAM",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Namibia",
+ "adm0_a3": "NAM",
+ "geou_dif": 0,
+ "geounit": "Namibia",
+ "gu_a3": "NAM",
+ "su_dif": 0,
+ "subunit": "Namibia",
+ "su_a3": "NAM",
+ "brk_diff": 0,
+ "name": "Namibia",
+ "name_long": "Namibia",
+ "brk_a3": "NAM",
+ "brk_name": "Namibia",
+ "brk_group": null,
+ "abbrev": "Nam.",
+ "postal": "NA",
+ "formal_en": "Republic of Namibia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Namibia",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 1,
+ "mapcolor9": 1,
+ "mapcolor13": 7,
+ "pop_est": 2108665,
+ "gdp_md_est": 13250,
+ "pop_year": -99,
+ "lastcensus": 2001,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "NA",
+ "iso_a3": "NAM",
+ "iso_n3": "516",
+ "un_a3": "516",
+ "wb_a2": "NA",
+ "wb_a3": "NAM",
+ "woe_id": -99,
+ "adm0_a3_is": "NAM",
+ "adm0_a3_us": "NAM",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Southern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1366,
+ -331,
+ 1367,
+ 1368,
+ -10
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "France",
+ "sov_a3": "FR1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "New Caledonia",
+ "adm0_a3": "NCL",
+ "geou_dif": 0,
+ "geounit": "New Caledonia",
+ "gu_a3": "NCL",
+ "su_dif": 0,
+ "subunit": "New Caledonia",
+ "su_a3": "NCL",
+ "brk_diff": 0,
+ "name": "New Caledonia",
+ "name_long": "New Caledonia",
+ "brk_a3": "NCL",
+ "brk_name": "New Caledonia",
+ "brk_group": null,
+ "abbrev": "New C.",
+ "postal": "NC",
+ "formal_en": "New Caledonia",
+ "formal_fr": "Nouvelle-Calédonie",
+ "note_adm0": "Fr.",
+ "note_brk": null,
+ "name_sort": "New Caledonia",
+ "name_alt": null,
+ "mapcolor7": 7,
+ "mapcolor8": 5,
+ "mapcolor9": 9,
+ "mapcolor13": 11,
+ "pop_est": 227436,
+ "gdp_md_est": 3158,
+ "pop_year": -99,
+ "lastcensus": 2009,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "NC",
+ "iso_a3": "NCL",
+ "iso_n3": "540",
+ "un_a3": "540",
+ "wb_a2": "NC",
+ "wb_a3": "NCL",
+ "woe_id": -99,
+ "adm0_a3_is": "NCL",
+ "adm0_a3_us": "NCL",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Melanesia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 13,
+ "long_len": 13,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ [
+ 1369
+ ]
+ ],
+ [
+ [
+ 1370
+ ]
+ ],
+ [
+ [
+ 1371
+ ]
+ ],
+ [
+ [
+ 1372
+ ]
+ ],
+ [
+ [
+ 1373
+ ]
+ ],
+ [
+ [
+ 1374
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Niger",
+ "sov_a3": "NER",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Niger",
+ "adm0_a3": "NER",
+ "geou_dif": 0,
+ "geounit": "Niger",
+ "gu_a3": "NER",
+ "su_dif": 0,
+ "subunit": "Niger",
+ "su_a3": "NER",
+ "brk_diff": 0,
+ "name": "Niger",
+ "name_long": "Niger",
+ "brk_a3": "NER",
+ "brk_name": "Niger",
+ "brk_group": null,
+ "abbrev": "Niger",
+ "postal": "NE",
+ "formal_en": "Republic of Niger",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Niger",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 5,
+ "mapcolor9": 3,
+ "mapcolor13": 13,
+ "pop_est": 15306252,
+ "gdp_md_est": 10040,
+ "pop_year": -99,
+ "lastcensus": 2001,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "NE",
+ "iso_a3": "NER",
+ "iso_n3": "562",
+ "un_a3": "562",
+ "wb_a2": "NE",
+ "wb_a3": "NER",
+ "woe_id": -99,
+ "adm0_a3_is": "NER",
+ "adm0_a3_us": "NER",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Western Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1375,
+ 1376,
+ -239,
+ -240,
+ -1304,
+ -660,
+ -1251
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 5,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Australia",
+ "sov_a3": "AU1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Norfolk Island",
+ "adm0_a3": "NFK",
+ "geou_dif": 0,
+ "geounit": "Norfolk Island",
+ "gu_a3": "NFK",
+ "su_dif": 0,
+ "subunit": "Norfolk Island",
+ "su_a3": "NFK",
+ "brk_diff": 0,
+ "name": "Norfolk Island",
+ "name_long": "Norfolk Island",
+ "brk_a3": "NFK",
+ "brk_name": "Norfolk Island",
+ "brk_group": null,
+ "abbrev": "Nfk. I.",
+ "postal": "NF",
+ "formal_en": "Territory of Norfolk Island",
+ "formal_fr": null,
+ "note_adm0": "Auz.",
+ "note_brk": null,
+ "name_sort": "Norfolk Island",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 2,
+ "mapcolor9": 2,
+ "mapcolor13": 7,
+ "pop_est": 2141,
+ "gdp_md_est": 32.115,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "NF",
+ "iso_a3": "NFK",
+ "iso_n3": "574",
+ "un_a3": "574",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "NFK",
+ "adm0_a3_us": "NFK",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Australia and New Zealand",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 14,
+ "long_len": 14,
+ "abbrev_len": 7,
+ "tiny": -99,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ 1377
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Nigeria",
+ "sov_a3": "NGA",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Nigeria",
+ "adm0_a3": "NGA",
+ "geou_dif": 0,
+ "geounit": "Nigeria",
+ "gu_a3": "NGA",
+ "su_dif": 0,
+ "subunit": "Nigeria",
+ "su_a3": "NGA",
+ "brk_diff": 0,
+ "name": "Nigeria",
+ "name_long": "Nigeria",
+ "brk_a3": "NGA",
+ "brk_name": "Nigeria",
+ "brk_group": null,
+ "abbrev": "Nigeria",
+ "postal": "NG",
+ "formal_en": "Federal Republic of Nigeria",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Nigeria",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 2,
+ "mapcolor9": 5,
+ "mapcolor13": 2,
+ "pop_est": 149229090,
+ "gdp_md_est": 335400,
+ "pop_year": -99,
+ "lastcensus": 2006,
+ "gdp_year": -99,
+ "economy": "5. Emerging region: G20",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "NG",
+ "iso_a3": "NGA",
+ "iso_n3": "566",
+ "un_a3": "566",
+ "wb_a2": "NG",
+ "wb_a3": "NGA",
+ "woe_id": -99,
+ "adm0_a3_is": "NGA",
+ "adm0_a3_us": "NGA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Western Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 7,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1378
+ ]
+ ],
+ [
+ [
+ 1379,
+ -575,
+ 1380,
+ -235,
+ -1377
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Nicaragua",
+ "sov_a3": "NIC",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Nicaragua",
+ "adm0_a3": "NIC",
+ "geou_dif": 0,
+ "geounit": "Nicaragua",
+ "gu_a3": "NIC",
+ "su_dif": 0,
+ "subunit": "Nicaragua",
+ "su_a3": "NIC",
+ "brk_diff": 0,
+ "name": "Nicaragua",
+ "name_long": "Nicaragua",
+ "brk_a3": "NIC",
+ "brk_name": "Nicaragua",
+ "brk_group": null,
+ "abbrev": "Nic.",
+ "postal": "NI",
+ "formal_en": "Republic of Nicaragua",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Nicaragua",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 4,
+ "mapcolor9": 1,
+ "mapcolor13": 9,
+ "pop_est": 5891199,
+ "gdp_md_est": 16790,
+ "pop_year": -99,
+ "lastcensus": 2005,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "NI",
+ "iso_a3": "NIC",
+ "iso_n3": "558",
+ "un_a3": "558",
+ "wb_a2": "NI",
+ "wb_a3": "NIC",
+ "woe_id": -99,
+ "adm0_a3_is": "NIC",
+ "adm0_a3_us": "NIC",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Central America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 9,
+ "long_len": 9,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1381,
+ -608,
+ 1382,
+ -900
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "New Zealand",
+ "sov_a3": "NZ1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Niue",
+ "adm0_a3": "NIU",
+ "geou_dif": 0,
+ "geounit": "Niue",
+ "gu_a3": "NIU",
+ "su_dif": 0,
+ "subunit": "Niue",
+ "su_a3": "NIU",
+ "brk_diff": 0,
+ "name": "Niue",
+ "name_long": "Niue",
+ "brk_a3": "NIU",
+ "brk_name": "Niue",
+ "brk_group": null,
+ "abbrev": "Niue",
+ "postal": "NU",
+ "formal_en": null,
+ "formal_fr": null,
+ "note_adm0": "Assoc. with N.Z.",
+ "note_brk": null,
+ "name_sort": "Niue",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 3,
+ "mapcolor9": 4,
+ "mapcolor13": 4,
+ "pop_est": 1398,
+ "gdp_md_est": 10.01,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "NU",
+ "iso_a3": "NIU",
+ "iso_n3": "570",
+ "un_a3": "570",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "NIU",
+ "adm0_a3_us": "NIU",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Polynesia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 4,
+ "long_len": 4,
+ "abbrev_len": 4,
+ "tiny": 3,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ 1383
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Netherlands",
+ "sov_a3": "NL1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Country",
+ "admin": "Netherlands",
+ "adm0_a3": "NLD",
+ "geou_dif": 0,
+ "geounit": "Netherlands",
+ "gu_a3": "NLD",
+ "su_dif": 0,
+ "subunit": "Netherlands",
+ "su_a3": "NLD",
+ "brk_diff": 0,
+ "name": "Netherlands",
+ "name_long": "Netherlands",
+ "brk_a3": "NLD",
+ "brk_name": "Netherlands",
+ "brk_group": null,
+ "abbrev": "Neth.",
+ "postal": "NL",
+ "formal_en": "Kingdom of the Netherlands",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Netherlands",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 2,
+ "mapcolor9": 2,
+ "mapcolor13": 9,
+ "pop_est": 16715999,
+ "gdp_md_est": 672000,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "NL",
+ "iso_a3": "NLD",
+ "iso_n3": "528",
+ "un_a3": "528",
+ "wb_a2": "NL",
+ "wb_a3": "NLD",
+ "woe_id": -99,
+ "adm0_a3_is": "NLD",
+ "adm0_a3_us": "NLD",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Western Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 11,
+ "long_len": 11,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1384
+ ]
+ ],
+ [
+ [
+ 1385
+ ]
+ ],
+ [
+ [
+ -233,
+ 1386
+ ]
+ ],
+ [
+ [
+ 1387
+ ]
+ ],
+ [
+ [
+ 1388
+ ]
+ ],
+ [
+ [
+ 1389
+ ]
+ ],
+ [
+ [
+ 1390,
+ -635,
+ 1391,
+ -234
+ ]
+ ],
+ [
+ [
+ 1392
+ ]
+ ],
+ [
+ [
+ 1393
+ ]
+ ],
+ [
+ [
+ 1394
+ ]
+ ],
+ [
+ [
+ 1395
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Norway",
+ "sov_a3": "NOR",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Norway",
+ "adm0_a3": "NOR",
+ "geou_dif": 0,
+ "geounit": "Norway",
+ "gu_a3": "NOR",
+ "su_dif": 0,
+ "subunit": "Norway",
+ "su_a3": "NOR",
+ "brk_diff": 0,
+ "name": "Norway",
+ "name_long": "Norway",
+ "brk_a3": "NOR",
+ "brk_name": "Norway",
+ "brk_group": null,
+ "abbrev": "Nor.",
+ "postal": "N",
+ "formal_en": "Kingdom of Norway",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Norway",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 3,
+ "mapcolor9": 8,
+ "mapcolor13": 12,
+ "pop_est": 4676305,
+ "gdp_md_est": 276400,
+ "pop_year": -99,
+ "lastcensus": 2001,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "NO",
+ "iso_a3": "NOR",
+ "iso_n3": "578",
+ "un_a3": "578",
+ "wb_a2": "NO",
+ "wb_a3": "NOR",
+ "woe_id": -99,
+ "adm0_a3_is": "NOR",
+ "adm0_a3_us": "NOR",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Northern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1396
+ ]
+ ],
+ [
+ [
+ 1397
+ ]
+ ],
+ [
+ [
+ 1398
+ ]
+ ],
+ [
+ [
+ 1399
+ ]
+ ],
+ [
+ [
+ 1400
+ ]
+ ],
+ [
+ [
+ 1401
+ ]
+ ],
+ [
+ [
+ 1402
+ ]
+ ],
+ [
+ [
+ 1403
+ ]
+ ],
+ [
+ [
+ 1404
+ ]
+ ],
+ [
+ [
+ 1405
+ ]
+ ],
+ [
+ [
+ 1406
+ ]
+ ],
+ [
+ [
+ 1407
+ ]
+ ],
+ [
+ [
+ 1408
+ ]
+ ],
+ [
+ [
+ 1409
+ ]
+ ],
+ [
+ [
+ 1410
+ ]
+ ],
+ [
+ [
+ 1411
+ ]
+ ],
+ [
+ [
+ 1412
+ ]
+ ],
+ [
+ [
+ 1413
+ ]
+ ],
+ [
+ [
+ 1414
+ ]
+ ],
+ [
+ [
+ 1415
+ ]
+ ],
+ [
+ [
+ 1416,
+ -724,
+ 1417,
+ 1418
+ ]
+ ],
+ [
+ [
+ 1419
+ ]
+ ],
+ [
+ [
+ 1420
+ ]
+ ],
+ [
+ [
+ 1421
+ ]
+ ],
+ [
+ [
+ 1422
+ ]
+ ],
+ [
+ [
+ 1423
+ ]
+ ],
+ [
+ [
+ 1424
+ ]
+ ],
+ [
+ [
+ 1425
+ ]
+ ],
+ [
+ [
+ 1426
+ ]
+ ],
+ [
+ [
+ 1427
+ ]
+ ],
+ [
+ [
+ 1428
+ ]
+ ],
+ [
+ [
+ 1429
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Nepal",
+ "sov_a3": "NPL",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Nepal",
+ "adm0_a3": "NPL",
+ "geou_dif": 0,
+ "geounit": "Nepal",
+ "gu_a3": "NPL",
+ "su_dif": 0,
+ "subunit": "Nepal",
+ "su_a3": "NPL",
+ "brk_diff": 0,
+ "name": "Nepal",
+ "name_long": "Nepal",
+ "brk_a3": "NPL",
+ "brk_name": "Nepal",
+ "brk_group": null,
+ "abbrev": "Nepal",
+ "postal": "NP",
+ "formal_en": "Nepal",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Nepal",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 2,
+ "mapcolor9": 3,
+ "mapcolor13": 12,
+ "pop_est": 28563377,
+ "gdp_md_est": 31080,
+ "pop_year": -99,
+ "lastcensus": 2001,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "NP",
+ "iso_a3": "NPL",
+ "iso_n3": "524",
+ "un_a3": "524",
+ "wb_a2": "NP",
+ "wb_a3": "NPL",
+ "woe_id": -99,
+ "adm0_a3_is": "NPL",
+ "adm0_a3_us": "NPL",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Southern Asia",
+ "region_wb": "South Asia",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -1088,
+ -543
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Nauru",
+ "sov_a3": "NRU",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Nauru",
+ "adm0_a3": "NRU",
+ "geou_dif": 0,
+ "geounit": "Nauru",
+ "gu_a3": "NRU",
+ "su_dif": 0,
+ "subunit": "Nauru",
+ "su_a3": "NRU",
+ "brk_diff": 0,
+ "name": "Nauru",
+ "name_long": "Nauru",
+ "brk_a3": "NRU",
+ "brk_name": "Nauru",
+ "brk_group": null,
+ "abbrev": "Nauru",
+ "postal": "NR",
+ "formal_en": "Republic of Nauru",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Nauru",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 7,
+ "mapcolor9": 6,
+ "mapcolor13": 9,
+ "pop_est": 14019,
+ "gdp_md_est": 60,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "NR",
+ "iso_a3": "NRU",
+ "iso_n3": "520",
+ "un_a3": "520",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "NRU",
+ "adm0_a3_us": "NRU",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Micronesia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": 3,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1430
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "New Zealand",
+ "sov_a3": "NZ1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Country",
+ "admin": "New Zealand",
+ "adm0_a3": "NZL",
+ "geou_dif": 0,
+ "geounit": "New Zealand",
+ "gu_a3": "NZL",
+ "su_dif": 0,
+ "subunit": "New Zealand",
+ "su_a3": "NZL",
+ "brk_diff": 0,
+ "name": "New Zealand",
+ "name_long": "New Zealand",
+ "brk_a3": "NZL",
+ "brk_name": "New Zealand",
+ "brk_group": null,
+ "abbrev": "N.Z.",
+ "postal": "NZ",
+ "formal_en": "New Zealand",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "New Zealand",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 3,
+ "mapcolor9": 4,
+ "mapcolor13": 4,
+ "pop_est": 4213418,
+ "gdp_md_est": 116700,
+ "pop_year": -99,
+ "lastcensus": 2006,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "NZ",
+ "iso_a3": "NZL",
+ "iso_n3": "554",
+ "un_a3": "554",
+ "wb_a2": "NZ",
+ "wb_a3": "NZL",
+ "woe_id": -99,
+ "adm0_a3_is": "NZL",
+ "adm0_a3_us": "NZL",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Australia and New Zealand",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 11,
+ "long_len": 11,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1431
+ ]
+ ],
+ [
+ [
+ 1432
+ ]
+ ],
+ [
+ [
+ 1433
+ ]
+ ],
+ [
+ [
+ 1434
+ ]
+ ],
+ [
+ [
+ 1435
+ ]
+ ],
+ [
+ [
+ 1436
+ ]
+ ],
+ [
+ [
+ 1437
+ ]
+ ],
+ [
+ [
+ 1438
+ ]
+ ],
+ [
+ [
+ 1439
+ ]
+ ],
+ [
+ [
+ 1440
+ ]
+ ],
+ [
+ [
+ 1441
+ ]
+ ],
+ [
+ [
+ 1442
+ ]
+ ],
+ [
+ [
+ 1443
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Oman",
+ "sov_a3": "OMN",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Oman",
+ "adm0_a3": "OMN",
+ "geou_dif": 0,
+ "geounit": "Oman",
+ "gu_a3": "OMN",
+ "su_dif": 0,
+ "subunit": "Oman",
+ "su_a3": "OMN",
+ "brk_diff": 0,
+ "name": "Oman",
+ "name_long": "Oman",
+ "brk_a3": "OMN",
+ "brk_name": "Oman",
+ "brk_group": null,
+ "abbrev": "Oman",
+ "postal": "OM",
+ "formal_en": "Sultanate of Oman",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Oman",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 4,
+ "mapcolor9": 1,
+ "mapcolor13": 6,
+ "pop_est": 3418085,
+ "gdp_md_est": 66980,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "OM",
+ "iso_a3": "OMN",
+ "iso_n3": "512",
+ "un_a3": "512",
+ "wb_a2": "OM",
+ "wb_a3": "OMN",
+ "woe_id": -99,
+ "adm0_a3_is": "OMN",
+ "adm0_a3_us": "OMN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Western Asia",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 4,
+ "long_len": 4,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1444
+ ]
+ ],
+ [
+ [
+ 1445,
+ 1446,
+ 1447,
+ -32
+ ]
+ ],
+ [
+ [
+ -36
+ ]
+ ],
+ [
+ [
+ -35,
+ 1448
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Pakistan",
+ "sov_a3": "PAK",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Pakistan",
+ "adm0_a3": "PAK",
+ "geou_dif": 0,
+ "geounit": "Pakistan",
+ "gu_a3": "PAK",
+ "su_dif": 0,
+ "subunit": "Pakistan",
+ "su_a3": "PAK",
+ "brk_diff": 0,
+ "name": "Pakistan",
+ "name_long": "Pakistan",
+ "brk_a3": "PAK",
+ "brk_name": "Pakistan",
+ "brk_group": null,
+ "abbrev": "Pak.",
+ "postal": "PK",
+ "formal_en": "Islamic Republic of Pakistan",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Pakistan",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 2,
+ "mapcolor9": 3,
+ "mapcolor13": 11,
+ "pop_est": 176242949,
+ "gdp_md_est": 427300,
+ "pop_year": -99,
+ "lastcensus": 1998,
+ "gdp_year": -99,
+ "economy": "5. Emerging region: G20",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "PK",
+ "iso_a3": "PAK",
+ "iso_n3": "586",
+ "un_a3": "586",
+ "wb_a2": "PK",
+ "wb_a3": "PAK",
+ "woe_id": -99,
+ "adm0_a3_is": "PAK",
+ "adm0_a3_us": "PAK",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Southern Asia",
+ "region_wb": "South Asia",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -1175,
+ -1091,
+ 1449,
+ -1106,
+ -3,
+ -557
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Panama",
+ "sov_a3": "PAN",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Panama",
+ "adm0_a3": "PAN",
+ "geou_dif": 0,
+ "geounit": "Panama",
+ "gu_a3": "PAN",
+ "su_dif": 0,
+ "subunit": "Panama",
+ "su_a3": "PAN",
+ "brk_diff": 0,
+ "name": "Panama",
+ "name_long": "Panama",
+ "brk_a3": "PAN",
+ "brk_name": "Panama",
+ "brk_group": null,
+ "abbrev": "Pan.",
+ "postal": "PA",
+ "formal_en": "Republic of Panama",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Panama",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 4,
+ "mapcolor9": 6,
+ "mapcolor13": 3,
+ "pop_est": 3360474,
+ "gdp_md_est": 38830,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "PA",
+ "iso_a3": "PAN",
+ "iso_n3": "591",
+ "un_a3": "591",
+ "wb_a2": "PA",
+ "wb_a3": "PAN",
+ "woe_id": -99,
+ "adm0_a3_is": "PAN",
+ "adm0_a3_us": "PAN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Central America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1450
+ ]
+ ],
+ [
+ [
+ 1451
+ ]
+ ],
+ [
+ [
+ 1452
+ ]
+ ],
+ [
+ [
+ 1453
+ ]
+ ],
+ [
+ [
+ -592,
+ 1454,
+ -606,
+ 1455
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "United Kingdom",
+ "sov_a3": "GB1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Pitcairn Islands",
+ "adm0_a3": "PCN",
+ "geou_dif": 0,
+ "geounit": "Pitcairn Islands",
+ "gu_a3": "PCN",
+ "su_dif": 0,
+ "subunit": "Pitcairn Islands",
+ "su_a3": "PCN",
+ "brk_diff": 0,
+ "name": "Pitcairn Is.",
+ "name_long": "Pitcairn Islands",
+ "brk_a3": "PCN",
+ "brk_name": "Pitcairn Is.",
+ "brk_group": null,
+ "abbrev": "Pit. Is.",
+ "postal": "PN",
+ "formal_en": "Pitcairn, Henderson, Ducie and Oeno Islands",
+ "formal_fr": null,
+ "note_adm0": "U.K.",
+ "note_brk": null,
+ "name_sort": "Pitcairn Islands",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 6,
+ "mapcolor9": 6,
+ "mapcolor13": 3,
+ "pop_est": 48,
+ "gdp_md_est": 0.72,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "PN",
+ "iso_a3": "PCN",
+ "iso_n3": "612",
+ "un_a3": "612",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "PCN",
+ "adm0_a3_us": "PCN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Polynesia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 12,
+ "long_len": 16,
+ "abbrev_len": 8,
+ "tiny": -99,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ 1456
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Peru",
+ "sov_a3": "PER",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Peru",
+ "adm0_a3": "PER",
+ "geou_dif": 0,
+ "geounit": "Peru",
+ "gu_a3": "PER",
+ "su_dif": 0,
+ "subunit": "Peru",
+ "su_a3": "PER",
+ "brk_diff": 0,
+ "name": "Peru",
+ "name_long": "Peru",
+ "brk_a3": "PER",
+ "brk_name": "Peru",
+ "brk_group": null,
+ "abbrev": "Peru",
+ "postal": "PE",
+ "formal_en": "Republic of Peru",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Peru",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 4,
+ "mapcolor9": 4,
+ "mapcolor13": 11,
+ "pop_est": 29546963,
+ "gdp_md_est": 247300,
+ "pop_year": -99,
+ "lastcensus": 2007,
+ "gdp_year": -99,
+ "economy": "5. Emerging region: G20",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "PE",
+ "iso_a3": "PER",
+ "iso_n3": "604",
+ "un_a3": "604",
+ "wb_a2": "PE",
+ "wb_a3": "PER",
+ "woe_id": -99,
+ "adm0_a3_is": "PER",
+ "adm0_a3_us": "PER",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "South America",
+ "region_un": "Americas",
+ "subregion": "South America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 4,
+ "long_len": 4,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -318,
+ -295,
+ -519,
+ 1457,
+ -674,
+ -589
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Philippines",
+ "sov_a3": "PHL",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Philippines",
+ "adm0_a3": "PHL",
+ "geou_dif": 0,
+ "geounit": "Philippines",
+ "gu_a3": "PHL",
+ "su_dif": 0,
+ "subunit": "Philippines",
+ "su_a3": "PHL",
+ "brk_diff": 0,
+ "name": "Philippines",
+ "name_long": "Philippines",
+ "brk_a3": "PHL",
+ "brk_name": "Philippines",
+ "brk_group": null,
+ "abbrev": "Phil.",
+ "postal": "PH",
+ "formal_en": "Republic of the Philippines",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Philippines",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 2,
+ "mapcolor9": 2,
+ "mapcolor13": 8,
+ "pop_est": 97976603,
+ "gdp_md_est": 317500,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "5. Emerging region: G20",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "PH",
+ "iso_a3": "PHL",
+ "iso_n3": "608",
+ "un_a3": "608",
+ "wb_a2": "PH",
+ "wb_a3": "PHL",
+ "woe_id": -99,
+ "adm0_a3_is": "PHL",
+ "adm0_a3_us": "PHL",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "South-Eastern Asia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 11,
+ "long_len": 11,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1458
+ ]
+ ],
+ [
+ [
+ 1459
+ ]
+ ],
+ [
+ [
+ 1460
+ ]
+ ],
+ [
+ [
+ 1461
+ ]
+ ],
+ [
+ [
+ 1462
+ ]
+ ],
+ [
+ [
+ 1463
+ ]
+ ],
+ [
+ [
+ 1464
+ ]
+ ],
+ [
+ [
+ 1465
+ ]
+ ],
+ [
+ [
+ 1466
+ ]
+ ],
+ [
+ [
+ 1467
+ ]
+ ],
+ [
+ [
+ 1468
+ ]
+ ],
+ [
+ [
+ 1469
+ ]
+ ],
+ [
+ [
+ 1470
+ ]
+ ],
+ [
+ [
+ 1471
+ ]
+ ],
+ [
+ [
+ 1472
+ ]
+ ],
+ [
+ [
+ 1473
+ ]
+ ],
+ [
+ [
+ 1474
+ ]
+ ],
+ [
+ [
+ 1475
+ ]
+ ],
+ [
+ [
+ 1476
+ ]
+ ],
+ [
+ [
+ 1477
+ ]
+ ],
+ [
+ [
+ 1478
+ ]
+ ],
+ [
+ [
+ 1479
+ ]
+ ],
+ [
+ [
+ 1480
+ ]
+ ],
+ [
+ [
+ 1481
+ ]
+ ],
+ [
+ [
+ 1482
+ ]
+ ],
+ [
+ [
+ 1483
+ ]
+ ],
+ [
+ [
+ 1484
+ ]
+ ],
+ [
+ [
+ 1485
+ ]
+ ],
+ [
+ [
+ 1486
+ ]
+ ],
+ [
+ [
+ 1487
+ ]
+ ],
+ [
+ [
+ 1488
+ ]
+ ],
+ [
+ [
+ 1489
+ ]
+ ],
+ [
+ [
+ 1490
+ ]
+ ],
+ [
+ [
+ 1491
+ ]
+ ],
+ [
+ [
+ 1492
+ ]
+ ],
+ [
+ [
+ 1493
+ ]
+ ],
+ [
+ [
+ 1494
+ ]
+ ],
+ [
+ [
+ 1495
+ ]
+ ],
+ [
+ [
+ 1496
+ ]
+ ],
+ [
+ [
+ 1497
+ ]
+ ],
+ [
+ [
+ 1498
+ ]
+ ],
+ [
+ [
+ 1499
+ ]
+ ],
+ [
+ [
+ 1500
+ ]
+ ],
+ [
+ [
+ 1501
+ ]
+ ],
+ [
+ [
+ 1502
+ ]
+ ],
+ [
+ [
+ 1503
+ ]
+ ],
+ [
+ [
+ 1504
+ ]
+ ],
+ [
+ [
+ 1505
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Palau",
+ "sov_a3": "PLW",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Palau",
+ "adm0_a3": "PLW",
+ "geou_dif": 0,
+ "geounit": "Palau",
+ "gu_a3": "PLW",
+ "su_dif": 0,
+ "subunit": "Palau",
+ "su_a3": "PLW",
+ "brk_diff": 0,
+ "name": "Palau",
+ "name_long": "Palau",
+ "brk_a3": "PLW",
+ "brk_name": "Palau",
+ "brk_group": null,
+ "abbrev": "Palau",
+ "postal": "PW",
+ "formal_en": "Republic of Palau",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Palau",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 5,
+ "mapcolor9": 1,
+ "mapcolor13": 12,
+ "pop_est": 20796,
+ "gdp_md_est": 164,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "PW",
+ "iso_a3": "PLW",
+ "iso_n3": "585",
+ "un_a3": "585",
+ "wb_a2": "PW",
+ "wb_a3": "PLW",
+ "woe_id": -99,
+ "adm0_a3_is": "PLW",
+ "adm0_a3_us": "PLW",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Micronesia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": 2,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1506
+ ]
+ ],
+ [
+ [
+ 1507
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Papua New Guinea",
+ "sov_a3": "PNG",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Papua New Guinea",
+ "adm0_a3": "PNG",
+ "geou_dif": 0,
+ "geounit": "Papua New Guinea",
+ "gu_a3": "PNG",
+ "su_dif": 1,
+ "subunit": "Papua New Guinea",
+ "su_a3": "PN1",
+ "brk_diff": 0,
+ "name": "Papua New Guinea",
+ "name_long": "Papua New Guinea",
+ "brk_a3": "PN1",
+ "brk_name": "Papua New Guinea",
+ "brk_group": null,
+ "abbrev": "P.N.G.",
+ "postal": "PG",
+ "formal_en": "Independent State of Papua New Guinea",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Papua New Guinea",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 2,
+ "mapcolor9": 3,
+ "mapcolor13": 1,
+ "pop_est": 6057263,
+ "gdp_md_est": 13210,
+ "pop_year": -99,
+ "lastcensus": 2000,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "PG",
+ "iso_a3": "PNG",
+ "iso_n3": "598",
+ "un_a3": "598",
+ "wb_a2": "PG",
+ "wb_a3": "PNG",
+ "woe_id": -99,
+ "adm0_a3_is": "PNG",
+ "adm0_a3_us": "PNG",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Melanesia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 16,
+ "long_len": 16,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1508
+ ]
+ ],
+ [
+ [
+ 1509
+ ]
+ ],
+ [
+ [
+ 1510
+ ]
+ ],
+ [
+ [
+ 1511
+ ]
+ ],
+ [
+ [
+ 1512
+ ]
+ ],
+ [
+ [
+ 1513
+ ]
+ ],
+ [
+ [
+ 1514
+ ]
+ ],
+ [
+ [
+ 1515
+ ]
+ ],
+ [
+ [
+ 1516
+ ]
+ ],
+ [
+ [
+ 1517
+ ]
+ ],
+ [
+ [
+ 1518
+ ]
+ ],
+ [
+ [
+ 1519
+ ]
+ ],
+ [
+ [
+ 1520
+ ]
+ ],
+ [
+ [
+ 1521
+ ]
+ ],
+ [
+ [
+ 1522
+ ]
+ ],
+ [
+ [
+ 1523
+ ]
+ ],
+ [
+ [
+ 1524
+ ]
+ ],
+ [
+ [
+ 1525
+ ]
+ ],
+ [
+ [
+ 1526
+ ]
+ ],
+ [
+ [
+ 1527
+ ]
+ ],
+ [
+ [
+ -1023,
+ 1528,
+ 1529
+ ]
+ ],
+ [
+ [
+ 1530
+ ]
+ ],
+ [
+ [
+ 1531
+ ]
+ ],
+ [
+ [
+ 1532
+ ]
+ ],
+ [
+ [
+ 1533
+ ]
+ ],
+ [
+ [
+ 1534
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Poland",
+ "sov_a3": "POL",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Poland",
+ "adm0_a3": "POL",
+ "geou_dif": 0,
+ "geounit": "Poland",
+ "gu_a3": "POL",
+ "su_dif": 0,
+ "subunit": "Poland",
+ "su_a3": "POL",
+ "brk_diff": 0,
+ "name": "Poland",
+ "name_long": "Poland",
+ "brk_a3": "POL",
+ "brk_name": "Poland",
+ "brk_group": null,
+ "abbrev": "Pol.",
+ "postal": "PL",
+ "formal_en": "Republic of Poland",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Poland",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 7,
+ "mapcolor9": 1,
+ "mapcolor13": 2,
+ "pop_est": 38482919,
+ "gdp_md_est": 667900,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "PL",
+ "iso_a3": "POL",
+ "iso_n3": "616",
+ "un_a3": "616",
+ "wb_a2": "PL",
+ "wb_a3": "POL",
+ "woe_id": -99,
+ "adm0_a3_is": "POL",
+ "adm0_a3_us": "POL",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Eastern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1535,
+ -1261,
+ -284,
+ 1536,
+ 1537,
+ -623,
+ -632,
+ 1538,
+ -627,
+ 1539
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "United States of America",
+ "sov_a3": "US1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Puerto Rico",
+ "adm0_a3": "PRI",
+ "geou_dif": 0,
+ "geounit": "Puerto Rico",
+ "gu_a3": "PRI",
+ "su_dif": 0,
+ "subunit": "Puerto Rico",
+ "su_a3": "PRI",
+ "brk_diff": 0,
+ "name": "Puerto Rico",
+ "name_long": "Puerto Rico",
+ "brk_a3": "PRI",
+ "brk_name": "Puerto Rico",
+ "brk_group": null,
+ "abbrev": "P.R.",
+ "postal": "PR",
+ "formal_en": "Commonwealth of Puerto Rico",
+ "formal_fr": null,
+ "note_adm0": "Commonwealth of U.S.A.",
+ "note_brk": null,
+ "name_sort": "Puerto Rico",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 5,
+ "mapcolor9": 1,
+ "mapcolor13": 1,
+ "pop_est": 3971020,
+ "gdp_md_est": 70230,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "PR",
+ "iso_a3": "PRI",
+ "iso_n3": "630",
+ "un_a3": "630",
+ "wb_a2": "PR",
+ "wb_a3": "PRI",
+ "woe_id": -99,
+ "adm0_a3_is": "PRI",
+ "adm0_a3_us": "PRI",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 11,
+ "long_len": 11,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ [
+ 1540
+ ]
+ ],
+ [
+ [
+ 1541
+ ]
+ ],
+ [
+ [
+ 1542
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "North Korea",
+ "sov_a3": "PRK",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "North Korea",
+ "adm0_a3": "PRK",
+ "geou_dif": 0,
+ "geounit": "North Korea",
+ "gu_a3": "PRK",
+ "su_dif": 0,
+ "subunit": "North Korea",
+ "su_a3": "PRK",
+ "brk_diff": 0,
+ "name": "Dem. Rep. Korea",
+ "name_long": "Dem. Rep. Korea",
+ "brk_a3": "PRK",
+ "brk_name": "Dem. Rep. Korea",
+ "brk_group": null,
+ "abbrev": "N.K.",
+ "postal": "KP",
+ "formal_en": "Democratic People's Republic of Korea",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Korea, Dem. Rep.",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 5,
+ "mapcolor9": 3,
+ "mapcolor13": 9,
+ "pop_est": 22665345,
+ "gdp_md_est": 40000,
+ "pop_year": -99,
+ "lastcensus": 2009,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "KP",
+ "iso_a3": "PRK",
+ "iso_n3": "408",
+ "un_a3": "408",
+ "wb_a2": "KP",
+ "wb_a3": "PRK",
+ "woe_id": -99,
+ "adm0_a3_is": "PRK",
+ "adm0_a3_us": "PRK",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Eastern Asia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 15,
+ "long_len": 15,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1543
+ ]
+ ],
+ [
+ [
+ 1544,
+ 1545,
+ -1233,
+ 1546,
+ -532
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Portugal",
+ "sov_a3": "PRT",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Portugal",
+ "adm0_a3": "PRT",
+ "geou_dif": 0,
+ "geounit": "Portugal",
+ "gu_a3": "PRT",
+ "su_dif": 1,
+ "subunit": "Portugal",
+ "su_a3": "PR1",
+ "brk_diff": 0,
+ "name": "Portugal",
+ "name_long": "Portugal",
+ "brk_a3": "PR1",
+ "brk_name": "Portugal",
+ "brk_group": null,
+ "abbrev": "Port.",
+ "postal": "P",
+ "formal_en": "Portuguese Republic",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Portugal",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 7,
+ "mapcolor9": 1,
+ "mapcolor13": 4,
+ "pop_est": 10707924,
+ "gdp_md_est": 208627,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": 0,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "PT",
+ "iso_a3": "PRT",
+ "iso_n3": "620",
+ "un_a3": "620",
+ "wb_a2": "PT",
+ "wb_a3": "PRT",
+ "woe_id": -99,
+ "adm0_a3_is": "PRT",
+ "adm0_a3_us": "PRT",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Southern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1547
+ ]
+ ],
+ [
+ [
+ 1548
+ ]
+ ],
+ [
+ [
+ 1549
+ ]
+ ],
+ [
+ [
+ 1550
+ ]
+ ],
+ [
+ [
+ 1551
+ ]
+ ],
+ [
+ [
+ 1552
+ ]
+ ],
+ [
+ [
+ 1553
+ ]
+ ],
+ [
+ [
+ 1554
+ ]
+ ],
+ [
+ [
+ 1555,
+ -701
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Paraguay",
+ "sov_a3": "PRY",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Paraguay",
+ "adm0_a3": "PRY",
+ "geou_dif": 0,
+ "geounit": "Paraguay",
+ "gu_a3": "PRY",
+ "su_dif": 0,
+ "subunit": "Paraguay",
+ "su_a3": "PRY",
+ "brk_diff": 0,
+ "name": "Paraguay",
+ "name_long": "Paraguay",
+ "brk_a3": "PRY",
+ "brk_name": "Paraguay",
+ "brk_group": null,
+ "abbrev": "Para.",
+ "postal": "PY",
+ "formal_en": "Republic of Paraguay",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Paraguay",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 3,
+ "mapcolor9": 6,
+ "mapcolor13": 2,
+ "pop_est": 6995655,
+ "gdp_md_est": 28890,
+ "pop_year": -99,
+ "lastcensus": 2002,
+ "gdp_year": -99,
+ "economy": "5. Emerging region: G20",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "PY",
+ "iso_a3": "PRY",
+ "iso_n3": "600",
+ "un_a3": "600",
+ "wb_a2": "PY",
+ "wb_a3": "PRY",
+ "woe_id": -99,
+ "adm0_a3_is": "PRY",
+ "adm0_a3_us": "PRY",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "South America",
+ "region_un": "Americas",
+ "subregion": "South America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -317,
+ -41,
+ -293
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Israel",
+ "sov_a3": "ISR",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Disputed",
+ "admin": "Palestine",
+ "adm0_a3": "PSX",
+ "geou_dif": 0,
+ "geounit": "Palestine",
+ "gu_a3": "PSX",
+ "su_dif": 0,
+ "subunit": "Palestine",
+ "su_a3": "PSX",
+ "brk_diff": 0,
+ "name": "Palestine",
+ "name_long": "Palestine",
+ "brk_a3": "PSX",
+ "brk_name": "Palestine",
+ "brk_group": null,
+ "abbrev": "Pal.",
+ "postal": "PAL",
+ "formal_en": "West Bank and Gaza",
+ "formal_fr": null,
+ "note_adm0": "Partial self-admin.",
+ "note_brk": "Partial self-admin.",
+ "name_sort": "Palestine (West Bank and Gaza)",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 2,
+ "mapcolor9": 5,
+ "mapcolor13": 8,
+ "pop_est": 4119083,
+ "gdp_md_est": 11950.77,
+ "pop_year": -99,
+ "lastcensus": 2007,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "PS",
+ "iso_a3": "PSE",
+ "iso_n3": "275",
+ "un_a3": "275",
+ "wb_a2": "GZ",
+ "wb_a3": "WBG",
+ "woe_id": -99,
+ "adm0_a3_is": "PSE",
+ "adm0_a3_us": "PSX",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Western Asia",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 9,
+ "long_len": 9,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ [
+ -676,
+ 1556,
+ -1121
+ ]
+ ],
+ [
+ [
+ -1118,
+ -1139
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "France",
+ "sov_a3": "FR1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "French Polynesia",
+ "adm0_a3": "PYF",
+ "geou_dif": 0,
+ "geounit": "French Polynesia",
+ "gu_a3": "PYF",
+ "su_dif": 0,
+ "subunit": "French Polynesia",
+ "su_a3": "PYF",
+ "brk_diff": 0,
+ "name": "Fr. Polynesia",
+ "name_long": "French Polynesia",
+ "brk_a3": "PYF",
+ "brk_name": "Fr. Polynesia",
+ "brk_group": null,
+ "abbrev": "Fr. Poly.",
+ "postal": "PF",
+ "formal_en": "French Polynesia",
+ "formal_fr": null,
+ "note_adm0": "Fr.",
+ "note_brk": null,
+ "name_sort": "French Polynesia",
+ "name_alt": null,
+ "mapcolor7": 7,
+ "mapcolor8": 5,
+ "mapcolor9": 9,
+ "mapcolor13": 11,
+ "pop_est": 287032,
+ "gdp_md_est": 4718,
+ "pop_year": -99,
+ "lastcensus": 2007,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "PF",
+ "iso_a3": "PYF",
+ "iso_n3": "258",
+ "un_a3": "258",
+ "wb_a2": "PF",
+ "wb_a3": "PYF",
+ "woe_id": -99,
+ "adm0_a3_is": "PYF",
+ "adm0_a3_us": "PYF",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Polynesia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 13,
+ "long_len": 16,
+ "abbrev_len": 9,
+ "tiny": 2,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ [
+ 1557
+ ]
+ ],
+ [
+ [
+ 1558
+ ]
+ ],
+ [
+ [
+ 1559
+ ]
+ ],
+ [
+ [
+ 1560
+ ]
+ ],
+ [
+ [
+ 1561
+ ]
+ ],
+ [
+ [
+ 1562
+ ]
+ ],
+ [
+ [
+ 1563
+ ]
+ ],
+ [
+ [
+ 1564
+ ]
+ ],
+ [
+ [
+ 1565
+ ]
+ ],
+ [
+ [
+ 1566
+ ]
+ ],
+ [
+ [
+ 1567
+ ]
+ ],
+ [
+ [
+ 1568
+ ]
+ ],
+ [
+ [
+ 1569
+ ]
+ ],
+ [
+ [
+ 1570
+ ]
+ ],
+ [
+ [
+ 1571
+ ]
+ ],
+ [
+ [
+ 1572
+ ]
+ ],
+ [
+ [
+ 1573
+ ]
+ ],
+ [
+ [
+ 1574
+ ]
+ ],
+ [
+ [
+ 1575
+ ]
+ ],
+ [
+ [
+ 1576
+ ]
+ ],
+ [
+ [
+ 1577
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Qatar",
+ "sov_a3": "QAT",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Qatar",
+ "adm0_a3": "QAT",
+ "geou_dif": 0,
+ "geounit": "Qatar",
+ "gu_a3": "QAT",
+ "su_dif": 0,
+ "subunit": "Qatar",
+ "su_a3": "QAT",
+ "brk_diff": 0,
+ "name": "Qatar",
+ "name_long": "Qatar",
+ "brk_a3": "QAT",
+ "brk_name": "Qatar",
+ "brk_group": null,
+ "abbrev": "Qatar",
+ "postal": "QA",
+ "formal_en": "State of Qatar",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Qatar",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 6,
+ "mapcolor9": 2,
+ "mapcolor13": 4,
+ "pop_est": 833285,
+ "gdp_md_est": 91330,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "QA",
+ "iso_a3": "QAT",
+ "iso_n3": "634",
+ "un_a3": "634",
+ "wb_a2": "QA",
+ "wb_a3": "QAT",
+ "woe_id": -99,
+ "adm0_a3_is": "QAT",
+ "adm0_a3_us": "QAT",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Western Asia",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1578,
+ 1579
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Romania",
+ "sov_a3": "ROU",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Romania",
+ "adm0_a3": "ROU",
+ "geou_dif": 0,
+ "geounit": "Romania",
+ "gu_a3": "ROU",
+ "su_dif": 0,
+ "subunit": "Romania",
+ "su_a3": "ROU",
+ "brk_diff": 0,
+ "name": "Romania",
+ "name_long": "Romania",
+ "brk_a3": "ROU",
+ "brk_name": "Romania",
+ "brk_group": null,
+ "abbrev": "Rom.",
+ "postal": "RO",
+ "formal_en": "Romania",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Romania",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 4,
+ "mapcolor9": 3,
+ "mapcolor13": 13,
+ "pop_est": 22215421,
+ "gdp_md_est": 271400,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "RO",
+ "iso_a3": "ROU",
+ "iso_n3": "642",
+ "un_a3": "642",
+ "wb_a2": "RO",
+ "wb_a3": "ROM",
+ "woe_id": -99,
+ "adm0_a3_is": "ROU",
+ "adm0_a3_us": "ROU",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Eastern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1580,
+ 1581,
+ -259,
+ 1582,
+ -927,
+ 1583,
+ -1273
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Russia",
+ "sov_a3": "RUS",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Russia",
+ "adm0_a3": "RUS",
+ "geou_dif": 0,
+ "geounit": "Russia",
+ "gu_a3": "RUS",
+ "su_dif": 0,
+ "subunit": "Russia",
+ "su_a3": "RUS",
+ "brk_diff": 0,
+ "name": "Russia",
+ "name_long": "Russian Federation",
+ "brk_a3": "RUS",
+ "brk_name": "Russia",
+ "brk_group": null,
+ "abbrev": "Rus.",
+ "postal": "RUS",
+ "formal_en": "Russian Federation",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Russian Federation",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 5,
+ "mapcolor9": 7,
+ "mapcolor13": 7,
+ "pop_est": 140041247,
+ "gdp_md_est": 2266000,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "3. Emerging region: BRIC",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "RU",
+ "iso_a3": "RUS",
+ "iso_n3": "643",
+ "un_a3": "643",
+ "wb_a2": "RU",
+ "wb_a3": "RUS",
+ "woe_id": -99,
+ "adm0_a3_is": "RUS",
+ "adm0_a3_us": "RUS",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Eastern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 6,
+ "long_len": 18,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1584
+ ]
+ ],
+ [
+ [
+ 1585
+ ]
+ ],
+ [
+ [
+ 1586
+ ]
+ ],
+ [
+ [
+ 1587
+ ]
+ ],
+ [
+ [
+ 1588
+ ]
+ ],
+ [
+ [
+ 1589
+ ]
+ ],
+ [
+ [
+ 1590
+ ]
+ ],
+ [
+ [
+ 1591
+ ]
+ ],
+ [
+ [
+ 1592
+ ]
+ ],
+ [
+ [
+ 1593
+ ]
+ ],
+ [
+ [
+ 1594
+ ]
+ ],
+ [
+ [
+ 1595
+ ]
+ ],
+ [
+ [
+ 1596
+ ]
+ ],
+ [
+ [
+ 1597
+ ]
+ ],
+ [
+ [
+ 1598
+ ]
+ ],
+ [
+ [
+ 1599
+ ]
+ ],
+ [
+ [
+ 1600
+ ]
+ ],
+ [
+ [
+ 1601
+ ]
+ ],
+ [
+ [
+ 1602
+ ]
+ ],
+ [
+ [
+ -1262,
+ -1536,
+ 1603,
+ -1259,
+ 1604
+ ]
+ ],
+ [
+ [
+ 1605
+ ]
+ ],
+ [
+ [
+ 1606
+ ]
+ ],
+ [
+ [
+ 1607
+ ]
+ ],
+ [
+ [
+ 1608
+ ]
+ ],
+ [
+ [
+ 1609
+ ]
+ ],
+ [
+ [
+ 1610
+ ]
+ ],
+ [
+ [
+ 1611
+ ]
+ ],
+ [
+ [
+ 1612
+ ]
+ ],
+ [
+ [
+ 1613
+ ]
+ ],
+ [
+ [
+ 1614
+ ]
+ ],
+ [
+ [
+ 1615
+ ]
+ ],
+ [
+ [
+ 1616
+ ]
+ ],
+ [
+ [
+ 1617
+ ]
+ ],
+ [
+ [
+ 1618
+ ]
+ ],
+ [
+ [
+ 1619
+ ]
+ ],
+ [
+ [
+ 1620
+ ]
+ ],
+ [
+ [
+ 1621
+ ]
+ ],
+ [
+ [
+ 1622
+ ]
+ ],
+ [
+ [
+ 1623
+ ]
+ ],
+ [
+ [
+ 1624
+ ]
+ ],
+ [
+ [
+ 1625
+ ]
+ ],
+ [
+ [
+ 1626
+ ]
+ ],
+ [
+ [
+ 1627
+ ]
+ ],
+ [
+ [
+ 1628
+ ]
+ ],
+ [
+ [
+ 1629
+ ]
+ ],
+ [
+ [
+ 1630
+ ]
+ ],
+ [
+ [
+ 1631
+ ]
+ ],
+ [
+ [
+ 1632
+ ]
+ ],
+ [
+ [
+ 1633
+ ]
+ ],
+ [
+ [
+ 1634
+ ]
+ ],
+ [
+ [
+ 1635
+ ]
+ ],
+ [
+ [
+ 1636
+ ]
+ ],
+ [
+ [
+ 1637
+ ]
+ ],
+ [
+ [
+ 1638
+ ]
+ ],
+ [
+ [
+ 1639
+ ]
+ ],
+ [
+ [
+ 1640
+ ]
+ ],
+ [
+ [
+ 1641
+ ]
+ ],
+ [
+ [
+ 1642
+ ]
+ ],
+ [
+ [
+ 1643
+ ]
+ ],
+ [
+ [
+ 1644
+ ]
+ ],
+ [
+ [
+ 1645
+ ]
+ ],
+ [
+ [
+ 1646
+ ]
+ ],
+ [
+ [
+ 1647
+ ]
+ ],
+ [
+ [
+ 1648
+ ]
+ ],
+ [
+ [
+ 1649
+ ]
+ ],
+ [
+ [
+ 1650
+ ]
+ ],
+ [
+ [
+ 1651
+ ]
+ ],
+ [
+ [
+ -1545,
+ -563,
+ -1331,
+ -561,
+ -1183,
+ 1652,
+ -224,
+ -804,
+ 1653,
+ 1654,
+ -282,
+ -1265,
+ -706,
+ 1655,
+ -721,
+ -1417,
+ 1656
+ ]
+ ],
+ [
+ [
+ 1657
+ ]
+ ],
+ [
+ [
+ 1658
+ ]
+ ],
+ [
+ [
+ 1659
+ ]
+ ],
+ [
+ [
+ 1660
+ ]
+ ],
+ [
+ [
+ 1661
+ ]
+ ],
+ [
+ [
+ 1662
+ ]
+ ],
+ [
+ [
+ 1663
+ ]
+ ],
+ [
+ [
+ 1664
+ ]
+ ],
+ [
+ [
+ 1665
+ ]
+ ],
+ [
+ [
+ 1666
+ ]
+ ],
+ [
+ [
+ 1667
+ ]
+ ],
+ [
+ [
+ 1668
+ ]
+ ],
+ [
+ [
+ 1669
+ ]
+ ],
+ [
+ [
+ 1670
+ ]
+ ],
+ [
+ [
+ 1671
+ ]
+ ],
+ [
+ [
+ 1672
+ ]
+ ],
+ [
+ [
+ 1673
+ ]
+ ],
+ [
+ [
+ 1674
+ ]
+ ],
+ [
+ [
+ 1675
+ ]
+ ],
+ [
+ [
+ 1676
+ ]
+ ],
+ [
+ [
+ 1677
+ ]
+ ],
+ [
+ [
+ 1678
+ ]
+ ],
+ [
+ [
+ 1679
+ ]
+ ],
+ [
+ [
+ 1680
+ ]
+ ],
+ [
+ [
+ 1681
+ ]
+ ],
+ [
+ [
+ 1682
+ ]
+ ],
+ [
+ [
+ 1683
+ ]
+ ],
+ [
+ [
+ 1684
+ ]
+ ],
+ [
+ [
+ 1685
+ ]
+ ],
+ [
+ [
+ 1686
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Rwanda",
+ "sov_a3": "RWA",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Rwanda",
+ "adm0_a3": "RWA",
+ "geou_dif": 0,
+ "geounit": "Rwanda",
+ "gu_a3": "RWA",
+ "su_dif": 0,
+ "subunit": "Rwanda",
+ "su_a3": "RWA",
+ "brk_diff": 0,
+ "name": "Rwanda",
+ "name_long": "Rwanda",
+ "brk_a3": "RWA",
+ "brk_name": "Rwanda",
+ "brk_group": null,
+ "abbrev": "Rwa.",
+ "postal": "RW",
+ "formal_en": "Republic of Rwanda",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Rwanda",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 2,
+ "mapcolor9": 3,
+ "mapcolor13": 10,
+ "pop_est": 10473282,
+ "gdp_md_est": 9706,
+ "pop_year": -99,
+ "lastcensus": 2002,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "RW",
+ "iso_a3": "RWA",
+ "iso_n3": "646",
+ "un_a3": "646",
+ "wb_a2": "RW",
+ "wb_a3": "RWA",
+ "woe_id": -99,
+ "adm0_a3_is": "RWA",
+ "adm0_a3_us": "RWA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Eastern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1687,
+ -227,
+ -579,
+ 1688
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 7,
+ "sovereignt": "Western Sahara",
+ "sov_a3": "SAH",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Indeterminate",
+ "admin": "Western Sahara",
+ "adm0_a3": "SAH",
+ "geou_dif": 0,
+ "geounit": "Western Sahara",
+ "gu_a3": "SAH",
+ "su_dif": 0,
+ "subunit": "Western Sahara",
+ "su_a3": "SAH",
+ "brk_diff": 1,
+ "name": "W. Sahara",
+ "name_long": "Western Sahara",
+ "brk_a3": "B28",
+ "brk_name": "W. Sahara",
+ "brk_group": null,
+ "abbrev": "W. Sah.",
+ "postal": "WS",
+ "formal_en": "Sahrawi Arab Democratic Republic",
+ "formal_fr": null,
+ "note_adm0": "Self admin.",
+ "note_brk": "Self admin.; Claimed by Morocco",
+ "name_sort": "Western Sahara",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 7,
+ "mapcolor9": 4,
+ "mapcolor13": 4,
+ "pop_est": -99,
+ "gdp_md_est": -99,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "EH",
+ "iso_a3": "ESH",
+ "iso_n3": "732",
+ "un_a3": "732",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "MAR",
+ "adm0_a3_us": "SAH",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Northern Africa",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 9,
+ "long_len": 14,
+ "abbrev_len": 7,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -1351,
+ 1689,
+ -1270,
+ -663
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Saudi Arabia",
+ "sov_a3": "SAU",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Saudi Arabia",
+ "adm0_a3": "SAU",
+ "geou_dif": 0,
+ "geounit": "Saudi Arabia",
+ "gu_a3": "SAU",
+ "su_dif": 0,
+ "subunit": "Saudi Arabia",
+ "su_a3": "SAU",
+ "brk_diff": 0,
+ "name": "Saudi Arabia",
+ "name_long": "Saudi Arabia",
+ "brk_a3": "SAU",
+ "brk_name": "Saudi Arabia",
+ "brk_group": null,
+ "abbrev": "Saud.",
+ "postal": "SA",
+ "formal_en": "Kingdom of Saudi Arabia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Saudi Arabia",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 1,
+ "mapcolor9": 6,
+ "mapcolor13": 7,
+ "pop_est": 28686633,
+ "gdp_md_est": 576500,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "SA",
+ "iso_a3": "SAU",
+ "iso_n3": "682",
+ "un_a3": "682",
+ "wb_a2": "SA",
+ "wb_a3": "SAU",
+ "woe_id": -99,
+ "adm0_a3_is": "SAU",
+ "adm0_a3_us": "SAU",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Western Asia",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 12,
+ "long_len": 12,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1690
+ ]
+ ],
+ [
+ [
+ 1691
+ ]
+ ],
+ [
+ [
+ 1692
+ ]
+ ],
+ [
+ [
+ -1238,
+ 1693,
+ -1579,
+ 1694,
+ -33,
+ -1448,
+ 1695,
+ 1696,
+ -1137,
+ -1112
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Sudan",
+ "sov_a3": "SDN",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Sudan",
+ "adm0_a3": "SDN",
+ "geou_dif": 0,
+ "geounit": "Sudan",
+ "gu_a3": "SDN",
+ "su_dif": 0,
+ "subunit": "Sudan",
+ "su_a3": "SDN",
+ "brk_diff": 0,
+ "name": "Sudan",
+ "name_long": "Sudan",
+ "brk_a3": "SDN",
+ "brk_name": "Sudan",
+ "brk_group": null,
+ "abbrev": "Sudan",
+ "postal": "SD",
+ "formal_en": "Republic of the Sudan",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Sudan",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 6,
+ "mapcolor9": 4,
+ "mapcolor13": 1,
+ "pop_est": 25946220,
+ "gdp_md_est": 88080,
+ "pop_year": -99,
+ "lastcensus": 2008,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "SD",
+ "iso_a3": "SDN",
+ "iso_n3": "729",
+ "un_a3": "729",
+ "wb_a2": "SD",
+ "wb_a3": "SDN",
+ "woe_id": -99,
+ "adm0_a3_is": "SDN",
+ "adm0_a3_us": "SDN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Northern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1697,
+ -686,
+ -713,
+ 1698,
+ -332,
+ 1699,
+ -1249,
+ -679
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "South Sudan",
+ "sov_a3": "SDS",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "South Sudan",
+ "adm0_a3": "SDS",
+ "geou_dif": 0,
+ "geounit": "South Sudan",
+ "gu_a3": "SDS",
+ "su_dif": 0,
+ "subunit": "South Sudan",
+ "su_a3": "SDS",
+ "brk_diff": 0,
+ "name": "S. Sudan",
+ "name_long": "South Sudan",
+ "brk_a3": "SDS",
+ "brk_name": "S. Sudan",
+ "brk_group": null,
+ "abbrev": "S. Sud.",
+ "postal": "SS",
+ "formal_en": "Republic of South Sudan",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "South Sudan",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 3,
+ "mapcolor9": 3,
+ "mapcolor13": 5,
+ "pop_est": 10625176,
+ "gdp_md_est": 13227,
+ "pop_year": -99,
+ "lastcensus": 2008,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "SS",
+ "iso_a3": "SSD",
+ "iso_n3": "728",
+ "un_a3": "728",
+ "wb_a2": "SS",
+ "wb_a3": "SSD",
+ "woe_id": -99,
+ "adm0_a3_is": "SSD",
+ "adm0_a3_us": "SDS",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Eastern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 8,
+ "long_len": 11,
+ "abbrev_len": 7,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -712,
+ -1189,
+ 1700,
+ -577,
+ -333,
+ -1699
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Senegal",
+ "sov_a3": "SEN",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Senegal",
+ "adm0_a3": "SEN",
+ "geou_dif": 0,
+ "geounit": "Senegal",
+ "gu_a3": "SEN",
+ "su_dif": 0,
+ "subunit": "Senegal",
+ "su_a3": "SEN",
+ "brk_diff": 0,
+ "name": "Senegal",
+ "name_long": "Senegal",
+ "brk_a3": "SEN",
+ "brk_name": "Senegal",
+ "brk_group": null,
+ "abbrev": "Sen.",
+ "postal": "SN",
+ "formal_en": "Republic of Senegal",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Senegal",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 6,
+ "mapcolor9": 5,
+ "mapcolor13": 5,
+ "pop_est": 13711597,
+ "gdp_md_est": 21980,
+ "pop_year": -99,
+ "lastcensus": 2002,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "SN",
+ "iso_a3": "SEN",
+ "iso_n3": "686",
+ "un_a3": "686",
+ "wb_a2": "SN",
+ "wb_a3": "SEN",
+ "woe_id": -99,
+ "adm0_a3_is": "SEN",
+ "adm0_a3_us": "SEN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Western Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -1305,
+ -814,
+ -824,
+ 1701,
+ -816,
+ 1702,
+ -1349
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Singapore",
+ "sov_a3": "SGP",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Singapore",
+ "adm0_a3": "SGP",
+ "geou_dif": 0,
+ "geounit": "Singapore",
+ "gu_a3": "SGP",
+ "su_dif": 0,
+ "subunit": "Singapore",
+ "su_a3": "SGP",
+ "brk_diff": 0,
+ "name": "Singapore",
+ "name_long": "Singapore",
+ "brk_a3": "SGP",
+ "brk_name": "Singapore",
+ "brk_group": null,
+ "abbrev": "Sing.",
+ "postal": "SG",
+ "formal_en": "Republic of Singapore",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Singapore",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 3,
+ "mapcolor9": 7,
+ "mapcolor13": 3,
+ "pop_est": 4657542,
+ "gdp_md_est": 237300,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "SG",
+ "iso_a3": "SGP",
+ "iso_n3": "702",
+ "un_a3": "702",
+ "wb_a2": "SG",
+ "wb_a3": "SGP",
+ "woe_id": -99,
+ "adm0_a3_is": "SGP",
+ "adm0_a3_us": "SGP",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "South-Eastern Asia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 9,
+ "long_len": 9,
+ "abbrev_len": 5,
+ "tiny": 3,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1703
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "United Kingdom",
+ "sov_a3": "GB1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "South Georgia and South Sandwich Islands",
+ "adm0_a3": "SGS",
+ "geou_dif": 0,
+ "geounit": "South Georgia and South Sandwich Islands",
+ "gu_a3": "SGS",
+ "su_dif": 0,
+ "subunit": "South Georgia and South Sandwich Islands",
+ "su_a3": "SGS",
+ "brk_diff": 0,
+ "name": "S. Geo. and S. Sandw. Is.",
+ "name_long": "South Georgia and South Sandwich Islands",
+ "brk_a3": "SGS",
+ "brk_name": "S. Geo. and S. Sandw. Is.",
+ "brk_group": null,
+ "abbrev": "S.G. S.S. Is.",
+ "postal": "GS",
+ "formal_en": "South Georgia and South Sandwich Islands",
+ "formal_fr": null,
+ "note_adm0": "U.K.",
+ "note_brk": null,
+ "name_sort": "South Georgia and the Islands",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 6,
+ "mapcolor9": 6,
+ "mapcolor13": 3,
+ "pop_est": 30,
+ "gdp_md_est": 0.3,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "GS",
+ "iso_a3": "SGS",
+ "iso_n3": "239",
+ "un_a3": "-099",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "SGS",
+ "adm0_a3_us": "SGS",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Seven seas (open ocean)",
+ "region_un": "Seven seas (open ocean)",
+ "subregion": "Seven seas (open ocean)",
+ "region_wb": "Antarctica",
+ "name_len": 25,
+ "long_len": 40,
+ "abbrev_len": 13,
+ "tiny": 3,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ [
+ 1704
+ ]
+ ],
+ [
+ [
+ 1705
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "United Kingdom",
+ "sov_a3": "GB1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Saint Helena",
+ "adm0_a3": "SHN",
+ "geou_dif": 0,
+ "geounit": "Saint Helena",
+ "gu_a3": "SHN",
+ "su_dif": 0,
+ "subunit": "Saint Helena",
+ "su_a3": "SHN",
+ "brk_diff": 0,
+ "name": "Saint Helena",
+ "name_long": "Saint Helena",
+ "brk_a3": "SHN",
+ "brk_name": "Saint Helena",
+ "brk_group": null,
+ "abbrev": "St.H.",
+ "postal": "SH",
+ "formal_en": null,
+ "formal_fr": null,
+ "note_adm0": "U.K.",
+ "note_brk": null,
+ "name_sort": "St. Helena",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 6,
+ "mapcolor9": 6,
+ "mapcolor13": 3,
+ "pop_est": 7637,
+ "gdp_md_est": 18,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "SH",
+ "iso_a3": "SHN",
+ "iso_n3": "654",
+ "un_a3": "654",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "SHN",
+ "adm0_a3_us": "SHN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Seven seas (open ocean)",
+ "region_un": "Africa",
+ "subregion": "Western Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 12,
+ "long_len": 12,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ [
+ 1706
+ ]
+ ],
+ [
+ [
+ 1707
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Solomon Islands",
+ "sov_a3": "SLB",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Solomon Islands",
+ "adm0_a3": "SLB",
+ "geou_dif": 0,
+ "geounit": "Solomon Islands",
+ "gu_a3": "SLB",
+ "su_dif": 0,
+ "subunit": "Solomon Islands",
+ "su_a3": "SLB",
+ "brk_diff": 0,
+ "name": "Solomon Is.",
+ "name_long": "Solomon Islands",
+ "brk_a3": "SLB",
+ "brk_name": "Solomon Is.",
+ "brk_group": null,
+ "abbrev": "S. Is.",
+ "postal": "SB",
+ "formal_en": null,
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Solomon Islands",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 4,
+ "mapcolor9": 1,
+ "mapcolor13": 6,
+ "pop_est": 595613,
+ "gdp_md_est": 1078,
+ "pop_year": -99,
+ "lastcensus": 2009,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "SB",
+ "iso_a3": "SLB",
+ "iso_n3": "090",
+ "un_a3": "090",
+ "wb_a2": "SB",
+ "wb_a3": "SLB",
+ "woe_id": -99,
+ "adm0_a3_is": "SLB",
+ "adm0_a3_us": "SLB",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Melanesia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 11,
+ "long_len": 15,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1708
+ ]
+ ],
+ [
+ [
+ 1709
+ ]
+ ],
+ [
+ [
+ 1710
+ ]
+ ],
+ [
+ [
+ 1711
+ ]
+ ],
+ [
+ [
+ 1712
+ ]
+ ],
+ [
+ [
+ 1713
+ ]
+ ],
+ [
+ [
+ 1714
+ ]
+ ],
+ [
+ [
+ 1715
+ ]
+ ],
+ [
+ [
+ 1716
+ ]
+ ],
+ [
+ [
+ 1717
+ ]
+ ],
+ [
+ [
+ 1718
+ ]
+ ],
+ [
+ [
+ 1719
+ ]
+ ],
+ [
+ [
+ 1720
+ ]
+ ],
+ [
+ [
+ 1721
+ ]
+ ],
+ [
+ [
+ 1722
+ ]
+ ],
+ [
+ [
+ 1723
+ ]
+ ],
+ [
+ [
+ 1724
+ ]
+ ],
+ [
+ [
+ 1725
+ ]
+ ],
+ [
+ [
+ 1726
+ ]
+ ],
+ [
+ [
+ 1727
+ ]
+ ],
+ [
+ [
+ 1728
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Sierra Leone",
+ "sov_a3": "SLE",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Sierra Leone",
+ "adm0_a3": "SLE",
+ "geou_dif": 0,
+ "geounit": "Sierra Leone",
+ "gu_a3": "SLE",
+ "su_dif": 0,
+ "subunit": "Sierra Leone",
+ "su_a3": "SLE",
+ "brk_diff": 0,
+ "name": "Sierra Leone",
+ "name_long": "Sierra Leone",
+ "brk_a3": "SLE",
+ "brk_name": "Sierra Leone",
+ "brk_group": null,
+ "abbrev": "S.L.",
+ "postal": "SL",
+ "formal_en": "Republic of Sierra Leone",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Sierra Leone",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 4,
+ "mapcolor9": 1,
+ "mapcolor13": 7,
+ "pop_est": 6440053,
+ "gdp_md_est": 4285,
+ "pop_year": -99,
+ "lastcensus": 2004,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "SL",
+ "iso_a3": "SLE",
+ "iso_n3": "694",
+ "un_a3": "694",
+ "wb_a2": "SL",
+ "wb_a3": "SLE",
+ "woe_id": -99,
+ "adm0_a3_is": "SLE",
+ "adm0_a3_us": "SLE",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Western Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 12,
+ "long_len": 12,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1729
+ ]
+ ],
+ [
+ [
+ -1248,
+ 1730,
+ -811
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "El Salvador",
+ "sov_a3": "SLV",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "El Salvador",
+ "adm0_a3": "SLV",
+ "geou_dif": 0,
+ "geounit": "El Salvador",
+ "gu_a3": "SLV",
+ "su_dif": 0,
+ "subunit": "El Salvador",
+ "su_a3": "SLV",
+ "brk_diff": 0,
+ "name": "El Salvador",
+ "name_long": "El Salvador",
+ "brk_a3": "SLV",
+ "brk_name": "El Salvador",
+ "brk_group": null,
+ "abbrev": "El. S.",
+ "postal": "SV",
+ "formal_en": "Republic of El Salvador",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "El Salvador",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 4,
+ "mapcolor9": 6,
+ "mapcolor13": 8,
+ "pop_est": 7185218,
+ "gdp_md_est": 43630,
+ "pop_year": -99,
+ "lastcensus": 2007,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "SV",
+ "iso_a3": "SLV",
+ "iso_n3": "222",
+ "un_a3": "222",
+ "wb_a2": "SV",
+ "wb_a3": "SLV",
+ "woe_id": -99,
+ "adm0_a3_is": "SLV",
+ "adm0_a3_us": "SLV",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Central America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 11,
+ "long_len": 11,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -902,
+ 1731,
+ -889
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "San Marino",
+ "sov_a3": "SMR",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "San Marino",
+ "adm0_a3": "SMR",
+ "geou_dif": 0,
+ "geounit": "San Marino",
+ "gu_a3": "SMR",
+ "su_dif": 0,
+ "subunit": "San Marino",
+ "su_a3": "SMR",
+ "brk_diff": 0,
+ "name": "San Marino",
+ "name_long": "San Marino",
+ "brk_a3": "SMR",
+ "brk_name": "San Marino",
+ "brk_group": null,
+ "abbrev": "S.M.",
+ "postal": "RSM",
+ "formal_en": "Republic of San Marino",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "San Marino",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 3,
+ "mapcolor9": 1,
+ "mapcolor13": 6,
+ "pop_est": 30324,
+ "gdp_md_est": 1662,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "SM",
+ "iso_a3": "SMR",
+ "iso_n3": "674",
+ "un_a3": "674",
+ "wb_a2": "SM",
+ "wb_a3": "SMR",
+ "woe_id": -99,
+ "adm0_a3_is": "SMR",
+ "adm0_a3_us": "SMR",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Southern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 10,
+ "long_len": 10,
+ "abbrev_len": 4,
+ "tiny": 5,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -1134
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Somaliland",
+ "sov_a3": "SOL",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Indeterminate",
+ "admin": "Somaliland",
+ "adm0_a3": "SOL",
+ "geou_dif": 0,
+ "geounit": "Somaliland",
+ "gu_a3": "SOL",
+ "su_dif": 0,
+ "subunit": "Somaliland",
+ "su_a3": "SOL",
+ "brk_diff": 1,
+ "name": "Somaliland",
+ "name_long": "Somaliland",
+ "brk_a3": "B30",
+ "brk_name": "Somaliland",
+ "brk_group": null,
+ "abbrev": "Solnd.",
+ "postal": "SL",
+ "formal_en": "Republic of Somaliland",
+ "formal_fr": null,
+ "note_adm0": "Self admin.",
+ "note_brk": "Self admin.; Claimed by Somalia",
+ "name_sort": "Somaliland",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 6,
+ "mapcolor9": 5,
+ "mapcolor13": 2,
+ "pop_est": 3500000,
+ "gdp_md_est": 12250,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "-99",
+ "iso_a3": "-99",
+ "iso_n3": "-99",
+ "un_a3": "-099",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "SOM",
+ "adm0_a3_us": "SOM",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Eastern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 10,
+ "long_len": 10,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1732,
+ -709,
+ -639,
+ 1733
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Somalia",
+ "sov_a3": "SOM",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Somalia",
+ "adm0_a3": "SOM",
+ "geou_dif": 0,
+ "geounit": "Somalia",
+ "gu_a3": "SOM",
+ "su_dif": 0,
+ "subunit": "Somalia",
+ "su_a3": "SOM",
+ "brk_diff": 0,
+ "name": "Somalia",
+ "name_long": "Somalia",
+ "brk_a3": "SOM",
+ "brk_name": "Somalia",
+ "brk_group": null,
+ "abbrev": "Som.",
+ "postal": "SO",
+ "formal_en": "Federal Republic of Somalia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Somalia",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 8,
+ "mapcolor9": 6,
+ "mapcolor13": 7,
+ "pop_est": 9832017,
+ "gdp_md_est": 5524,
+ "pop_year": -99,
+ "lastcensus": 1987,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "SO",
+ "iso_a3": "SOM",
+ "iso_n3": "706",
+ "un_a3": "706",
+ "wb_a2": "SO",
+ "wb_a3": "SOM",
+ "woe_id": -99,
+ "adm0_a3_is": "SOM",
+ "adm0_a3_us": "SOM",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Eastern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -1185,
+ -710,
+ -1733,
+ 1734
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "France",
+ "sov_a3": "FR1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Saint Pierre and Miquelon",
+ "adm0_a3": "SPM",
+ "geou_dif": 0,
+ "geounit": "Saint Pierre and Miquelon",
+ "gu_a3": "SPM",
+ "su_dif": 0,
+ "subunit": "Saint Pierre and Miquelon",
+ "su_a3": "SPM",
+ "brk_diff": 0,
+ "name": "St. Pierre and Miquelon",
+ "name_long": "Saint Pierre and Miquelon",
+ "brk_a3": "SPM",
+ "brk_name": "St. Pierre and Miquelon",
+ "brk_group": null,
+ "abbrev": "St. P.M.",
+ "postal": "PM",
+ "formal_en": "Saint Pierre and Miquelon",
+ "formal_fr": null,
+ "note_adm0": "Fr.",
+ "note_brk": null,
+ "name_sort": "St. Pierre and Miquelon",
+ "name_alt": null,
+ "mapcolor7": 7,
+ "mapcolor8": 5,
+ "mapcolor9": 9,
+ "mapcolor13": 11,
+ "pop_est": 7051,
+ "gdp_md_est": 48.3,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "PM",
+ "iso_a3": "SPM",
+ "iso_n3": "666",
+ "un_a3": "666",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "SPM",
+ "adm0_a3_us": "SPM",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Northern America",
+ "region_wb": "North America",
+ "name_len": 23,
+ "long_len": 25,
+ "abbrev_len": 8,
+ "tiny": 3,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ [
+ 1735
+ ]
+ ],
+ [
+ [
+ 1736
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Republic of Serbia",
+ "sov_a3": "SRB",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Republic of Serbia",
+ "adm0_a3": "SRB",
+ "geou_dif": 0,
+ "geounit": "Republic of Serbia",
+ "gu_a3": "SRB",
+ "su_dif": 0,
+ "subunit": "Republic of Serbia",
+ "su_a3": "SRB",
+ "brk_diff": 0,
+ "name": "Serbia",
+ "name_long": "Serbia",
+ "brk_a3": "SRB",
+ "brk_name": "Serbia",
+ "brk_group": null,
+ "abbrev": "Serb.",
+ "postal": "RS",
+ "formal_en": "Republic of Serbia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Serbia",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 3,
+ "mapcolor9": 2,
+ "mapcolor13": 10,
+ "pop_est": 7379339,
+ "gdp_md_est": 80340,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "RS",
+ "iso_a3": "SRB",
+ "iso_n3": "688",
+ "un_a3": "688",
+ "wb_a2": "YF",
+ "wb_a3": "SRB",
+ "woe_id": -99,
+ "adm0_a3_is": "SRB",
+ "adm0_a3_us": "SRB",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Southern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -1583,
+ -258,
+ -1303,
+ -1236,
+ -1329,
+ -276,
+ -919,
+ -928
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Sao Tome and Principe",
+ "sov_a3": "STP",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Sao Tome and Principe",
+ "adm0_a3": "STP",
+ "geou_dif": 0,
+ "geounit": "Sao Tome and Principe",
+ "gu_a3": "STP",
+ "su_dif": 0,
+ "subunit": "Sao Tome and Principe",
+ "su_a3": "STP",
+ "brk_diff": 0,
+ "name": "São Tomé and Principe",
+ "name_long": "São Tomé and Principe",
+ "brk_a3": "STP",
+ "brk_name": "Sao Tome and Principe",
+ "brk_group": null,
+ "abbrev": "S.T.P.",
+ "postal": "ST",
+ "formal_en": "Democratic Republic of São Tomé and Principe",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "São Tomé and Principe",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 6,
+ "mapcolor9": 1,
+ "mapcolor13": 7,
+ "pop_est": 212679,
+ "gdp_md_est": 276.5,
+ "pop_year": -99,
+ "lastcensus": 2001,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "ST",
+ "iso_a3": "STP",
+ "iso_n3": "678",
+ "un_a3": "678",
+ "wb_a2": "ST",
+ "wb_a3": "STP",
+ "woe_id": -99,
+ "adm0_a3_is": "STP",
+ "adm0_a3_us": "STP",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Middle Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 21,
+ "long_len": 21,
+ "abbrev_len": 6,
+ "tiny": 3,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1737
+ ]
+ ],
+ [
+ [
+ 1738
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Suriname",
+ "sov_a3": "SUR",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Suriname",
+ "adm0_a3": "SUR",
+ "geou_dif": 0,
+ "geounit": "Suriname",
+ "gu_a3": "SUR",
+ "su_dif": 0,
+ "subunit": "Suriname",
+ "su_a3": "SUR",
+ "brk_diff": 0,
+ "name": "Suriname",
+ "name_long": "Suriname",
+ "brk_a3": "SUR",
+ "brk_name": "Suriname",
+ "brk_group": null,
+ "abbrev": "Sur.",
+ "postal": "SR",
+ "formal_en": "Republic of Suriname",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Suriname",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 4,
+ "mapcolor9": 7,
+ "mapcolor13": 6,
+ "pop_est": 481267,
+ "gdp_md_est": 4254,
+ "pop_year": -99,
+ "lastcensus": 2004,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "SR",
+ "iso_a3": "SUR",
+ "iso_n3": "740",
+ "un_a3": "740",
+ "wb_a2": "SR",
+ "wb_a3": "SUR",
+ "woe_id": -99,
+ "adm0_a3_is": "SUR",
+ "adm0_a3_us": "SUR",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "South America",
+ "region_un": "Americas",
+ "subregion": "South America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -752,
+ -313,
+ -893,
+ 1739
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Slovakia",
+ "sov_a3": "SVK",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Slovakia",
+ "adm0_a3": "SVK",
+ "geou_dif": 0,
+ "geounit": "Slovakia",
+ "gu_a3": "SVK",
+ "su_dif": 0,
+ "subunit": "Slovakia",
+ "su_a3": "SVK",
+ "brk_diff": 0,
+ "name": "Slovakia",
+ "name_long": "Slovakia",
+ "brk_a3": "SVK",
+ "brk_name": "Slovakia",
+ "brk_group": null,
+ "abbrev": "Svk.",
+ "postal": "SK",
+ "formal_en": "Slovak Republic",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Slovak Republic",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 4,
+ "mapcolor9": 4,
+ "mapcolor13": 9,
+ "pop_est": 5463046,
+ "gdp_md_est": 119500,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "SK",
+ "iso_a3": "SVK",
+ "iso_n3": "703",
+ "un_a3": "703",
+ "wb_a2": "SK",
+ "wb_a3": "SVK",
+ "woe_id": -99,
+ "adm0_a3_is": "SVK",
+ "adm0_a3_us": "SVK",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Eastern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1740,
+ -930,
+ -210,
+ -624,
+ -1538
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Slovenia",
+ "sov_a3": "SVN",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Slovenia",
+ "adm0_a3": "SVN",
+ "geou_dif": 0,
+ "geounit": "Slovenia",
+ "gu_a3": "SVN",
+ "su_dif": 0,
+ "subunit": "Slovenia",
+ "su_a3": "SVN",
+ "brk_diff": 0,
+ "name": "Slovenia",
+ "name_long": "Slovenia",
+ "brk_a3": "SVN",
+ "brk_name": "Slovenia",
+ "brk_group": null,
+ "abbrev": "Slo.",
+ "postal": "SLO",
+ "formal_en": "Republic of Slovenia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Slovenia",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 3,
+ "mapcolor9": 2,
+ "mapcolor13": 12,
+ "pop_est": 2005692,
+ "gdp_md_est": 59340,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "SI",
+ "iso_a3": "SVN",
+ "iso_n3": "705",
+ "un_a3": "705",
+ "wb_a2": "SI",
+ "wb_a3": "SVN",
+ "woe_id": -99,
+ "adm0_a3_is": "SVN",
+ "adm0_a3_us": "SVN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Southern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -921,
+ 1741,
+ -1132,
+ -212,
+ -929
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Sweden",
+ "sov_a3": "SWE",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Sweden",
+ "adm0_a3": "SWE",
+ "geou_dif": 0,
+ "geounit": "Sweden",
+ "gu_a3": "SWE",
+ "su_dif": 0,
+ "subunit": "Sweden",
+ "su_a3": "SWE",
+ "brk_diff": 0,
+ "name": "Sweden",
+ "name_long": "Sweden",
+ "brk_a3": "SWE",
+ "brk_name": "Sweden",
+ "brk_group": null,
+ "abbrev": "Swe.",
+ "postal": "S",
+ "formal_en": "Kingdom of Sweden",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Sweden",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 4,
+ "mapcolor9": 2,
+ "mapcolor13": 4,
+ "pop_est": 9059651,
+ "gdp_md_est": 344300,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "SE",
+ "iso_a3": "SWE",
+ "iso_n3": "752",
+ "un_a3": "752",
+ "wb_a2": "SE",
+ "wb_a3": "SWE",
+ "woe_id": -99,
+ "adm0_a3_is": "SWE",
+ "adm0_a3_us": "SWE",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Northern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1742
+ ]
+ ],
+ [
+ [
+ 1743
+ ]
+ ],
+ [
+ [
+ 1744
+ ]
+ ],
+ [
+ [
+ 1745
+ ]
+ ],
+ [
+ [
+ 1746
+ ]
+ ],
+ [
+ [
+ 1747,
+ -1418,
+ -723
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Swaziland",
+ "sov_a3": "SWZ",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Swaziland",
+ "adm0_a3": "SWZ",
+ "geou_dif": 0,
+ "geounit": "Swaziland",
+ "gu_a3": "SWZ",
+ "su_dif": 0,
+ "subunit": "Swaziland",
+ "su_a3": "SWZ",
+ "brk_diff": 0,
+ "name": "Swaziland",
+ "name_long": "Swaziland",
+ "brk_a3": "SWZ",
+ "brk_name": "Swaziland",
+ "brk_group": null,
+ "abbrev": "Swz.",
+ "postal": "SW",
+ "formal_en": "Kingdom of Swaziland",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Swaziland",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 6,
+ "mapcolor9": 2,
+ "mapcolor13": 5,
+ "pop_est": 1123913,
+ "gdp_md_est": 5702,
+ "pop_year": -99,
+ "lastcensus": 2007,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "SZ",
+ "iso_a3": "SWZ",
+ "iso_n3": "748",
+ "un_a3": "748",
+ "wb_a2": "SZ",
+ "wb_a3": "SWZ",
+ "woe_id": -99,
+ "adm0_a3_is": "SWZ",
+ "adm0_a3_us": "SWZ",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Southern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 9,
+ "long_len": 9,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -1339,
+ 1748
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Netherlands",
+ "sov_a3": "NL1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Country",
+ "admin": "Sint Maarten",
+ "adm0_a3": "SXM",
+ "geou_dif": 0,
+ "geounit": "Sint Maarten",
+ "gu_a3": "SXM",
+ "su_dif": 0,
+ "subunit": "Sint Maarten",
+ "su_a3": "SXM",
+ "brk_diff": 0,
+ "name": "Sint Maarten",
+ "name_long": "Sint Maarten",
+ "brk_a3": "SXM",
+ "brk_name": "Sint Maarten",
+ "brk_group": null,
+ "abbrev": "St. M.",
+ "postal": "SX",
+ "formal_en": "Sint Maarten (Dutch part)",
+ "formal_fr": null,
+ "note_adm0": "Neth.",
+ "note_brk": null,
+ "name_sort": "St. Maarten (Dutch part)",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 2,
+ "mapcolor9": 2,
+ "mapcolor13": 9,
+ "pop_est": 37429,
+ "gdp_md_est": 400,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "SX",
+ "iso_a3": "SXM",
+ "iso_n3": "534",
+ "un_a3": "534",
+ "wb_a2": "SX",
+ "wb_a3": "SXM",
+ "woe_id": -99,
+ "adm0_a3_is": "SXM",
+ "adm0_a3_us": "SXM",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 12,
+ "long_len": 12,
+ "abbrev_len": 6,
+ "tiny": 4,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ -1268,
+ 1749
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Seychelles",
+ "sov_a3": "SYC",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Seychelles",
+ "adm0_a3": "SYC",
+ "geou_dif": 0,
+ "geounit": "Seychelles",
+ "gu_a3": "SYC",
+ "su_dif": 0,
+ "subunit": "Seychelles",
+ "su_a3": "SYC",
+ "brk_diff": 0,
+ "name": "Seychelles",
+ "name_long": "Seychelles",
+ "brk_a3": "SYC",
+ "brk_name": "Seychelles",
+ "brk_group": null,
+ "abbrev": "Syc.",
+ "postal": "SC",
+ "formal_en": "Republic of Seychelles",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Seychelles",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 8,
+ "mapcolor9": 3,
+ "mapcolor13": 1,
+ "pop_est": 87476,
+ "gdp_md_est": 1715,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "SC",
+ "iso_a3": "SYC",
+ "iso_n3": "690",
+ "un_a3": "690",
+ "wb_a2": "SC",
+ "wb_a3": "SYC",
+ "woe_id": -99,
+ "adm0_a3_is": "SYC",
+ "adm0_a3_us": "SYC",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Seven seas (open ocean)",
+ "region_un": "Africa",
+ "subregion": "Eastern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 10,
+ "long_len": 10,
+ "abbrev_len": 4,
+ "tiny": 2,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1750
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Syria",
+ "sov_a3": "SYR",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Syria",
+ "adm0_a3": "SYR",
+ "geou_dif": 0,
+ "geounit": "Syria",
+ "gu_a3": "SYR",
+ "su_dif": 0,
+ "subunit": "Syria",
+ "su_a3": "SYR",
+ "brk_diff": 0,
+ "name": "Syria",
+ "name_long": "Syria",
+ "brk_a3": "SYR",
+ "brk_name": "Syria",
+ "brk_group": null,
+ "abbrev": "Syria",
+ "postal": "SYR",
+ "formal_en": "Syrian Arab Republic",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Syrian Arab Republic",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 6,
+ "mapcolor9": 2,
+ "mapcolor13": 6,
+ "pop_est": 20178485,
+ "gdp_md_est": 98830,
+ "pop_year": -99,
+ "lastcensus": 2004,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "SY",
+ "iso_a3": "SYR",
+ "iso_n3": "760",
+ "un_a3": "760",
+ "wb_a2": "SY",
+ "wb_a3": "SYR",
+ "woe_id": -99,
+ "adm0_a3_is": "SYR",
+ "adm0_a3_us": "SYR",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Western Asia",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -1114,
+ -1140,
+ -1124,
+ -1246,
+ 1751,
+ 1752
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "United Kingdom",
+ "sov_a3": "GB1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Turks and Caicos Islands",
+ "adm0_a3": "TCA",
+ "geou_dif": 0,
+ "geounit": "Turks and Caicos Islands",
+ "gu_a3": "TCA",
+ "su_dif": 0,
+ "subunit": "Turks and Caicos Islands",
+ "su_a3": "TCA",
+ "brk_diff": 0,
+ "name": "Turks and Caicos Is.",
+ "name_long": "Turks and Caicos Islands",
+ "brk_a3": "TCA",
+ "brk_name": "Turks and Caicos Is.",
+ "brk_group": null,
+ "abbrev": "T.C. Is.",
+ "postal": "TC",
+ "formal_en": "Turks and Caicos Islands",
+ "formal_fr": null,
+ "note_adm0": "U.K.",
+ "note_brk": null,
+ "name_sort": "Turks and Caicos Islands",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 6,
+ "mapcolor9": 6,
+ "mapcolor13": 3,
+ "pop_est": 22942,
+ "gdp_md_est": 216,
+ "pop_year": -99,
+ "lastcensus": 2001,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "TC",
+ "iso_a3": "TCA",
+ "iso_n3": "796",
+ "un_a3": "796",
+ "wb_a2": "TC",
+ "wb_a3": "TCA",
+ "woe_id": -99,
+ "adm0_a3_is": "TCA",
+ "adm0_a3_us": "TCA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 20,
+ "long_len": 24,
+ "abbrev_len": 8,
+ "tiny": -99,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ [
+ 1753
+ ]
+ ],
+ [
+ [
+ 1754
+ ]
+ ],
+ [
+ [
+ 1755
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Chad",
+ "sov_a3": "TCD",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Chad",
+ "adm0_a3": "TCD",
+ "geou_dif": 0,
+ "geounit": "Chad",
+ "gu_a3": "TCD",
+ "su_dif": 0,
+ "subunit": "Chad",
+ "su_a3": "TCD",
+ "brk_diff": 0,
+ "name": "Chad",
+ "name_long": "Chad",
+ "brk_a3": "TCD",
+ "brk_name": "Chad",
+ "brk_group": null,
+ "abbrev": "Chad",
+ "postal": "TD",
+ "formal_en": "Republic of Chad",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Chad",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 1,
+ "mapcolor9": 8,
+ "mapcolor13": 6,
+ "pop_est": 10329208,
+ "gdp_md_est": 15860,
+ "pop_year": -99,
+ "lastcensus": 2009,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "TD",
+ "iso_a3": "TCD",
+ "iso_n3": "148",
+ "un_a3": "148",
+ "wb_a2": "TD",
+ "wb_a3": "TCD",
+ "woe_id": -99,
+ "adm0_a3_is": "TCD",
+ "adm0_a3_us": "TCD",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Middle Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 4,
+ "long_len": 4,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -1700,
+ -337,
+ -576,
+ -1380,
+ -1376,
+ -1250
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Togo",
+ "sov_a3": "TGO",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Togo",
+ "adm0_a3": "TGO",
+ "geou_dif": 0,
+ "geounit": "Togo",
+ "gu_a3": "TGO",
+ "su_dif": 0,
+ "subunit": "Togo",
+ "su_a3": "TGO",
+ "brk_diff": 0,
+ "name": "Togo",
+ "name_long": "Togo",
+ "brk_a3": "TGO",
+ "brk_name": "Togo",
+ "brk_group": null,
+ "abbrev": "Togo",
+ "postal": "TG",
+ "formal_en": "Togolese Republic",
+ "formal_fr": "République Togolaise",
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Togo",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 1,
+ "mapcolor9": 3,
+ "mapcolor13": 5,
+ "pop_est": 6019877,
+ "gdp_md_est": 5118,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "TG",
+ "iso_a3": "TGO",
+ "iso_n3": "768",
+ "un_a3": "768",
+ "wb_a2": "TG",
+ "wb_a3": "TGO",
+ "woe_id": -99,
+ "adm0_a3_is": "TGO",
+ "adm0_a3_us": "TGO",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Western Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 4,
+ "long_len": 4,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -237,
+ 1756,
+ -806,
+ -241
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Thailand",
+ "sov_a3": "THA",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Thailand",
+ "adm0_a3": "THA",
+ "geou_dif": 0,
+ "geounit": "Thailand",
+ "gu_a3": "THA",
+ "su_dif": 0,
+ "subunit": "Thailand",
+ "su_a3": "THA",
+ "brk_diff": 0,
+ "name": "Thailand",
+ "name_long": "Thailand",
+ "brk_a3": "THA",
+ "brk_name": "Thailand",
+ "brk_group": null,
+ "abbrev": "Thai.",
+ "postal": "TH",
+ "formal_en": "Kingdom of Thailand",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Thailand",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 6,
+ "mapcolor9": 8,
+ "mapcolor13": 1,
+ "pop_est": 65905410,
+ "gdp_md_est": 547400,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "5. Emerging region: G20",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "TH",
+ "iso_a3": "THA",
+ "iso_n3": "764",
+ "un_a3": "764",
+ "wb_a2": "TH",
+ "wb_a3": "THA",
+ "woe_id": -99,
+ "adm0_a3_is": "THA",
+ "adm0_a3_us": "THA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "South-Eastern Asia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1757
+ ]
+ ],
+ [
+ [
+ 1758
+ ]
+ ],
+ [
+ [
+ 1759
+ ]
+ ],
+ [
+ [
+ 1760
+ ]
+ ],
+ [
+ [
+ 1761
+ ]
+ ],
+ [
+ [
+ 1762
+ ]
+ ],
+ [
+ [
+ 1763
+ ]
+ ],
+ [
+ [
+ 1764
+ ]
+ ],
+ [
+ [
+ 1765
+ ]
+ ],
+ [
+ [
+ -1243,
+ -1198,
+ 1766,
+ -1363,
+ 1767,
+ -1327
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Tajikistan",
+ "sov_a3": "TJK",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Tajikistan",
+ "adm0_a3": "TJK",
+ "geou_dif": 0,
+ "geounit": "Tajikistan",
+ "gu_a3": "TJK",
+ "su_dif": 0,
+ "subunit": "Tajikistan",
+ "su_a3": "TJK",
+ "brk_diff": 0,
+ "name": "Tajikistan",
+ "name_long": "Tajikistan",
+ "brk_a3": "TJK",
+ "brk_name": "Tajikistan",
+ "brk_group": null,
+ "abbrev": "Tjk.",
+ "postal": "TJ",
+ "formal_en": "Republic of Tajikistan",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Tajikistan",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 6,
+ "mapcolor9": 2,
+ "mapcolor13": 5,
+ "pop_est": 7349145,
+ "gdp_md_est": 13160,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "TJ",
+ "iso_a3": "TJK",
+ "iso_n3": "762",
+ "un_a3": "762",
+ "wb_a2": "TJ",
+ "wb_a3": "TJK",
+ "woe_id": -99,
+ "adm0_a3_is": "TJK",
+ "adm0_a3_us": "TJK",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Central Asia",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 10,
+ "long_len": 10,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ -1192
+ ]
+ ],
+ [
+ [
+ 1768
+ ]
+ ],
+ [
+ [
+ -1190,
+ -558,
+ -8,
+ 1769
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Turkmenistan",
+ "sov_a3": "TKM",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Turkmenistan",
+ "adm0_a3": "TKM",
+ "geou_dif": 0,
+ "geounit": "Turkmenistan",
+ "gu_a3": "TKM",
+ "su_dif": 0,
+ "subunit": "Turkmenistan",
+ "su_a3": "TKM",
+ "brk_diff": 0,
+ "name": "Turkmenistan",
+ "name_long": "Turkmenistan",
+ "brk_a3": "TKM",
+ "brk_name": "Turkmenistan",
+ "brk_group": null,
+ "abbrev": "Turkm.",
+ "postal": "TM",
+ "formal_en": "Turkmenistan",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Turkmenistan",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 2,
+ "mapcolor9": 1,
+ "mapcolor13": 9,
+ "pop_est": 4884887,
+ "gdp_md_est": 29780,
+ "pop_year": -99,
+ "lastcensus": 1995,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "TM",
+ "iso_a3": "TKM",
+ "iso_n3": "795",
+ "un_a3": "795",
+ "wb_a2": "TM",
+ "wb_a3": "TKM",
+ "woe_id": -99,
+ "adm0_a3_is": "TKM",
+ "adm0_a3_us": "TKM",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Central Asia",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 12,
+ "long_len": 12,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1770
+ ]
+ ],
+ [
+ [
+ -6,
+ -1104,
+ 1771,
+ -1181,
+ 1772
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "East Timor",
+ "sov_a3": "TLS",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "East Timor",
+ "adm0_a3": "TLS",
+ "geou_dif": 0,
+ "geounit": "East Timor",
+ "gu_a3": "TLS",
+ "su_dif": 0,
+ "subunit": "East Timor",
+ "su_a3": "TLS",
+ "brk_diff": 0,
+ "name": "Timor-Leste",
+ "name_long": "Timor-Leste",
+ "brk_a3": "TLS",
+ "brk_name": "Timor-Leste",
+ "brk_group": null,
+ "abbrev": "T.L.",
+ "postal": "TL",
+ "formal_en": "Democratic Republic of Timor-Leste",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Timor-Leste",
+ "name_alt": "East Timor",
+ "mapcolor7": 2,
+ "mapcolor8": 2,
+ "mapcolor9": 4,
+ "mapcolor13": 3,
+ "pop_est": 1131612,
+ "gdp_md_est": 2520,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "TL",
+ "iso_a3": "TLS",
+ "iso_n3": "626",
+ "un_a3": "626",
+ "wb_a2": "TP",
+ "wb_a3": "TMP",
+ "woe_id": -99,
+ "adm0_a3_is": "TLS",
+ "adm0_a3_us": "TLS",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "South-Eastern Asia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 11,
+ "long_len": 11,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1773,
+ -936
+ ]
+ ],
+ [
+ [
+ -938,
+ 1774
+ ]
+ ],
+ [
+ [
+ 1775
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Tonga",
+ "sov_a3": "TON",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Tonga",
+ "adm0_a3": "TON",
+ "geou_dif": 0,
+ "geounit": "Tonga",
+ "gu_a3": "TON",
+ "su_dif": 0,
+ "subunit": "Tonga",
+ "su_a3": "TON",
+ "brk_diff": 0,
+ "name": "Tonga",
+ "name_long": "Tonga",
+ "brk_a3": "TON",
+ "brk_name": "Tonga",
+ "brk_group": null,
+ "abbrev": "Tongo",
+ "postal": "TO",
+ "formal_en": "Kingdom of Tonga",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Tonga",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 1,
+ "mapcolor9": 1,
+ "mapcolor13": 8,
+ "pop_est": 120898,
+ "gdp_md_est": 549,
+ "pop_year": -99,
+ "lastcensus": 2006,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "TO",
+ "iso_a3": "TON",
+ "iso_n3": "776",
+ "un_a3": "776",
+ "wb_a2": "TO",
+ "wb_a3": "TON",
+ "woe_id": -99,
+ "adm0_a3_is": "TON",
+ "adm0_a3_us": "TON",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Polynesia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": 3,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1776
+ ]
+ ],
+ [
+ [
+ 1777
+ ]
+ ],
+ [
+ [
+ 1778
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 5,
+ "sovereignt": "Trinidad and Tobago",
+ "sov_a3": "TTO",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Trinidad and Tobago",
+ "adm0_a3": "TTO",
+ "geou_dif": 0,
+ "geounit": "Trinidad and Tobago",
+ "gu_a3": "TTO",
+ "su_dif": 0,
+ "subunit": "Trinidad and Tobago",
+ "su_a3": "TTO",
+ "brk_diff": 0,
+ "name": "Trinidad and Tobago",
+ "name_long": "Trinidad and Tobago",
+ "brk_a3": "TTO",
+ "brk_name": "Trinidad and Tobago",
+ "brk_group": null,
+ "abbrev": "Tr.T.",
+ "postal": "TT",
+ "formal_en": "Republic of Trinidad and Tobago",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Trinidad and Tobago",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 6,
+ "mapcolor9": 2,
+ "mapcolor13": 5,
+ "pop_est": 1310000,
+ "gdp_md_est": 29010,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "TT",
+ "iso_a3": "TTO",
+ "iso_n3": "780",
+ "un_a3": "780",
+ "wb_a2": "TT",
+ "wb_a3": "TTO",
+ "woe_id": -99,
+ "adm0_a3_is": "TTO",
+ "adm0_a3_us": "TTO",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 19,
+ "long_len": 19,
+ "abbrev_len": 5,
+ "tiny": 2,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1779
+ ]
+ ],
+ [
+ [
+ 1780
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Tunisia",
+ "sov_a3": "TUN",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Tunisia",
+ "adm0_a3": "TUN",
+ "geou_dif": 0,
+ "geounit": "Tunisia",
+ "gu_a3": "TUN",
+ "su_dif": 0,
+ "subunit": "Tunisia",
+ "su_a3": "TUN",
+ "brk_diff": 0,
+ "name": "Tunisia",
+ "name_long": "Tunisia",
+ "brk_a3": "TUN",
+ "brk_name": "Tunisia",
+ "brk_group": null,
+ "abbrev": "Tun.",
+ "postal": "TN",
+ "formal_en": "Republic of Tunisia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Tunisia",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 3,
+ "mapcolor9": 3,
+ "mapcolor13": 2,
+ "pop_est": 10486339,
+ "gdp_md_est": 81710,
+ "pop_year": -99,
+ "lastcensus": 2004,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "TN",
+ "iso_a3": "TUN",
+ "iso_n3": "788",
+ "un_a3": "788",
+ "wb_a2": "TN",
+ "wb_a3": "TUN",
+ "woe_id": -99,
+ "adm0_a3_is": "TUN",
+ "adm0_a3_us": "TUN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Northern Africa",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1781
+ ]
+ ],
+ [
+ [
+ 1782
+ ]
+ ],
+ [
+ [
+ -1252,
+ -658,
+ 1783
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Turkey",
+ "sov_a3": "TUR",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Turkey",
+ "adm0_a3": "TUR",
+ "geou_dif": 0,
+ "geounit": "Turkey",
+ "gu_a3": "TUR",
+ "su_dif": 0,
+ "subunit": "Turkey",
+ "su_a3": "TUR",
+ "brk_diff": 0,
+ "name": "Turkey",
+ "name_long": "Turkey",
+ "brk_a3": "TUR",
+ "brk_name": "Turkey",
+ "brk_group": null,
+ "abbrev": "Tur.",
+ "postal": "TR",
+ "formal_en": "Republic of Turkey",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Turkey",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 3,
+ "mapcolor9": 8,
+ "mapcolor13": 4,
+ "pop_est": 76805524,
+ "gdp_md_est": 902700,
+ "pop_year": -99,
+ "lastcensus": 2000,
+ "gdp_year": -99,
+ "economy": "4. Emerging region: MIKT",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "TR",
+ "iso_a3": "TUR",
+ "iso_n3": "792",
+ "un_a3": "792",
+ "wb_a2": "TR",
+ "wb_a3": "TUR",
+ "woe_id": -99,
+ "adm0_a3_is": "TUR",
+ "adm0_a3_us": "TUR",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Western Asia",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1784
+ ]
+ ],
+ [
+ [
+ -802,
+ -50,
+ -220,
+ -1109,
+ -1115,
+ -1753,
+ 1785
+ ]
+ ],
+ [
+ [
+ 1786,
+ -868,
+ -255
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Taiwan",
+ "sov_a3": "TWN",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Taiwan",
+ "adm0_a3": "TWN",
+ "geou_dif": 0,
+ "geounit": "Taiwan",
+ "gu_a3": "TWN",
+ "su_dif": 0,
+ "subunit": "Taiwan",
+ "su_a3": "TWN",
+ "brk_diff": 1,
+ "name": "Taiwan",
+ "name_long": "Taiwan",
+ "brk_a3": "B77",
+ "brk_name": "Taiwan",
+ "brk_group": null,
+ "abbrev": "Taiwan",
+ "postal": "TW",
+ "formal_en": null,
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": "Self admin.; Claimed by China",
+ "name_sort": "Taiwan",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 5,
+ "mapcolor9": 7,
+ "mapcolor13": 2,
+ "pop_est": 22974347,
+ "gdp_md_est": 712000,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "TW",
+ "iso_a3": "TWN",
+ "iso_n3": "158",
+ "un_a3": "-099",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "TWN",
+ "adm0_a3_us": "TWN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Eastern Asia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1787
+ ]
+ ],
+ [
+ [
+ 1788
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "United Republic of Tanzania",
+ "sov_a3": "TZA",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "United Republic of Tanzania",
+ "adm0_a3": "TZA",
+ "geou_dif": 0,
+ "geounit": "Tanzania",
+ "gu_a3": "TZA",
+ "su_dif": 0,
+ "subunit": "Tanzania",
+ "su_a3": "TZA",
+ "brk_diff": 0,
+ "name": "Tanzania",
+ "name_long": "Tanzania",
+ "brk_a3": "TZA",
+ "brk_name": "Tanzania",
+ "brk_group": null,
+ "abbrev": "Tanz.",
+ "postal": "TZ",
+ "formal_en": "United Republic of Tanzania",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Tanzania",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 6,
+ "mapcolor9": 2,
+ "mapcolor13": 2,
+ "pop_est": 41048532,
+ "gdp_md_est": 54250,
+ "pop_year": -99,
+ "lastcensus": 2002,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "TZ",
+ "iso_a3": "TZA",
+ "iso_n3": "834",
+ "un_a3": "834",
+ "wb_a2": "TZ",
+ "wb_a3": "TZA",
+ "woe_id": -99,
+ "adm0_a3_is": "TZA",
+ "adm0_a3_us": "TZA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Eastern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1789
+ ]
+ ],
+ [
+ [
+ 1790
+ ]
+ ],
+ [
+ [
+ 1791
+ ]
+ ],
+ [
+ [
+ -1187,
+ 1792,
+ -1344,
+ -1355,
+ 1793,
+ -580,
+ -225,
+ -1688,
+ 1794
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Uganda",
+ "sov_a3": "UGA",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Uganda",
+ "adm0_a3": "UGA",
+ "geou_dif": 0,
+ "geounit": "Uganda",
+ "gu_a3": "UGA",
+ "su_dif": 0,
+ "subunit": "Uganda",
+ "su_a3": "UGA",
+ "brk_diff": 0,
+ "name": "Uganda",
+ "name_long": "Uganda",
+ "brk_a3": "UGA",
+ "brk_name": "Uganda",
+ "brk_group": null,
+ "abbrev": "Uga.",
+ "postal": "UG",
+ "formal_en": "Republic of Uganda",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Uganda",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 3,
+ "mapcolor9": 6,
+ "mapcolor13": 4,
+ "pop_est": 32369558,
+ "gdp_md_est": 39380,
+ "pop_year": -99,
+ "lastcensus": 2002,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "UG",
+ "iso_a3": "UGA",
+ "iso_n3": "800",
+ "un_a3": "800",
+ "wb_a2": "UG",
+ "wb_a3": "UGA",
+ "woe_id": -99,
+ "adm0_a3_is": "UGA",
+ "adm0_a3_us": "UGA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Eastern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -1795,
+ -1689,
+ -578,
+ -1701,
+ -1188
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Ukraine",
+ "sov_a3": "UKR",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Ukraine",
+ "adm0_a3": "UKR",
+ "geou_dif": 0,
+ "geounit": "Ukraine",
+ "gu_a3": "UKR",
+ "su_dif": 0,
+ "subunit": "Ukraine",
+ "su_a3": "UKR",
+ "brk_diff": 0,
+ "name": "Ukraine",
+ "name_long": "Ukraine",
+ "brk_a3": "UKR",
+ "brk_name": "Ukraine",
+ "brk_group": null,
+ "abbrev": "Ukr.",
+ "postal": "UA",
+ "formal_en": "Ukraine",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Ukraine",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 1,
+ "mapcolor9": 6,
+ "mapcolor13": 3,
+ "pop_est": 45700395,
+ "gdp_md_est": 339800,
+ "pop_year": -99,
+ "lastcensus": 2001,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "UA",
+ "iso_a3": "UKR",
+ "iso_n3": "804",
+ "un_a3": "804",
+ "wb_a2": "UA",
+ "wb_a3": "UKR",
+ "woe_id": -99,
+ "adm0_a3_is": "UKR",
+ "adm0_a3_us": "UKR",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Europe",
+ "region_un": "Europe",
+ "subregion": "Eastern Europe",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1795
+ ]
+ ],
+ [
+ [
+ 1796,
+ -1581,
+ -1274,
+ -1584,
+ -926,
+ -1741,
+ -1537,
+ -283,
+ -1655
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Uruguay",
+ "sov_a3": "URY",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Uruguay",
+ "adm0_a3": "URY",
+ "geou_dif": 0,
+ "geounit": "Uruguay",
+ "gu_a3": "URY",
+ "su_dif": 0,
+ "subunit": "Uruguay",
+ "su_a3": "URY",
+ "brk_diff": 0,
+ "name": "Uruguay",
+ "name_long": "Uruguay",
+ "brk_a3": "URY",
+ "brk_name": "Uruguay",
+ "brk_group": null,
+ "abbrev": "Ury.",
+ "postal": "UY",
+ "formal_en": "Oriental Republic of Uruguay",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Uruguay",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 2,
+ "mapcolor9": 2,
+ "mapcolor13": 10,
+ "pop_est": 3494382,
+ "gdp_md_est": 43160,
+ "pop_year": -99,
+ "lastcensus": 2004,
+ "gdp_year": -99,
+ "economy": "5. Emerging region: G20",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "UY",
+ "iso_a3": "URY",
+ "iso_n3": "858",
+ "un_a3": "858",
+ "wb_a2": "UY",
+ "wb_a3": "URY",
+ "woe_id": -99,
+ "adm0_a3_is": "URY",
+ "adm0_a3_us": "URY",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "South America",
+ "region_un": "Americas",
+ "subregion": "South America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ 1797,
+ -43,
+ -316
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "United States of America",
+ "sov_a3": "US1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Country",
+ "admin": "United States of America",
+ "adm0_a3": "USA",
+ "geou_dif": 0,
+ "geounit": "United States of America",
+ "gu_a3": "USA",
+ "su_dif": 0,
+ "subunit": "United States of America",
+ "su_a3": "USA",
+ "brk_diff": 0,
+ "name": "United States",
+ "name_long": "United States",
+ "brk_a3": "USA",
+ "brk_name": "United States",
+ "brk_group": null,
+ "abbrev": "U.S.A.",
+ "postal": "US",
+ "formal_en": "United States of America",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "United States of America",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 5,
+ "mapcolor9": 1,
+ "mapcolor13": 1,
+ "pop_est": 313973000,
+ "gdp_md_est": 15094000,
+ "pop_year": 0,
+ "lastcensus": 2010,
+ "gdp_year": 0,
+ "economy": "1. Developed region: G7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": 0,
+ "fips_10": null,
+ "iso_a2": "US",
+ "iso_a3": "USA",
+ "iso_n3": "840",
+ "un_a3": "840",
+ "wb_a2": "US",
+ "wb_a3": "USA",
+ "woe_id": -99,
+ "adm0_a3_is": "USA",
+ "adm0_a3_us": "USA",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Northern America",
+ "region_wb": "North America",
+ "name_len": 13,
+ "long_len": 13,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1798
+ ]
+ ],
+ [
+ [
+ 1799
+ ]
+ ],
+ [
+ [
+ 1800
+ ]
+ ],
+ [
+ [
+ 1801
+ ]
+ ],
+ [
+ [
+ 1802
+ ]
+ ],
+ [
+ [
+ 1803
+ ]
+ ],
+ [
+ [
+ 1804
+ ]
+ ],
+ [
+ [
+ 1805
+ ]
+ ],
+ [
+ [
+ 1806
+ ]
+ ],
+ [
+ [
+ 1807
+ ]
+ ],
+ [
+ [
+ 1808
+ ]
+ ],
+ [
+ [
+ 1809
+ ]
+ ],
+ [
+ [
+ 1810
+ ]
+ ],
+ [
+ [
+ 1811
+ ]
+ ],
+ [
+ [
+ 1812
+ ]
+ ],
+ [
+ [
+ 1813
+ ]
+ ],
+ [
+ [
+ 1814
+ ]
+ ],
+ [
+ [
+ 1815
+ ]
+ ],
+ [
+ [
+ 1816
+ ]
+ ],
+ [
+ [
+ 1817
+ ]
+ ],
+ [
+ [
+ 1818
+ ]
+ ],
+ [
+ [
+ 1819
+ ]
+ ],
+ [
+ [
+ 1820
+ ]
+ ],
+ [
+ [
+ 1821
+ ]
+ ],
+ [
+ [
+ 1822
+ ]
+ ],
+ [
+ [
+ 1823
+ ]
+ ],
+ [
+ [
+ 1824
+ ]
+ ],
+ [
+ [
+ 1825
+ ]
+ ],
+ [
+ [
+ 1826
+ ]
+ ],
+ [
+ [
+ 1827
+ ]
+ ],
+ [
+ [
+ 1828
+ ]
+ ],
+ [
+ [
+ 1829
+ ]
+ ],
+ [
+ [
+ 1830
+ ]
+ ],
+ [
+ [
+ 1831
+ ]
+ ],
+ [
+ [
+ 1832
+ ]
+ ],
+ [
+ [
+ 1833
+ ]
+ ],
+ [
+ [
+ 1834
+ ]
+ ],
+ [
+ [
+ 1835
+ ]
+ ],
+ [
+ [
+ 1836
+ ]
+ ],
+ [
+ [
+ 1837
+ ]
+ ],
+ [
+ [
+ 1838
+ ]
+ ],
+ [
+ [
+ 1839
+ ]
+ ],
+ [
+ [
+ 1840
+ ]
+ ],
+ [
+ [
+ 1841
+ ]
+ ],
+ [
+ [
+ 1842
+ ]
+ ],
+ [
+ [
+ 1843
+ ]
+ ],
+ [
+ [
+ 1844
+ ]
+ ],
+ [
+ [
+ 1845
+ ]
+ ],
+ [
+ [
+ 1846
+ ]
+ ],
+ [
+ [
+ 1847
+ ]
+ ],
+ [
+ [
+ 1848
+ ]
+ ],
+ [
+ [
+ 1849
+ ]
+ ],
+ [
+ [
+ 1850
+ ]
+ ],
+ [
+ [
+ 1851
+ ]
+ ],
+ [
+ [
+ 1852
+ ]
+ ],
+ [
+ [
+ 1853
+ ]
+ ],
+ [
+ [
+ 1854
+ ]
+ ],
+ [
+ [
+ 1855
+ ]
+ ],
+ [
+ [
+ -354,
+ 1856,
+ -1297,
+ 1857,
+ -440
+ ]
+ ],
+ [
+ [
+ 1858
+ ]
+ ],
+ [
+ [
+ 1859
+ ]
+ ],
+ [
+ [
+ 1860
+ ]
+ ],
+ [
+ [
+ 1861
+ ]
+ ],
+ [
+ [
+ 1862
+ ]
+ ],
+ [
+ [
+ 1863
+ ]
+ ],
+ [
+ [
+ 1864
+ ]
+ ],
+ [
+ [
+ 1865
+ ]
+ ],
+ [
+ [
+ 1866
+ ]
+ ],
+ [
+ [
+ 1867
+ ]
+ ],
+ [
+ [
+ 1868
+ ]
+ ],
+ [
+ [
+ 1869
+ ]
+ ],
+ [
+ [
+ 1870
+ ]
+ ],
+ [
+ [
+ 1871
+ ]
+ ],
+ [
+ [
+ 1872
+ ]
+ ],
+ [
+ [
+ 1873
+ ]
+ ],
+ [
+ [
+ 1874
+ ]
+ ],
+ [
+ [
+ 1875
+ ]
+ ],
+ [
+ [
+ 1876
+ ]
+ ],
+ [
+ [
+ 1877
+ ]
+ ],
+ [
+ [
+ 1878
+ ]
+ ],
+ [
+ [
+ 1879
+ ]
+ ],
+ [
+ [
+ 1880
+ ]
+ ],
+ [
+ [
+ 1881
+ ]
+ ],
+ [
+ [
+ 1882
+ ]
+ ],
+ [
+ [
+ 1883
+ ]
+ ],
+ [
+ [
+ 1884
+ ]
+ ],
+ [
+ [
+ 1885
+ ]
+ ],
+ [
+ [
+ 1886
+ ]
+ ],
+ [
+ [
+ 1887
+ ]
+ ],
+ [
+ [
+ 1888
+ ]
+ ],
+ [
+ [
+ 1889
+ ]
+ ],
+ [
+ [
+ 1890
+ ]
+ ],
+ [
+ [
+ 1891
+ ]
+ ],
+ [
+ [
+ 1892
+ ]
+ ],
+ [
+ [
+ 1893
+ ]
+ ],
+ [
+ [
+ 1894
+ ]
+ ],
+ [
+ [
+ 1895
+ ]
+ ],
+ [
+ [
+ 1896
+ ]
+ ],
+ [
+ [
+ 1897
+ ]
+ ],
+ [
+ [
+ 1898
+ ]
+ ],
+ [
+ [
+ 1899
+ ]
+ ],
+ [
+ [
+ 1900
+ ]
+ ],
+ [
+ [
+ 1901
+ ]
+ ],
+ [
+ [
+ 1902
+ ]
+ ],
+ [
+ [
+ 1903
+ ]
+ ],
+ [
+ [
+ 1904
+ ]
+ ],
+ [
+ [
+ 1905
+ ]
+ ],
+ [
+ [
+ 1906
+ ]
+ ],
+ [
+ [
+ 1907
+ ]
+ ],
+ [
+ [
+ 1908
+ ]
+ ],
+ [
+ [
+ 1909
+ ]
+ ],
+ [
+ [
+ 1910
+ ]
+ ],
+ [
+ [
+ 1911
+ ]
+ ],
+ [
+ [
+ 1912
+ ]
+ ],
+ [
+ [
+ 1913
+ ]
+ ],
+ [
+ [
+ 1914
+ ]
+ ],
+ [
+ [
+ 1915
+ ]
+ ],
+ [
+ [
+ 1916
+ ]
+ ],
+ [
+ [
+ 1917
+ ]
+ ],
+ [
+ [
+ 1918
+ ]
+ ],
+ [
+ [
+ 1919
+ ]
+ ],
+ [
+ [
+ 1920
+ ]
+ ],
+ [
+ [
+ 1921
+ ]
+ ],
+ [
+ [
+ 1922
+ ]
+ ],
+ [
+ [
+ 1923
+ ]
+ ],
+ [
+ [
+ 1924
+ ]
+ ],
+ [
+ [
+ -442,
+ 1925,
+ -382,
+ 1926
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Uzbekistan",
+ "sov_a3": "UZB",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Uzbekistan",
+ "adm0_a3": "UZB",
+ "geou_dif": 0,
+ "geounit": "Uzbekistan",
+ "gu_a3": "UZB",
+ "su_dif": 0,
+ "subunit": "Uzbekistan",
+ "su_a3": "UZB",
+ "brk_diff": 0,
+ "name": "Uzbekistan",
+ "name_long": "Uzbekistan",
+ "brk_a3": "UZB",
+ "brk_name": "Uzbekistan",
+ "brk_group": null,
+ "abbrev": "Uzb.",
+ "postal": "UZ",
+ "formal_en": "Republic of Uzbekistan",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Uzbekistan",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 3,
+ "mapcolor9": 5,
+ "mapcolor13": 4,
+ "pop_est": 27606007,
+ "gdp_md_est": 71670,
+ "pop_year": -99,
+ "lastcensus": 1989,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "UZ",
+ "iso_a3": "UZB",
+ "iso_n3": "860",
+ "un_a3": "860",
+ "wb_a2": "UZ",
+ "wb_a3": "UZB",
+ "woe_id": -99,
+ "adm0_a3_is": "UZB",
+ "adm0_a3_us": "UZB",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Central Asia",
+ "region_wb": "Europe & Central Asia",
+ "name_len": 10,
+ "long_len": 10,
+ "abbrev_len": 4,
+ "tiny": 5,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ -1193
+ ]
+ ],
+ [
+ [
+ -1194
+ ]
+ ],
+ [
+ [
+ -1191,
+ -1770,
+ -7,
+ -1773,
+ -1180
+ ],
+ [
+ -1769
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "Saint Vincent and the Grenadines",
+ "sov_a3": "VCT",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Saint Vincent and the Grenadines",
+ "adm0_a3": "VCT",
+ "geou_dif": 0,
+ "geounit": "Saint Vincent and the Grenadines",
+ "gu_a3": "VCT",
+ "su_dif": 0,
+ "subunit": "Saint Vincent and the Grenadines",
+ "su_a3": "VCT",
+ "brk_diff": 0,
+ "name": "St. Vin. and Gren.",
+ "name_long": "Saint Vincent and the Grenadines",
+ "brk_a3": "VCT",
+ "brk_name": "St. Vin. and Gren.",
+ "brk_group": null,
+ "abbrev": "St.V.G.",
+ "postal": "VC",
+ "formal_en": "Saint Vincent and the Grenadines",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "St. Vincent and the Grenadines",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 1,
+ "mapcolor9": 5,
+ "mapcolor13": 7,
+ "pop_est": 104574,
+ "gdp_md_est": 1070,
+ "pop_year": -99,
+ "lastcensus": 2011,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "VC",
+ "iso_a3": "VCT",
+ "iso_n3": "670",
+ "un_a3": "670",
+ "wb_a2": "VC",
+ "wb_a3": "VCT",
+ "woe_id": -99,
+ "adm0_a3_is": "VCT",
+ "adm0_a3_us": "VCT",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 18,
+ "long_len": 32,
+ "abbrev_len": 7,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1927
+ ]
+ ],
+ [
+ [
+ 1928
+ ]
+ ],
+ [
+ [
+ 1929
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Venezuela",
+ "sov_a3": "VEN",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Venezuela",
+ "adm0_a3": "VEN",
+ "geou_dif": 0,
+ "geounit": "Venezuela",
+ "gu_a3": "VEN",
+ "su_dif": 0,
+ "subunit": "Venezuela",
+ "su_a3": "VEN",
+ "brk_diff": 0,
+ "name": "Venezuela",
+ "name_long": "Venezuela",
+ "brk_a3": "VEN",
+ "brk_name": "Venezuela",
+ "brk_group": null,
+ "abbrev": "Ven.",
+ "postal": "VE",
+ "formal_en": "Bolivarian Republic of Venezuela",
+ "formal_fr": "República Bolivariana de Venezuela",
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Venezuela, RB",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 3,
+ "mapcolor9": 1,
+ "mapcolor13": 4,
+ "pop_est": 26814843,
+ "gdp_md_est": 357400,
+ "pop_year": -99,
+ "lastcensus": 2001,
+ "gdp_year": -99,
+ "economy": "5. Emerging region: G20",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "VE",
+ "iso_a3": "VEN",
+ "iso_n3": "862",
+ "un_a3": "862",
+ "wb_a2": "VE",
+ "wb_a3": "VEN",
+ "woe_id": -99,
+ "adm0_a3_is": "VEN",
+ "adm0_a3_us": "VEN",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "South America",
+ "region_un": "Americas",
+ "subregion": "South America",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 9,
+ "long_len": 9,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1930
+ ]
+ ],
+ [
+ [
+ 1931
+ ]
+ ],
+ [
+ [
+ 1932
+ ]
+ ],
+ [
+ [
+ 1933
+ ]
+ ],
+ [
+ [
+ -894,
+ -320,
+ -588,
+ 1934
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "United Kingdom",
+ "sov_a3": "GB1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "British Virgin Islands",
+ "adm0_a3": "VGB",
+ "geou_dif": 0,
+ "geounit": "British Virgin Islands",
+ "gu_a3": "VGB",
+ "su_dif": 0,
+ "subunit": "British Virgin Islands",
+ "su_a3": "VGB",
+ "brk_diff": 0,
+ "name": "British Virgin Is.",
+ "name_long": "British Virgin Islands",
+ "brk_a3": "VGB",
+ "brk_name": "British Virgin Is.",
+ "brk_group": null,
+ "abbrev": "V.I. (Br.)",
+ "postal": "VG",
+ "formal_en": "British Virgin Islands",
+ "formal_fr": null,
+ "note_adm0": "U.K.",
+ "note_brk": null,
+ "name_sort": "British Virgin Islands",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 6,
+ "mapcolor9": 6,
+ "mapcolor13": 3,
+ "pop_est": 24491,
+ "gdp_md_est": 853.4,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "2. Developed region: nonG7",
+ "income_grp": "1. High income: OECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "VG",
+ "iso_a3": "VGB",
+ "iso_n3": "092",
+ "un_a3": "092",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "VGB",
+ "adm0_a3_us": "VGB",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 18,
+ "long_len": 22,
+ "abbrev_len": 10,
+ "tiny": 3,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ [
+ 1935
+ ]
+ ],
+ [
+ [
+ 1936
+ ]
+ ],
+ [
+ [
+ 1937
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 6,
+ "sovereignt": "United States of America",
+ "sov_a3": "US1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "United States Virgin Islands",
+ "adm0_a3": "VIR",
+ "geou_dif": 0,
+ "geounit": "United States Virgin Islands",
+ "gu_a3": "VIR",
+ "su_dif": 0,
+ "subunit": "United States Virgin Islands",
+ "su_a3": "VIR",
+ "brk_diff": 0,
+ "name": "U.S. Virgin Is.",
+ "name_long": "United States Virgin Islands",
+ "brk_a3": "VIR",
+ "brk_name": "U.S. Virgin Is.",
+ "brk_group": null,
+ "abbrev": "V.I. (U.S.)",
+ "postal": "VI",
+ "formal_en": "Virgin Islands of the United States",
+ "formal_fr": null,
+ "note_adm0": "U.S.A.",
+ "note_brk": null,
+ "name_sort": "Virgin Islands (U.S.)",
+ "name_alt": null,
+ "mapcolor7": 4,
+ "mapcolor8": 5,
+ "mapcolor9": 1,
+ "mapcolor13": 1,
+ "pop_est": 109825,
+ "gdp_md_est": 1577,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "2. High income: nonOECD",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "VI",
+ "iso_a3": "VIR",
+ "iso_n3": "850",
+ "un_a3": "850",
+ "wb_a2": "VI",
+ "wb_a3": "VIR",
+ "woe_id": -99,
+ "adm0_a3_is": "VIR",
+ "adm0_a3_us": "VIR",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "North America",
+ "region_un": "Americas",
+ "subregion": "Caribbean",
+ "region_wb": "Latin America & Caribbean",
+ "name_len": 15,
+ "long_len": 28,
+ "abbrev_len": 11,
+ "tiny": 3,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ [
+ 1938
+ ]
+ ],
+ [
+ [
+ 1939
+ ]
+ ],
+ [
+ [
+ 1940
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "Vietnam",
+ "sov_a3": "VNM",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Vietnam",
+ "adm0_a3": "VNM",
+ "geou_dif": 0,
+ "geounit": "Vietnam",
+ "gu_a3": "VNM",
+ "su_dif": 0,
+ "subunit": "Vietnam",
+ "su_a3": "VNM",
+ "brk_diff": 0,
+ "name": "Vietnam",
+ "name_long": "Vietnam",
+ "brk_a3": "VNM",
+ "brk_name": "Vietnam",
+ "brk_group": null,
+ "abbrev": "Viet.",
+ "postal": "VN",
+ "formal_en": "Socialist Republic of Vietnam",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Vietnam",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 6,
+ "mapcolor9": 5,
+ "mapcolor13": 4,
+ "pop_est": 86967524,
+ "gdp_md_est": 241700,
+ "pop_year": -99,
+ "lastcensus": 2009,
+ "gdp_year": -99,
+ "economy": "5. Emerging region: G20",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "VN",
+ "iso_a3": "VNM",
+ "iso_n3": "704",
+ "un_a3": "704",
+ "wb_a2": "VN",
+ "wb_a3": "VNM",
+ "woe_id": -99,
+ "adm0_a3_is": "VNM",
+ "adm0_a3_us": "VNM",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "South-Eastern Asia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 5,
+ "tiny": 2,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1941
+ ]
+ ],
+ [
+ [
+ 1942
+ ]
+ ],
+ [
+ [
+ 1943
+ ]
+ ],
+ [
+ [
+ 1944
+ ]
+ ],
+ [
+ [
+ 1945
+ ]
+ ],
+ [
+ [
+ 1946
+ ]
+ ],
+ [
+ [
+ 1947
+ ]
+ ],
+ [
+ [
+ 1948,
+ -1200,
+ -1242,
+ 1949,
+ -1240,
+ -538
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Vanuatu",
+ "sov_a3": "VUT",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Vanuatu",
+ "adm0_a3": "VUT",
+ "geou_dif": 0,
+ "geounit": "Vanuatu",
+ "gu_a3": "VUT",
+ "su_dif": 0,
+ "subunit": "Vanuatu",
+ "su_a3": "VUT",
+ "brk_diff": 0,
+ "name": "Vanuatu",
+ "name_long": "Vanuatu",
+ "brk_a3": "VUT",
+ "brk_name": "Vanuatu",
+ "brk_group": null,
+ "abbrev": "Van.",
+ "postal": "VU",
+ "formal_en": "Republic of Vanuatu",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Vanuatu",
+ "name_alt": null,
+ "mapcolor7": 6,
+ "mapcolor8": 3,
+ "mapcolor9": 7,
+ "mapcolor13": 3,
+ "pop_est": 218519,
+ "gdp_md_est": 988.5,
+ "pop_year": -99,
+ "lastcensus": 2009,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "VU",
+ "iso_a3": "VUT",
+ "iso_n3": "548",
+ "un_a3": "548",
+ "wb_a2": "VU",
+ "wb_a3": "VUT",
+ "woe_id": -99,
+ "adm0_a3_is": "VUT",
+ "adm0_a3_us": "VUT",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Melanesia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 7,
+ "long_len": 7,
+ "abbrev_len": 4,
+ "tiny": 2,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1950
+ ]
+ ],
+ [
+ [
+ 1951
+ ]
+ ],
+ [
+ [
+ 1952
+ ]
+ ],
+ [
+ [
+ 1953
+ ]
+ ],
+ [
+ [
+ 1954
+ ]
+ ],
+ [
+ [
+ 1955
+ ]
+ ],
+ [
+ [
+ 1956
+ ]
+ ],
+ [
+ [
+ 1957
+ ]
+ ],
+ [
+ [
+ 1958
+ ]
+ ],
+ [
+ [
+ 1959
+ ]
+ ],
+ [
+ [
+ 1960
+ ]
+ ],
+ [
+ [
+ 1961
+ ]
+ ],
+ [
+ [
+ 1962
+ ]
+ ],
+ [
+ [
+ 1963
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 3,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "France",
+ "sov_a3": "FR1",
+ "adm0_dif": 1,
+ "level": 2,
+ "type": "Dependency",
+ "admin": "Wallis and Futuna",
+ "adm0_a3": "WLF",
+ "geou_dif": 0,
+ "geounit": "Wallis and Futuna",
+ "gu_a3": "WLF",
+ "su_dif": 0,
+ "subunit": "Wallis and Futuna",
+ "su_a3": "WLF",
+ "brk_diff": 0,
+ "name": "Wallis and Futuna Is.",
+ "name_long": "Wallis and Futuna Islands",
+ "brk_a3": "WLF",
+ "brk_name": "Wallis and Futuna Islands",
+ "brk_group": null,
+ "abbrev": "Wlf.",
+ "postal": "WF",
+ "formal_en": "Wallis and Futuna Islands",
+ "formal_fr": null,
+ "note_adm0": "Fr.",
+ "note_brk": null,
+ "name_sort": "Wallis and Futuna",
+ "name_alt": null,
+ "mapcolor7": 7,
+ "mapcolor8": 5,
+ "mapcolor9": 9,
+ "mapcolor13": 11,
+ "pop_est": 15289,
+ "gdp_md_est": 60,
+ "pop_year": -99,
+ "lastcensus": -99,
+ "gdp_year": -99,
+ "economy": "6. Developing region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "WF",
+ "iso_a3": "WLF",
+ "iso_n3": "876",
+ "un_a3": "876",
+ "wb_a2": "-99",
+ "wb_a3": "-99",
+ "woe_id": -99,
+ "adm0_a3_is": "WLF",
+ "adm0_a3_us": "WLF",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Polynesia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 21,
+ "long_len": 25,
+ "abbrev_len": 4,
+ "tiny": 3,
+ "homepart": -99
+ },
+ "arcs": [
+ [
+ [
+ 1964
+ ]
+ ],
+ [
+ [
+ 1965
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 4,
+ "sovereignt": "Samoa",
+ "sov_a3": "WSM",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Samoa",
+ "adm0_a3": "WSM",
+ "geou_dif": 0,
+ "geounit": "Samoa",
+ "gu_a3": "WSM",
+ "su_dif": 0,
+ "subunit": "Samoa",
+ "su_a3": "WSM",
+ "brk_diff": 0,
+ "name": "Samoa",
+ "name_long": "Samoa",
+ "brk_a3": "WSM",
+ "brk_name": "Samoa",
+ "brk_group": null,
+ "abbrev": "Samoa",
+ "postal": "WS",
+ "formal_en": "Independent State of Samoa",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Samoa",
+ "name_alt": null,
+ "mapcolor7": 3,
+ "mapcolor8": 3,
+ "mapcolor9": 4,
+ "mapcolor13": 6,
+ "pop_est": 219998,
+ "gdp_md_est": 1049,
+ "pop_year": -99,
+ "lastcensus": 2006,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "WS",
+ "iso_a3": "WSM",
+ "iso_n3": "882",
+ "un_a3": "882",
+ "wb_a2": "WS",
+ "wb_a3": "WSM",
+ "woe_id": -99,
+ "adm0_a3_is": "WSM",
+ "adm0_a3_us": "WSM",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Oceania",
+ "region_un": "Oceania",
+ "subregion": "Polynesia",
+ "region_wb": "East Asia & Pacific",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1966
+ ]
+ ],
+ [
+ [
+ 1967
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Yemen",
+ "sov_a3": "YEM",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Yemen",
+ "adm0_a3": "YEM",
+ "geou_dif": 0,
+ "geounit": "Yemen",
+ "gu_a3": "YEM",
+ "su_dif": 0,
+ "subunit": "Yemen",
+ "su_a3": "YEM",
+ "brk_diff": 0,
+ "name": "Yemen",
+ "name_long": "Yemen",
+ "brk_a3": "YEM",
+ "brk_name": "Yemen",
+ "brk_group": null,
+ "abbrev": "Yem.",
+ "postal": "YE",
+ "formal_en": "Republic of Yemen",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Yemen, Rep.",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 3,
+ "mapcolor9": 3,
+ "mapcolor13": 11,
+ "pop_est": 23822783,
+ "gdp_md_est": 55280,
+ "pop_year": -99,
+ "lastcensus": 2004,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "YE",
+ "iso_a3": "YEM",
+ "iso_n3": "887",
+ "un_a3": "887",
+ "wb_a2": "RY",
+ "wb_a3": "YEM",
+ "woe_id": -99,
+ "adm0_a3_is": "YEM",
+ "adm0_a3_us": "YEM",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Asia",
+ "region_un": "Asia",
+ "subregion": "Western Asia",
+ "region_wb": "Middle East & North Africa",
+ "name_len": 5,
+ "long_len": 5,
+ "abbrev_len": 4,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1968
+ ]
+ ],
+ [
+ [
+ 1969
+ ]
+ ],
+ [
+ [
+ 1970
+ ]
+ ],
+ [
+ [
+ 1971
+ ]
+ ],
+ [
+ [
+ 1972,
+ -1696,
+ -1447
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "MultiPolygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 2,
+ "sovereignt": "South Africa",
+ "sov_a3": "ZAF",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "South Africa",
+ "adm0_a3": "ZAF",
+ "geou_dif": 0,
+ "geounit": "South Africa",
+ "gu_a3": "ZAF",
+ "su_dif": 0,
+ "subunit": "South Africa",
+ "su_a3": "ZAF",
+ "brk_diff": 0,
+ "name": "South Africa",
+ "name_long": "South Africa",
+ "brk_a3": "ZAF",
+ "brk_name": "South Africa",
+ "brk_group": null,
+ "abbrev": "S.Af.",
+ "postal": "ZA",
+ "formal_en": "Republic of South Africa",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "South Africa",
+ "name_alt": null,
+ "mapcolor7": 2,
+ "mapcolor8": 3,
+ "mapcolor9": 4,
+ "mapcolor13": 2,
+ "pop_est": 49052489,
+ "gdp_md_est": 491000,
+ "pop_year": -99,
+ "lastcensus": 2001,
+ "gdp_year": -99,
+ "economy": "5. Emerging region: G20",
+ "income_grp": "3. Upper middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "ZA",
+ "iso_a3": "ZAF",
+ "iso_n3": "710",
+ "un_a3": "710",
+ "wb_a2": "ZA",
+ "wb_a3": "ZAF",
+ "woe_id": -99,
+ "adm0_a3_is": "ZAF",
+ "adm0_a3_us": "ZAF",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Southern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 12,
+ "long_len": 12,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ [
+ 1973
+ ]
+ ],
+ [
+ [
+ -1340,
+ -1749,
+ -1338,
+ 1974,
+ -1368,
+ -330,
+ 1975
+ ],
+ [
+ -1258
+ ]
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Zambia",
+ "sov_a3": "ZMB",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Zambia",
+ "adm0_a3": "ZMB",
+ "geou_dif": 0,
+ "geounit": "Zambia",
+ "gu_a3": "ZMB",
+ "su_dif": 0,
+ "subunit": "Zambia",
+ "su_a3": "ZMB",
+ "brk_diff": 0,
+ "name": "Zambia",
+ "name_long": "Zambia",
+ "brk_a3": "ZMB",
+ "brk_name": "Zambia",
+ "brk_group": null,
+ "abbrev": "Zambia",
+ "postal": "ZM",
+ "formal_en": "Republic of Zambia",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Zambia",
+ "name_alt": null,
+ "mapcolor7": 5,
+ "mapcolor8": 8,
+ "mapcolor9": 5,
+ "mapcolor13": 13,
+ "pop_est": 11862740,
+ "gdp_md_est": 17500,
+ "pop_year": -99,
+ "lastcensus": 2010,
+ "gdp_year": -99,
+ "economy": "7. Least developed region",
+ "income_grp": "4. Lower middle income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "ZM",
+ "iso_a3": "ZMB",
+ "iso_n3": "894",
+ "un_a3": "894",
+ "wb_a2": "ZM",
+ "wb_a3": "ZMB",
+ "woe_id": -99,
+ "adm0_a3_is": "ZMB",
+ "adm0_a3_us": "ZMB",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Eastern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 6,
+ "long_len": 6,
+ "abbrev_len": 6,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -1354,
+ -1342,
+ 1976,
+ -1367,
+ -9,
+ -581,
+ -1794
+ ]
+ ]
+ },
+ {
+ "type": "Polygon",
+ "properties": {
+ "scalerank": 1,
+ "featurecla": "Admin-0 country",
+ "labelrank": 3,
+ "sovereignt": "Zimbabwe",
+ "sov_a3": "ZWE",
+ "adm0_dif": 0,
+ "level": 2,
+ "type": "Sovereign country",
+ "admin": "Zimbabwe",
+ "adm0_a3": "ZWE",
+ "geou_dif": 0,
+ "geounit": "Zimbabwe",
+ "gu_a3": "ZWE",
+ "su_dif": 0,
+ "subunit": "Zimbabwe",
+ "su_a3": "ZWE",
+ "brk_diff": 0,
+ "name": "Zimbabwe",
+ "name_long": "Zimbabwe",
+ "brk_a3": "ZWE",
+ "brk_name": "Zimbabwe",
+ "brk_group": null,
+ "abbrev": "Zimb.",
+ "postal": "ZW",
+ "formal_en": "Republic of Zimbabwe",
+ "formal_fr": null,
+ "note_adm0": null,
+ "note_brk": null,
+ "name_sort": "Zimbabwe",
+ "name_alt": null,
+ "mapcolor7": 1,
+ "mapcolor8": 5,
+ "mapcolor9": 3,
+ "mapcolor13": 9,
+ "pop_est": 12619600,
+ "gdp_md_est": 9323,
+ "pop_year": 0,
+ "lastcensus": 2002,
+ "gdp_year": 0,
+ "economy": "5. Emerging region: G20",
+ "income_grp": "5. Low income",
+ "wikipedia": -99,
+ "fips_10": null,
+ "iso_a2": "ZW",
+ "iso_a3": "ZWE",
+ "iso_n3": "716",
+ "un_a3": "716",
+ "wb_a2": "ZW",
+ "wb_a3": "ZWE",
+ "woe_id": -99,
+ "adm0_a3_is": "ZWE",
+ "adm0_a3_us": "ZWE",
+ "adm0_a3_un": -99,
+ "adm0_a3_wb": -99,
+ "continent": "Africa",
+ "region_un": "Africa",
+ "subregion": "Eastern Africa",
+ "region_wb": "Sub-Saharan Africa",
+ "name_len": 8,
+ "long_len": 8,
+ "abbrev_len": 5,
+ "tiny": -99,
+ "homepart": 1
+ },
+ "arcs": [
+ [
+ -1976,
+ -329,
+ -1977,
+ -1341
+ ]
+ ]
+ }
+ ]
+ }
+ },
+ "arcs": [
+ [
+ [
+ 3058,
+ 5901
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 7080,
+ 7328
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 7070,
+ 7316
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 1,
+ -18
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -11,
+ 4
+ ],
+ [
+ -30,
+ -5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -10,
+ 6
+ ],
+ [
+ -14,
+ 7
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ -11,
+ 7
+ ]
+ ],
+ [
+ [
+ 6689,
+ 6904
+ ],
+ [
+ 8,
+ 15
+ ]
+ ],
+ [
+ [
+ 6697,
+ 6919
+ ],
+ [
+ 6,
+ 14
+ ],
+ [
+ 6,
+ 13
+ ],
+ [
+ 7,
+ 14
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -3,
+ 21
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -2,
+ 15
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ]
+ ],
+ [
+ [
+ 6701,
+ 7235
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 6847,
+ 7335
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 6882,
+ 7325
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 9,
+ 8
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5665,
+ 4558
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -14
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -18
+ ],
+ [
+ 0,
+ -19
+ ],
+ [
+ 0,
+ -18
+ ],
+ [
+ 0,
+ -19
+ ],
+ [
+ 0,
+ -18
+ ],
+ [
+ 0,
+ -19
+ ],
+ [
+ 0,
+ -18
+ ],
+ [
+ 0,
+ -19
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 2,
+ -18
+ ],
+ [
+ 3,
+ -19
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ 6,
+ -12
+ ],
+ [
+ 6,
+ -11
+ ],
+ [
+ 6,
+ -9
+ ]
+ ],
+ [
+ [
+ 5649,
+ 4168
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -12,
+ -4
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -11,
+ -4
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -9,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ]
+ ],
+ [
+ [
+ 5326,
+ 4190
+ ],
+ [
+ 1,
+ 22
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ -1,
+ 30
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 16
+ ],
+ [
+ 6,
+ 35
+ ],
+ [
+ 2,
+ 34
+ ],
+ [
+ 4,
+ 17
+ ],
+ [
+ 1,
+ 18
+ ],
+ [
+ 10,
+ 23
+ ],
+ [
+ 2,
+ 15
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 5,
+ 13
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 2,
+ 18
+ ],
+ [
+ 0,
+ 19
+ ],
+ [
+ 2,
+ 25
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -4,
+ 15
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 9,
+ 18
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -8,
+ 34
+ ],
+ [
+ -6,
+ 31
+ ],
+ [
+ -1,
+ 16
+ ],
+ [
+ -9,
+ 21
+ ],
+ [
+ -3,
+ 14
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ]
+ ],
+ [
+ [
+ 5362,
+ 4846
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 5,
+ -15
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 1,
+ 15
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ 1,
+ -14
+ ],
+ [
+ 3,
+ -14
+ ],
+ [
+ 0,
+ -20
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ -1,
+ -15
+ ],
+ [
+ -1,
+ -18
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ]
+ ],
+ [
+ [
+ 5339,
+ 4852
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ -1,
+ 2
+ ]
+ ],
+ [
+ [
+ 5333,
+ 4896
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5363,
+ 4917
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -16
+ ],
+ [
+ 0,
+ -15
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 3250,
+ 6233
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 5557,
+ 7634
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 5571,
+ 7596
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 5582,
+ 7537
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 5555,
+ 7471
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -10,
+ 10
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ]
+ ],
+ [
+ [
+ 5537,
+ 7595
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5572,
+ 8642
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5546,
+ 8650
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 5555,
+ 8660
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 5047,
+ 7632
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ]
+ ],
+ [
+ [
+ 5039,
+ 7637
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 6497,
+ 6576
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 6461,
+ 6583
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 6481,
+ 6581
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 6512,
+ 6592
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 6563,
+ 6661
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -32
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 6566,
+ 6623
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -8
+ ]
+ ],
+ [
+ [
+ 6532,
+ 6492
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ]
+ ],
+ [
+ [
+ 6432,
+ 6583
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 13,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 10,
+ 13
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 11,
+ 17
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 6557,
+ 6685
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 6561,
+ 6636
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 3207,
+ 2032
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ]
+ ],
+ [
+ [
+ 3093,
+ 2024
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 18
+ ],
+ [
+ 0,
+ 15
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ 0,
+ 15
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ]
+ ],
+ [
+ [
+ 3093,
+ 2151
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 6,
+ -12
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -14
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -18,
+ 2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 3281,
+ 2928
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3259,
+ 3903
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ 4,
+ -14
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 9,
+ -6
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 8,
+ -10
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 12,
+ -13
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 11,
+ -6
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 1,
+ 18
+ ],
+ [
+ 1,
+ 25
+ ]
+ ],
+ [
+ [
+ 3483,
+ 3711
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 3399,
+ 3445
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -9
+ ]
+ ],
+ [
+ [
+ 3383,
+ 3313
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 2,
+ -23
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -3,
+ -22
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 14,
+ -12
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 7,
+ -10
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -5,
+ -13
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -18
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -10,
+ -28
+ ],
+ [
+ -9,
+ -17
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -14,
+ -15
+ ],
+ [
+ -23,
+ -14
+ ],
+ [
+ -19,
+ -7
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -30,
+ -8
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -15
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 4,
+ -12
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -11,
+ -9
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -10,
+ 8
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 3,
+ -19
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ -2,
+ -13
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 11,
+ -9
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -6,
+ -13
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 2,
+ -15
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -8,
+ -11
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -12,
+ 3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -9,
+ -18
+ ],
+ [
+ -3,
+ -12
+ ],
+ [
+ -5,
+ -11
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 17,
+ -26
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 18,
+ -3
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -13
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -11,
+ -15
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -6,
+ -17
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -3,
+ -30
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 7,
+ -17
+ ],
+ [
+ 5,
+ -11
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 3098,
+ 2168
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -14,
+ 1
+ ],
+ [
+ -13,
+ 0
+ ],
+ [
+ -13,
+ 0
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -13,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 18
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 13
+ ],
+ [
+ -1,
+ 13
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 15
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 19
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 9,
+ 8
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 18
+ ],
+ [
+ 4,
+ 22
+ ],
+ [
+ 2,
+ 14
+ ],
+ [
+ -5,
+ 10
+ ]
+ ],
+ [
+ [
+ 3133,
+ 3869
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 5,
+ 16
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 6265,
+ 7523
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 6291,
+ 7425
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ]
+ ],
+ [
+ [
+ 6280,
+ 7423
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ]
+ ],
+ [
+ [
+ 6243,
+ 7471
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ]
+ ],
+ [
+ [
+ 6206,
+ 7552
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 6249,
+ 7562
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 6249,
+ 7547
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 258,
+ 4357
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ]
+ ],
+ [
+ [
+ 500,
+ 396
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -20,
+ 3
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 28,
+ -1
+ ],
+ [
+ 11,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 19,
+ -6
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -5,
+ -5
+ ]
+ ],
+ [
+ [
+ 611,
+ 455
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -11,
+ 7
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 15,
+ -7
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 12,
+ -5
+ ],
+ [
+ -5,
+ -4
+ ]
+ ],
+ [
+ [
+ 543,
+ 484
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -75,
+ 7
+ ],
+ [
+ -14,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 19,
+ 2
+ ],
+ [
+ 20,
+ -2
+ ],
+ [
+ 25,
+ -5
+ ],
+ [
+ 17,
+ -3
+ ],
+ [
+ 9,
+ -4
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 724,
+ 574
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -11,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -13,
+ 3
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 14,
+ -4
+ ],
+ [
+ 17,
+ -5
+ ],
+ [
+ 14,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ]
+ ],
+ [
+ [
+ 3340,
+ 556
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -40,
+ 4
+ ],
+ [
+ -18,
+ 3
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -16,
+ -2
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -26,
+ 8
+ ],
+ [
+ -27,
+ 9
+ ],
+ [
+ -11,
+ 5
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 96,
+ 0
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 17,
+ 1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 13,
+ 4
+ ],
+ [
+ 20,
+ -2
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ]
+ ],
+ [
+ [
+ 4135,
+ 588
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 22,
+ -5
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -10,
+ -5
+ ],
+ [
+ -12,
+ 4
+ ],
+ [
+ -21,
+ 3
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 13,
+ -8
+ ]
+ ],
+ [
+ [
+ 4101,
+ 595
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -10,
+ -4
+ ]
+ ],
+ [
+ [
+ 3162,
+ 571
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -14,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -17,
+ 8
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 14,
+ -1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -11,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ -2
+ ]
+ ],
+ [
+ [
+ 3131,
+ 607
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -21,
+ 1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 12,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 4057,
+ 615
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -68,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 31,
+ -7
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 582,
+ 587
+ ],
+ [
+ -35,
+ -2
+ ],
+ [
+ -14,
+ 2
+ ],
+ [
+ -29,
+ 6
+ ],
+ [
+ -41,
+ 11
+ ],
+ [
+ -11,
+ 4
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 15,
+ -6
+ ],
+ [
+ 10,
+ -6
+ ],
+ [
+ 14,
+ -7
+ ],
+ [
+ 15,
+ -8
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 8,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3046,
+ 594
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -12,
+ 1
+ ],
+ [
+ -12,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 18,
+ 9
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 16,
+ 5
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 10,
+ 5
+ ],
+ [
+ 53,
+ 18
+ ],
+ [
+ 13,
+ 3
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -9,
+ -6
+ ],
+ [
+ -19,
+ -11
+ ],
+ [
+ -13,
+ -8
+ ],
+ [
+ -17,
+ -12
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -8,
+ -9
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -6,
+ -1
+ ]
+ ],
+ [
+ [
+ 9656,
+ 683
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -12,
+ 1
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 13,
+ -3
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 3743,
+ 644
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 15,
+ 1
+ ],
+ [
+ 14,
+ 0
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -2,
+ -13
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -158,
+ -26
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -122,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 11,
+ 12
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 16,
+ 9
+ ],
+ [
+ 15,
+ 9
+ ],
+ [
+ 14,
+ 11
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 17,
+ 13
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 39,
+ 12
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 12,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 16,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 13,
+ -3
+ ],
+ [
+ 19,
+ -6
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -31,
+ -4
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ]
+ ],
+ [
+ [
+ 855,
+ 729
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ -14,
+ 1
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 822,
+ 727
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -24,
+ 5
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 14,
+ -7
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 9640,
+ 730
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 27,
+ 0
+ ],
+ [
+ 23,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -10,
+ -5
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -12,
+ 3
+ ],
+ [
+ -14,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -9,
+ -5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -8,
+ 9
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 872,
+ 748
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 15,
+ -2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ]
+ ],
+ [
+ [
+ 855,
+ 742
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -17,
+ 1
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 15,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 928,
+ 751
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 18,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -12,
+ -1
+ ]
+ ],
+ [
+ [
+ 852,
+ 765
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ 4,
+ 2
+ ]
+ ],
+ [
+ [
+ 827,
+ 762
+ ],
+ [
+ -12,
+ -1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 18,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ]
+ ],
+ [
+ [
+ 900,
+ 769
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 922,
+ 770
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ]
+ ],
+ [
+ [
+ 925,
+ 792
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 11,
+ -2
+ ],
+ [
+ 7,
+ -9
+ ]
+ ],
+ [
+ [
+ 9526,
+ 831
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 966,
+ 823
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -14,
+ 5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 9554,
+ 874
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ]
+ ],
+ [
+ [
+ 1322,
+ 896
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 1359,
+ 888
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -12,
+ 3
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ]
+ ],
+ [
+ [
+ 1462,
+ 886
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -4,
+ -2
+ ]
+ ],
+ [
+ [
+ 1757,
+ 912
+ ],
+ [
+ -14,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 28,
+ 12
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ]
+ ],
+ [
+ [
+ 1679,
+ 915
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -11,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ]
+ ],
+ [
+ [
+ 1651,
+ 936
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -20,
+ -10
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -34,
+ -4
+ ],
+ [
+ -16,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -9,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 13,
+ -2
+ ],
+ [
+ 13,
+ -1
+ ],
+ [
+ 21,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ]
+ ],
+ [
+ [
+ 4427,
+ 928
+ ],
+ [
+ -1,
+ -13
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 13
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -13,
+ 2
+ ],
+ [
+ -12,
+ -1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 18,
+ 4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -3,
+ -5
+ ]
+ ],
+ [
+ [
+ 9717,
+ 944
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 1491,
+ 963
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 12,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -19,
+ 1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -9,
+ 6
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -10,
+ 4
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 8,
+ 0
+ ]
+ ],
+ [
+ [
+ 2948,
+ 959
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ]
+ ],
+ [
+ [
+ 2096,
+ 970
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 12,
+ -13
+ ]
+ ],
+ [
+ [
+ 2934,
+ 973
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -37,
+ 16
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 25,
+ -4
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -4,
+ -6
+ ]
+ ],
+ [
+ [
+ 2394,
+ 984
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 2468,
+ 969
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ]
+ ],
+ [
+ [
+ 2360,
+ 998
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 13,
+ 5
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -17,
+ -3
+ ]
+ ],
+ [
+ [
+ 4552,
+ 998
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -4
+ ]
+ ],
+ [
+ [
+ 6901,
+ 1019
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -6,
+ -2
+ ]
+ ],
+ [
+ [
+ 4652,
+ 1027
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 6941,
+ 1041
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 2275,
+ 1042
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 13,
+ 1
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ -12,
+ -5
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 16,
+ 5
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -18,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -34,
+ 6
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 48,
+ 6
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ]
+ ],
+ [
+ [
+ 4917,
+ 1082
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 6,
+ -7
+ ]
+ ],
+ [
+ [
+ 3318,
+ 1091
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 4929,
+ 1108
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -13,
+ 7
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 14,
+ 0
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 6,
+ -4
+ ]
+ ],
+ [
+ [
+ 2952,
+ 1115
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -15,
+ -7
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -38,
+ -7
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 23,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 6,
+ -10
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ]
+ ],
+ [
+ [
+ 3312,
+ 1111
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -7,
+ -4
+ ]
+ ],
+ [
+ [
+ 4836,
+ 1120
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -7
+ ]
+ ],
+ [
+ [
+ 5084,
+ 1118
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 12,
+ 7
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ]
+ ],
+ [
+ [
+ 4908,
+ 1121
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -15,
+ -2
+ ]
+ ],
+ [
+ [
+ 3008,
+ 1137
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ]
+ ],
+ [
+ [
+ 6999,
+ 1115
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ]
+ ],
+ [
+ [
+ 5125,
+ 1124
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 5745,
+ 1130
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -10,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 9,
+ 8
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5036,
+ 1137
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -4,
+ -7
+ ]
+ ],
+ [
+ [
+ 3301,
+ 1153
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2917,
+ 1168
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -12,
+ 1
+ ],
+ [
+ -13,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ]
+ ],
+ [
+ [
+ 5450,
+ 1151
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -3,
+ -10
+ ]
+ ],
+ [
+ [
+ 3000,
+ 1169
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -12,
+ 3
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 9,
+ -12
+ ]
+ ],
+ [
+ [
+ 3278,
+ 1168
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -7,
+ 12
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 3054,
+ 1199
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 8,
+ -15
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 4,
+ -14
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 11,
+ -19
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 1,
+ -13
+ ],
+ [
+ 0,
+ -23
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -14,
+ -13
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -23,
+ -5
+ ],
+ [
+ -14,
+ -3
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -19,
+ -1
+ ],
+ [
+ -15,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 15,
+ -2
+ ],
+ [
+ 20,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 22,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -14,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -14,
+ -15
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -10,
+ -7
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 12,
+ 3
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -13,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 18,
+ -4
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 10,
+ -9
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 14,
+ 8
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -11,
+ 1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -16,
+ 7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 14,
+ 4
+ ],
+ [
+ 27,
+ 5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -11
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 2485,
+ 1221
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 3315,
+ 1223
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ]
+ ],
+ [
+ [
+ 3129,
+ 1281
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 9578,
+ 1294
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3129,
+ 1331
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 7383,
+ 1327
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ -3,
+ -4
+ ]
+ ],
+ [
+ [
+ 6348,
+ 1337
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ]
+ ],
+ [
+ [
+ 9535,
+ 1335
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 7403,
+ 1338
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ]
+ ],
+ [
+ [
+ 3111,
+ 1297
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 7,
+ 10
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 12,
+ 8
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 7370,
+ 1347
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ]
+ ],
+ [
+ [
+ 7745,
+ 1355
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ]
+ ],
+ [
+ [
+ 9516,
+ 1355
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 7,
+ -11
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 7784,
+ 1370
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3150,
+ 1371
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 7683,
+ 1380
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -15,
+ -2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ]
+ ],
+ [
+ [
+ 7572,
+ 1393
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3171,
+ 1391
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 7804,
+ 1401
+ ],
+ [
+ -12,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -7,
+ -6
+ ]
+ ],
+ [
+ [
+ 7871,
+ 1414
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 3241,
+ 1448
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ]
+ ],
+ [
+ [
+ 3410,
+ 1465
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -7,
+ -6
+ ]
+ ],
+ [
+ [
+ 3245,
+ 1470
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 3,
+ -6
+ ]
+ ],
+ [
+ [
+ 3268,
+ 1473
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 3279,
+ 1493
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 3393,
+ 1494
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ]
+ ],
+ [
+ [
+ 3406,
+ 1509
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 3315,
+ 1505
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 3448,
+ 1524
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ]
+ ],
+ [
+ [
+ 0,
+ 325
+ ],
+ [
+ 45,
+ 1
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 21,
+ 0
+ ],
+ [
+ 19,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 13,
+ 2
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 82,
+ -5
+ ],
+ [
+ 85,
+ -8
+ ],
+ [
+ 17,
+ -2
+ ],
+ [
+ 15,
+ -6
+ ],
+ [
+ 17,
+ 0
+ ],
+ [
+ 95,
+ -4
+ ],
+ [
+ 15,
+ 0
+ ],
+ [
+ 59,
+ -5
+ ],
+ [
+ 102,
+ -12
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -10,
+ 6
+ ],
+ [
+ -13,
+ 4
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 18,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -36,
+ 2
+ ],
+ [
+ -147,
+ 14
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -22,
+ 1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 34,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -14,
+ 5
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -24,
+ 8
+ ],
+ [
+ -16,
+ 3
+ ],
+ [
+ -11,
+ -2
+ ],
+ [
+ -20,
+ 0
+ ],
+ [
+ -25,
+ -2
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -11,
+ 4
+ ],
+ [
+ -56,
+ 11
+ ],
+ [
+ -10,
+ 3
+ ],
+ [
+ -70,
+ 18
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 32,
+ -7
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 22,
+ -6
+ ],
+ [
+ 44,
+ -8
+ ],
+ [
+ 12,
+ -4
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 42,
+ 1
+ ],
+ [
+ 16,
+ -1
+ ],
+ [
+ 20,
+ -5
+ ],
+ [
+ 8,
+ -7
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 11,
+ 3
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 17,
+ 2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 9,
+ -4
+ ],
+ [
+ 10,
+ -6
+ ],
+ [
+ 45,
+ 2
+ ],
+ [
+ 19,
+ 0
+ ],
+ [
+ 13,
+ -3
+ ],
+ [
+ 48,
+ 9
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 11,
+ 7
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 14,
+ 2
+ ],
+ [
+ 28,
+ 3
+ ],
+ [
+ 16,
+ 2
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 37,
+ 11
+ ],
+ [
+ 12,
+ 5
+ ],
+ [
+ 11,
+ 8
+ ],
+ [
+ -25,
+ 16
+ ],
+ [
+ -23,
+ 13
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -12,
+ 3
+ ],
+ [
+ -44,
+ 8
+ ],
+ [
+ -15,
+ 3
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 17,
+ 2
+ ],
+ [
+ 108,
+ 6
+ ],
+ [
+ 108,
+ 7
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ -14,
+ 4
+ ],
+ [
+ -13,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -19,
+ 5
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 23,
+ 0
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -17,
+ 5
+ ],
+ [
+ -40,
+ 6
+ ],
+ [
+ -16,
+ 5
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -13,
+ -2
+ ],
+ [
+ -22,
+ 1
+ ],
+ [
+ -28,
+ 4
+ ],
+ [
+ -19,
+ 5
+ ],
+ [
+ -26,
+ 12
+ ],
+ [
+ -9,
+ 7
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 33,
+ 6
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ -11,
+ 3
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -34,
+ 0
+ ],
+ [
+ -20,
+ 0
+ ],
+ [
+ -16,
+ 7
+ ],
+ [
+ -12,
+ 7
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 11,
+ -9
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 13,
+ 1
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 15,
+ -2
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 25,
+ -5
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 11,
+ -2
+ ],
+ [
+ 30,
+ 2
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 21,
+ -8
+ ],
+ [
+ 18,
+ -9
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 10,
+ 4
+ ],
+ [
+ 21,
+ 5
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 10,
+ -6
+ ],
+ [
+ 13,
+ -6
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 15,
+ -12
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -11,
+ 5
+ ],
+ [
+ -17,
+ 9
+ ],
+ [
+ -16,
+ 4
+ ],
+ [
+ -35,
+ -3
+ ],
+ [
+ -12,
+ 2
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 11,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 13,
+ -1
+ ],
+ [
+ 29,
+ -11
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 20,
+ -5
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -14,
+ 10
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 10,
+ 8
+ ],
+ [
+ 24,
+ 0
+ ],
+ [
+ 11,
+ 3
+ ],
+ [
+ 14,
+ 6
+ ],
+ [
+ 18,
+ 9
+ ],
+ [
+ 15,
+ 2
+ ],
+ [
+ 19,
+ 3
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 16,
+ -9
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ -10,
+ 11
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 17,
+ 11
+ ],
+ [
+ 15,
+ 3
+ ],
+ [
+ 42,
+ 5
+ ],
+ [
+ 15,
+ -5
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 7,
+ 11
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 19,
+ 5
+ ],
+ [
+ 14,
+ 0
+ ],
+ [
+ 11,
+ -5
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 14,
+ 3
+ ],
+ [
+ 17,
+ 1
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 24,
+ -1
+ ],
+ [
+ 18,
+ -4
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 15,
+ 4
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 30,
+ 6
+ ],
+ [
+ 24,
+ 1
+ ],
+ [
+ 17,
+ -2
+ ],
+ [
+ 29,
+ 1
+ ],
+ [
+ 29,
+ -1
+ ],
+ [
+ 11,
+ -2
+ ],
+ [
+ 66,
+ 1
+ ],
+ [
+ 51,
+ 6
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 11,
+ 6
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 14,
+ -2
+ ],
+ [
+ 21,
+ -4
+ ],
+ [
+ 18,
+ 2
+ ],
+ [
+ 33,
+ -3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 5,
+ 16
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 23,
+ -10
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ -8,
+ -6
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 14,
+ 3
+ ],
+ [
+ 26,
+ 4
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -7,
+ -8
+ ],
+ [
+ -12,
+ -6
+ ],
+ [
+ -13,
+ -11
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 31,
+ -1
+ ],
+ [
+ 19,
+ 1
+ ],
+ [
+ 13,
+ -1
+ ],
+ [
+ 16,
+ -3
+ ],
+ [
+ 12,
+ -4
+ ],
+ [
+ 15,
+ 0
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 34,
+ 9
+ ],
+ [
+ 14,
+ 4
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 13,
+ 3
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 30,
+ 0
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 9,
+ -8
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 15,
+ 3
+ ],
+ [
+ 15,
+ -1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -13,
+ 3
+ ],
+ [
+ -12,
+ 8
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 7,
+ 9
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -9,
+ -3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -7,
+ 15
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -10,
+ 4
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 26,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -9,
+ 5
+ ],
+ [
+ -14,
+ 5
+ ],
+ [
+ -11,
+ 3
+ ],
+ [
+ -21,
+ 2
+ ],
+ [
+ -11,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -7,
+ 14
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 14,
+ 1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 45,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 15,
+ -5
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 24,
+ 3
+ ],
+ [
+ 17,
+ -1
+ ],
+ [
+ 29,
+ -8
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 14,
+ 4
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 9,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -6,
+ -11
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 10,
+ -9
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 17,
+ 8
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 9,
+ -9
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 12,
+ -3
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 12,
+ -4
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 15,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 18,
+ -7
+ ],
+ [
+ 16,
+ 3
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 19,
+ -11
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 15,
+ -13
+ ],
+ [
+ 5,
+ -11
+ ],
+ [
+ 11,
+ -3
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ -7,
+ -8
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 13,
+ -1
+ ],
+ [
+ 10,
+ 4
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 30,
+ 14
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 11,
+ 3
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 12,
+ 5
+ ],
+ [
+ 19,
+ -1
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 19,
+ 3
+ ],
+ [
+ 13,
+ 4
+ ],
+ [
+ 23,
+ 10
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 10,
+ 13
+ ],
+ [
+ 6,
+ 12
+ ],
+ [
+ 7,
+ 18
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -7,
+ 11
+ ],
+ [
+ -2,
+ 14
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -5,
+ 16
+ ],
+ [
+ -7,
+ 10
+ ],
+ [
+ -7,
+ 13
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 21,
+ -3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -10,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 10,
+ 6
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 16,
+ 9
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 14,
+ 5
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 13,
+ 5
+ ],
+ [
+ 9,
+ 8
+ ],
+ [
+ 14,
+ 5
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -12,
+ -6
+ ],
+ [
+ -7,
+ -9
+ ],
+ [
+ -6,
+ -9
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -7,
+ -11
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -8,
+ 13
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -10,
+ 4
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -13,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 13,
+ -4
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 16,
+ 3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -10,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 1,
+ -14
+ ],
+ [
+ 6,
+ -12
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 14,
+ 1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 7,
+ -9
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -8,
+ -8
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 9,
+ 7
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -17,
+ -2
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -9,
+ -6
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 10,
+ -6
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 9,
+ -4
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 14,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 14,
+ -2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 6,
+ -10
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -12,
+ -5
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -20,
+ -7
+ ],
+ [
+ -20,
+ -10
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -18,
+ -8
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -32,
+ -6
+ ],
+ [
+ -49,
+ -14
+ ],
+ [
+ -17,
+ -10
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -25,
+ -1
+ ],
+ [
+ -25,
+ 4
+ ],
+ [
+ -21,
+ 0
+ ],
+ [
+ -12,
+ -1
+ ],
+ [
+ -38,
+ 7
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -26,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 10,
+ -9
+ ],
+ [
+ 16,
+ -16
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 10,
+ -5
+ ],
+ [
+ 22,
+ 0
+ ],
+ [
+ 31,
+ -3
+ ],
+ [
+ 17,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -10,
+ -12
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -15,
+ -8
+ ],
+ [
+ -21,
+ -4
+ ],
+ [
+ -17,
+ 1
+ ],
+ [
+ -29,
+ 7
+ ],
+ [
+ -36,
+ 6
+ ],
+ [
+ -54,
+ 5
+ ],
+ [
+ -11,
+ 3
+ ],
+ [
+ -14,
+ 2
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -13,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 54,
+ -16
+ ],
+ [
+ 46,
+ -11
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -9,
+ -5
+ ],
+ [
+ -24,
+ 0
+ ],
+ [
+ -29,
+ -4
+ ],
+ [
+ -15,
+ 0
+ ],
+ [
+ -14,
+ 4
+ ],
+ [
+ -31,
+ 11
+ ],
+ [
+ -19,
+ 8
+ ],
+ [
+ -13,
+ 10
+ ],
+ [
+ -9,
+ 8
+ ],
+ [
+ -10,
+ 7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 9,
+ -9
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 11,
+ -6
+ ],
+ [
+ 25,
+ -10
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 8,
+ -8
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 20,
+ -2
+ ],
+ [
+ 82,
+ -1
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ -9,
+ -11
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -14,
+ -1
+ ],
+ [
+ -27,
+ 1
+ ],
+ [
+ -27,
+ 0
+ ],
+ [
+ 21,
+ -5
+ ],
+ [
+ 20,
+ -5
+ ],
+ [
+ 28,
+ 1
+ ],
+ [
+ 12,
+ 1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 8,
+ -8
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 16,
+ 1
+ ],
+ [
+ 15,
+ -5
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 13,
+ 4
+ ],
+ [
+ 11,
+ 5
+ ],
+ [
+ 22,
+ 5
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 13,
+ -2
+ ],
+ [
+ 16,
+ 2
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 66,
+ -18
+ ],
+ [
+ 23,
+ -4
+ ],
+ [
+ 35,
+ -2
+ ],
+ [
+ 28,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -17,
+ 1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -13,
+ 1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -9,
+ -3
+ ],
+ [
+ -17,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 12,
+ -1
+ ],
+ [
+ 18,
+ 1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -16,
+ -1
+ ],
+ [
+ -33,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 15,
+ 0
+ ],
+ [
+ 17,
+ 4
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 23,
+ 3
+ ],
+ [
+ 20,
+ -1
+ ],
+ [
+ 29,
+ 5
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -35,
+ -11
+ ],
+ [
+ -13,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 9,
+ -6
+ ],
+ [
+ 6,
+ -9
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 11,
+ 4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 13,
+ -1
+ ],
+ [
+ 16,
+ -1
+ ],
+ [
+ 15,
+ 0
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 35,
+ 19
+ ],
+ [
+ 13,
+ 10
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 28,
+ 12
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 14,
+ 1
+ ],
+ [
+ 19,
+ 9
+ ],
+ [
+ 17,
+ 6
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 15,
+ 0
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 19,
+ 4
+ ],
+ [
+ 14,
+ 3
+ ],
+ [
+ 16,
+ 2
+ ],
+ [
+ 17,
+ 1
+ ],
+ [
+ 46,
+ 4
+ ],
+ [
+ 13,
+ -2
+ ],
+ [
+ 15,
+ -5
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 12,
+ 1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 9,
+ -4
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 20,
+ 4
+ ],
+ [
+ 17,
+ 4
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 11,
+ 3
+ ],
+ [
+ 13,
+ 15
+ ],
+ [
+ 17,
+ 14
+ ],
+ [
+ 15,
+ 10
+ ],
+ [
+ 9,
+ 11
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 13,
+ 1
+ ],
+ [
+ 19,
+ 7
+ ],
+ [
+ 28,
+ 9
+ ],
+ [
+ 21,
+ -4
+ ],
+ [
+ 22,
+ -6
+ ],
+ [
+ 11,
+ 5
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 27,
+ 3
+ ],
+ [
+ 29,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 13,
+ 3
+ ],
+ [
+ 17,
+ 1
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 16,
+ 2
+ ],
+ [
+ 18,
+ 3
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 141,
+ 6
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 13,
+ 3
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ -19,
+ 3
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -16,
+ 1
+ ],
+ [
+ -130,
+ 9
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -12,
+ -1
+ ],
+ [
+ -31,
+ -4
+ ],
+ [
+ -13,
+ -1
+ ],
+ [
+ -33,
+ 7
+ ],
+ [
+ -22,
+ 8
+ ],
+ [
+ -15,
+ 2
+ ],
+ [
+ -10,
+ 6
+ ],
+ [
+ -10,
+ 4
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 18,
+ 25
+ ],
+ [
+ 12,
+ 12
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 7,
+ 12
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 14,
+ 7
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 22,
+ 8
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 11,
+ 7
+ ],
+ [
+ 33,
+ 15
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 27,
+ 13
+ ],
+ [
+ 24,
+ 6
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 15,
+ 4
+ ],
+ [
+ 16,
+ 6
+ ],
+ [
+ 14,
+ 6
+ ],
+ [
+ 49,
+ 11
+ ],
+ [
+ 30,
+ 3
+ ],
+ [
+ 21,
+ 3
+ ],
+ [
+ 14,
+ -2
+ ],
+ [
+ 14,
+ 1
+ ],
+ [
+ 13,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 28,
+ -3
+ ],
+ [
+ 18,
+ 4
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 13,
+ 19
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 21,
+ -5
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 12,
+ 10
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -18,
+ -2
+ ],
+ [
+ -14,
+ -3
+ ],
+ [
+ -13,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 10,
+ 10
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 17,
+ 2
+ ],
+ [
+ 19,
+ -4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ -5,
+ 9
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 12,
+ 9
+ ],
+ [
+ 19,
+ 8
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 7,
+ 15
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -10,
+ 4
+ ],
+ [
+ -13,
+ 6
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 9,
+ -6
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 7,
+ -10
+ ],
+ [
+ 9,
+ -18
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 42,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 14,
+ 1
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 14,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 10,
+ 9
+ ],
+ [
+ 10,
+ 8
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 20,
+ 7
+ ],
+ [
+ 10,
+ 4
+ ],
+ [
+ 19,
+ 6
+ ],
+ [
+ 25,
+ 3
+ ],
+ [
+ 45,
+ 11
+ ],
+ [
+ 14,
+ 1
+ ],
+ [
+ 24,
+ 3
+ ],
+ [
+ 13,
+ 3
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 17,
+ -6
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 9,
+ 12
+ ],
+ [
+ 14,
+ -5
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 9,
+ -6
+ ],
+ [
+ 21,
+ -11
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 14,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ 6,
+ 10
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 12,
+ 1
+ ],
+ [
+ 7,
+ -10
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 19,
+ 3
+ ],
+ [
+ 16,
+ 0
+ ],
+ [
+ 14,
+ -2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 12,
+ -3
+ ],
+ [
+ 27,
+ -5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 26,
+ 4
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 10,
+ 14
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 15,
+ -4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 7,
+ 9
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 12,
+ -5
+ ],
+ [
+ 13,
+ -1
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 15,
+ 1
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 19,
+ 6
+ ],
+ [
+ 15,
+ 5
+ ],
+ [
+ 15,
+ 11
+ ],
+ [
+ 15,
+ 6
+ ],
+ [
+ 23,
+ 3
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 22,
+ 7
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 15,
+ 1
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 10,
+ -19
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 10,
+ -6
+ ],
+ [
+ 10,
+ -13
+ ],
+ [
+ 11,
+ -7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 7,
+ 10
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ 2,
+ 15
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 9,
+ 9
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 13,
+ 5
+ ],
+ [
+ 16,
+ 5
+ ],
+ [
+ 12,
+ 13
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 18,
+ 5
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 12,
+ 9
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 10,
+ 6
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 14,
+ -8
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 21,
+ 14
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 13,
+ 3
+ ],
+ [
+ 16,
+ 1
+ ],
+ [
+ 20,
+ 5
+ ],
+ [
+ 36,
+ -3
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 7,
+ -8
+ ],
+ [
+ 11,
+ -9
+ ],
+ [
+ 14,
+ -3
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -17,
+ -13
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 13,
+ 1
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 12,
+ -4
+ ],
+ [
+ 14,
+ -14
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 17,
+ 2
+ ],
+ [
+ 15,
+ -7
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 24,
+ -2
+ ],
+ [
+ 15,
+ -5
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 13,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 18,
+ -5
+ ],
+ [
+ 32,
+ -6
+ ],
+ [
+ 21,
+ -2
+ ],
+ [
+ 19,
+ -1
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 17,
+ -2
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 16,
+ 2
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -10,
+ -8
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ 11,
+ -3
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 17,
+ 0
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -9,
+ -19
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -8,
+ -6
+ ],
+ [
+ -4,
+ -11
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ -8,
+ -15
+ ],
+ [
+ -4,
+ -17
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -7,
+ -18
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 12,
+ 7
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 9,
+ 8
+ ],
+ [
+ 20,
+ 6
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 10,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 5,
+ 12
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 8,
+ 10
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 16,
+ 1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 12,
+ 9
+ ],
+ [
+ 12,
+ 8
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 30,
+ 10
+ ],
+ [
+ 22,
+ 7
+ ],
+ [
+ 24,
+ 8
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 15,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ 9
+ ],
+ [
+ 11,
+ 9
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 9,
+ 7
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 11,
+ -2
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 11,
+ 7
+ ],
+ [
+ 18,
+ 1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 25,
+ 9
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 14,
+ 2
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 16,
+ 3
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 14,
+ 8
+ ],
+ [
+ 14,
+ 1
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 13,
+ 1
+ ],
+ [
+ 12,
+ 1
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 15,
+ 8
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 15,
+ 1
+ ],
+ [
+ 12,
+ 6
+ ],
+ [
+ 11,
+ 4
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 12,
+ 15
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 19,
+ 0
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 14,
+ -3
+ ],
+ [
+ 13,
+ -5
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 11,
+ -6
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 38,
+ -14
+ ],
+ [
+ 22,
+ -4
+ ],
+ [
+ 11,
+ -5
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 14,
+ -5
+ ],
+ [
+ 16,
+ -3
+ ],
+ [
+ 10,
+ 4
+ ],
+ [
+ 17,
+ 13
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ 9,
+ 14
+ ],
+ [
+ 15,
+ 7
+ ],
+ [
+ 19,
+ 3
+ ],
+ [
+ 12,
+ 3
+ ],
+ [
+ 15,
+ 3
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 10,
+ -17
+ ],
+ [
+ 8,
+ -7
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 9,
+ -12
+ ],
+ [
+ -5,
+ -11
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -19,
+ -5
+ ],
+ [
+ -9,
+ -3
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 14,
+ 2
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 13,
+ -1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 10,
+ 5
+ ],
+ [
+ 12,
+ 4
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -12,
+ -6
+ ],
+ [
+ -18,
+ -7
+ ],
+ [
+ -10,
+ -7
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 36,
+ 8
+ ],
+ [
+ 16,
+ 6
+ ],
+ [
+ 14,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 12,
+ 9
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 13,
+ 3
+ ],
+ [
+ 16,
+ 3
+ ],
+ [
+ 12,
+ 4
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 5,
+ -15
+ ],
+ [
+ 14,
+ -14
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 12,
+ 1
+ ],
+ [
+ 13,
+ -5
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 7,
+ 17
+ ],
+ [
+ 7,
+ 16
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 17,
+ -1
+ ],
+ [
+ 14,
+ 4
+ ],
+ [
+ 15,
+ -1
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 11,
+ -5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 11,
+ 7
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 11,
+ 12
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 12,
+ -5
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 10,
+ -8
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 12,
+ -1
+ ],
+ [
+ 12,
+ -3
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 24,
+ -2
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 28,
+ -2
+ ],
+ [
+ 11,
+ -5
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 13,
+ -1
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -7,
+ -11
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -6,
+ -9
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 14,
+ 4
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 12,
+ -2
+ ],
+ [
+ 8,
+ -8
+ ],
+ [
+ 16,
+ -12
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 25,
+ -6
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 13,
+ 1
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -14
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 20,
+ -2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 11,
+ -12
+ ],
+ [
+ 8,
+ -8
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 10,
+ -8
+ ],
+ [
+ 14,
+ -3
+ ],
+ [
+ 13,
+ -6
+ ],
+ [
+ 15,
+ 0
+ ],
+ [
+ 13,
+ -7
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 20,
+ -8
+ ],
+ [
+ 12,
+ -4
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 13,
+ -6
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 11,
+ -30
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 7,
+ -8
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -7,
+ 20
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 13,
+ 1
+ ],
+ [
+ 10,
+ -11
+ ],
+ [
+ 9,
+ -7
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 11,
+ 8
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 14,
+ -1
+ ],
+ [
+ 18,
+ -4
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 14,
+ -1
+ ],
+ [
+ 16,
+ -7
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 12,
+ -5
+ ],
+ [
+ 24,
+ -13
+ ],
+ [
+ 9,
+ -4
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -2,
+ -16
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -11,
+ 1
+ ],
+ [
+ -9,
+ 5
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 13,
+ -4
+ ],
+ [
+ 15,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -15,
+ -8
+ ],
+ [
+ -8,
+ 6
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -20,
+ -1
+ ],
+ [
+ -7,
+ 7
+ ],
+ [
+ -12,
+ 5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 10,
+ -13
+ ],
+ [
+ 11,
+ -3
+ ],
+ [
+ 11,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -8,
+ -6
+ ],
+ [
+ -16,
+ 1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ 4,
+ -16
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ 7,
+ -14
+ ],
+ [
+ 7,
+ -9
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ -20
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -21,
+ -6
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 18,
+ -1
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 3,
+ -13
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -9,
+ -6
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 9,
+ -5
+ ],
+ [
+ 12,
+ 5
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 15,
+ -9
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -41,
+ -2
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -11,
+ -5
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -17,
+ -5
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -19,
+ 12
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 9,
+ -13
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -11,
+ -9
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -12,
+ -7
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -39,
+ -12
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 14,
+ -2
+ ],
+ [
+ 41,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -12
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 12,
+ -3
+ ],
+ [
+ 18,
+ -13
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 12,
+ -7
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 17,
+ -9
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -35,
+ -7
+ ],
+ [
+ -35,
+ -6
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 38,
+ 0
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 21,
+ 4
+ ],
+ [
+ 20,
+ 2
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 28,
+ -15
+ ],
+ [
+ 13,
+ -5
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 10,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 48,
+ -2
+ ],
+ [
+ 13,
+ -4
+ ],
+ [
+ 14,
+ 2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 14,
+ -2
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 15,
+ -5
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 33,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 47,
+ -6
+ ],
+ [
+ 17,
+ -3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 13,
+ -3
+ ],
+ [
+ 12,
+ -1
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ -9988,
+ -5
+ ]
+ ],
+ [
+ [
+ 3457,
+ 1545
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -13,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 10,
+ 4
+ ],
+ [
+ 13,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 3442,
+ 1551
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 3319,
+ 1557
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -4
+ ]
+ ],
+ [
+ [
+ 3260,
+ 1551
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -6,
+ -6
+ ]
+ ],
+ [
+ [
+ 3316,
+ 1580
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 12,
+ 1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ -10,
+ -7
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ]
+ ],
+ [
+ [
+ 3350,
+ 1587
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3365,
+ 1595
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3389,
+ 1618
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 8,
+ 3
+ ]
+ ],
+ [
+ [
+ 3498,
+ 1653
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 3467,
+ 1658
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 20,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ]
+ ],
+ [
+ [
+ 3730,
+ 1698
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ]
+ ],
+ [
+ [
+ 6924,
+ 2358
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 6921,
+ 2355
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ]
+ ],
+ [
+ [
+ 6439,
+ 2509
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 3285,
+ 6165
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 3284,
+ 6196
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 9412,
+ 2033
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -7
+ ]
+ ],
+ [
+ [
+ 9092,
+ 2684
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 9095,
+ 2693
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -7
+ ]
+ ],
+ [
+ [
+ 9113,
+ 2724
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 9028,
+ 2835
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 8,
+ -6
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ 22
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 13
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -5,
+ 11
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -4,
+ 13
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 6,
+ -3
+ ]
+ ],
+ [
+ [
+ 9117,
+ 2850
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 9021,
+ 2851
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 9119,
+ 2862
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ]
+ ],
+ [
+ [
+ 9110,
+ 2894
+ ],
+ [
+ 5,
+ -11
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 8997,
+ 2873
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ]
+ ],
+ [
+ [
+ 9036,
+ 2967
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 9040,
+ 2975
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 8821,
+ 3125
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 12,
+ 5
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 9264,
+ 3604
+ ],
+ [
+ -2,
+ -16
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ -1
+ ]
+ ],
+ [
+ [
+ 9261,
+ 3610
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 0,
+ -7
+ ]
+ ],
+ [
+ [
+ 8143,
+ 3683
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ 18
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -17
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ]
+ ],
+ [
+ [
+ 9251,
+ 3701
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -6,
+ -26
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 9198,
+ 3831
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 12
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ -2
+ ]
+ ],
+ [
+ [
+ 9180,
+ 3898
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 9164,
+ 3906
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 8206,
+ 3986
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 9139,
+ 4015
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 9136,
+ 4023
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 9062,
+ 4134
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 8873,
+ 4198
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ]
+ ],
+ [
+ [
+ 8874,
+ 4229
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 8807,
+ 4275
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 8793,
+ 4284
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8801,
+ 4284
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 8460,
+ 4297
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 8477,
+ 4344
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 8797,
+ 4389
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8783,
+ 4388
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 8786,
+ 4516
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 8623,
+ 4511
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ]
+ ],
+ [
+ [
+ 8627,
+ 4529
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -9,
+ -12
+ ],
+ [
+ -9,
+ 10
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8794,
+ 4528
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -3,
+ -11
+ ]
+ ],
+ [
+ [
+ 8682,
+ 4533
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -7
+ ]
+ ],
+ [
+ [
+ 8976,
+ 4495
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ -1,
+ -17
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 8,
+ -10
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 3,
+ -13
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 4,
+ -18
+ ],
+ [
+ 2,
+ -15
+ ],
+ [
+ -1,
+ -20
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 5,
+ -13
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 2,
+ -15
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 0,
+ -18
+ ],
+ [
+ 1,
+ -16
+ ],
+ [
+ 1,
+ -16
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 7,
+ -11
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 4,
+ -17
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 0,
+ -15
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -3,
+ -19
+ ],
+ [
+ 3,
+ -39
+ ],
+ [
+ -2,
+ -13
+ ],
+ [
+ 3,
+ -12
+ ],
+ [
+ 5,
+ -21
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 0,
+ -17
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -4,
+ -11
+ ],
+ [
+ -3,
+ -14
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ -2,
+ -23
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -4,
+ -23
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -13
+ ],
+ [
+ -5,
+ -20
+ ],
+ [
+ -6,
+ -15
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ -12
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -15
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -6,
+ -22
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -1,
+ -14
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -14
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -19,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ -7,
+ -10
+ ],
+ [
+ -15,
+ -25
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -10,
+ -10
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -8,
+ -13
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -8,
+ 7
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ 11
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -11,
+ 2
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ -5,
+ 15
+ ],
+ [
+ -9,
+ 16
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -4,
+ 17
+ ],
+ [
+ -5,
+ 16
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -6,
+ 10
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 17
+ ],
+ [
+ -1,
+ 15
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -5,
+ 12
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -1,
+ -15
+ ],
+ [
+ -5,
+ -24
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 4,
+ 19
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 5,
+ 18
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -2,
+ 18
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -4,
+ -11
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -9,
+ -23
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ 11
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ -2,
+ 14
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -9,
+ 8
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -12,
+ 13
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -9,
+ -5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -14,
+ 18
+ ],
+ [
+ -9,
+ 9
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -18,
+ 2
+ ],
+ [
+ -16,
+ -3
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -11,
+ -11
+ ],
+ [
+ -13,
+ -10
+ ],
+ [
+ -11,
+ -5
+ ],
+ [
+ -10,
+ -7
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -18,
+ 3
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -10,
+ -12
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -14,
+ -15
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -4,
+ -19
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -6,
+ -14
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -18,
+ -6
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -17,
+ -2
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -5,
+ -16
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -11,
+ -15
+ ],
+ [
+ -10,
+ -14
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -12,
+ 4
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -9,
+ 7
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -7,
+ 15
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -8,
+ 7
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -1,
+ 19
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 0,
+ 29
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -7,
+ 23
+ ],
+ [
+ -4,
+ 19
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -3,
+ 15
+ ],
+ [
+ -3,
+ 19
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ -1,
+ 19
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 17
+ ],
+ [
+ -7,
+ 16
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -5,
+ 14
+ ],
+ [
+ -6,
+ 12
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 25
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ -9,
+ 28
+ ],
+ [
+ -11,
+ 25
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 3,
+ -14
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -14
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -6,
+ 17
+ ],
+ [
+ -6,
+ 22
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -3,
+ 17
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 2,
+ 15
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 6,
+ 18
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ 3,
+ 18
+ ],
+ [
+ 5,
+ 22
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -2,
+ -16
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 6,
+ 18
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 16,
+ 19
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 7,
+ 9
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 10,
+ 15
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 12,
+ 3
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 12,
+ 10
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 4,
+ 12
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 7,
+ 14
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 14
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -16
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 3,
+ -15
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 8,
+ -13
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 0,
+ -14
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 12,
+ -6
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -11,
+ -25
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -3,
+ -13
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -7,
+ -8
+ ],
+ [
+ 0,
+ -18
+ ],
+ [
+ 2,
+ -11
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -12
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -6,
+ -17
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 8,
+ -9
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 6,
+ -14
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 7,
+ -10
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 7,
+ 21
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 1,
+ 17
+ ],
+ [
+ 4,
+ 24
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ -3,
+ 22
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 2,
+ 14
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ -1,
+ 18
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 3,
+ 16
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 3,
+ 15
+ ],
+ [
+ 2,
+ 20
+ ],
+ [
+ 1,
+ 19
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ]
+ ],
+ [
+ [
+ 8951,
+ 4567
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ -7
+ ]
+ ],
+ [
+ [
+ 8953,
+ 4597
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 8948,
+ 4599
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 5470,
+ 7983
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 5476,
+ 7949
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -6
+ ]
+ ],
+ [
+ [
+ 5446,
+ 7883
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 5380,
+ 7863
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -10,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 5290,
+ 7883
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 5266,
+ 7894
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 5264,
+ 7907
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ]
+ ],
+ [
+ [
+ 5264,
+ 7921
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 13,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 5383,
+ 7993
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 6280,
+ 7423
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -10,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -4,
+ 11
+ ],
+ [
+ -1,
+ 2
+ ]
+ ],
+ [
+ [
+ 6244,
+ 7468
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 6349,
+ 7594
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 6,
+ -15
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 6,
+ -13
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -3,
+ -14
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -13
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -22
+ ]
+ ],
+ [
+ [
+ 6357,
+ 7398
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -6,
+ -10
+ ],
+ [
+ -2,
+ 0
+ ]
+ ],
+ [
+ [
+ 6249,
+ 7562
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ]
+ ],
+ [
+ [
+ 6289,
+ 7597
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 4
+ ]
+ ],
+ [
+ [
+ 5848,
+ 5046
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -6,
+ -12
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -9,
+ 1
+ ]
+ ],
+ [
+ [
+ 5816,
+ 4928
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ]
+ ],
+ [
+ [
+ 5805,
+ 5027
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 5158,
+ 8108
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ]
+ ],
+ [
+ [
+ 5166,
+ 8107
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5169,
+ 8071
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5160,
+ 8037
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ]
+ ],
+ [
+ [
+ 5070,
+ 8127
+ ],
+ [
+ 12,
+ 10
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 4,
+ 1
+ ]
+ ],
+ [
+ [
+ 5093,
+ 8143
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ]
+ ],
+ [
+ [
+ 5117,
+ 8144
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5099,
+ 5857
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 5,
+ -12
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -15
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 5075,
+ 5551
+ ],
+ [
+ -12,
+ -3
+ ],
+ [
+ -13,
+ -4
+ ],
+ [
+ -5,
+ -2
+ ]
+ ],
+ [
+ [
+ 5045,
+ 5542
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ 21
+ ],
+ [
+ 0,
+ 21
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ -1,
+ 17
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 19
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 1,
+ 6
+ ]
+ ],
+ [
+ [
+ 5025,
+ 5817
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 6,
+ 13
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 1,
+ 3
+ ]
+ ],
+ [
+ [
+ 5066,
+ 5869
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 8,
+ -14
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ]
+ ],
+ [
+ [
+ 5006,
+ 6043
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ -10
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 5,
+ -11
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5025,
+ 5817
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -6,
+ 3
+ ]
+ ],
+ [
+ [
+ 4998,
+ 5824
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 4925,
+ 5730
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ]
+ ],
+ [
+ [
+ 4846,
+ 5784
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 8,
+ -10
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 6,
+ 9
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 10,
+ -6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 15
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 6,
+ -4
+ ]
+ ],
+ [
+ [
+ 7553,
+ 6423
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ]
+ ],
+ [
+ [
+ 7551,
+ 6441
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 7531,
+ 6461
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 1,
+ 24
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ]
+ ],
+ [
+ [
+ 7542,
+ 6473
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 7521,
+ 6456
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 4,
+ 15
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -13
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 7517,
+ 6506
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -5
+ ]
+ ],
+ [
+ [
+ 7571,
+ 6450
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -20
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ]
+ ],
+ [
+ [
+ 7564,
+ 6381
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -4,
+ 11
+ ],
+ [
+ -1,
+ 20
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -1,
+ 16
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -4,
+ 12
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -5,
+ 17
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -2,
+ 17
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 4
+ ]
+ ],
+ [
+ [
+ 7473,
+ 6456
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 13
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -13
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -16
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ 2,
+ -15
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -21
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 5793,
+ 7703
+ ],
+ [
+ 0,
+ -14
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 0,
+ -16
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -7,
+ -14
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 1,
+ -5
+ ]
+ ],
+ [
+ [
+ 5778,
+ 7601
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5731,
+ 7587
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ]
+ ],
+ [
+ [
+ 5636,
+ 7565
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 14
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 9
+ ]
+ ],
+ [
+ [
+ 5620,
+ 7621
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 5630,
+ 7732
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 12,
+ -4
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 11,
+ -3
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 10,
+ 4
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 8,
+ -8
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ]
+ ],
+ [
+ [
+ 6405,
+ 6675
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -6
+ ]
+ ],
+ [
+ [
+ 2971,
+ 6404
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ -7
+ ]
+ ],
+ [
+ [
+ 2974,
+ 6423
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ -3
+ ]
+ ],
+ [
+ [
+ 2971,
+ 6476
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ -1
+ ]
+ ],
+ [
+ [
+ 2938,
+ 6463
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -6
+ ]
+ ],
+ [
+ [
+ 2943,
+ 6493
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ]
+ ],
+ [
+ [
+ 2921,
+ 6502
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ 12
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -11
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -7
+ ]
+ ],
+ [
+ [
+ 2898,
+ 6534
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ]
+ ],
+ [
+ [
+ 2932,
+ 6570
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 2843,
+ 6581
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 2908,
+ 6578
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -13
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 6,
+ -13
+ ]
+ ],
+ [
+ [
+ 2851,
+ 6625
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 2840,
+ 6607
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 3,
+ -5
+ ]
+ ],
+ [
+ [
+ 2871,
+ 6652
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ]
+ ],
+ [
+ [
+ 2819,
+ 6723
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 9
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ -4
+ ]
+ ],
+ [
+ [
+ 2855,
+ 6676
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -5,
+ 13
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ 0,
+ -16
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5527,
+ 7768
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5533,
+ 7691
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5512,
+ 7635
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 5490,
+ 7655
+ ],
+ [
+ -2,
+ 2
+ ]
+ ],
+ [
+ [
+ 5488,
+ 7657
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 3254,
+ 6213
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5781,
+ 8418
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 5882,
+ 8185
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 5655,
+ 8151
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 10,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -5,
+ 19
+ ],
+ [
+ -3,
+ 20
+ ]
+ ],
+ [
+ [
+ 5652,
+ 8291
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ]
+ ],
+ [
+ [
+ 5738,
+ 8390
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 2559,
+ 6187
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ]
+ ],
+ [
+ [
+ 2557,
+ 6216
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -3,
+ -13
+ ]
+ ],
+ [
+ [
+ 2530,
+ 6099
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ 15
+ ],
+ [
+ 1,
+ 22
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 1,
+ 16
+ ],
+ [
+ 0,
+ 14
+ ]
+ ],
+ [
+ [
+ 2523,
+ 6210
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 4,
+ 12
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 2547,
+ 6248
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -3,
+ -16
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -13
+ ],
+ [
+ -1,
+ -19
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -5,
+ -14
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 3202,
+ 7044
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ -1,
+ -5
+ ]
+ ],
+ [
+ [
+ 3384,
+ 4022
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -9,
+ 10
+ ],
+ [
+ -7,
+ 9
+ ],
+ [
+ -10,
+ 12
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -13,
+ -1
+ ],
+ [
+ -13,
+ -5
+ ],
+ [
+ -12,
+ -5
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -12,
+ -4
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -4,
+ -13
+ ],
+ [
+ 0,
+ -14
+ ],
+ [
+ 0,
+ -15
+ ],
+ [
+ -3,
+ -19
+ ],
+ [
+ -3,
+ -17
+ ],
+ [
+ -2,
+ -17
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 3133,
+ 3869
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ 0,
+ 6
+ ]
+ ],
+ [
+ [
+ 3069,
+ 4175
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 23
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 12
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 24
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -4,
+ 13
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -4,
+ 13
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -3,
+ 13
+ ]
+ ],
+ [
+ [
+ 3067,
+ 4553
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 11,
+ 17
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -11
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -27
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 1,
+ -15
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 1,
+ -13
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 13,
+ -1
+ ],
+ [
+ 12,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -12
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 6,
+ -9
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ -16
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ -3,
+ -15
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ -2,
+ -12
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 3653,
+ 3584
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 3650,
+ 3663
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 3742,
+ 3808
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3774,
+ 3851
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 3919,
+ 4408
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 3923,
+ 4429
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ -6
+ ]
+ ],
+ [
+ [
+ 3764,
+ 5014
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -8
+ ]
+ ],
+ [
+ [
+ 3753,
+ 5108
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 3560,
+ 5101
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 4,
+ 15
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ -4,
+ -20
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -11
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -5,
+ -6
+ ]
+ ],
+ [
+ [
+ 3621,
+ 5171
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 17,
+ -6
+ ]
+ ],
+ [
+ [
+ 3593,
+ 5176
+ ],
+ [
+ -8,
+ -11
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 3626,
+ 5177
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ]
+ ],
+ [
+ [
+ 3618,
+ 5199
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -4,
+ -12
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 4,
+ -2
+ ]
+ ],
+ [
+ [
+ 3599,
+ 5192
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -3,
+ -7
+ ]
+ ],
+ [
+ [
+ 3607,
+ 5206
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -8
+ ]
+ ],
+ [
+ [
+ 3602,
+ 5295
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 3431,
+ 5296
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 3483,
+ 5318
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 13
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ]
+ ],
+ [
+ [
+ 3565,
+ 5418
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 4,
+ -25
+ ],
+ [
+ 1,
+ -22
+ ],
+ [
+ 1,
+ -12
+ ],
+ [
+ 5,
+ -24
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -6,
+ -10
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -3,
+ -13
+ ],
+ [
+ -5,
+ -11
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -3,
+ -13
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ -12
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -9,
+ -8
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 8,
+ 11
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 6,
+ -9
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ -3,
+ -14
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -13
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 6,
+ 24
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 8,
+ 20
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -12
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -3,
+ -22
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 5,
+ 11
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 10,
+ -8
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 11,
+ 4
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 10,
+ -11
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 6,
+ -9
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 6,
+ -15
+ ],
+ [
+ 7,
+ -11
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 9,
+ -7
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 12,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 5,
+ -18
+ ],
+ [
+ 2,
+ -20
+ ],
+ [
+ 2,
+ -15
+ ],
+ [
+ 3,
+ -12
+ ],
+ [
+ 1,
+ -23
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -15
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -18
+ ],
+ [
+ -5,
+ -31
+ ],
+ [
+ -5,
+ -17
+ ],
+ [
+ -7,
+ -18
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -5,
+ -14
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -4,
+ -15
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -5,
+ -14
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -6,
+ -26
+ ],
+ [
+ -8,
+ -22
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -7,
+ -15
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -3,
+ -36
+ ],
+ [
+ 1,
+ -16
+ ],
+ [
+ 0,
+ -19
+ ],
+ [
+ 2,
+ -18
+ ],
+ [
+ 1,
+ -16
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -3,
+ -19
+ ],
+ [
+ -2,
+ -18
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ -1,
+ -16
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 2,
+ -18
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -5,
+ -16
+ ],
+ [
+ -2,
+ -22
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 1,
+ -25
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -3,
+ -13
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -6,
+ -12
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ -3,
+ -16
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -18
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -12,
+ -9
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -8,
+ -16
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -13,
+ 0
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -7,
+ -11
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -19,
+ -18
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -8,
+ -15
+ ],
+ [
+ -12,
+ -17
+ ],
+ [
+ -7,
+ -9
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -4,
+ -12
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -14
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ 1,
+ -16
+ ],
+ [
+ 0,
+ -14
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -7,
+ -10
+ ],
+ [
+ -6,
+ -12
+ ],
+ [
+ -7,
+ -16
+ ],
+ [
+ -8,
+ -26
+ ],
+ [
+ -8,
+ -36
+ ],
+ [
+ -8,
+ -27
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -5,
+ -11
+ ],
+ [
+ -6,
+ -12
+ ],
+ [
+ -9,
+ -13
+ ],
+ [
+ -9,
+ -12
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 7,
+ 12
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ -1,
+ 16
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -8,
+ -8
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -5,
+ -25
+ ],
+ [
+ -4,
+ -15
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -13,
+ -20
+ ]
+ ],
+ [
+ [
+ 3517,
+ 3240
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 19
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -8,
+ 6
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -6,
+ 10
+ ],
+ [
+ -9,
+ 15
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ]
+ ],
+ [
+ [
+ 3483,
+ 3711
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 4,
+ 12
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 3,
+ 20
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ]
+ ],
+ [
+ [
+ 3067,
+ 4553
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 15
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ]
+ ],
+ [
+ [
+ 3056,
+ 4940
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 1,
+ 19
+ ],
+ [
+ 2,
+ 18
+ ],
+ [
+ 2,
+ 19
+ ],
+ [
+ 1,
+ 20
+ ],
+ [
+ 2,
+ 21
+ ],
+ [
+ 2,
+ 16
+ ],
+ [
+ 1,
+ 15
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 1,
+ 15
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ]
+ ],
+ [
+ [
+ 3142,
+ 5254
+ ],
+ [
+ 7,
+ -13
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -8,
+ 13
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 16
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 3312,
+ 5483
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -13
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 3347,
+ 5937
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ]
+ ],
+ [
+ [
+ 8194,
+ 5466
+ ],
+ [
+ 4,
+ 0
+ ]
+ ],
+ [
+ [
+ 8198,
+ 5466
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ]
+ ],
+ [
+ [
+ 8194,
+ 5466
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 8168,
+ 5448
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 7545,
+ 6783
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 7468,
+ 6757
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 5701,
+ 4159
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 6,
+ -12
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 4,
+ -17
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 7,
+ -11
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5815,
+ 3905
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -5,
+ -11
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -4,
+ -27
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -3,
+ -13
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ -3,
+ -12
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -7,
+ -10
+ ],
+ [
+ -4,
+ -11
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -3,
+ 14
+ ],
+ [
+ -4,
+ 15
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -9,
+ 13
+ ],
+ [
+ -2,
+ 2
+ ]
+ ],
+ [
+ [
+ 5554,
+ 3757
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 0,
+ 24
+ ],
+ [
+ 0,
+ 23
+ ],
+ [
+ 0,
+ 24
+ ],
+ [
+ 0,
+ 23
+ ],
+ [
+ 0,
+ 24
+ ],
+ [
+ 0,
+ 23
+ ],
+ [
+ 0,
+ 24
+ ],
+ [
+ 0,
+ 23
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 14,
+ 4
+ ],
+ [
+ 12,
+ 4
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 7,
+ 11
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 5634,
+ 5813
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 8,
+ -17
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 4,
+ -12
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 3,
+ -12
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -16
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ]
+ ],
+ [
+ [
+ 5670,
+ 5683
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 9,
+ -9
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ]
+ ],
+ [
+ [
+ 5761,
+ 5478
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -13,
+ 5
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -12
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -3,
+ -14
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -14,
+ 7
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -7,
+ -10
+ ],
+ [
+ -6,
+ -22
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -1,
+ -16
+ ],
+ [
+ 0,
+ -12
+ ]
+ ],
+ [
+ [
+ 5516,
+ 5384
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -2,
+ -7
+ ]
+ ],
+ [
+ [
+ 5449,
+ 5315
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 23
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 22
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 2,
+ 9
+ ]
+ ],
+ [
+ [
+ 5429,
+ 5617
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 7,
+ 15
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 3339,
+ 7715
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 3159,
+ 7735
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -2,
+ -6
+ ]
+ ],
+ [
+ [
+ 3145,
+ 7757
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 3306,
+ 7804
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2953,
+ 7809
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ -3,
+ -7
+ ]
+ ],
+ [
+ [
+ 2956,
+ 7803
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 3027,
+ 7884
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ]
+ ],
+ [
+ [
+ 3302,
+ 7830
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 6,
+ 10
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 13
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 7,
+ 20
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -12
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -6,
+ -6
+ ]
+ ],
+ [
+ [
+ 3227,
+ 7860
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 3280,
+ 7907
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 3493,
+ 7916
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -8
+ ]
+ ],
+ [
+ [
+ 3208,
+ 7942
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ]
+ ],
+ [
+ [
+ 3209,
+ 7946
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 1571,
+ 7992
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 1573,
+ 8000
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 2924,
+ 7776
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 9,
+ 9
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 8,
+ 9
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 7,
+ 10
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 13,
+ 11
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 6,
+ 9
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 8,
+ 13
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 10,
+ 6
+ ],
+ [
+ 9,
+ 7
+ ],
+ [
+ 12,
+ 6
+ ],
+ [
+ 15,
+ 9
+ ],
+ [
+ 11,
+ 5
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 16,
+ -4
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 9,
+ -10
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 10,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -6,
+ -9
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 16
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 13
+ ],
+ [
+ 6,
+ 12
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 21,
+ 21
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 10,
+ 6
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 7,
+ 9
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -7,
+ -8
+ ],
+ [
+ -9,
+ -6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ]
+ ],
+ [
+ [
+ 3135,
+ 7785
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ]
+ ],
+ [
+ [
+ 1497,
+ 8027
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ]
+ ],
+ [
+ [
+ 3484,
+ 8040
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3497,
+ 8049
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 1551,
+ 8037
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -8
+ ]
+ ],
+ [
+ [
+ 1482,
+ 8041
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 3283,
+ 8012
+ ],
+ [
+ -12,
+ -1
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -15,
+ 10
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -15,
+ 10
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 11,
+ -3
+ ],
+ [
+ 13,
+ -4
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 14,
+ -12
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ]
+ ],
+ [
+ [
+ 1528,
+ 8065
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 1523,
+ 8069
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 3457,
+ 8105
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 1467,
+ 8101
+ ],
+ [
+ 13,
+ -8
+ ],
+ [
+ 14,
+ -3
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 3,
+ -14
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -9,
+ 5
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 15,
+ -10
+ ]
+ ],
+ [
+ [
+ 3459,
+ 8152
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -6,
+ -9
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -9,
+ -7
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 7,
+ 14
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -6,
+ -18
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -5,
+ -12
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -7,
+ -12
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 11
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -15,
+ 3
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -10,
+ -3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 9,
+ 10
+ ],
+ [
+ 7,
+ 9
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 6,
+ 19
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 4,
+ 15
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 1446,
+ 8149
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 3462,
+ 8173
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ]
+ ],
+ [
+ [
+ 2795,
+ 8176
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 1360,
+ 8177
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -1,
+ -7
+ ]
+ ],
+ [
+ [
+ 1434,
+ 8202
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 1418,
+ 8208
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ]
+ ],
+ [
+ [
+ 1408,
+ 8236
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 2757,
+ 8222
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -14,
+ 6
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 14,
+ 2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 6,
+ -9
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 1340,
+ 8248
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -7,
+ 12
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -9,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ]
+ ],
+ [
+ [
+ 1429,
+ 8233
+ ],
+ [
+ 1,
+ -18
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -10
+ ]
+ ],
+ [
+ [
+ 1412,
+ 8243
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -8
+ ]
+ ],
+ [
+ [
+ 2779,
+ 8254
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 1393,
+ 8246
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 6,
+ -11
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 1382,
+ 8292
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ]
+ ],
+ [
+ [
+ 1315,
+ 8301
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -9,
+ -7
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -9,
+ -5
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ]
+ ],
+ [
+ [
+ 1363,
+ 8322
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ]
+ ],
+ [
+ [
+ 1373,
+ 8338
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 3,
+ 4
+ ]
+ ],
+ [
+ [
+ 1383,
+ 8353
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -1,
+ 1
+ ]
+ ],
+ [
+ [
+ 3305,
+ 8412
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 2810,
+ 8418
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 2778,
+ 8421
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -8,
+ -7
+ ]
+ ],
+ [
+ [
+ 2807,
+ 8425
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -5,
+ -13
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ 7,
+ 17
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -6,
+ -10
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 2791,
+ 8447
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 2781,
+ 8454
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3285,
+ 8499
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ]
+ ],
+ [
+ [
+ 2785,
+ 8497
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 3079,
+ 8584
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 2770,
+ 8618
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2776,
+ 8627
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ]
+ ],
+ [
+ [
+ 3211,
+ 8661
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ]
+ ],
+ [
+ [
+ 3104,
+ 8654
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ -3
+ ]
+ ],
+ [
+ [
+ 2818,
+ 8682
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ]
+ ],
+ [
+ [
+ 3199,
+ 8718
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -9,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 2415,
+ 8746
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 3193,
+ 8748
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 2790,
+ 8779
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 3199,
+ 8787
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 2944,
+ 8791
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 3046,
+ 8787
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 2722,
+ 8810
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -12,
+ -11
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -9,
+ -5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 10,
+ 19
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2836,
+ 8840
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 2870,
+ 8835
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -8,
+ 8
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 10,
+ -6
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 0,
+ -7
+ ]
+ ],
+ [
+ [
+ 2843,
+ 8870
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 2641,
+ 8943
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 9,
+ -7
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 3,
+ -13
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -16,
+ 8
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -8,
+ -8
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -4,
+ 22
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -14,
+ -3
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 13,
+ 7
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 4,
+ 14
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 24
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 4,
+ -10
+ ]
+ ],
+ [
+ [
+ 2648,
+ 8961
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2674,
+ 8974
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 2691,
+ 9002
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ]
+ ],
+ [
+ [
+ 1997,
+ 9043
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ]
+ ],
+ [
+ [
+ 3259,
+ 9046
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -5
+ ]
+ ],
+ [
+ [
+ 2003,
+ 9066
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 1967,
+ 9099
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ]
+ ],
+ [
+ [
+ 2955,
+ 9088
+ ],
+ [
+ -14,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ]
+ ],
+ [
+ [
+ 1963,
+ 9100
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 2594,
+ 9085
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 2898,
+ 9119
+ ],
+ [
+ 14,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -12
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -10,
+ -5
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ]
+ ],
+ [
+ [
+ 2806,
+ 9112
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ]
+ ],
+ [
+ [
+ 2096,
+ 9124
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 2920,
+ 9121
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2171,
+ 9134
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 2216,
+ 9147
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -6
+ ]
+ ],
+ [
+ [
+ 2222,
+ 9159
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 2486,
+ 9171
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 2799,
+ 9149
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ]
+ ],
+ [
+ [
+ 2494,
+ 9182
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2861,
+ 9166
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ]
+ ],
+ [
+ [
+ 2189,
+ 9181
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 2347,
+ 9191
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ]
+ ],
+ [
+ [
+ 1138,
+ 9191
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ]
+ ],
+ [
+ [
+ 3113,
+ 9189
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 2832,
+ 9199
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ]
+ ],
+ [
+ [
+ 2793,
+ 9203
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ -2
+ ]
+ ],
+ [
+ [
+ 2293,
+ 9195
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 11,
+ -7
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -11,
+ 5
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -10,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2585,
+ 9222
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ -2
+ ]
+ ],
+ [
+ [
+ 2213,
+ 9244
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2924,
+ 7776
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -11,
+ -16
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -6,
+ -9
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -9,
+ -6
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -12,
+ -4
+ ],
+ [
+ -10,
+ -3
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 16
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 4,
+ 12
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -2,
+ 15
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -8,
+ 7
+ ],
+ [
+ -8,
+ 6
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -10,
+ 3
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ]
+ ],
+ [
+ [
+ 1589,
+ 8006
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -9,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -5,
+ 11
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -10,
+ -3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -11,
+ -15
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -12
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ -5,
+ 9
+ ],
+ [
+ 9,
+ 9
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 16
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 8,
+ -7
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 6,
+ 10
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 1388,
+ 8403
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 0,
+ 17
+ ]
+ ],
+ [
+ [
+ 1083,
+ 9196
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 13,
+ -2
+ ],
+ [
+ 12,
+ 1
+ ],
+ [
+ 22,
+ -6
+ ],
+ [
+ 13,
+ -12
+ ],
+ [
+ 11,
+ -5
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 17,
+ -7
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 14,
+ -7
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 10,
+ 8
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -23,
+ -13
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -11,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 17,
+ -2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 6,
+ 9
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 16,
+ 6
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 9,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 11,
+ -8
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 6,
+ -10
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 10,
+ -11
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -8,
+ -9
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 11,
+ -5
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 14,
+ -12
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 27,
+ -5
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 8,
+ -6
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 14,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 13,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 10,
+ -6
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -14,
+ 1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 12,
+ 7
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 10,
+ -8
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -8,
+ 11
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -9,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 8,
+ 13
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 15,
+ 2
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 17,
+ 7
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 10,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 8,
+ -7
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 13,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 12,
+ -1
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 10,
+ -13
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 9,
+ -5
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -7,
+ 8
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -7,
+ -10
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 10,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ -19
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 13,
+ -14
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 5,
+ 17
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -13,
+ 6
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -7,
+ 8
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -13,
+ -10
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 9,
+ -4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 14,
+ -11
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 9,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 14,
+ -16
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 10,
+ 13
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 14
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 9,
+ -5
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 15,
+ -1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 8,
+ -9
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -16,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -19,
+ -21
+ ],
+ [
+ -7,
+ -8
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -8,
+ 7
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -9,
+ 7
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 11,
+ -2
+ ],
+ [
+ 12,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 10,
+ -12
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 22,
+ -4
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 15,
+ -1
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -17,
+ -25
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -12,
+ 6
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -12,
+ 7
+ ],
+ [
+ -13,
+ 5
+ ],
+ [
+ -7,
+ 7
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 18,
+ -8
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -12,
+ 2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -8,
+ -6
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 0,
+ -27
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -18
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 15
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 5,
+ -16
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 3,
+ -13
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 6,
+ -18
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 25,
+ 10
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 12,
+ -4
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 9,
+ -16
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 15,
+ -8
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -4,
+ -12
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ -19
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 7,
+ -10
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 21,
+ 11
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 10,
+ 6
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 11,
+ 12
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ -1,
+ 16
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -8,
+ 15
+ ],
+ [
+ -9,
+ 10
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -10,
+ 11
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -5,
+ 13
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 23,
+ -9
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 8,
+ -6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -15,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 15,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 13
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 8,
+ -9
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -14,
+ 3
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -7,
+ -11
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 9,
+ 10
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 16,
+ -2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 6,
+ -13
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -9,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -9,
+ -12
+ ],
+ [
+ -8,
+ -8
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -12,
+ -13
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -12,
+ -17
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -6,
+ -11
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -12,
+ -5
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -14,
+ -3
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -8,
+ -22
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -14,
+ -4
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ -8,
+ -14
+ ],
+ [
+ -4,
+ -11
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -18,
+ 5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 10,
+ -6
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -8,
+ -14
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -7,
+ -16
+ ],
+ [
+ -8,
+ -8
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -10,
+ -5
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -12,
+ -11
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -10,
+ -12
+ ]
+ ],
+ [
+ [
+ 2311,
+ 9385
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ]
+ ],
+ [
+ [
+ 1819,
+ 9365
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 11,
+ -3
+ ],
+ [
+ 17,
+ -7
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -7,
+ -8
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 11,
+ -7
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 5,
+ -14
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 10,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -7,
+ 27
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 10,
+ -5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 11,
+ -7
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 10,
+ -25
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 7,
+ -9
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 9,
+ -8
+ ],
+ [
+ 6,
+ -9
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 9,
+ -7
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 11,
+ -7
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -15,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -14,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -15,
+ -5
+ ],
+ [
+ -14,
+ -2
+ ],
+ [
+ -14,
+ -1
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -22,
+ -1
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -6,
+ 10
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -11,
+ 4
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -13,
+ -1
+ ],
+ [
+ -13,
+ 1
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -12,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -8,
+ 9
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 16,
+ 5
+ ],
+ [
+ 29,
+ 4
+ ],
+ [
+ 26,
+ 4
+ ],
+ [
+ 12,
+ -1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 16,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 12,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -10,
+ 5
+ ],
+ [
+ -29,
+ 10
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -13,
+ -1
+ ],
+ [
+ -19,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -19,
+ -2
+ ],
+ [
+ -16,
+ 2
+ ],
+ [
+ -19,
+ 15
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 14,
+ 4
+ ],
+ [
+ 14,
+ 3
+ ],
+ [
+ 11,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -33,
+ -6
+ ],
+ [
+ -16,
+ -1
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -13,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 10,
+ 11
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 17,
+ 12
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 11,
+ 6
+ ],
+ [
+ 28,
+ 9
+ ],
+ [
+ 25,
+ 9
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 2075,
+ 9384
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -8,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -9,
+ 6
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 24,
+ 3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ]
+ ],
+ [
+ [
+ 2790,
+ 9426
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 30,
+ 2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 19,
+ -7
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -17,
+ 1
+ ],
+ [
+ -22,
+ 4
+ ],
+ [
+ -14,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -16,
+ -5
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 9,
+ -3
+ ]
+ ],
+ [
+ [
+ 2594,
+ 9274
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 15,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 15
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 12,
+ -5
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -8,
+ 6
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 20,
+ -7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -23,
+ 10
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 12,
+ 13
+ ],
+ [
+ 11,
+ 3
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ -9,
+ -8
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 13,
+ 10
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 9,
+ 9
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 11,
+ -6
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -10,
+ 4
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 10,
+ 5
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 11,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -10,
+ -11
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -9,
+ -11
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -4,
+ -17
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 7,
+ 18
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -10,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 9,
+ -10
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -13,
+ 3
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 12,
+ -5
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -11,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -12,
+ -6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 16,
+ 5
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -14,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 13,
+ -6
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 8,
+ -6
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -11,
+ -10
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 7,
+ 9
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 9,
+ -9
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 12,
+ -7
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -18
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -6,
+ 11
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -9,
+ 7
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -6,
+ 16
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -14
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -11,
+ 11
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -10,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -26,
+ 4
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -10,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -7,
+ 9
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -6,
+ 10
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -7,
+ 9
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 12,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 12,
+ -5
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -7,
+ 8
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 11,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -7,
+ 8
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 12,
+ 9
+ ],
+ [
+ 10,
+ 8
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ 18
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ -7,
+ 9
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -11,
+ -7
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -15,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -13,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -18,
+ 12
+ ],
+ [
+ -11,
+ -4
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -12,
+ 6
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -11,
+ -2
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -18,
+ 2
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -10,
+ -4
+ ],
+ [
+ -12,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -8,
+ 7
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -10,
+ 13
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -15,
+ 1
+ ],
+ [
+ -14,
+ 3
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 15,
+ 11
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 20,
+ 5
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 12,
+ -1
+ ],
+ [
+ 24,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -9,
+ -9
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -11,
+ -17
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 8,
+ -8
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ]
+ ],
+ [
+ [
+ 2222,
+ 9443
+ ],
+ [
+ 23,
+ -12
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -9,
+ -3
+ ],
+ [
+ -10,
+ -10
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -16,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -10,
+ 9
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -8,
+ 9
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -12,
+ 6
+ ],
+ [
+ -7,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -15,
+ 9
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ]
+ ],
+ [
+ [
+ 2270,
+ 9439
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 15,
+ 4
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ]
+ ],
+ [
+ [
+ 2412,
+ 9455
+ ],
+ [
+ 11,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 16,
+ -1
+ ],
+ [
+ 12,
+ -4
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -26,
+ 5
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -17,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -9,
+ -10
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -11,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -8,
+ 16
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 15,
+ 1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ]
+ ],
+ [
+ [
+ 1674,
+ 9453
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 21,
+ -16
+ ],
+ [
+ 9,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -13,
+ -5
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -16,
+ -8
+ ],
+ [
+ -11,
+ -4
+ ],
+ [
+ -14,
+ -8
+ ],
+ [
+ -28,
+ -13
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -8,
+ -14
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -11,
+ -10
+ ],
+ [
+ -11,
+ -5
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -5,
+ 12
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -21,
+ 9
+ ],
+ [
+ -10,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -13,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 11
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -9,
+ 17
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 34,
+ 5
+ ],
+ [
+ 24,
+ 2
+ ],
+ [
+ 24,
+ 4
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 9,
+ -4
+ ],
+ [
+ 17,
+ -5
+ ],
+ [
+ 11,
+ -2
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 2295,
+ 9476
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ]
+ ],
+ [
+ [
+ 2352,
+ 9475
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -10,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2108,
+ 9506
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -8,
+ -2
+ ]
+ ],
+ [
+ [
+ 2401,
+ 9505
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -9,
+ 6
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -11,
+ 2
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 18,
+ 5
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 9,
+ -7
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 2331,
+ 9533
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ]
+ ],
+ [
+ [
+ 1637,
+ 9547
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 2374,
+ 9547
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -6,
+ -1
+ ]
+ ],
+ [
+ [
+ 1713,
+ 9537
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 11,
+ 8
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -9,
+ -11
+ ],
+ [
+ -3,
+ -2
+ ]
+ ],
+ [
+ [
+ 2804,
+ 9557
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 2160,
+ 9562
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -16,
+ -4
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 13,
+ 3
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -4
+ ]
+ ],
+ [
+ [
+ 2110,
+ 9595
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 11,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -23,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ]
+ ],
+ [
+ [
+ 2286,
+ 9588
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 12,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 12,
+ 3
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -20,
+ -1
+ ],
+ [
+ -27,
+ -4
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -30,
+ -6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 19,
+ -11
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -13,
+ 2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 10,
+ -6
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 2188,
+ 9595
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ -14,
+ -5
+ ],
+ [
+ -13,
+ -4
+ ]
+ ],
+ [
+ [
+ 1992,
+ 9565
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 14,
+ -3
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -5,
+ -12
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -14,
+ -4
+ ],
+ [
+ -10,
+ -5
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -10,
+ 3
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -14,
+ -7
+ ],
+ [
+ -19,
+ -3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -10,
+ -3
+ ],
+ [
+ -12,
+ -5
+ ],
+ [
+ -22,
+ -5
+ ],
+ [
+ -14,
+ -1
+ ],
+ [
+ -13,
+ 2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -10,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 15,
+ 3
+ ],
+ [
+ 13,
+ 6
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 13,
+ 1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -11,
+ -1
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -12,
+ -5
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -11,
+ 4
+ ],
+ [
+ -10,
+ 8
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -14,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 19,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 21,
+ 7
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -25,
+ -5
+ ],
+ [
+ -11,
+ -2
+ ],
+ [
+ -17,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 15,
+ 2
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ -17,
+ 0
+ ],
+ [
+ -21,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 23,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -18,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 16,
+ 4
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 13,
+ 3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 10,
+ -8
+ ],
+ [
+ 13,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 39,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -24,
+ 9
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 11,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 10,
+ 10
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ]
+ ],
+ [
+ [
+ 2507,
+ 9591
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 1845,
+ 9604
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -29,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 15,
+ 1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ]
+ ],
+ [
+ [
+ 2380,
+ 9614
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 12,
+ 8
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 12,
+ 1
+ ],
+ [
+ 14,
+ 3
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -11,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 13,
+ -1
+ ],
+ [
+ 44,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -25,
+ -2
+ ],
+ [
+ -14,
+ 2
+ ],
+ [
+ -12,
+ 3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 13,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 10,
+ -6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 11,
+ -8
+ ],
+ [
+ 13,
+ 4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 12,
+ -7
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 11,
+ 4
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 13,
+ 7
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 15,
+ -3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 15,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 14,
+ -3
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -10,
+ -4
+ ],
+ [
+ -10,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -12,
+ -3
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -27,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -10,
+ 3
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -10,
+ -3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -12,
+ 1
+ ],
+ [
+ -11,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -15,
+ 1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -10,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -19,
+ 8
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 14,
+ -3
+ ],
+ [
+ 15,
+ -4
+ ],
+ [
+ 8,
+ -2
+ ]
+ ],
+ [
+ [
+ 1790,
+ 9640
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -16,
+ -5
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -15,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 21,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 10,
+ 10
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 14,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 10,
+ 8
+ ],
+ [
+ 10,
+ 6
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 23,
+ 3
+ ],
+ [
+ 16,
+ -4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 13,
+ -5
+ ]
+ ],
+ [
+ [
+ 2504,
+ 9634
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -21,
+ 7
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 9,
+ -6
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ]
+ ],
+ [
+ [
+ 2095,
+ 9627
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 2347,
+ 9664
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 18,
+ -1
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -16,
+ 1
+ ],
+ [
+ -44,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 13,
+ 4
+ ],
+ [
+ 5,
+ 0
+ ]
+ ],
+ [
+ [
+ 2175,
+ 9659
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ]
+ ],
+ [
+ [
+ 1838,
+ 9662
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -10,
+ 9
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ]
+ ],
+ [
+ [
+ 1932,
+ 9682
+ ],
+ [
+ 22,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -12,
+ -3
+ ],
+ [
+ -16,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -20,
+ -5
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 14,
+ 4
+ ],
+ [
+ 31,
+ 5
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 8,
+ 0
+ ]
+ ],
+ [
+ [
+ 2139,
+ 9685
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -6,
+ -4
+ ]
+ ],
+ [
+ [
+ 1949,
+ 9714
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -10,
+ 5
+ ],
+ [
+ -12,
+ -2
+ ],
+ [
+ -12,
+ -3
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 12,
+ 3
+ ],
+ [
+ 14,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ]
+ ],
+ [
+ [
+ 2327,
+ 9707
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -13,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -13,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 13,
+ -1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2127,
+ 9752
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 11,
+ -6
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 13,
+ 2
+ ],
+ [
+ 12,
+ -6
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 12,
+ -10
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -15,
+ 4
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -26,
+ -3
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 14,
+ -2
+ ],
+ [
+ 12,
+ -2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -12,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -13,
+ -1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -10,
+ -8
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -11,
+ -1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 15,
+ -1
+ ],
+ [
+ 25,
+ 2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 8,
+ -2
+ ]
+ ],
+ [
+ [
+ 2256,
+ 9791
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 2447,
+ 9857
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 13,
+ -11
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 11,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 9,
+ -9
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -23,
+ -6
+ ],
+ [
+ -10,
+ -4
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -8,
+ 6
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -11,
+ 9
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -7,
+ 7
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -13,
+ 1
+ ],
+ [
+ -14,
+ 3
+ ],
+ [
+ -13,
+ 4
+ ],
+ [
+ -9,
+ 5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 12,
+ 1
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -22,
+ 2
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -16,
+ 4
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 18,
+ 6
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 19,
+ 2
+ ],
+ [
+ 14,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -11,
+ -1
+ ],
+ [
+ -16,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -10,
+ -4
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -10,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -12,
+ -4
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 22,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -13,
+ 8
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 27,
+ -4
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 21,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -16,
+ -4
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 16,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -11,
+ 2
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -12,
+ 3
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 13,
+ -1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -13,
+ 1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 18,
+ -4
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ]
+ ],
+ [
+ [
+ 3069,
+ 9965
+ ],
+ [
+ 23,
+ -1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 23,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -42,
+ -8
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 11,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 14,
+ 3
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 8,
+ -6
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 21,
+ 4
+ ],
+ [
+ 22,
+ -2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -10,
+ -6
+ ],
+ [
+ -10,
+ -4
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -31,
+ -9
+ ],
+ [
+ -15,
+ -3
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -18,
+ 0
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -17,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -49,
+ -11
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 72,
+ 14
+ ],
+ [
+ 13,
+ 1
+ ],
+ [
+ 13,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -18,
+ -9
+ ],
+ [
+ -23,
+ -8
+ ],
+ [
+ -12,
+ -6
+ ],
+ [
+ -29,
+ -11
+ ],
+ [
+ -24,
+ -10
+ ],
+ [
+ -9,
+ -6
+ ],
+ [
+ -12,
+ -9
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 12,
+ -13
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -23,
+ -3
+ ],
+ [
+ -11,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 21,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -16,
+ -5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -16,
+ -4
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -29,
+ 8
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 14,
+ -2
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -13,
+ -2
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -14,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -16,
+ 0
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -17,
+ -2
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 19,
+ 2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 13,
+ -6
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -15,
+ -1
+ ],
+ [
+ -15,
+ 0
+ ],
+ [
+ -12,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 18,
+ -5
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -10,
+ -6
+ ],
+ [
+ -9,
+ -12
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -10,
+ -3
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -14,
+ 1
+ ],
+ [
+ -15,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -21,
+ -2
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -14,
+ 7
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 11,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -18,
+ -7
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -12,
+ -3
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -14,
+ -4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -32,
+ -1
+ ],
+ [
+ -13,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -7,
+ 10
+ ],
+ [
+ -1,
+ -18
+ ],
+ [
+ -24,
+ -3
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -12,
+ 5
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -11,
+ 2
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ -17,
+ 1
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -16,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 20,
+ 9
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -7,
+ 7
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 7,
+ -8
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 18,
+ -5
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 14,
+ 1
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 10,
+ 8
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -16,
+ -16
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -9,
+ -5
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -10,
+ -3
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ -8,
+ 9
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 11,
+ 8
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ 4,
+ 17
+ ],
+ [
+ -7,
+ -13
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -17,
+ -2
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -10,
+ -5
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 16,
+ 3
+ ],
+ [
+ 15,
+ 1
+ ],
+ [
+ 13,
+ 3
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 24,
+ -2
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 16,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -11,
+ 2
+ ],
+ [
+ -20,
+ 0
+ ],
+ [
+ -11,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -9,
+ 7
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -16,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -8,
+ 6
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 32,
+ -3
+ ],
+ [
+ 14,
+ 1
+ ],
+ [
+ 17,
+ -1
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 11,
+ -5
+ ],
+ [
+ 9,
+ -5
+ ],
+ [
+ 9,
+ -4
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 10,
+ -7
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 12,
+ -3
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -8,
+ 6
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -13,
+ 6
+ ],
+ [
+ -10,
+ 7
+ ],
+ [
+ -8,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 43,
+ 4
+ ],
+ [
+ 26,
+ 5
+ ],
+ [
+ 11,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 34,
+ 8
+ ],
+ [
+ 25,
+ 3
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -17,
+ 0
+ ],
+ [
+ -15,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 21,
+ 9
+ ],
+ [
+ 14,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ -30,
+ -6
+ ],
+ [
+ -11,
+ -4
+ ],
+ [
+ -10,
+ -6
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -10,
+ -4
+ ],
+ [
+ -24,
+ -7
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -22,
+ -4
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 12,
+ 6
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -17,
+ -1
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -20,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -12,
+ 3
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 17,
+ 8
+ ],
+ [
+ 11,
+ 4
+ ],
+ [
+ 16,
+ 3
+ ],
+ [
+ 36,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -37,
+ -3
+ ],
+ [
+ -32,
+ -4
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -23,
+ -12
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -11,
+ -1
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -11,
+ 4
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 21,
+ 3
+ ],
+ [
+ 28,
+ 0
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 13,
+ 2
+ ],
+ [
+ 18,
+ 5
+ ],
+ [
+ 20,
+ 7
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -13,
+ -3
+ ],
+ [
+ -20,
+ -7
+ ],
+ [
+ -19,
+ -2
+ ],
+ [
+ -44,
+ -1
+ ],
+ [
+ -15,
+ -2
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 11,
+ 3
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -12,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 15,
+ 5
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 14,
+ 1
+ ],
+ [
+ 14,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -14,
+ 1
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -14,
+ -2
+ ],
+ [
+ -37,
+ -8
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 20,
+ 9
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -14,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 12,
+ 3
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 15,
+ 0
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 14,
+ 2
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -35,
+ 9
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 15,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 11,
+ -8
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 19,
+ -5
+ ],
+ [
+ 29,
+ -7
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -14,
+ 6
+ ],
+ [
+ -37,
+ 9
+ ],
+ [
+ -15,
+ 5
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -9,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 16,
+ -3
+ ],
+ [
+ 29,
+ -2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -11,
+ 2
+ ],
+ [
+ -13,
+ 3
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 19,
+ 0
+ ],
+ [
+ 18,
+ -3
+ ],
+ [
+ 16,
+ 1
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 22,
+ -9
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -13,
+ 5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -14,
+ 6
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 39,
+ 2
+ ],
+ [
+ 37,
+ -2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 12,
+ -5
+ ],
+ [
+ 17,
+ -3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -13,
+ 5
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 14,
+ 5
+ ],
+ [
+ 21,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 16,
+ -7
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 25,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 5264,
+ 7907
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ]
+ ],
+ [
+ [
+ 5290,
+ 7883
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 5195,
+ 7829
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ]
+ ],
+ [
+ [
+ 5211,
+ 7925
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 5,
+ -4
+ ]
+ ],
+ [
+ [
+ 3123,
+ 1965
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3131,
+ 1971
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 3153,
+ 2003
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3136,
+ 2007
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 13,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 3064,
+ 2021
+ ],
+ [
+ 22,
+ -6
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 6,
+ -2
+ ]
+ ],
+ [
+ [
+ 3028,
+ 2023
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ]
+ ],
+ [
+ [
+ 3017,
+ 2072
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 5,
+ -4
+ ]
+ ],
+ [
+ [
+ 2974,
+ 2103
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 2933,
+ 2136
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 3093,
+ 2024
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -11,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -11,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ -15
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -22,
+ 14
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ -11
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2940,
+ 2193
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2921,
+ 2210
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ]
+ ],
+ [
+ [
+ 2929,
+ 2230
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 2908,
+ 2265
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 2915,
+ 2287
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 2913,
+ 2371
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 2931,
+ 2353
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -19
+ ]
+ ],
+ [
+ [
+ 2902,
+ 2375
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 4,
+ 15
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 2928,
+ 2385
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -10
+ ]
+ ],
+ [
+ [
+ 2913,
+ 2428
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2935,
+ 2552
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ]
+ ],
+ [
+ [
+ 2915,
+ 2598
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 2954,
+ 2602
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 2972,
+ 2605
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -3
+ ]
+ ],
+ [
+ [
+ 2952,
+ 2627
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 2949,
+ 2659
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 2926,
+ 2672
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 2950,
+ 2687
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 2,
+ 17
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 9,
+ -4
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 2811,
+ 3246
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 1964,
+ 3621
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ]
+ ],
+ [
+ [
+ 3098,
+ 2168
+ ],
+ [
+ -15,
+ 6
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -14,
+ -8
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -15
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 15
+ ],
+ [
+ 9,
+ 7
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -14,
+ -14
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -8,
+ 7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 9,
+ 9
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -12,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -11,
+ 8
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 9,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -9,
+ -3
+ ],
+ [
+ -7,
+ -8
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ 16
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 4,
+ -13
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 8,
+ -7
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -14
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 18
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 9,
+ -9
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 13
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -3,
+ -17
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 9,
+ 11
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 14
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -1,
+ 13
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ -12
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 4,
+ 23
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 21
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ -7,
+ 34
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 2,
+ 14
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -4,
+ 12
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 3,
+ 23
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 3,
+ 18
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 18
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ 0,
+ 23
+ ],
+ [
+ -2,
+ 18
+ ],
+ [
+ -2,
+ 18
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ -1,
+ 13
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 17
+ ],
+ [
+ 7,
+ 11
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 1,
+ 16
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ -1,
+ 16
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 18
+ ],
+ [
+ 2,
+ 15
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 3,
+ 13
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 3,
+ 14
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 14
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 3,
+ 13
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -3,
+ 23
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ 18
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 17
+ ],
+ [
+ 1,
+ 21
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -3,
+ 30
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 1,
+ 18
+ ],
+ [
+ 0,
+ 24
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 13
+ ],
+ [
+ -2,
+ 25
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -1,
+ 3
+ ]
+ ],
+ [
+ [
+ 3044,
+ 4127
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ]
+ ],
+ [
+ [
+ 8079,
+ 6335
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -15
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -1,
+ 13
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 20
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 8065,
+ 6399
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ]
+ ],
+ [
+ [
+ 8128,
+ 6430
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 8132,
+ 6428
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ]
+ ],
+ [
+ [
+ 8154,
+ 6497
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 8282,
+ 6595
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 8328,
+ 6650
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 8367,
+ 6802
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8393,
+ 6893
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 8399,
+ 6906
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8396,
+ 6910
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8384,
+ 6998
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 8625,
+ 7634
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ]
+ ],
+ [
+ [
+ 8454,
+ 7488
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -14,
+ -14
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 11,
+ 8
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 5,
+ 12
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -8,
+ 9
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -8,
+ -21
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -15,
+ -12
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -5,
+ -11
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ -16
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 15,
+ -5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 10,
+ 8
+ ],
+ [
+ 9,
+ -6
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ -18
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 3,
+ -15
+ ],
+ [
+ 4,
+ -13
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 8,
+ -7
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -9,
+ 9
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -6,
+ 10
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -9,
+ -8
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 9,
+ -9
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -9,
+ -8
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 7,
+ -14
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -6,
+ -11
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -20
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -13
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 8173,
+ 6482
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 8166,
+ 6480
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 8153,
+ 6465
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 8151,
+ 6462
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ]
+ ],
+ [
+ [
+ 7998,
+ 6423
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -8,
+ 13
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 7836,
+ 6473
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ]
+ ],
+ [
+ [
+ 7809,
+ 6426
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 18
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 7703,
+ 6809
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ]
+ ],
+ [
+ [
+ 7468,
+ 6757
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 14
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 7447,
+ 6789
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -8,
+ 7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -5,
+ -14
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ]
+ ],
+ [
+ [
+ 7250,
+ 6921
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ]
+ ],
+ [
+ [
+ 7224,
+ 6957
+ ],
+ [
+ -5,
+ 6
+ ]
+ ],
+ [
+ [
+ 7219,
+ 6963
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ [
+ [
+ 7219,
+ 6963
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ]
+ ],
+ [
+ [
+ 7204,
+ 6974
+ ],
+ [
+ -1,
+ 1
+ ]
+ ],
+ [
+ [
+ 7203,
+ 6975
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ]
+ ],
+ [
+ [
+ 7186,
+ 7020
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 11
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 7200,
+ 7056
+ ],
+ [
+ 0,
+ 3
+ ]
+ ],
+ [
+ [
+ 7200,
+ 7059
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ]
+ ],
+ [
+ [
+ 7197,
+ 7094
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 7197,
+ 7098
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ]
+ ],
+ [
+ [
+ 7161,
+ 7228
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 7160,
+ 7228
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ]
+ ],
+ [
+ [
+ 7132,
+ 7238
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 7080,
+ 7328
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ]
+ ],
+ [
+ [
+ 7045,
+ 7456
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 8,
+ 9
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 7,
+ 12
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 11,
+ 9
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ]
+ ],
+ [
+ [
+ 7227,
+ 7614
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 4,
+ 14
+ ],
+ [
+ 3,
+ 13
+ ],
+ [
+ 5,
+ 20
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ]
+ ],
+ [
+ [
+ 7425,
+ 8011
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 7439,
+ 8015
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 11,
+ -2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -11
+ ],
+ [
+ 5,
+ -16
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 15,
+ -3
+ ],
+ [
+ 14,
+ -3
+ ],
+ [
+ 13,
+ -2
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 14,
+ -2
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 12,
+ -4
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 12,
+ -4
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 12,
+ 8
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 12,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 9,
+ -4
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 5,
+ 14
+ ],
+ [
+ 5,
+ 16
+ ],
+ [
+ 2,
+ 8
+ ]
+ ],
+ [
+ [
+ 8240,
+ 8054
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 9,
+ 10
+ ],
+ [
+ 7,
+ 9
+ ],
+ [
+ 9,
+ 7
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 8,
+ 11
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 10,
+ 4
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 7,
+ -13
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 10,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 3,
+ -23
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -17
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 4914,
+ 5479
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 4913,
+ 5477
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ]
+ ],
+ [
+ [
+ 4925,
+ 5730
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -16
+ ],
+ [
+ 2,
+ -16
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -13
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -15
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ]
+ ],
+ [
+ [
+ 4916,
+ 5479
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -15,
+ 6
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 14,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -17,
+ -3
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -14,
+ -2
+ ],
+ [
+ -10,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -13,
+ -11
+ ],
+ [
+ -9,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -3,
+ -2
+ ]
+ ],
+ [
+ [
+ 4790,
+ 5434
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 15
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 5,
+ 11
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -3,
+ 20
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 4764,
+ 5619
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ]
+ ],
+ [
+ [
+ 4778,
+ 5769
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5449,
+ 5315
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ]
+ ],
+ [
+ [
+ 5369,
+ 5308
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 5314,
+ 5309
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 5272,
+ 5317
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -6,
+ 14
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 5237,
+ 5458
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 2,
+ 16
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ 2,
+ 17
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ 5,
+ 15
+ ],
+ [
+ 5,
+ 15
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -3,
+ 27
+ ]
+ ],
+ [
+ [
+ 5390,
+ 5937
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 1,
+ -14
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 1,
+ -15
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ 6,
+ -10
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 4,
+ -14
+ ],
+ [
+ 3,
+ -14
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ]
+ ],
+ [
+ [
+ 5761,
+ 5478
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 5,
+ -11
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5856,
+ 5385
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -6,
+ -14
+ ],
+ [
+ -13,
+ -26
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -19
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 5821,
+ 5104
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 5816,
+ 4928
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -11
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 4,
+ -12
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -5
+ ]
+ ],
+ [
+ [
+ 5854,
+ 4712
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 4,
+ -14
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -5,
+ 9
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ]
+ ],
+ [
+ [
+ 5362,
+ 4846
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ]
+ ],
+ [
+ [
+ 5363,
+ 4917
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 5,
+ 14
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 4,
+ 17
+ ],
+ [
+ 1,
+ 16
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 33
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 5,
+ 19
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 8,
+ 13
+ ],
+ [
+ 6,
+ 13
+ ],
+ [
+ -1,
+ 16
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ 3,
+ 16
+ ],
+ [
+ 1,
+ 18
+ ],
+ [
+ -1,
+ 18
+ ],
+ [
+ 1,
+ 15
+ ],
+ [
+ 3,
+ 18
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 4,
+ 23
+ ],
+ [
+ 4,
+ 14
+ ],
+ [
+ 4,
+ 15
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ -1,
+ 10
+ ]
+ ],
+ [
+ [
+ 5333,
+ 4896
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -8,
+ 14
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -6,
+ 12
+ ]
+ ],
+ [
+ [
+ 5309,
+ 4958
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 10,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 0,
+ 4
+ ]
+ ],
+ [
+ [
+ 563,
+ 3960
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 2830,
+ 5330
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 3019,
+ 5867
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -6,
+ -23
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -14
+ ],
+ [
+ -2,
+ -17
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -1,
+ -13
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -15
+ ],
+ [
+ 1,
+ -12
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ -13
+ ],
+ [
+ 5,
+ -12
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ -1,
+ -15
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -13
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -9,
+ -17
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 3056,
+ 4940
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 6,
+ 18
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ 4,
+ 13
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 2908,
+ 5178
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -5,
+ 9
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ]
+ ],
+ [
+ [
+ 2809,
+ 5268
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 15
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 5,
+ 19
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -3,
+ 5
+ ]
+ ],
+ [
+ [
+ 2836,
+ 5600
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 2850,
+ 5683
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 17
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 12,
+ 17
+ ],
+ [
+ 4,
+ 15
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 11,
+ -7
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 17,
+ 24
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 6216,
+ 4475
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ]
+ ],
+ [
+ [
+ 6235,
+ 4488
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 6207,
+ 4498
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 18
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 4324,
+ 6039
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ]
+ ],
+ [
+ [
+ 4356,
+ 6056
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 4348,
+ 6048
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -8
+ ]
+ ],
+ [
+ [
+ 4363,
+ 6119
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ]
+ ],
+ [
+ [
+ 4330,
+ 6141
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ]
+ ],
+ [
+ [
+ 4364,
+ 6143
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ]
+ ],
+ [
+ [
+ 4308,
+ 6152
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 4300,
+ 6160
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ -6
+ ]
+ ],
+ [
+ [
+ 2676,
+ 5813
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 4,
+ -15
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 6,
+ -16
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ -12
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 2706,
+ 5735
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 2698,
+ 5649
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -9,
+ 12
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 11
+ ],
+ [
+ -9,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 2618,
+ 5821
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ]
+ ],
+ [
+ [
+ 2706,
+ 6426
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 2842,
+ 6448
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 2836,
+ 6458
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 2832,
+ 6467
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 2816,
+ 6483
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ]
+ ],
+ [
+ [
+ 2796,
+ 6489
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2726,
+ 6518
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 15,
+ -15
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -11,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ 4,
+ 13
+ ],
+ [
+ 10,
+ 13
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -10,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -15,
+ 9
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -13,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -24,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 10,
+ 8
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 22,
+ 18
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 14,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 7,
+ -2
+ ]
+ ],
+ [
+ [
+ 3090,
+ 5878
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ -6
+ ]
+ ],
+ [
+ [
+ 2739,
+ 6298
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 2778,
+ 6319
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 2782,
+ 6319
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ]
+ ],
+ [
+ [
+ 5944,
+ 7204
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ]
+ ],
+ [
+ [
+ 5908,
+ 7210
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 13,
+ 7
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -15,
+ -17
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ]
+ ],
+ [
+ [
+ 5944,
+ 7204
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -6,
+ -9
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 5411,
+ 8113
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 7,
+ -8
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 6,
+ -9
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5523,
+ 8036
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ]
+ ],
+ [
+ [
+ 5383,
+ 7993
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 5394,
+ 8287
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 5,
+ -5
+ ]
+ ],
+ [
+ [
+ 5394,
+ 8291
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 5313,
+ 8318
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 5380,
+ 8316
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ]
+ ],
+ [
+ [
+ 5238,
+ 8335
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 5270,
+ 8342
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 11,
+ -7
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ 9
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 8,
+ -8
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 5396,
+ 8279
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -16
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 8,
+ -8
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 5211,
+ 7925
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5176,
+ 8032
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ]
+ ],
+ [
+ [
+ 5166,
+ 8107
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 6
+ ]
+ ],
+ [
+ [
+ 5199,
+ 8253
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 8,
+ -12
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -9,
+ 15
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 15
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ]
+ ],
+ [
+ [
+ 5240,
+ 8346
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 5230,
+ 8339
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 6201,
+ 5846
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -3,
+ -12
+ ]
+ ],
+ [
+ [
+ 6192,
+ 5817
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 13
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 3,
+ 8
+ ]
+ ],
+ [
+ [
+ 6177,
+ 5902
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ]
+ ],
+ [
+ [
+ 6197,
+ 5916
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 5,
+ -11
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ]
+ ],
+ [
+ [
+ 3297,
+ 6062
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -1,
+ -7
+ ]
+ ],
+ [
+ [
+ 5315,
+ 8345
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -12,
+ 9
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ -4
+ ]
+ ],
+ [
+ [
+ 5291,
+ 8343
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 5348,
+ 8350
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5279,
+ 8345
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 5298,
+ 8337
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -4,
+ -15
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5419,
+ 8353
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 10,
+ -9
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 5295,
+ 8387
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 3
+ ]
+ ],
+ [
+ [
+ 5351,
+ 8386
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 5294,
+ 8397
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5349,
+ 8397
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ -8
+ ]
+ ],
+ [
+ [
+ 5306,
+ 8481
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5240,
+ 8346
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ 2,
+ 18
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 1,
+ 16
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 7,
+ 14
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -12
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ]
+ ],
+ [
+ [
+ 3006,
+ 6223
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ 0,
+ 2
+ ]
+ ],
+ [
+ [
+ 3006,
+ 6320
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 6,
+ -11
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -5,
+ -13
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ]
+ ],
+ [
+ [
+ 5238,
+ 7311
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -13
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 2,
+ -14
+ ],
+ [
+ 1,
+ -14
+ ],
+ [
+ 3,
+ -17
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 2,
+ -14
+ ]
+ ],
+ [
+ [
+ 5264,
+ 6925
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 5,
+ -11
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ 2,
+ -11
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ -1,
+ -23
+ ],
+ [
+ 1,
+ -30
+ ],
+ [
+ 2,
+ -15
+ ],
+ [
+ -3,
+ -13
+ ],
+ [
+ -2,
+ -13
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 5,
+ -15
+ ],
+ [
+ 6,
+ -17
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 3,
+ -15
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 12,
+ -7
+ ],
+ [
+ 11,
+ -7
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 4,
+ -14
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 3,
+ -11
+ ]
+ ],
+ [
+ [
+ 5332,
+ 6538
+ ],
+ [
+ -14,
+ -17
+ ],
+ [
+ -15,
+ -18
+ ],
+ [
+ -14,
+ -17
+ ],
+ [
+ -15,
+ -18
+ ],
+ [
+ -14,
+ -18
+ ],
+ [
+ -14,
+ -17
+ ],
+ [
+ -15,
+ -18
+ ],
+ [
+ -14,
+ -17
+ ],
+ [
+ -10,
+ -12
+ ],
+ [
+ -6,
+ -10
+ ],
+ [
+ -7,
+ -13
+ ],
+ [
+ -8,
+ -13
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -8,
+ -13
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -8,
+ -14
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -11,
+ -4
+ ],
+ [
+ -10,
+ -4
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -6,
+ -3
+ ]
+ ],
+ [
+ [
+ 5117,
+ 6286
+ ],
+ [
+ -9,
+ -3
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -9,
+ 9
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -9,
+ 12
+ ],
+ [
+ -9,
+ 12
+ ],
+ [
+ -9,
+ 13
+ ],
+ [
+ -9,
+ 12
+ ],
+ [
+ -9,
+ 12
+ ],
+ [
+ -9,
+ 13
+ ],
+ [
+ -9,
+ 12
+ ],
+ [
+ -10,
+ 12
+ ],
+ [
+ -9,
+ 13
+ ],
+ [
+ -9,
+ 12
+ ],
+ [
+ -9,
+ 12
+ ],
+ [
+ -9,
+ 13
+ ],
+ [
+ -9,
+ 12
+ ],
+ [
+ -9,
+ 12
+ ],
+ [
+ -9,
+ 13
+ ],
+ [
+ -9,
+ 12
+ ],
+ [
+ -8,
+ 10
+ ],
+ [
+ -8,
+ 12
+ ]
+ ],
+ [
+ [
+ 4866,
+ 6624
+ ],
+ [
+ -7,
+ 8
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ -7,
+ 8
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -6,
+ 6
+ ]
+ ],
+ [
+ [
+ 4758,
+ 6755
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 10
+ ]
+ ],
+ [
+ [
+ 4758,
+ 6777
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 7,
+ 9
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 7,
+ 10
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 12,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 1,
+ 14
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ]
+ ],
+ [
+ [
+ 4938,
+ 7206
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 14,
+ 11
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 20,
+ 3
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 15,
+ 0
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 28,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 9,
+ 7
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 10,
+ -5
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 13,
+ 1
+ ]
+ ],
+ [
+ [
+ 2774,
+ 5013
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -7
+ ]
+ ],
+ [
+ [
+ 2488,
+ 5107
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 2516,
+ 5131
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ]
+ ],
+ [
+ [
+ 2490,
+ 5139
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2460,
+ 5157
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 2484,
+ 5165
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 2464,
+ 5185
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 6,
+ -11
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 15
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 2808,
+ 5256
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -6
+ ]
+ ],
+ [
+ [
+ 2908,
+ 5178
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -14
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -6,
+ -14
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -8,
+ -6
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ]
+ ],
+ [
+ [
+ 2768,
+ 4989
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 18
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 1,
+ -16
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -7,
+ 13
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ 1,
+ 14
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 11
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 1,
+ 14
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ -1,
+ 10
+ ]
+ ],
+ [
+ [
+ 5949,
+ 6988
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ]
+ ],
+ [
+ [
+ 5951,
+ 6981
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -14
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 2,
+ -14
+ ],
+ [
+ 1,
+ -5
+ ]
+ ],
+ [
+ [
+ 5969,
+ 6882
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -3,
+ -30
+ ],
+ [
+ -5,
+ -23
+ ],
+ [
+ 0,
+ -14
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -8,
+ 12
+ ],
+ [
+ -4,
+ 12
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -6,
+ 13
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 16
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 5,
+ -13
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -12
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 2,
+ -23
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 8,
+ -30
+ ],
+ [
+ 7,
+ -19
+ ],
+ [
+ 3,
+ -15
+ ],
+ [
+ 5,
+ -17
+ ],
+ [
+ 9,
+ -38
+ ],
+ [
+ 6,
+ -12
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -19
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 4,
+ -19
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 9,
+ -7
+ ],
+ [
+ 5,
+ -13
+ ],
+ [
+ 11,
+ -17
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 6024,
+ 6451
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ]
+ ],
+ [
+ [
+ 5693,
+ 6451
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 14
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 4,
+ 12
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ]
+ ],
+ [
+ [
+ 5698,
+ 7007
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 15,
+ 6
+ ],
+ [
+ 15,
+ -6
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 13,
+ -5
+ ],
+ [
+ 8,
+ -9
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 16,
+ -3
+ ],
+ [
+ 8,
+ -6
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 10,
+ 12
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -9,
+ -6
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 9,
+ -7
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 6,
+ -9
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 6114,
+ 6088
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ]
+ ],
+ [
+ [
+ 6113,
+ 6110
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 6072,
+ 6221
+ ],
+ [
+ 8,
+ -33
+ ],
+ [
+ 4,
+ -20
+ ],
+ [
+ 3,
+ -21
+ ],
+ [
+ 2,
+ -30
+ ],
+ [
+ 2,
+ -16
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 3,
+ -15
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -14
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 10,
+ -7
+ ],
+ [
+ 9,
+ -22
+ ],
+ [
+ 5,
+ -15
+ ],
+ [
+ 16,
+ -23
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ -11
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -6
+ ]
+ ],
+ [
+ [
+ 6177,
+ 5902
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -8,
+ 10
+ ],
+ [
+ -6,
+ 14
+ ],
+ [
+ -5,
+ 14
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -9,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 11
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -3,
+ -14
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 13
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ]
+ ],
+ [
+ [
+ 6014,
+ 6005
+ ],
+ [
+ -1,
+ 17
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 3,
+ 21
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 14
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 3,
+ 4
+ ]
+ ],
+ [
+ [
+ 4503,
+ 6786
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 4572,
+ 6805
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 4522,
+ 6798
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ]
+ ],
+ [
+ [
+ 4546,
+ 6818
+ ],
+ [
+ -3,
+ -13
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -6,
+ -9
+ ]
+ ],
+ [
+ [
+ 4605,
+ 6806
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 4,
+ 12
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -8,
+ -5
+ ]
+ ],
+ [
+ [
+ 4504,
+ 6825
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ]
+ ],
+ [
+ [
+ 4619,
+ 6849
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ]
+ ],
+ [
+ [
+ 5044,
+ 7411
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 5040,
+ 7425
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5087,
+ 7476
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 12,
+ 14
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 5119,
+ 7479
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -8,
+ 7
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 4950,
+ 7684
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -6
+ ]
+ ],
+ [
+ [
+ 5047,
+ 7632
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 5089,
+ 7628
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -19,
+ -18
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -14,
+ -5
+ ],
+ [
+ -10,
+ -6
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -6,
+ -10
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ -17
+ ],
+ [
+ -6,
+ -12
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -7,
+ -21
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 4,
+ -20
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -9,
+ -8
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -9,
+ -10
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -4,
+ -16
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -15,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -11,
+ 14
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -6,
+ -2
+ ]
+ ],
+ [
+ [
+ 4794,
+ 7325
+ ],
+ [
+ -2,
+ 15
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -6,
+ 16
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 4756,
+ 7600
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 16,
+ -5
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 10,
+ -5
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 5628,
+ 8560
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 9,
+ -7
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 5648,
+ 8556
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 5636,
+ 8572
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ]
+ ],
+ [
+ [
+ 5778,
+ 8610
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -17
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 5759,
+ 8497
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -9,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 5675,
+ 8517
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 12
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 16,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 18,
+ -5
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 15,
+ -2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 6192,
+ 5817
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 6,
+ -11
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 9,
+ -6
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 10,
+ -6
+ ],
+ [
+ 9,
+ -7
+ ],
+ [
+ 8,
+ -6
+ ],
+ [
+ 12,
+ -8
+ ],
+ [
+ 10,
+ -7
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 9,
+ 0
+ ]
+ ],
+ [
+ [
+ 6332,
+ 5644
+ ],
+ [
+ -7,
+ -13
+ ],
+ [
+ -7,
+ -16
+ ],
+ [
+ -9,
+ -16
+ ],
+ [
+ -5,
+ -11
+ ],
+ [
+ -8,
+ -16
+ ],
+ [
+ -7,
+ -14
+ ],
+ [
+ -7,
+ -15
+ ],
+ [
+ -7,
+ -14
+ ],
+ [
+ -8,
+ -19
+ ],
+ [
+ -5,
+ -12
+ ],
+ [
+ -9,
+ -19
+ ],
+ [
+ -5,
+ -12
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -12,
+ -5
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 6163,
+ 5413
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -8,
+ -8
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -7,
+ 8
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ]
+ ],
+ [
+ [
+ 5979,
+ 5500
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -2,
+ 15
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -6,
+ 10
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 17
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 3
+ ]
+ ],
+ [
+ [
+ 5946,
+ 5729
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 16
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 4,
+ 14
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 2,
+ 15
+ ]
+ ],
+ [
+ [
+ 5600,
+ 8646
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5606,
+ 8648
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5615,
+ 8661
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 5610,
+ 8659
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 5595,
+ 8670
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ]
+ ],
+ [
+ [
+ 5589,
+ 8826
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 5690,
+ 8927
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5804,
+ 9159
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -7,
+ -14
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 8,
+ -10
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 4,
+ -14
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 10,
+ -10
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 9,
+ -7
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -7,
+ -9
+ ],
+ [
+ -11,
+ -12
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -8,
+ -12
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -7,
+ -9
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -7,
+ -9
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -8,
+ -8
+ ],
+ [
+ -9,
+ -12
+ ]
+ ],
+ [
+ [
+ 5772,
+ 8671
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -9,
+ 6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 7,
+ 10
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -12,
+ 7
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ]
+ ],
+ [
+ [
+ 5670,
+ 8974
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -11,
+ 4
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -8,
+ 3
+ ]
+ ],
+ [
+ [
+ 5572,
+ 9160
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 4,
+ 13
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 10,
+ -5
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 5,
+ -12
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ]
+ ],
+ [
+ [
+ 9850,
+ 3934
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 36,
+ 3993
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 41,
+ 4080
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 9957,
+ 4091
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 6,
+ 4093
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 34,
+ 4134
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 9981,
+ 4141
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 28,
+ 4148
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 49,
+ 4150
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 9966,
+ 4163
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 9951,
+ 4183
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 9983,
+ 4184
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 29,
+ 4189
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 9922,
+ 4196
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 9999,
+ 4207
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -9997,
+ 5
+ ],
+ [
+ 9999,
+ -10
+ ]
+ ],
+ [
+ [
+ 0,
+ 4217
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ 10
+ ]
+ ],
+ [
+ [
+ 9999,
+ 4231
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -9999,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 9999,
+ 0
+ ]
+ ],
+ [
+ [
+ 9999,
+ 4253
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -9995,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 9999,
+ 0
+ ]
+ ],
+ [
+ [
+ 9919,
+ 4464
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 3342,
+ 2175
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 3376,
+ 2188
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 3305,
+ 2201
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ]
+ ],
+ [
+ [
+ 3325,
+ 2220
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -6,
+ -10
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -3
+ ]
+ ],
+ [
+ [
+ 3330,
+ 2223
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 3365,
+ 2231
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -9,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -13,
+ 5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 6549,
+ 3955
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 6254,
+ 4436
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 3483,
+ 5318
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ 14
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ]
+ ],
+ [
+ [
+ 3495,
+ 5492
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 15
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 11,
+ -13
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 10,
+ -7
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 9,
+ -15
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -16
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 3310,
+ 6019
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -7
+ ]
+ ],
+ [
+ [
+ 3299,
+ 6099
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3289,
+ 6106
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3296,
+ 6119
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ -4,
+ -1
+ ]
+ ],
+ [
+ [
+ 5263,
+ 7649
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -23
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 4967,
+ 7828
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ]
+ ],
+ [
+ [
+ 5160,
+ 8037
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 5195,
+ 7829
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 5208,
+ 7705
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 5206,
+ 7704
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 5204,
+ 7703
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -9,
+ -12
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -15,
+ -15
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -14
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 4950,
+ 7684
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 4,
+ 26
+ ],
+ [
+ 3,
+ 31
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ 28
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 17
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -8,
+ 8
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 16
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -11,
+ 10
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -11,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -11,
+ 5
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 13,
+ 5
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 6,
+ -11
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 23
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 12,
+ 9
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 25
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 14,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ]
+ ],
+ [
+ [
+ 4813,
+ 8723
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 4816,
+ 8744
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 4800,
+ 8763
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 4815,
+ 8768
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -5,
+ 11
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ]
+ ],
+ [
+ [
+ 4822,
+ 8770
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 9526,
+ 5491
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 9397,
+ 5576
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 9212,
+ 5607
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 9218,
+ 5612
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 8836,
+ 5731
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ]
+ ],
+ [
+ [
+ 5309,
+ 4958
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -7,
+ 15
+ ],
+ [
+ -10,
+ 16
+ ],
+ [
+ -6,
+ 13
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 8,
+ -18
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -3,
+ 13
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 19
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 5,
+ 13
+ ],
+ [
+ 1,
+ 16
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ 1,
+ 2
+ ]
+ ],
+ [
+ [
+ 5266,
+ 5243
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 14
+ ]
+ ],
+ [
+ [
+ 4970,
+ 8103
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ]
+ ],
+ [
+ [
+ 4883,
+ 8255
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -6
+ ]
+ ],
+ [
+ [
+ 4827,
+ 8299
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 4
+ ]
+ ],
+ [
+ [
+ 4799,
+ 8357
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ]
+ ],
+ [
+ [
+ 4858,
+ 8378
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 4829,
+ 8405
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ]
+ ],
+ [
+ [
+ 4834,
+ 8399
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -4,
+ -11
+ ]
+ ],
+ [
+ [
+ 4839,
+ 8429
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -9
+ ]
+ ],
+ [
+ [
+ 4816,
+ 8443
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ]
+ ],
+ [
+ [
+ 4794,
+ 8465
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 4825,
+ 8465
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 4798,
+ 8474
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -14
+ ]
+ ],
+ [
+ [
+ 4829,
+ 8496
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ]
+ ],
+ [
+ [
+ 4799,
+ 8506
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 4827,
+ 8545
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 4913,
+ 8554
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -10,
+ -10
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 17,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -14
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 16,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 13,
+ -7
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 3,
+ -14
+ ],
+ [
+ 4,
+ -14
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 11,
+ -7
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 12,
+ -13
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 8,
+ -8
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -8,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -11,
+ 3
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -11,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 8,
+ 11
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 9,
+ 7
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -5,
+ 9
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 5,
+ 12
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -5,
+ -22
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -10,
+ -11
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ]
+ ],
+ [
+ [
+ 4918,
+ 8567
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 4912,
+ 8570
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 4915,
+ 8584
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 4929,
+ 8595
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ]
+ ],
+ [
+ [
+ 4924,
+ 8593
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 4963,
+ 8671
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 4971,
+ 8669
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 4978,
+ 8686
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 6206,
+ 7552
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ]
+ ],
+ [
+ [
+ 6152,
+ 7575
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ -3,
+ 15
+ ],
+ [
+ -2,
+ 15
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -8,
+ 6
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -7,
+ 10
+ ],
+ [
+ -6,
+ 6
+ ]
+ ],
+ [
+ [
+ 6110,
+ 7685
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 13,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ]
+ ],
+ [
+ [
+ 4930,
+ 8035
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 4998,
+ 5824
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -18
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -24
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 5032,
+ 5535
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -11,
+ -1
+ ],
+ [
+ -11,
+ -10
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -12,
+ -8
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -9,
+ 5
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 4914,
+ 5479
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 4683,
+ 5898
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 4764,
+ 5619
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 4714,
+ 5673
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 4630,
+ 5705
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -7,
+ 7
+ ],
+ [
+ -5,
+ 17
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ]
+ ],
+ [
+ [
+ 4582,
+ 5814
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 5,
+ 19
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ]
+ ],
+ [
+ [
+ 4618,
+ 5914
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 4534,
+ 5936
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 7
+ ]
+ ],
+ [
+ [
+ 4539,
+ 5966
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 4558,
+ 5822
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 4552,
+ 5821
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 4563,
+ 5830
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 4558,
+ 5844
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -7
+ ]
+ ],
+ [
+ [
+ 4568,
+ 5848
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 4555,
+ 5868
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 4582,
+ 5814
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -8,
+ 8
+ ]
+ ],
+ [
+ [
+ 4535,
+ 5895
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 9,
+ 0
+ ]
+ ],
+ [
+ [
+ 5266,
+ 5243
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 1,
+ 14
+ ]
+ ],
+ [
+ [
+ 5242,
+ 5400
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -4,
+ -13
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ]
+ ],
+ [
+ [
+ 5662,
+ 7231
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -12,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -13,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 5754,
+ 7227
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ]
+ ],
+ [
+ [
+ 5640,
+ 7268
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 5773,
+ 7253
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -7
+ ]
+ ],
+ [
+ [
+ 5707,
+ 7280
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 5734,
+ 7291
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5773,
+ 7289
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5681,
+ 7301
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ]
+ ],
+ [
+ [
+ 5704,
+ 7296
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5748,
+ 7299
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 5718,
+ 7303
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -5
+ ]
+ ],
+ [
+ [
+ 5686,
+ 7310
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5750,
+ 7313
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 5702,
+ 7319
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5709,
+ 7313
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 5681,
+ 7322
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 5678,
+ 7335
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5692,
+ 7343
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5705,
+ 7339
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ]
+ ],
+ [
+ [
+ 5722,
+ 7345
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -5,
+ -3
+ ]
+ ],
+ [
+ [
+ 5701,
+ 7349
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5676,
+ 7348
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 5745,
+ 7362
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ]
+ ],
+ [
+ [
+ 5580,
+ 7361
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 5694,
+ 7359
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5654,
+ 7368
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5572,
+ 7395
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -5
+ ]
+ ],
+ [
+ [
+ 5576,
+ 7392
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 5724,
+ 7385
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5574,
+ 7408
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5685,
+ 7419
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ]
+ ],
+ [
+ [
+ 5650,
+ 7428
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ]
+ ],
+ [
+ [
+ 5660,
+ 7437
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 5,
+ -5
+ ]
+ ],
+ [
+ [
+ 5663,
+ 7439
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5733,
+ 7449
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ]
+ ],
+ [
+ [
+ 5557,
+ 7455
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5706,
+ 7487
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 5713,
+ 7512
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5688,
+ 7523
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5723,
+ 7530
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -10,
+ 3
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -5,
+ 12
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 7,
+ -14
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 4,
+ -16
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -12
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -4,
+ 13
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 8,
+ -8
+ ],
+ [
+ 9,
+ -4
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -3,
+ 13
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 4
+ ]
+ ],
+ [
+ [
+ 5582,
+ 7537
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 5731,
+ 7587
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 3285,
+ 5876
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -3,
+ -2
+ ]
+ ],
+ [
+ [
+ 3714,
+ 8685
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 11,
+ 7
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 3971,
+ 8958
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 3583,
+ 9190
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3535,
+ 9213
+ ],
+ [
+ 9,
+ -5
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -18,
+ -7
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -16,
+ -5
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 18,
+ -5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 10,
+ -11
+ ]
+ ],
+ [
+ [
+ 3564,
+ 9265
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 4293,
+ 9269
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -14,
+ -2
+ ],
+ [
+ -17,
+ -3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 14,
+ 7
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 3513,
+ 9276
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 3471,
+ 9376
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 4500,
+ 9527
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -21,
+ 1
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 7,
+ 2
+ ]
+ ],
+ [
+ [
+ 4483,
+ 9564
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -11,
+ 24
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 2,
+ -21
+ ]
+ ],
+ [
+ [
+ 3009,
+ 9638
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -6,
+ -1
+ ]
+ ],
+ [
+ [
+ 4501,
+ 9656
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 7,
+ 9
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -6,
+ -4
+ ]
+ ],
+ [
+ [
+ 4472,
+ 9675
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -3,
+ -8
+ ]
+ ],
+ [
+ [
+ 4510,
+ 9782
+ ],
+ [
+ -11,
+ -7
+ ],
+ [
+ -18,
+ 1
+ ],
+ [
+ -10,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 12,
+ 4
+ ],
+ [
+ 16,
+ 3
+ ],
+ [
+ 14,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -6,
+ -6
+ ]
+ ],
+ [
+ [
+ 4481,
+ 9898
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -9,
+ 5
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 4,
+ -6
+ ]
+ ],
+ [
+ [
+ 3753,
+ 9912
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -12,
+ 6
+ ],
+ [
+ -19,
+ 6
+ ],
+ [
+ -16,
+ 4
+ ],
+ [
+ -15,
+ 11
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 27,
+ -7
+ ],
+ [
+ 14,
+ -5
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -3,
+ -9
+ ]
+ ],
+ [
+ [
+ 4168,
+ 9997
+ ],
+ [
+ 26,
+ -3
+ ],
+ [
+ 14,
+ -4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 19,
+ -2
+ ],
+ [
+ 19,
+ -2
+ ],
+ [
+ 30,
+ -5
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -38,
+ -1
+ ],
+ [
+ -70,
+ -2
+ ],
+ [
+ -40,
+ -4
+ ],
+ [
+ -13,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 32,
+ 6
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 22,
+ -1
+ ],
+ [
+ 29,
+ -2
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 21,
+ -1
+ ],
+ [
+ 23,
+ 2
+ ],
+ [
+ 29,
+ 4
+ ],
+ [
+ 7,
+ -8
+ ],
+ [
+ 11,
+ -9
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 25,
+ -3
+ ],
+ [
+ 17,
+ -4
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -10,
+ -4
+ ],
+ [
+ -14,
+ -5
+ ],
+ [
+ -18,
+ -3
+ ],
+ [
+ -20,
+ -3
+ ],
+ [
+ -159,
+ -7
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 17,
+ 4
+ ],
+ [
+ 30,
+ 3
+ ],
+ [
+ 22,
+ 0
+ ],
+ [
+ 53,
+ -3
+ ],
+ [
+ 16,
+ -7
+ ],
+ [
+ 8,
+ -10
+ ],
+ [
+ 18,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 27,
+ 1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -8,
+ -10
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -13,
+ -9
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -14,
+ -10
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 20,
+ 6
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 14,
+ 8
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 21,
+ 15
+ ],
+ [
+ 10,
+ 4
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 13,
+ -1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 27,
+ -1
+ ],
+ [
+ 15,
+ -1
+ ],
+ [
+ 21,
+ -4
+ ],
+ [
+ 14,
+ -2
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -19,
+ -7
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -18,
+ -9
+ ],
+ [
+ -9,
+ -3
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -20,
+ -3
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -13,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -12,
+ -4
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 14,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -18,
+ 2
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -9,
+ -6
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -12,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -14,
+ -9
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -6,
+ -10
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 7,
+ 9
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 9,
+ -4
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -12,
+ 5
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ 6,
+ -10
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 11,
+ -2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -10,
+ 3
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -12,
+ -1
+ ],
+ [
+ -12,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -18,
+ -9
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -12,
+ -9
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -10,
+ 5
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 7,
+ -13
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -11,
+ 1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -12,
+ -4
+ ],
+ [
+ -13,
+ -2
+ ],
+ [
+ -13,
+ 3
+ ],
+ [
+ -10,
+ 5
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 19,
+ 0
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 18,
+ -6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -19,
+ 0
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -9,
+ -5
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -18,
+ 4
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -14,
+ 9
+ ],
+ [
+ -11,
+ 13
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 11,
+ -9
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 16,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 17,
+ 4
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 13,
+ 2
+ ],
+ [
+ 12,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 11,
+ -5
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -12
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -13
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -14,
+ 6
+ ],
+ [
+ -13,
+ 3
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -8,
+ 10
+ ],
+ [
+ -5,
+ 14
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -17,
+ -4
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -13,
+ -5
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 11,
+ 5
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 4,
+ -17
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 13,
+ -7
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 9,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -12
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -13
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -13,
+ 6
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -13,
+ 0
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -12,
+ -5
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -12,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -14,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 14,
+ -4
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 24,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 15,
+ 6
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 22,
+ -3
+ ],
+ [
+ 20,
+ -7
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 14,
+ -2
+ ],
+ [
+ 25,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -9,
+ -3
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -8,
+ -6
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -16,
+ -5
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -14,
+ -5
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -11,
+ 3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -9,
+ 6
+ ],
+ [
+ -11,
+ 9
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -13,
+ -10
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -8,
+ -13
+ ],
+ [
+ -6,
+ -13
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -13,
+ -9
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 8,
+ 13
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -12,
+ -5
+ ],
+ [
+ -12,
+ -1
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -15,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 15,
+ -9
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -11,
+ 3
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -11,
+ 1
+ ],
+ [
+ 11,
+ -7
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -6,
+ -9
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -4,
+ -17
+ ],
+ [
+ -2,
+ -17
+ ],
+ [
+ -9,
+ -14
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -12
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -16,
+ 8
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -9,
+ -9
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -7,
+ -8
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -5,
+ 11
+ ],
+ [
+ -8,
+ 11
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 11,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -10,
+ -4
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -6,
+ -10
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -3,
+ 15
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -8,
+ -6
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 14,
+ 11
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -16,
+ -14
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 12,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ 9
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 13,
+ -5
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 13,
+ -8
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -15,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -12,
+ -11
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 13,
+ -3
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -11,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 12
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 14,
+ -9
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -18,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -10,
+ 3
+ ],
+ [
+ -11,
+ 2
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 17,
+ -10
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 12,
+ -4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -12,
+ 1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 22,
+ 6
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -13,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 10,
+ 9
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -12,
+ -12
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -12,
+ 5
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -13,
+ 6
+ ],
+ [
+ -19,
+ 6
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -13,
+ 3
+ ],
+ [
+ -11,
+ 1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -36,
+ 6
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -10,
+ 5
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 15,
+ 8
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -16,
+ 0
+ ],
+ [
+ -13,
+ 1
+ ],
+ [
+ -12,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -15,
+ -7
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 27,
+ 2
+ ],
+ [
+ 19,
+ -2
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 13,
+ 2
+ ],
+ [
+ 20,
+ 0
+ ],
+ [
+ 13,
+ -1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -10,
+ -5
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -17,
+ 4
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -11,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -10,
+ 5
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 10,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 12,
+ 3
+ ],
+ [
+ 27,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 12,
+ 3
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 21,
+ 1
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 10,
+ 7
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 11,
+ 7
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 17,
+ 4
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 11,
+ -7
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 11,
+ 3
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 15,
+ -8
+ ],
+ [
+ 9,
+ -4
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 12,
+ -6
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -19,
+ 7
+ ],
+ [
+ -11,
+ 6
+ ],
+ [
+ -9,
+ 6
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -13,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 15,
+ 5
+ ],
+ [
+ 27,
+ 5
+ ],
+ [
+ 32,
+ 3
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 19,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 17,
+ 3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -18
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 28,
+ -14
+ ],
+ [
+ 11,
+ -3
+ ],
+ [
+ 13,
+ -7
+ ],
+ [
+ 15,
+ 1
+ ],
+ [
+ 13,
+ -1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -19,
+ 9
+ ],
+ [
+ -9,
+ 7
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 22,
+ 0
+ ],
+ [
+ 32,
+ -4
+ ],
+ [
+ 42,
+ -13
+ ],
+ [
+ 21,
+ -5
+ ],
+ [
+ 37,
+ -15
+ ],
+ [
+ 11,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -27,
+ 11
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 67,
+ -2
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 15,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -78,
+ 4
+ ],
+ [
+ -15,
+ 2
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -16,
+ -1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -9,
+ 6
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 14,
+ -3
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 13,
+ 3
+ ],
+ [
+ 13,
+ 1
+ ],
+ [
+ 28,
+ 6
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 15,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 10,
+ 4
+ ],
+ [
+ 13,
+ -2
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 18,
+ -11
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -15,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 32,
+ 0
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 12,
+ 3
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 64,
+ 0
+ ],
+ [
+ 21,
+ -2
+ ]
+ ],
+ [
+ [
+ 2530,
+ 6099
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 10,
+ -13
+ ]
+ ],
+ [
+ [
+ 2549,
+ 6090
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 2517,
+ 6014
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 2497,
+ 5975
+ ],
+ [
+ -11,
+ 9
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -15,
+ 0
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -7,
+ 7
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -11,
+ 19
+ ]
+ ],
+ [
+ [
+ 2438,
+ 6022
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ 4,
+ 13
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ]
+ ],
+ [
+ [
+ 9020,
+ 5948
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -1,
+ -8
+ ]
+ ],
+ [
+ [
+ 3411,
+ 5503
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3312,
+ 5483
+ ],
+ [
+ -5,
+ 14
+ ],
+ [
+ -6,
+ 14
+ ],
+ [
+ -6,
+ 13
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -5,
+ 14
+ ]
+ ],
+ [
+ [
+ 3333,
+ 5676
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 7,
+ -10
+ ],
+ [
+ 11,
+ -20
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -17
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -11
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -12
+ ],
+ [
+ -1,
+ -19
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 8172,
+ 6463
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 8166,
+ 6463
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 8173,
+ 6482
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 7047,
+ 2123
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 2690,
+ 6047
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -13
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ -1
+ ]
+ ],
+ [
+ [
+ 2574,
+ 5931
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ]
+ ],
+ [
+ [
+ 2560,
+ 5956
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 2549,
+ 6090
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 8,
+ -6
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 9,
+ -6
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 14,
+ -22
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 8,
+ -7
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ]
+ ],
+ [
+ [
+ 2599,
+ 6127
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -5,
+ -3
+ ]
+ ],
+ [
+ [
+ 2614,
+ 6132
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5489,
+ 7647
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -11,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ]
+ ],
+ [
+ [
+ 5462,
+ 7660
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ]
+ ],
+ [
+ [
+ 5512,
+ 7635
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5514,
+ 7628
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -9,
+ 10
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -9,
+ 8
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 14,
+ -10
+ ],
+ [
+ -2,
+ 3
+ ]
+ ],
+ [
+ [
+ 5477,
+ 7668
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -12,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ]
+ ],
+ [
+ [
+ 5466,
+ 7676
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ]
+ ],
+ [
+ [
+ 5426,
+ 7717
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 5423,
+ 7722
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 5,
+ -5
+ ]
+ ],
+ [
+ [
+ 5421,
+ 7714
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -7,
+ 12
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 6,
+ -11
+ ]
+ ],
+ [
+ [
+ 5421,
+ 7737
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5411,
+ 7762
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5402,
+ 7756
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 5411,
+ 7774
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -6
+ ]
+ ],
+ [
+ [
+ 5525,
+ 7829
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 5488,
+ 7657
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -6,
+ 10
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -9,
+ 15
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -8,
+ 13
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 14
+ ],
+ [
+ 2,
+ 3
+ ]
+ ],
+ [
+ [
+ 5377,
+ 7806
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 5458,
+ 7862
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 2977,
+ 6265
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ -5
+ ]
+ ],
+ [
+ [
+ 3006,
+ 6223
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -12,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 19,
+ -4
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -5,
+ 9
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 2
+ ]
+ ],
+ [
+ [
+ 2981,
+ 6338
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ]
+ ],
+ [
+ [
+ 5614,
+ 7972
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5635,
+ 7945
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5562,
+ 7840
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ]
+ ],
+ [
+ [
+ 5458,
+ 7862
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -6,
+ 0
+ ]
+ ],
+ [
+ [
+ 5476,
+ 7949
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 8414,
+ 4555
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ]
+ ],
+ [
+ [
+ 8385,
+ 4574
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -3,
+ -3
+ ]
+ ],
+ [
+ [
+ 8427,
+ 4590
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 8333,
+ 4644
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 8473,
+ 4636
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ]
+ ],
+ [
+ [
+ 8445,
+ 4646
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ]
+ ],
+ [
+ [
+ 8456,
+ 4654
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ]
+ ],
+ [
+ [
+ 8469,
+ 4669
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -7
+ ]
+ ],
+ [
+ [
+ 8211,
+ 4679
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8415,
+ 4692
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 8318,
+ 4680
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8425,
+ 4703
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 8239,
+ 4688
+ ],
+ [
+ -3,
+ -12
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -3,
+ -13
+ ]
+ ],
+ [
+ [
+ 8452,
+ 4704
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -6
+ ]
+ ],
+ [
+ [
+ 8442,
+ 4707
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 8857,
+ 4701
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8265,
+ 4702
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -10
+ ]
+ ],
+ [
+ [
+ 8307,
+ 4709
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 8460,
+ 4715
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -18,
+ -6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 8550,
+ 4717
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 8410,
+ 4688
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 8634,
+ 4705
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8284,
+ 4705
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 8206,
+ 4714
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ]
+ ],
+ [
+ [
+ 8606,
+ 4726
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8521,
+ 4742
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 8539,
+ 4745
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 8847,
+ 4707
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 4,
+ 19
+ ],
+ [
+ 5,
+ 17
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -2,
+ -5
+ ]
+ ],
+ [
+ [
+ 8647,
+ 4723
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 8665,
+ 4769
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 1,
+ -6
+ ]
+ ],
+ [
+ [
+ 8177,
+ 4773
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8573,
+ 4770
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8354,
+ 4774
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8162,
+ 4775
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 25,
+ 0
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 8204,
+ 4782
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 8740,
+ 4795
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ]
+ ],
+ [
+ [
+ 7923,
+ 4801
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ]
+ ],
+ [
+ [
+ 8741,
+ 4807
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 8744,
+ 4813
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ -7
+ ]
+ ],
+ [
+ [
+ 8736,
+ 4813
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 17
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ]
+ ],
+ [
+ [
+ 7982,
+ 4838
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 8,
+ -8
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -15
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -12,
+ 11
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -17,
+ 1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -16,
+ 15
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -16,
+ 7
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -12,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -9,
+ 7
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 20
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 8445,
+ 4840
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8347,
+ 4821
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -19
+ ]
+ ],
+ [
+ [
+ 8130,
+ 4849
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 8688,
+ 4847
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8742,
+ 4855
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -6
+ ]
+ ],
+ [
+ [
+ 8692,
+ 4844
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 18
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -13
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -1,
+ -9
+ ]
+ ],
+ [
+ [
+ 7843,
+ 4868
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8433,
+ 4880
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 8389,
+ 4871
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -12
+ ]
+ ],
+ [
+ [
+ 8406,
+ 4880
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -15
+ ],
+ [
+ -4,
+ -12
+ ],
+ [
+ 1,
+ -8
+ ]
+ ],
+ [
+ [
+ 8421,
+ 4922
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -6
+ ]
+ ],
+ [
+ [
+ 8709,
+ 4939
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ]
+ ],
+ [
+ [
+ 8423,
+ 4947
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 8570,
+ 4977
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8562,
+ 4972
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8575,
+ 4980
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 8233,
+ 4984
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 8544,
+ 4993
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -3
+ ]
+ ],
+ [
+ [
+ 8230,
+ 4961
+ ],
+ [
+ -6,
+ -11
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 8523,
+ 5006
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 8554,
+ 5015
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 7968,
+ 5011
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 7985,
+ 5017
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8603,
+ 5019
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -16
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 7,
+ 17
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ]
+ ],
+ [
+ [
+ 7789,
+ 5000
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 6,
+ -12
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8005,
+ 5011
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ -2,
+ -10
+ ]
+ ],
+ [
+ [
+ 7783,
+ 5026
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 6,
+ -10
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8732,
+ 5061
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ]
+ ],
+ [
+ [
+ 7773,
+ 5049
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 8501,
+ 5043
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 8439,
+ 5071
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -5
+ ]
+ ],
+ [
+ [
+ 8500,
+ 5081
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 9,
+ 2
+ ]
+ ],
+ [
+ [
+ 8420,
+ 5079
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8620,
+ 5086
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 8471,
+ 5086
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 9,
+ -4
+ ]
+ ],
+ [
+ [
+ 8762,
+ 5092
+ ],
+ [
+ 11,
+ -3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -10,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 8026,
+ 5091
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 7945,
+ 5088
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -18
+ ],
+ [
+ 5,
+ -16
+ ],
+ [
+ 12,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8432,
+ 5086
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8559,
+ 5088
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8422,
+ 5116
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 8047,
+ 5116
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 8748,
+ 5120
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 7754,
+ 5081
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -5,
+ 16
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ]
+ ],
+ [
+ [
+ 8638,
+ 5108
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -13
+ ],
+ [
+ -1,
+ -7
+ ]
+ ],
+ [
+ [
+ 8635,
+ 5139
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -12,
+ -3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 8760,
+ 5146
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ]
+ ],
+ [
+ [
+ 8535,
+ 5139
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 8628,
+ 5153
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8384,
+ 5160
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 8915,
+ 5033
+ ],
+ [
+ 0,
+ -11
+ ]
+ ],
+ [
+ [
+ 8915,
+ 5022
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -12
+ ]
+ ],
+ [
+ [
+ 8915,
+ 4659
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -11,
+ 19
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 13
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -13,
+ 14
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -13,
+ 15
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 13
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -12,
+ 9
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 4,
+ -18
+ ],
+ [
+ 3,
+ -12
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 7,
+ 9
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 15,
+ -10
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 8,
+ -7
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 6,
+ -1
+ ]
+ ],
+ [
+ [
+ 7901,
+ 5165
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ 4
+ ]
+ ],
+ [
+ [
+ 8543,
+ 5165
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 8534,
+ 5155
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ]
+ ],
+ [
+ [
+ 7881,
+ 5164
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 8633,
+ 5184
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ]
+ ],
+ [
+ [
+ 7734,
+ 5153
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -3,
+ 13
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -9
+ ]
+ ],
+ [
+ [
+ 7910,
+ 5174
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ]
+ ],
+ [
+ [
+ 8598,
+ 5173
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 7,
+ -10
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8540,
+ 5183
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ]
+ ],
+ [
+ [
+ 7907,
+ 5187
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 7868,
+ 5215
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8539,
+ 5221
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 8537,
+ 5229
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 7873,
+ 5222
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 7883,
+ 5230
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 7895,
+ 5232
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 7861,
+ 5227
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ]
+ ],
+ [
+ [
+ 7872,
+ 5244
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 7865,
+ 5234
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -8
+ ]
+ ],
+ [
+ [
+ 7889,
+ 5252
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ]
+ ],
+ [
+ [
+ 7904,
+ 5254
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ]
+ ],
+ [
+ [
+ 7844,
+ 5241
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 7707,
+ 5268
+ ],
+ [
+ 6,
+ -16
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -15
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -6,
+ 14
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ]
+ ],
+ [
+ [
+ 7846,
+ 5268
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 12,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8468,
+ 5241
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -17,
+ 0
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 4,
+ -12
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -8,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -13
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 6,
+ -9
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 17
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -11,
+ 21
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 2,
+ -21
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 0,
+ -14
+ ],
+ [
+ 0,
+ -19
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -3,
+ -14
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -14
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 22
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ 14
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 4,
+ 20
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ -1,
+ 23
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 15,
+ -5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 9,
+ 10
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ]
+ ],
+ [
+ [
+ 7824,
+ 5304
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 8547,
+ 5233
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -15
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -10,
+ 7
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -18
+ ],
+ [
+ 3,
+ -13
+ ],
+ [
+ 5,
+ -14
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 13
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -7,
+ -9
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 7703,
+ 5303
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 8567,
+ 5302
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -3,
+ -3
+ ]
+ ],
+ [
+ [
+ 8483,
+ 5337
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 7679,
+ 5320
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -7,
+ 9
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8024,
+ 5351
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -6
+ ]
+ ],
+ [
+ [
+ 7937,
+ 5349
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 7952,
+ 5366
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 8267,
+ 5373
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -7
+ ]
+ ],
+ [
+ [
+ 8490,
+ 5382
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 8523,
+ 5401
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 8519,
+ 5407
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 8274,
+ 5425
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ]
+ ],
+ [
+ [
+ 8267,
+ 5424
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ]
+ ],
+ [
+ [
+ 8008,
+ 5396
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 6,
+ 9
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -9
+ ]
+ ],
+ [
+ [
+ 8265,
+ 5424
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 9,
+ -13
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 6,
+ -13
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ -23
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -25
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -19,
+ -18
+ ],
+ [
+ -16,
+ -15
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 23
+ ],
+ [
+ -2,
+ 13
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -9,
+ 18
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 15
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ -3,
+ 26
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ -1,
+ 16
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 7,
+ 6
+ ]
+ ],
+ [
+ [
+ 8044,
+ 5301
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 6,
+ -11
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 9,
+ 8
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 8522,
+ 5416
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -9
+ ]
+ ],
+ [
+ [
+ 7680,
+ 5485
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 6,
+ -9
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 6,
+ -13
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 7,
+ -8
+ ],
+ [
+ 11,
+ -15
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 6,
+ -10
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -11
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 9,
+ -23
+ ],
+ [
+ 4,
+ -12
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -14
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -22
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 1,
+ -13
+ ],
+ [
+ -2,
+ -38
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -8,
+ 9
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -7,
+ 17
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -10,
+ 12
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -11,
+ 19
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ -5,
+ 17
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -9,
+ 13
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -5,
+ 16
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -5,
+ 14
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ -10,
+ 37
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -2,
+ 16
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ 14
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -4,
+ 16
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 13
+ ],
+ [
+ -4,
+ 20
+ ],
+ [
+ -3,
+ 27
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -13,
+ 17
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -6,
+ 18
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -6,
+ 11
+ ],
+ [
+ -12,
+ 23
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -5,
+ 18
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 6,
+ -9
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 7,
+ -2
+ ]
+ ],
+ [
+ [
+ 7648,
+ 5519
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 4877,
+ 8305
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 7607,
+ 5577
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ 14
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -14
+ ],
+ [
+ -1,
+ -8
+ ]
+ ],
+ [
+ [
+ 7603,
+ 5608
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 7595,
+ 5638
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 7597,
+ 5648
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ]
+ ],
+ [
+ [
+ 7029,
+ 5660
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 7586,
+ 5659
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ -6
+ ]
+ ],
+ [
+ [
+ 7577,
+ 5710
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 7569,
+ 5792
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -2,
+ -8
+ ]
+ ],
+ [
+ [
+ 7574,
+ 5839
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 7583,
+ 5877
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 7575,
+ 5925
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 7575,
+ 5848
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -18
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -6
+ ]
+ ],
+ [
+ [
+ 7186,
+ 7020
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 2,
+ -5
+ ]
+ ],
+ [
+ [
+ 7203,
+ 6975
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 7219,
+ 6963
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ [
+ [
+ 7219,
+ 6963
+ ],
+ [
+ 5,
+ -6
+ ]
+ ],
+ [
+ [
+ 7250,
+ 6921
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 16
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ]
+ ],
+ [
+ [
+ 7703,
+ 6809
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 6,
+ -16
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -10,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -8,
+ -11
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -2,
+ -12
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ -14
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 7473,
+ 6456
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 15
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ -17
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 3,
+ 14
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -13,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -12
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -7,
+ -8
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -10,
+ -6
+ ],
+ [
+ -8,
+ -6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -13,
+ -22
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -5,
+ -12
+ ],
+ [
+ -7,
+ -16
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -12,
+ -12
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -5,
+ -13
+ ],
+ [
+ -6,
+ -10
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -10,
+ -11
+ ],
+ [
+ -7,
+ -10
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -11,
+ -9
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -18
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -6,
+ -23
+ ],
+ [
+ -1,
+ -14
+ ],
+ [
+ 1,
+ -16
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 3,
+ -12
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -11
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -3,
+ -38
+ ],
+ [
+ -3,
+ -14
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -15
+ ],
+ [
+ -3,
+ -17
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -25
+ ],
+ [
+ 0,
+ -26
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -7,
+ -20
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -15,
+ -10
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -1,
+ -13
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -8,
+ -11
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -7,
+ 10
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -9,
+ 25
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ -2,
+ 15
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -3,
+ 22
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -5,
+ 22
+ ],
+ [
+ -2,
+ 16
+ ],
+ [
+ -3,
+ 17
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -4,
+ 14
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -7,
+ 29
+ ],
+ [
+ -2,
+ 17
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 25
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 11
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 13
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -4,
+ 18
+ ],
+ [
+ -2,
+ 42
+ ],
+ [
+ -3,
+ 19
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -3,
+ 16
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 14
+ ],
+ [
+ 5,
+ 28
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -5,
+ -18
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -13,
+ -10
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -11,
+ -8
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -10,
+ 15
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -8,
+ 18
+ ],
+ [
+ -6,
+ 10
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ -5,
+ 12
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 14
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -11,
+ 5
+ ],
+ [
+ -12,
+ 12
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 7
+ ]
+ ],
+ [
+ [
+ 6893,
+ 6558
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 12
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 4,
+ 13
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 9,
+ 7
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ 16
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 6,
+ 14
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 10,
+ 8
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ]
+ ],
+ [
+ [
+ 7140,
+ 7206
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ]
+ ],
+ [
+ [
+ 7160,
+ 7228
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 7197,
+ 7098
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 7200,
+ 7059
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 7691,
+ 4481
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 7689,
+ 4482
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 7936,
+ 4579
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 7013,
+ 4759
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 4723,
+ 8289
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 4827,
+ 8299
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -14,
+ -5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ -14,
+ -6
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 6560,
+ 6734
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ]
+ ],
+ [
+ [
+ 6357,
+ 7398
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -14
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 11,
+ -12
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 18,
+ -7
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 33,
+ 14
+ ],
+ [
+ 11,
+ 4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 13
+ ],
+ [
+ -1,
+ 10
+ ]
+ ],
+ [
+ [
+ 6497,
+ 7335
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 13
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 9,
+ -7
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 8,
+ -6
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 6697,
+ 6919
+ ],
+ [
+ -7,
+ -14
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 6689,
+ 6904
+ ],
+ [
+ 6,
+ -12
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 5,
+ -14
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ 1,
+ -12
+ ],
+ [
+ 1,
+ -17
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -17
+ ],
+ [
+ -1,
+ -5
+ ]
+ ],
+ [
+ [
+ 6710,
+ 6635
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -13,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -10,
+ 4
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -7,
+ 8
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -11,
+ 3
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ -1,
+ 18
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -10,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -7,
+ -10
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -8,
+ 6
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -10,
+ 8
+ ],
+ [
+ -8,
+ 11
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -8,
+ 6
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -6,
+ 13
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -4,
+ 13
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -4,
+ 11
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -12,
+ -11
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -10,
+ 10
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 6348,
+ 6910
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -5,
+ 14
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 7,
+ 13
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 18
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 16
+ ],
+ [
+ -1,
+ 4
+ ]
+ ],
+ [
+ [
+ 6243,
+ 7323
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 15
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 6348,
+ 6910
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 6332,
+ 6911
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ -9
+ ]
+ ],
+ [
+ [
+ 6292,
+ 6860
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -11,
+ 2
+ ],
+ [
+ -13,
+ 2
+ ],
+ [
+ -12,
+ 2
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -9,
+ 13
+ ],
+ [
+ -8,
+ 11
+ ],
+ [
+ -9,
+ 13
+ ],
+ [
+ -9,
+ 14
+ ],
+ [
+ -9,
+ 13
+ ],
+ [
+ -7,
+ 10
+ ],
+ [
+ -8,
+ 13
+ ],
+ [
+ -8,
+ 12
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ -8,
+ 8
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -9,
+ 10
+ ],
+ [
+ -7,
+ 7
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -9,
+ 10
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -10,
+ 4
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -6,
+ 2
+ ]
+ ],
+ [
+ [
+ 6087,
+ 7034
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -2,
+ 13
+ ],
+ [
+ -2,
+ 13
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ -2,
+ 13
+ ]
+ ],
+ [
+ [
+ 6076,
+ 7106
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 8,
+ 9
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 8,
+ 9
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 15
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 6176,
+ 7321
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 4568,
+ 8998
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -9,
+ -5
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -15,
+ -3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -10,
+ -3
+ ],
+ [
+ -16,
+ 2
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -26,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -17,
+ 2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -13,
+ -3
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 9,
+ -5
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -10,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -4,
+ 11
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ]
+ ],
+ [
+ [
+ 5993,
+ 7069
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -13
+ ]
+ ],
+ [
+ [
+ 5987,
+ 7050
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 5984,
+ 6997
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -13
+ ]
+ ],
+ [
+ [
+ 5971,
+ 6886
+ ],
+ [
+ -2,
+ -4
+ ]
+ ],
+ [
+ [
+ 5951,
+ 6981
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ]
+ ],
+ [
+ [
+ 5957,
+ 7003
+ ],
+ [
+ 6,
+ 18
+ ],
+ [
+ 3,
+ 17
+ ],
+ [
+ 3,
+ 24
+ ],
+ [
+ 3,
+ 13
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 1,
+ 6
+ ]
+ ],
+ [
+ [
+ 5975,
+ 7089
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 5996,
+ 7109
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5334,
+ 7301
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 5432,
+ 7385
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -6,
+ -16
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 5235,
+ 7434
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5387,
+ 7528
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 5230,
+ 7548
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5267,
+ 7539
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 4,
+ -15
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -32
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 5288,
+ 7652
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ]
+ ],
+ [
+ [
+ 5380,
+ 7863
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ]
+ ],
+ [
+ [
+ 5381,
+ 7810
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 1,
+ -17
+ ],
+ [
+ 3,
+ -12
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 11,
+ -14
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 3,
+ -12
+ ],
+ [
+ 3,
+ -19
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 10,
+ -15
+ ],
+ [
+ 9,
+ -11
+ ],
+ [
+ 9,
+ -7
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 16,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 15,
+ -11
+ ],
+ [
+ 16,
+ -10
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 13,
+ -11
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 9,
+ -11
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -6,
+ 20
+ ],
+ [
+ -11,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ -4,
+ -16
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 0,
+ -14
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 1,
+ -13
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -7,
+ -9
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 13
+ ],
+ [
+ -5,
+ 15
+ ],
+ [
+ -3,
+ 14
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -9,
+ 10
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -6,
+ 15
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -11,
+ 20
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -8,
+ 8
+ ],
+ [
+ -4,
+ 11
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -7,
+ 11
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -2,
+ 20
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -9,
+ 5
+ ],
+ [
+ -12,
+ 13
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -7,
+ -12
+ ],
+ [
+ -6,
+ -13
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -6,
+ -2
+ ]
+ ],
+ [
+ [
+ 5344,
+ 7714
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 2854,
+ 6247
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 10,
+ -6
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ]
+ ],
+ [
+ [
+ 4943,
+ 8019
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 6087,
+ 7034
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -11,
+ -6
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -9,
+ -5
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 6,
+ -12
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 5,
+ -11
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -6,
+ -9
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -6,
+ 2
+ ]
+ ],
+ [
+ [
+ 5970,
+ 6875
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ]
+ ],
+ [
+ [
+ 5984,
+ 6997
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 13
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ -1,
+ 9
+ ]
+ ],
+ [
+ [
+ 5993,
+ 7069
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 8,
+ 9
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 9,
+ 9
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 7,
+ 8
+ ]
+ ],
+ [
+ [
+ 8441,
+ 6582
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 8452,
+ 6596
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 8484,
+ 6609
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 8949,
+ 6717
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 8562,
+ 6719
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8582,
+ 6780
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 8591,
+ 6803
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 8595,
+ 6809
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 8628,
+ 6927
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -6
+ ]
+ ],
+ [
+ [
+ 8637,
+ 6935
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -7
+ ]
+ ],
+ [
+ [
+ 8602,
+ 7007
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ]
+ ],
+ [
+ [
+ 8621,
+ 7051
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 8613,
+ 7040
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -3,
+ -7
+ ]
+ ],
+ [
+ [
+ 8573,
+ 7072
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 7
+ ]
+ ],
+ [
+ [
+ 8884,
+ 7088
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 8585,
+ 7075
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ]
+ ],
+ [
+ [
+ 8596,
+ 7097
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8605,
+ 7128
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8643,
+ 7119
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -7,
+ -15
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -4,
+ -15
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -4
+ ]
+ ],
+ [
+ [
+ 8673,
+ 7139
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 8682,
+ 7149
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 8590,
+ 7149
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ]
+ ],
+ [
+ [
+ 8731,
+ 7157
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 9
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -9,
+ -9
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ]
+ ],
+ [
+ [
+ 8731,
+ 7170
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 8747,
+ 7159
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ 0,
+ -6
+ ]
+ ],
+ [
+ [
+ 8593,
+ 7163
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8873,
+ 7184
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 8704,
+ 7269
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8842,
+ 7362
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -4,
+ -5
+ ]
+ ],
+ [
+ [
+ 8922,
+ 7567
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -15
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -2,
+ -12
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -13
+ ],
+ [
+ -1,
+ -20
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -3,
+ -13
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 4,
+ -13
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -5,
+ -19
+ ],
+ [
+ -4,
+ -12
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -9,
+ 11
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 16
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 5,
+ 12
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 11,
+ 7
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 7,
+ 10
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 10,
+ 9
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -15
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -5
+ ]
+ ],
+ [
+ [
+ 8874,
+ 7608
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -2,
+ -8
+ ]
+ ],
+ [
+ [
+ 8924,
+ 7783
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 8918,
+ 7795
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 8994,
+ 7725
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 10,
+ -9
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 7,
+ 11
+ ],
+ [
+ 6,
+ 9
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -4,
+ -12
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -11,
+ 8
+ ],
+ [
+ -12,
+ 12
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -12,
+ -2
+ ],
+ [
+ -12,
+ -11
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ -2,
+ 13
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 7,
+ -11
+ ],
+ [
+ 8,
+ -18
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 7140,
+ 7206
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 5
+ ]
+ ],
+ [
+ [
+ 6393,
+ 7767
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 6397,
+ 7774
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 6463,
+ 7799
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 7227,
+ 7614
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -9,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -7,
+ 7
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -18
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 2,
+ -11
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -10,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 6970,
+ 7617
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 0,
+ -14
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 0,
+ -14
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 0,
+ -14
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 0,
+ -13
+ ]
+ ],
+ [
+ [
+ 6554,
+ 7564
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -5,
+ -10
+ ]
+ ],
+ [
+ [
+ 6458,
+ 7590
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -4,
+ 12
+ ],
+ [
+ -3,
+ 13
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 6367,
+ 7853
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ 3,
+ 13
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 5,
+ -11
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -10,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -9,
+ 5
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 12,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 4,
+ -14
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 9,
+ -9
+ ],
+ [
+ 9,
+ -10
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 8,
+ -16
+ ],
+ [
+ 7,
+ -17
+ ],
+ [
+ 8,
+ -17
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 9,
+ -21
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 5,
+ -12
+ ],
+ [
+ 4,
+ -12
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 11,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 6138,
+ 5059
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ]
+ ],
+ [
+ [
+ 6163,
+ 5413
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -4,
+ -12
+ ],
+ [
+ -7,
+ -23
+ ],
+ [
+ -6,
+ -12
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -24
+ ],
+ [
+ 0,
+ -49
+ ],
+ [
+ 1,
+ -48
+ ],
+ [
+ 0,
+ -49
+ ],
+ [
+ 0,
+ -24
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 5,
+ -14
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 6153,
+ 5086
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -12
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -19
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 6089,
+ 4914
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ]
+ ],
+ [
+ [
+ 5941,
+ 5126
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 1,
+ 25
+ ],
+ [
+ 0,
+ 22
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ 19
+ ]
+ ],
+ [
+ [
+ 5943,
+ 5427
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ 5,
+ 12
+ ],
+ [
+ 8,
+ 15
+ ],
+ [
+ 6,
+ 13
+ ],
+ [
+ 6,
+ 12
+ ],
+ [
+ 5,
+ 10
+ ]
+ ],
+ [
+ [
+ 7045,
+ 7456
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 6970,
+ 7501
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 9,
+ 8
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 7,
+ 9
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 6963,
+ 7478
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 3
+ ]
+ ],
+ [
+ [
+ 6993,
+ 7485
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 3
+ ]
+ ],
+ [
+ [
+ 6977,
+ 7482
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 7869,
+ 5801
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -4
+ ]
+ ],
+ [
+ [
+ 7862,
+ 5834
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -6
+ ]
+ ],
+ [
+ [
+ 7900,
+ 5783
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 7858,
+ 5858
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -5,
+ 20
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 15
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ]
+ ],
+ [
+ [
+ 7921,
+ 6010
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ]
+ ],
+ [
+ [
+ 7986,
+ 6031
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ -2,
+ -12
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 784,
+ 4525
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 670,
+ 4860
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 152,
+ 4915
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 216,
+ 4924
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 244,
+ 4927
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 696,
+ 4948
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 248,
+ 5003
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 231,
+ 5024
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 9854,
+ 5114
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 9709,
+ 5133
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 9846,
+ 5138
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 9805,
+ 5242
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 9806,
+ 5261
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 9805,
+ 5283
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 9805,
+ 5290
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 629,
+ 5291
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ]
+ ],
+ [
+ [
+ 9800,
+ 5360
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 9804,
+ 5364
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 574,
+ 5410
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 3263,
+ 6170
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 3260,
+ 6177
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 8508,
+ 7097
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -7,
+ -1
+ ]
+ ],
+ [
+ [
+ 8520,
+ 7162
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 8506,
+ 7163
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ]
+ ],
+ [
+ [
+ 8549,
+ 7178
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8504,
+ 7184
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ]
+ ],
+ [
+ [
+ 8557,
+ 7189
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8575,
+ 7188
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -13
+ ]
+ ],
+ [
+ [
+ 8511,
+ 7286
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8636,
+ 7343
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 8514,
+ 7357
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 8565,
+ 7408
+ ],
+ [
+ 7,
+ -25
+ ],
+ [
+ 6,
+ -17
+ ],
+ [
+ 6,
+ -12
+ ],
+ [
+ 8,
+ -23
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 2,
+ -11
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -6,
+ -9
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ]
+ ],
+ [
+ [
+ 8517,
+ 7360
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 5598,
+ 7617
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 5557,
+ 7634
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ]
+ ],
+ [
+ [
+ 5565,
+ 7651
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 6340,
+ 6890
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ]
+ ],
+ [
+ [
+ 6345,
+ 6828
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -5,
+ 2
+ ]
+ ],
+ [
+ [
+ 6332,
+ 6911
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 3,
+ -13
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ]
+ ],
+ [
+ [
+ 7836,
+ 6473
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 6,
+ -18
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 9,
+ -12
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ]
+ ],
+ [
+ [
+ 7925,
+ 6231
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 7929,
+ 6229
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 7,
+ -12
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ]
+ ],
+ [
+ [
+ 7921,
+ 6010
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -5,
+ 13
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ 3,
+ 14
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ]
+ ],
+ [
+ [
+ 7780,
+ 6354
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 2,
+ 6
+ ]
+ ],
+ [
+ [
+ 5975,
+ 7089
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 5,
+ 21
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ]
+ ],
+ [
+ [
+ 5999,
+ 7178
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -12
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 4790,
+ 5434
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -10,
+ 8
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -24,
+ 27
+ ],
+ [
+ -7,
+ 11
+ ],
+ [
+ -8,
+ 16
+ ],
+ [
+ -17,
+ 32
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -8,
+ 8
+ ],
+ [
+ -6,
+ 13
+ ]
+ ],
+ [
+ [
+ 4680,
+ 5582
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 2
+ ]
+ ],
+ [
+ [
+ 5693,
+ 6451
+ ],
+ [
+ 0,
+ -29
+ ],
+ [
+ 0,
+ -29
+ ],
+ [
+ 0,
+ -28
+ ],
+ [
+ 0,
+ -29
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -7
+ ]
+ ],
+ [
+ [
+ 5666,
+ 6307
+ ],
+ [
+ -14,
+ 13
+ ],
+ [
+ -13,
+ 14
+ ],
+ [
+ -13,
+ 14
+ ],
+ [
+ -14,
+ 13
+ ],
+ [
+ -13,
+ 14
+ ],
+ [
+ -13,
+ 14
+ ],
+ [
+ -14,
+ 13
+ ],
+ [
+ -13,
+ 14
+ ],
+ [
+ -13,
+ 13
+ ],
+ [
+ -14,
+ 14
+ ],
+ [
+ -13,
+ 14
+ ],
+ [
+ -13,
+ 13
+ ],
+ [
+ -13,
+ 14
+ ],
+ [
+ -14,
+ 14
+ ],
+ [
+ -13,
+ 13
+ ],
+ [
+ -13,
+ 14
+ ],
+ [
+ -10,
+ 9
+ ],
+ [
+ -9,
+ -9
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ -10,
+ -10
+ ]
+ ],
+ [
+ [
+ 5416,
+ 6508
+ ],
+ [
+ -12,
+ -12
+ ],
+ [
+ -9,
+ -9
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -9,
+ 16
+ ],
+ [
+ -8,
+ 12
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -14,
+ 6
+ ],
+ [
+ -14,
+ 7
+ ],
+ [
+ -14,
+ 6
+ ]
+ ],
+ [
+ [
+ 5264,
+ 6925
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 13
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 5319,
+ 7095
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 13,
+ -14
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 10,
+ 6
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 9,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 18,
+ -7
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 15,
+ -8
+ ],
+ [
+ 14,
+ -9
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 13,
+ -21
+ ],
+ [
+ 7,
+ -8
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 9,
+ 8
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 8,
+ 18
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 15
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 7,
+ 12
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 13,
+ 12
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 14,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 3308,
+ 5980
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -11
+ ]
+ ],
+ [
+ [
+ 7218,
+ 5705
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 7221,
+ 5739
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 7221,
+ 5749
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 9,
+ -16
+ ],
+ [
+ 5,
+ -16
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ -15
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -12
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 7,
+ -19
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 0,
+ -16
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -7,
+ -11
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -10,
+ -7
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ -2,
+ 13
+ ],
+ [
+ -2,
+ 14
+ ],
+ [
+ -2,
+ 44
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ -2,
+ 15
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ -15
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 15
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 3,
+ 16
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 5798,
+ 3450
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ -11
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ]
+ ],
+ [
+ [
+ 5582,
+ 8368
+ ],
+ [
+ -2,
+ 0
+ ]
+ ],
+ [
+ [
+ 5580,
+ 8368
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -2,
+ -4
+ ]
+ ],
+ [
+ [
+ 5652,
+ 8291
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5632,
+ 8315
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ]
+ ],
+ [
+ [
+ 5589,
+ 8367
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -4,
+ 12
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 2
+ ]
+ ],
+ [
+ [
+ 5584,
+ 8413
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 9,
+ 7
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 5759,
+ 8497
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5584,
+ 8413
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ 1,
+ 22
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 7,
+ 15
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 10,
+ -12
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -14
+ ],
+ [
+ 10,
+ -7
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 18
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 1,
+ 5
+ ]
+ ],
+ [
+ [
+ 8153,
+ 6465
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 3249,
+ 6225
+ ],
+ [
+ -3,
+ 0
+ ]
+ ],
+ [
+ [
+ 3246,
+ 6225
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 4758,
+ 6777
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ]
+ ],
+ [
+ [
+ 4527,
+ 6418
+ ],
+ [
+ 2,
+ 27
+ ],
+ [
+ 4,
+ 15
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 4,
+ 15
+ ],
+ [
+ 2,
+ 14
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 11,
+ 24
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 0,
+ 20
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 3,
+ 15
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 14
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 2,
+ 15
+ ],
+ [
+ 4,
+ 17
+ ],
+ [
+ 3,
+ 13
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 14,
+ 7
+ ],
+ [
+ 12,
+ 10
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ 11,
+ 13
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 8,
+ 18
+ ],
+ [
+ 5,
+ 15
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 1,
+ 14
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 1,
+ 21
+ ],
+ [
+ 4,
+ 16
+ ],
+ [
+ 9,
+ 22
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 1,
+ 14
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 11,
+ 20
+ ],
+ [
+ 7,
+ 15
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 20,
+ 15
+ ],
+ [
+ 12,
+ 11
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 11,
+ 37
+ ],
+ [
+ 11,
+ 52
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 7,
+ -11
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 10,
+ 5
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ]
+ ],
+ [
+ [
+ 5206,
+ 7704
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 5783,
+ 7802
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 5739,
+ 7963
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ]
+ ],
+ [
+ [
+ 6386,
+ 4210
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 4,
+ 13
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -3,
+ -12
+ ]
+ ],
+ [
+ [
+ 6342,
+ 4414
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 6375,
+ 4468
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 5,
+ -14
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 3,
+ -17
+ ],
+ [
+ 3,
+ -27
+ ],
+ [
+ 1,
+ -27
+ ],
+ [
+ 1,
+ -13
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ 4,
+ -12
+ ],
+ [
+ 1,
+ -13
+ ],
+ [
+ -3,
+ -14
+ ],
+ [
+ -3,
+ -14
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 13
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -12
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -19
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ -3,
+ -25
+ ],
+ [
+ -2,
+ -12
+ ],
+ [
+ -3,
+ -15
+ ],
+ [
+ -4,
+ -18
+ ],
+ [
+ -4,
+ -24
+ ],
+ [
+ -3,
+ -24
+ ],
+ [
+ -3,
+ -15
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ -4,
+ -25
+ ],
+ [
+ -4,
+ -26
+ ],
+ [
+ -4,
+ -28
+ ],
+ [
+ -7,
+ -32
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -16
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -3,
+ -23
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ -15
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -3,
+ -13
+ ],
+ [
+ -4,
+ -11
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -9,
+ 12
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -4,
+ 11
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -5,
+ 12
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 18
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 17
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 4,
+ 12
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 3,
+ 13
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 15
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -4,
+ 13
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ -1,
+ 21
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 12,
+ 40
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 13
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 6,
+ 9
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 5,
+ 18
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 3,
+ 19
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 5,
+ 14
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ]
+ ],
+ [
+ [
+ 7039,
+ 5370
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 7041,
+ 5424
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 2453,
+ 6260
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 1919,
+ 6263
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 2585,
+ 6353
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -10
+ ]
+ ],
+ [
+ [
+ 2591,
+ 6407
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 2041,
+ 6429
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 1950,
+ 6575
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 1897,
+ 6589
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -9,
+ 11
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -8
+ ]
+ ],
+ [
+ [
+ 1928,
+ 6624
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 1887,
+ 6598
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 1,
+ 19
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -20
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 1914,
+ 6683
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 1801,
+ 6801
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 1715,
+ 6851
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ]
+ ],
+ [
+ [
+ 1883,
+ 6854
+ ],
+ [
+ -2,
+ -13
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 16
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ]
+ ],
+ [
+ [
+ 1857,
+ 6857
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -7,
+ 12
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 1,
+ -5
+ ]
+ ],
+ [
+ [
+ 1814,
+ 7010
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 2301,
+ 6679
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -5,
+ -20
+ ],
+ [
+ -3,
+ -12
+ ],
+ [
+ -4,
+ -36
+ ],
+ [
+ -2,
+ -24
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -25
+ ],
+ [
+ 1,
+ -21
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 5,
+ -17
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -5,
+ 16
+ ],
+ [
+ 4,
+ -25
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 4,
+ -17
+ ],
+ [
+ 5,
+ -17
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 11,
+ -24
+ ],
+ [
+ 7,
+ -19
+ ],
+ [
+ 3,
+ -17
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ 2,
+ 22
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 15
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 26,
+ 8
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -6,
+ -16
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 2438,
+ 6022
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -8,
+ 16
+ ],
+ [
+ -7,
+ 17
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -11,
+ 17
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -5,
+ 9
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -13,
+ 10
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -9,
+ -12
+ ],
+ [
+ -9,
+ -5
+ ],
+ [
+ -12,
+ -11
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ -11,
+ 10
+ ],
+ [
+ -16,
+ 3
+ ],
+ [
+ -10,
+ 14
+ ],
+ [
+ -11,
+ 6
+ ],
+ [
+ -7,
+ 13
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -10,
+ 5
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -10,
+ 11
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -12,
+ 8
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -9,
+ 5
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -9,
+ 7
+ ],
+ [
+ -12,
+ 8
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ -6,
+ 11
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -9,
+ 9
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -5,
+ 15
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ 0,
+ 20
+ ],
+ [
+ -4,
+ 17
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -6,
+ 13
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -4,
+ 14
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ -6,
+ 15
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -19,
+ 26
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -5,
+ 11
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -8,
+ 6
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -7,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 17
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -6,
+ 16
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -4,
+ 11
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ -4,
+ 12
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -8,
+ 11
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -22
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ -11
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ -1,
+ -16
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 7,
+ -10
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 6,
+ -15
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -17
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ 7,
+ -8
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 7,
+ -10
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 4,
+ -12
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 3,
+ -16
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -14
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 7,
+ -10
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -3,
+ 19
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -7,
+ 8
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -10,
+ 13
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ 10
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 16
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -6,
+ 18
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -10,
+ 15
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -10,
+ 21
+ ],
+ [
+ -6,
+ 10
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -7,
+ 8
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -7,
+ 10
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 11
+ ]
+ ],
+ [
+ [
+ 1746,
+ 7058
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 13,
+ -8
+ ],
+ [
+ 13,
+ -9
+ ],
+ [
+ 13,
+ -8
+ ],
+ [
+ 14,
+ -9
+ ],
+ [
+ 13,
+ -8
+ ],
+ [
+ 13,
+ -9
+ ],
+ [
+ 13,
+ -8
+ ],
+ [
+ 13,
+ -9
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 6,
+ -9
+ ],
+ [
+ 8,
+ -15
+ ],
+ [
+ 6,
+ -10
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 4,
+ -19
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 7,
+ -8
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 7,
+ -10
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 4,
+ -12
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ -11
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ]
+ ],
+ [
+ [
+ 9711,
+ 5520
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ]
+ ],
+ [
+ [
+ 9765,
+ 5590
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ]
+ ],
+ [
+ [
+ 9752,
+ 5595
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 9689,
+ 5605
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 9635,
+ 5826
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 5598,
+ 7617
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 5117,
+ 6286
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -15
+ ],
+ [
+ 0,
+ -17
+ ],
+ [
+ 0,
+ -15
+ ],
+ [
+ 0,
+ -18
+ ],
+ [
+ 0,
+ -14
+ ],
+ [
+ 0,
+ -17
+ ],
+ [
+ 0,
+ -17
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ -2,
+ -13
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ -9
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 4683,
+ 5898
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -3,
+ 9
+ ]
+ ],
+ [
+ [
+ 4658,
+ 6037
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 5,
+ -11
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ 17
+ ],
+ [
+ 1,
+ 16
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ -5,
+ 9
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ -1,
+ 15
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ -1,
+ 15
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ -1,
+ 15
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ 0,
+ 15
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ -1,
+ 15
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ -1,
+ 15
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ -1,
+ 15
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ -1,
+ 15
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ -1,
+ 15
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ 0,
+ 15
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ -1,
+ 13
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 10,
+ 1
+ ]
+ ],
+ [
+ [
+ 5404,
+ 7249
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5397,
+ 7259
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 7727,
+ 5756
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 7727,
+ 5815
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 7737,
+ 5815
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ -7
+ ]
+ ],
+ [
+ [
+ 7728,
+ 5845
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 7737,
+ 5860
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 7724,
+ 5857
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 7736,
+ 5870
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 7725,
+ 5884
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 7723,
+ 5897
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 7733,
+ 5909
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 7730,
+ 5938
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 7633,
+ 6095
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 7624,
+ 6102
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -2,
+ -4
+ ]
+ ],
+ [
+ [
+ 7710,
+ 6120
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -8
+ ]
+ ],
+ [
+ [
+ 7602,
+ 6260
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 7602,
+ 6310
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ]
+ ],
+ [
+ [
+ 7596,
+ 6330
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ -3
+ ]
+ ],
+ [
+ [
+ 7583,
+ 6331
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -7
+ ]
+ ],
+ [
+ [
+ 7780,
+ 6354
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 2,
+ -18
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -11
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 6,
+ -11
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -15
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -18
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -4,
+ -17
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 7741,
+ 5771
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ -2,
+ 19
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -5,
+ 15
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ -19
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 18
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ -2,
+ 25
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 2,
+ 22
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 1,
+ 15
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 22
+ ],
+ [
+ -4,
+ 18
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 15
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -7,
+ 14
+ ],
+ [
+ -1,
+ 4
+ ]
+ ],
+ [
+ [
+ 5533,
+ 7691
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 5537,
+ 7595
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -7,
+ 11
+ ],
+ [
+ -7,
+ 8
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 7439,
+ 8015
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 10,
+ 8
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 9034,
+ 5999
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 9045,
+ 6046
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 9048,
+ 6055
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 9047,
+ 6125
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 9048,
+ 6225
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 9047,
+ 6264
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 5913,
+ 3637
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ]
+ ],
+ [
+ [
+ 5891,
+ 3638
+ ],
+ [
+ 0,
+ 18
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 5887,
+ 3689
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -2,
+ 15
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ]
+ ],
+ [
+ [
+ 5869,
+ 3893
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 5,
+ 11
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 4,
+ 14
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 19
+ ],
+ [
+ 1,
+ 18
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -7,
+ 12
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 9
+ ]
+ ],
+ [
+ [
+ 5844,
+ 4283
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 6,
+ 4
+ ]
+ ],
+ [
+ [
+ 5922,
+ 4377
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -14
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 5,
+ -12
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 17
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ 1,
+ 15
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -4,
+ 12
+ ],
+ [
+ -6,
+ 15
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -7,
+ 15
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -1,
+ 15
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ]
+ ],
+ [
+ [
+ 5971,
+ 4517
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 3,
+ 5
+ ]
+ ],
+ [
+ [
+ 6123,
+ 4581
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -13
+ ],
+ [
+ 0,
+ -16
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -12
+ ],
+ [
+ -7,
+ -17
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -11,
+ -12
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -9,
+ -10
+ ],
+ [
+ -7,
+ -10
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -11
+ ],
+ [
+ -6,
+ -12
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -8,
+ -19
+ ],
+ [
+ -12,
+ -18
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -2,
+ -18
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 4,
+ -22
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 4,
+ -14
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 2,
+ -16
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -16
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -11
+ ],
+ [
+ -3,
+ -13
+ ],
+ [
+ -3,
+ -30
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -5,
+ -15
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -10,
+ -10
+ ],
+ [
+ -22,
+ -14
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -11,
+ -13
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -1,
+ -34
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 5962,
+ 4492
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ]
+ ],
+ [
+ [
+ 5964,
+ 4486
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 4545,
+ 6319
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -1,
+ -9
+ ]
+ ],
+ [
+ [
+ 4658,
+ 6037
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -6,
+ 10
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -1,
+ -5
+ ]
+ ],
+ [
+ [
+ 4540,
+ 6096
+ ],
+ [
+ 0,
+ 26
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 3,
+ 19
+ ],
+ [
+ 4,
+ 15
+ ],
+ [
+ 4,
+ 20
+ ],
+ [
+ 1,
+ 20
+ ],
+ [
+ 0,
+ 19
+ ],
+ [
+ -1,
+ 18
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -2,
+ 16
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 4,
+ 19
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -3,
+ 13
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -4,
+ 16
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -14
+ ]
+ ],
+ [
+ [
+ 4526,
+ 6382
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 9
+ ]
+ ],
+ [
+ [
+ 3273,
+ 6148
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 6601,
+ 4004
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5922,
+ 4377
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 11
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ]
+ ],
+ [
+ [
+ 5914,
+ 4642
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 7,
+ -11
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 8093,
+ 5323
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 18
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 7894,
+ 5341
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 7814,
+ 5356
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8267,
+ 5424
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -4
+ ]
+ ],
+ [
+ [
+ 7785,
+ 5489
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ]
+ ],
+ [
+ [
+ 7773,
+ 5556
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 7835,
+ 5543
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -18
+ ],
+ [
+ 8,
+ -12
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 6,
+ -24
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 0,
+ -16
+ ],
+ [
+ -1,
+ -24
+ ],
+ [
+ -2,
+ -12
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -19
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 8,
+ -12
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 4,
+ -14
+ ],
+ [
+ 7,
+ -31
+ ],
+ [
+ 2,
+ -14
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -13,
+ 14
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ -11,
+ 12
+ ],
+ [
+ -8,
+ 12
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -5,
+ 13
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ -4,
+ 22
+ ],
+ [
+ -3,
+ 32
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -1,
+ 7
+ ]
+ ],
+ [
+ [
+ 7780,
+ 5555
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ]
+ ],
+ [
+ [
+ 8044,
+ 5301
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 8,
+ -9
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 11,
+ 4
+ ],
+ [
+ 17,
+ 9
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 5,
+ 13
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 8,
+ 15
+ ],
+ [
+ 6,
+ 14
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 8198,
+ 5466
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 10,
+ 22
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 6,
+ 23
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 7,
+ -10
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 8253,
+ 5597
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ]
+ ],
+ [
+ [
+ 5649,
+ 4168
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 12,
+ -2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 5,
+ -9
+ ]
+ ],
+ [
+ [
+ 5554,
+ 3757
+ ],
+ [
+ 0,
+ -24
+ ],
+ [
+ 0,
+ -26
+ ],
+ [
+ 0,
+ -26
+ ],
+ [
+ 0,
+ -25
+ ],
+ [
+ 0,
+ -26
+ ],
+ [
+ 0,
+ -26
+ ],
+ [
+ 0,
+ -25
+ ],
+ [
+ 0,
+ -26
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5456,
+ 3535
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -9,
+ 18
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -5,
+ 11
+ ],
+ [
+ -10,
+ 33
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 16
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -1,
+ 21
+ ],
+ [
+ -2,
+ 13
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ -2,
+ 14
+ ],
+ [
+ -4,
+ 14
+ ],
+ [
+ -4,
+ 20
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 23
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 15
+ ],
+ [
+ -4,
+ 15
+ ],
+ [
+ -9,
+ 24
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -11,
+ 32
+ ],
+ [
+ -5,
+ 23
+ ],
+ [
+ -3,
+ 19
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -16,
+ 64
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ -7,
+ 12
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -4,
+ 16
+ ],
+ [
+ -2,
+ 14
+ ],
+ [
+ 0,
+ 17
+ ],
+ [
+ 1,
+ 12
+ ]
+ ],
+ [
+ [
+ 9653,
+ 3881
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 9666,
+ 3949
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 9649,
+ 3965
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 9625,
+ 3992
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ]
+ ],
+ [
+ [
+ 9560,
+ 4018
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 11,
+ -17
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 7,
+ -8
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -6,
+ 11
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -5,
+ 12
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ -6
+ ]
+ ],
+ [
+ [
+ 9442,
+ 4071
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ]
+ ],
+ [
+ [
+ 5416,
+ 6508
+ ],
+ [
+ 3,
+ -33
+ ],
+ [
+ 2,
+ -29
+ ],
+ [
+ 0,
+ -18
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 9,
+ -26
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 7,
+ -15
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -5,
+ -18
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -23
+ ],
+ [
+ -1,
+ -17
+ ],
+ [
+ -1,
+ -23
+ ],
+ [
+ -1,
+ -27
+ ],
+ [
+ -1,
+ -23
+ ],
+ [
+ -2,
+ -30
+ ],
+ [
+ -1,
+ -29
+ ],
+ [
+ -7,
+ -16
+ ],
+ [
+ -13,
+ -28
+ ],
+ [
+ -10,
+ -23
+ ],
+ [
+ -6,
+ -15
+ ],
+ [
+ -10,
+ -30
+ ],
+ [
+ -5,
+ -19
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 2,
+ -14
+ ],
+ [
+ 2,
+ -25
+ ]
+ ],
+ [
+ [
+ 5377,
+ 5973
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -9,
+ 6
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -12,
+ 1
+ ],
+ [
+ -14,
+ -2
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -8,
+ -18
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -9,
+ 9
+ ],
+ [
+ -10,
+ 13
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -12,
+ -13
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -4,
+ 15
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -9,
+ 6
+ ],
+ [
+ -10,
+ 6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -23
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 9664,
+ 3512
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5202,
+ 5438
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 5377,
+ 5973
+ ],
+ [
+ 5,
+ -12
+ ],
+ [
+ 4,
+ -14
+ ],
+ [
+ 4,
+ -10
+ ]
+ ],
+ [
+ [
+ 5237,
+ 5458
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 3,
+ -14
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -6,
+ 11
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 13
+ ],
+ [
+ -7,
+ 11
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -18,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -15,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ]
+ ],
+ [
+ [
+ 2690,
+ 6047
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -23
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -15
+ ],
+ [
+ -2,
+ -24
+ ],
+ [
+ 2,
+ -22
+ ],
+ [
+ -1,
+ -20
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 2618,
+ 5821
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -14,
+ 24
+ ],
+ [
+ -5,
+ 14
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -7,
+ 11
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -8,
+ 15
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 283,
+ 4085
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 3105,
+ 5883
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 3251,
+ 6192
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5093,
+ 8143
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 2
+ ]
+ ],
+ [
+ [
+ 5109,
+ 8164
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ]
+ ],
+ [
+ [
+ 5135,
+ 8241
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 0,
+ -6
+ ]
+ ],
+ [
+ [
+ 5141,
+ 8254
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 5117,
+ 8144
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 8,
+ -6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 3,
+ 22
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 10,
+ 6
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ]
+ ],
+ [
+ [
+ 5166,
+ 8107
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ]
+ ],
+ [
+ [
+ 5147,
+ 8259
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -8,
+ -3
+ ]
+ ],
+ [
+ [
+ 5164,
+ 8263
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5175,
+ 8266
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 5187,
+ 8270
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5141,
+ 8657
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ]
+ ],
+ [
+ [
+ 5137,
+ 8702
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 5225,
+ 8832
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5235,
+ 8851
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -9,
+ -2
+ ]
+ ],
+ [
+ [
+ 5311,
+ 8920
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5332,
+ 8964
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5347,
+ 8980
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -6,
+ -3
+ ]
+ ],
+ [
+ [
+ 5344,
+ 8988
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -5,
+ -1
+ ]
+ ],
+ [
+ [
+ 5360,
+ 9093
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ]
+ ],
+ [
+ [
+ 5385,
+ 9116
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ]
+ ],
+ [
+ [
+ 5422,
+ 9155
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5437,
+ 9133
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -8,
+ -6
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 14,
+ 2
+ ],
+ [
+ 9,
+ 10
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5486,
+ 9192
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 5832,
+ 9204
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ]
+ ],
+ [
+ [
+ 5577,
+ 9221
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -7
+ ]
+ ],
+ [
+ [
+ 5534,
+ 9220
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ]
+ ],
+ [
+ [
+ 5549,
+ 9228
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ]
+ ],
+ [
+ [
+ 5655,
+ 9247
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5667,
+ 9248
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ]
+ ],
+ [
+ [
+ 5651,
+ 9263
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 5857,
+ 9203
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -12,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ]
+ ],
+ [
+ [
+ 5572,
+ 9160
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -11,
+ -1
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -12,
+ 4
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -11,
+ 4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -10,
+ 5
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -10,
+ -8
+ ],
+ [
+ -6,
+ -15
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -10,
+ -12
+ ],
+ [
+ -9,
+ -13
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 2,
+ -11
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -11,
+ -1
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -20
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -6,
+ -13
+ ],
+ [
+ -6,
+ -9
+ ],
+ [
+ -7,
+ -12
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -7,
+ -10
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -6,
+ -12
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 5,
+ -18
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ -12
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 7
+ ]
+ ],
+ [
+ [
+ 5316,
+ 8584
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -5,
+ -12
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -11,
+ -15
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -9,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -8,
+ 6
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 4,
+ 12
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -13,
+ -5
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 11,
+ 8
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 14,
+ 3
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 14,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -12,
+ -1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 9,
+ -4
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 12,
+ 1
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -13,
+ 4
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -18,
+ -3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 11,
+ 4
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 9,
+ -7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -8,
+ 9
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -16,
+ -12
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 9,
+ 14
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 18,
+ 12
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 8,
+ 10
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 16,
+ 5
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 18,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -13,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -17,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 11,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 13,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 13
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -7,
+ -10
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 9,
+ 10
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 8,
+ 9
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 7,
+ 10
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 14,
+ 17
+ ],
+ [
+ 7,
+ 9
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -9,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 9,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -13,
+ -4
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -32,
+ 3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 22,
+ -7
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ]
+ ],
+ [
+ [
+ 5710,
+ 9281
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ]
+ ],
+ [
+ [
+ 4751,
+ 9264
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 12,
+ 7
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -9,
+ -6
+ ]
+ ],
+ [
+ [
+ 5533,
+ 9469
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 5600,
+ 9711
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 9,
+ -5
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 9,
+ -4
+ ],
+ [
+ 9,
+ -5
+ ],
+ [
+ -21,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -23,
+ -3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -12,
+ 5
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 19,
+ 3
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ]
+ ],
+ [
+ [
+ 5746,
+ 9714
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ]
+ ],
+ [
+ [
+ 5312,
+ 9712
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -7,
+ 11
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ]
+ ],
+ [
+ [
+ 5806,
+ 9729
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -10,
+ -3
+ ],
+ [
+ -12,
+ 1
+ ],
+ [
+ -11,
+ 1
+ ],
+ [
+ -13,
+ -4
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 5,
+ -3
+ ]
+ ],
+ [
+ [
+ 5466,
+ 9786
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 11,
+ 10
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -17,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -13,
+ 7
+ ],
+ [
+ -11,
+ 12
+ ],
+ [
+ -11,
+ 4
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ 10
+ ],
+ [
+ 36,
+ 5
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -13,
+ -2
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -14,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 21,
+ 4
+ ],
+ [
+ 10,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 17,
+ 0
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -8,
+ -6
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -14,
+ -1
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 20,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 16,
+ 2
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -20,
+ -1
+ ],
+ [
+ -14,
+ -7
+ ],
+ [
+ 19,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 6,
+ -10
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 12,
+ -10
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -6,
+ 13
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 8,
+ -7
+ ]
+ ],
+ [
+ [
+ 5903,
+ 9799
+ ],
+ [
+ -26,
+ -3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 43,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -29,
+ -4
+ ]
+ ],
+ [
+ [
+ 5520,
+ 9809
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ -3
+ ]
+ ],
+ [
+ [
+ 5580,
+ 9806
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 15,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 16,
+ -3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 17,
+ 0
+ ],
+ [
+ 12,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -24,
+ -11
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -10,
+ -4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -23,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ -27,
+ -2
+ ],
+ [
+ -29,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ -14,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 19,
+ 1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 6,
+ -3
+ ]
+ ],
+ [
+ [
+ 9637,
+ 5154
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 9698,
+ 2160
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 9616,
+ 2260
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 9670,
+ 2485
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ -9
+ ]
+ ],
+ [
+ [
+ 9631,
+ 2554
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 9637,
+ 2582
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 106,
+ 2631
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 106,
+ 2664
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 11,
+ -2
+ ]
+ ],
+ [
+ [
+ 9830,
+ 2830
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ]
+ ],
+ [
+ [
+ 9808,
+ 2806
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -7,
+ -12
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -6,
+ -19
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -3,
+ -13
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -7,
+ -10
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -10,
+ -3
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 6,
+ 10
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 14
+ ],
+ [
+ 2,
+ 14
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ]
+ ],
+ [
+ [
+ 9875,
+ 3094
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ]
+ ],
+ [
+ [
+ 9812,
+ 3172
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 6,
+ -14
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -14
+ ],
+ [
+ 2,
+ -14
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 9,
+ -8
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 11,
+ -5
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -14
+ ],
+ [
+ -1,
+ -14
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ -4,
+ -14
+ ],
+ [
+ -4,
+ -14
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 5,
+ 12
+ ],
+ [
+ 4,
+ 13
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 14
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -15,
+ 37
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 245,
+ 4645
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 209,
+ 4690
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 6631,
+ 6348
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 6566,
+ 6623
+ ],
+ [
+ 3,
+ -16
+ ],
+ [
+ 4,
+ -14
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 6,
+ -10
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 11,
+ -7
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -4,
+ -16
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -7,
+ -8
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -5,
+ -18
+ ],
+ [
+ -5,
+ -17
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -13
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -3,
+ -24
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -6,
+ -15
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -6,
+ -4
+ ]
+ ],
+ [
+ [
+ 6474,
+ 6143
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ]
+ ],
+ [
+ [
+ 6443,
+ 6278
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 7
+ ]
+ ],
+ [
+ [
+ 6557,
+ 6685
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -18
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 6893,
+ 6558
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -3,
+ 23
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -11,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -10,
+ -3
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -9,
+ -3
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -11,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 2733,
+ 5606
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 2803,
+ 5659
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 2808,
+ 5660
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 2715,
+ 5724
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 2836,
+ 5600
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -7,
+ 16
+ ],
+ [
+ -5,
+ 21
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -10,
+ -14
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 5,
+ -11
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -3,
+ 16
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -5,
+ 17
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 2706,
+ 5735
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ -11
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 12,
+ 7
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 12,
+ -10
+ ],
+ [
+ 7,
+ -10
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 9,
+ -13
+ ]
+ ],
+ [
+ [
+ 1436,
+ 3779
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 3044,
+ 4127
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -9,
+ 13
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -8,
+ 11
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -9,
+ 6
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -8,
+ 8
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -9,
+ 6
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -9,
+ 14
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -16,
+ 16
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 16
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -5,
+ 15
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 15
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -9,
+ 14
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -10,
+ 33
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ -3,
+ 16
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -2,
+ 16
+ ],
+ [
+ -4,
+ 12
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -3,
+ 13
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -5,
+ 13
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -6,
+ 24
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -4,
+ 13
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -19,
+ 21
+ ],
+ [
+ -7,
+ 9
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -6,
+ 18
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 2,
+ 20
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 10,
+ 20
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 4,
+ 7
+ ]
+ ],
+ [
+ [
+ 8339,
+ 5487
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 8365,
+ 5534
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 4,
+ -1
+ ]
+ ],
+ [
+ [
+ 8391,
+ 5554
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ]
+ ],
+ [
+ [
+ 8493,
+ 5585
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -10
+ ]
+ ],
+ [
+ [
+ 8414,
+ 5611
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 8251,
+ 5638
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ -11
+ ]
+ ],
+ [
+ [
+ 8259,
+ 5657
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 8466,
+ 5710
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8435,
+ 5716
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 8498,
+ 5736
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ]
+ ],
+ [
+ [
+ 8499,
+ 5721
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -13
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -1,
+ -15
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -14
+ ],
+ [
+ 0,
+ -14
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -4,
+ -12
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -8,
+ 7
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -4,
+ -12
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 17
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -3,
+ 23
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 7,
+ -8
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -6
+ ]
+ ],
+ [
+ [
+ 8501,
+ 5746
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ]
+ ],
+ [
+ [
+ 8479,
+ 5759
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -7
+ ]
+ ],
+ [
+ [
+ 8460,
+ 5748
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 8491,
+ 5755
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 8330,
+ 5788
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 8452,
+ 5795
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 8406,
+ 5787
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 8419,
+ 5706
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 13
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 12
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 4,
+ -14
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 8426,
+ 5728
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 18
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 3,
+ 13
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ -19
+ ],
+ [
+ -4,
+ -8
+ ]
+ ],
+ [
+ [
+ 8437,
+ 5834
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 8258,
+ 5670
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 7,
+ 15
+ ],
+ [
+ 5,
+ 11
+ ],
+ [
+ 5,
+ 14
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 5,
+ 13
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 15
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 3,
+ -14
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -5,
+ -19
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ]
+ ],
+ [
+ [
+ 8329,
+ 5848
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 8460,
+ 5837
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 2,
+ 14
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 13
+ ],
+ [
+ -1,
+ 13
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 8461,
+ 5846
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8467,
+ 5852
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 8402,
+ 5853
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ 1,
+ 18
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -5
+ ]
+ ],
+ [
+ [
+ 8334,
+ 5858
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ]
+ ],
+ [
+ [
+ 8335,
+ 5885
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 8406,
+ 5893
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8478,
+ 5905
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 2,
+ -3
+ ]
+ ],
+ [
+ [
+ 8436,
+ 5892
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 4,
+ -12
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ -6
+ ]
+ ],
+ [
+ [
+ 8397,
+ 5905
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8391,
+ 5895
+ ],
+ [
+ -3,
+ -14
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -11
+ ]
+ ],
+ [
+ [
+ 8437,
+ 5901
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -9
+ ]
+ ],
+ [
+ [
+ 8424,
+ 5924
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ -12
+ ],
+ [
+ 2,
+ -3
+ ]
+ ],
+ [
+ [
+ 8352,
+ 5960
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 8386,
+ 5964
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 8340,
+ 5976
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ]
+ ],
+ [
+ [
+ 8453,
+ 5969
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 8393,
+ 5993
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 6,
+ -10
+ ]
+ ],
+ [
+ [
+ 8389,
+ 6048
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 8363,
+ 6256
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 10,
+ -11
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -17
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -6,
+ -23
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -12
+ ],
+ [
+ 4,
+ -12
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 3,
+ -14
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ -14
+ ],
+ [
+ -2,
+ -13
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -7,
+ 9
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -8,
+ 9
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 6,
+ 12
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 23
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 5,
+ 30
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 8386,
+ 6272
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ]
+ ],
+ [
+ [
+ 8367,
+ 6283
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 8375,
+ 6299
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ -2
+ ]
+ ],
+ [
+ [
+ 8387,
+ 6357
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ -6
+ ]
+ ],
+ [
+ [
+ 8385,
+ 6381
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 8643,
+ 5358
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 8738,
+ 5609
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 9264,
+ 4523
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 6,
+ -7
+ ]
+ ],
+ [
+ [
+ 9285,
+ 4529
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 9191,
+ 4575
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 9196,
+ 4607
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -13
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 9180,
+ 4645
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 9175,
+ 4637
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ]
+ ],
+ [
+ [
+ 9239,
+ 4668
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ]
+ ],
+ [
+ [
+ 8988,
+ 4687
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 4,
+ -6
+ ]
+ ],
+ [
+ [
+ 9196,
+ 4681
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -9
+ ]
+ ],
+ [
+ [
+ 8988,
+ 4695
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 9111,
+ 4848
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 9331,
+ 4799
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ]
+ ],
+ [
+ [
+ 9087,
+ 4871
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 9295,
+ 4871
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 9055,
+ 4912
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ]
+ ],
+ [
+ [
+ 9219,
+ 4936
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -8,
+ 12
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 18
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 6,
+ 9
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -3,
+ 17
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 9267,
+ 4948
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 9240,
+ 5003
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -6
+ ]
+ ],
+ [
+ [
+ 9224,
+ 5014
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 9220,
+ 5021
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 8915,
+ 5022
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ]
+ ],
+ [
+ [
+ 8915,
+ 5033
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 14,
+ -12
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 10,
+ -7
+ ],
+ [
+ 10,
+ -6
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 12,
+ -25
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -16
+ ],
+ [
+ -1,
+ -13
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 17,
+ -17
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 4,
+ -14
+ ],
+ [
+ 3,
+ -12
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -14
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -12,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -7,
+ 9
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -4,
+ 11
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 6,
+ -23
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 6
+ ]
+ ],
+ [
+ [
+ 9248,
+ 4910
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -7,
+ 19
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -6,
+ 10
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -10,
+ 12
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 18,
+ -30
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ]
+ ],
+ [
+ [
+ 9178,
+ 5030
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 9107,
+ 5052
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 9084,
+ 5071
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 6,
+ -1
+ ]
+ ],
+ [
+ [
+ 9159,
+ 5094
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -7
+ ]
+ ],
+ [
+ [
+ 5544,
+ 8321
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 14,
+ -1
+ ],
+ [
+ 13,
+ -1
+ ],
+ [
+ 15,
+ -1
+ ],
+ [
+ 16,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 5655,
+ 8151
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -7,
+ -10
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5626,
+ 8010
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ]
+ ],
+ [
+ [
+ 5396,
+ 8279
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ]
+ ],
+ [
+ [
+ 5394,
+ 8291
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 16,
+ 7
+ ],
+ [
+ 17,
+ 7
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 16,
+ 5
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 4,
+ -13
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ]
+ ],
+ [
+ [
+ 3114,
+ 6224
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 3182,
+ 6227
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ]
+ ],
+ [
+ [
+ 3163,
+ 6246
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 17,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 8469,
+ 7461
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8625,
+ 7634
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 8629,
+ 7620
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -10,
+ -7
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -11
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 8517,
+ 7360
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 7,
+ 24
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ]
+ ],
+ [
+ [
+ 4522,
+ 7077
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ]
+ ],
+ [
+ [
+ 4304,
+ 7313
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 4287,
+ 7363
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ -4
+ ]
+ ],
+ [
+ [
+ 4218,
+ 7399
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ -5
+ ]
+ ],
+ [
+ [
+ 4204,
+ 7403
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 4228,
+ 7405
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ 10,
+ -6
+ ],
+ [
+ 5,
+ -4
+ ]
+ ],
+ [
+ [
+ 4247,
+ 7410
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 4135,
+ 7454
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 4794,
+ 7325
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -9,
+ -10
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 3,
+ 15
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 4,
+ 16
+ ],
+ [
+ 5,
+ 17
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 3,
+ 20
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -2,
+ 16
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 7
+ ]
+ ],
+ [
+ [
+ 5949,
+ 6988
+ ],
+ [
+ 6,
+ 9
+ ],
+ [
+ 2,
+ 6
+ ]
+ ],
+ [
+ [
+ 1153,
+ 3982
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 1214,
+ 4116
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 1092,
+ 4125
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 3,
+ -3
+ ]
+ ],
+ [
+ [
+ 1195,
+ 4127
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 1088,
+ 4136
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ]
+ ],
+ [
+ [
+ 1089,
+ 4155
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 852,
+ 4165
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ]
+ ],
+ [
+ [
+ 838,
+ 4173
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 794,
+ 4212
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 1015,
+ 4227
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 1012,
+ 4226
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 793,
+ 4224
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 959,
+ 4243
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 1041,
+ 4257
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 971,
+ 4271
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ -5
+ ]
+ ],
+ [
+ [
+ 1148,
+ 4578
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 1137,
+ 4612
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 1138,
+ 4625
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ]
+ ],
+ [
+ [
+ 1109,
+ 4641
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ]
+ ],
+ [
+ [
+ 1123,
+ 4669
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 1109,
+ 4671
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 6423,
+ 6601
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ]
+ ],
+ [
+ [
+ 6411,
+ 6612
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 17
+ ],
+ [
+ -1,
+ 13
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 3,
+ 15
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -12
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ]
+ ],
+ [
+ [
+ 5783,
+ 7802
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ]
+ ],
+ [
+ [
+ 5825,
+ 7791
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -14,
+ -5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 0,
+ -18
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 5630,
+ 7732
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ]
+ ],
+ [
+ [
+ 5635,
+ 7945
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 9056,
+ 7684
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 9051,
+ 7687
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 9065,
+ 7697
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 9074,
+ 7703
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -6,
+ -4
+ ]
+ ],
+ [
+ [
+ 9060,
+ 7747
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 13
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 9127,
+ 7794
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -7,
+ -8
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -7,
+ -9
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 8,
+ 12
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -5,
+ 0
+ ]
+ ],
+ [
+ [
+ 6332,
+ 7804
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 9157,
+ 7813
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 6,
+ 14
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 9,
+ 10
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ -9,
+ -11
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -6,
+ -8
+ ]
+ ],
+ [
+ [
+ 9221,
+ 7885
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -8,
+ -14
+ ]
+ ],
+ [
+ [
+ 9252,
+ 7935
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 9279,
+ 7994
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ]
+ ],
+ [
+ [
+ 9299,
+ 8024
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 6,
+ 15
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 9330,
+ 8081
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -4,
+ -9
+ ]
+ ],
+ [
+ [
+ 9344,
+ 8102
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ]
+ ],
+ [
+ [
+ 9323,
+ 8111
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 8965,
+ 8317
+ ],
+ [
+ 6,
+ -15
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 5,
+ -17
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 1,
+ -15
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -15
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 6,
+ -43
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 6,
+ -22
+ ],
+ [
+ 3,
+ -14
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ -9,
+ -38
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ -13
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ -16
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 16
+ ],
+ [
+ 1,
+ 14
+ ],
+ [
+ 4,
+ 20
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -2,
+ 16
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 13
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 0,
+ 37
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 20
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 14
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -5,
+ 11
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 9667,
+ 8327
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -11,
+ 10
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 5,
+ -7
+ ]
+ ],
+ [
+ [
+ 8810,
+ 8357
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 8831,
+ 8357
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 9,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5544,
+ 8321
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ]
+ ],
+ [
+ [
+ 5582,
+ 8368
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -7,
+ -11
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 0,
+ 9
+ ]
+ ],
+ [
+ [
+ 9628,
+ 8342
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ]
+ ],
+ [
+ [
+ 9182,
+ 8583
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -5
+ ]
+ ],
+ [
+ [
+ 9544,
+ 8559
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 12,
+ 5
+ ],
+ [
+ 9,
+ 7
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -10,
+ -3
+ ],
+ [
+ -9,
+ -6
+ ],
+ [
+ -9,
+ -8
+ ]
+ ],
+ [
+ [
+ 5994,
+ 8938
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 6944,
+ 9014
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -5,
+ 9
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 6186,
+ 9026
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 6396,
+ 9169
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -13,
+ -5
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 21,
+ -12
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ]
+ ],
+ [
+ [
+ 6870,
+ 9189
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 9484,
+ 9152
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 9699,
+ 9192
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -16,
+ 5
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 28,
+ -8
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 6679,
+ 9212
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -8,
+ 9
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 9,
+ -5
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 6848,
+ 9247
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 3,
+ -9
+ ]
+ ],
+ [
+ [
+ 9463,
+ 9263
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ]
+ ],
+ [
+ [
+ 6469,
+ 9294
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ]
+ ],
+ [
+ [
+ 8831,
+ 9303
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 14,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 0,
+ 9304
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 12,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -8,
+ -6
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -13,
+ -2
+ ],
+ [
+ -18,
+ -4
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ 9996,
+ -1
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -14,
+ -1
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 10,
+ 5
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ -9996,
+ 1
+ ]
+ ],
+ [
+ [
+ 7156,
+ 9348
+ ],
+ [
+ -14,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 15,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -4,
+ -1
+ ]
+ ],
+ [
+ [
+ 7208,
+ 9372
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -16,
+ 2
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 14,
+ 12
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 7073,
+ 9381
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 8340,
+ 9394
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 6536,
+ 9406
+ ],
+ [
+ 13,
+ -2
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 6,
+ -10
+ ],
+ [
+ 6,
+ -10
+ ],
+ [
+ 12,
+ -14
+ ],
+ [
+ 12,
+ -10
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 11,
+ -5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -14,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -8,
+ 6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -12,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -13,
+ 3
+ ],
+ [
+ -10,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -13,
+ -2
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 10,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ]
+ ],
+ [
+ [
+ 6962,
+ 9394
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 17,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -13,
+ -3
+ ],
+ [
+ -6,
+ -1
+ ]
+ ],
+ [
+ [
+ 7131,
+ 9414
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -12,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 14,
+ -6
+ ]
+ ],
+ [
+ [
+ 7097,
+ 9415
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -9,
+ 0
+ ]
+ ],
+ [
+ [
+ 8949,
+ 9440
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 20,
+ -14
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -12
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -15,
+ 1
+ ],
+ [
+ -11,
+ 5
+ ],
+ [
+ -12,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -10,
+ -5
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ]
+ ],
+ [
+ [
+ 8459,
+ 9437
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ]
+ ],
+ [
+ [
+ 7320,
+ 9450
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 7297,
+ 9451
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 8782,
+ 9441
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -9,
+ 8
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 11,
+ -8
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ]
+ ],
+ [
+ [
+ 8916,
+ 9446
+ ],
+ [
+ -14,
+ -5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 13,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 7354,
+ 9473
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ]
+ ],
+ [
+ [
+ 8149,
+ 9469
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -16,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 24,
+ -4
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ]
+ ],
+ [
+ [
+ 7406,
+ 9503
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 7282,
+ 9528
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 9077,
+ 9525
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 11,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 26,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 16,
+ -1
+ ],
+ [
+ 13,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -5,
+ -13
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -14,
+ -4
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -16,
+ 0
+ ],
+ [
+ -21,
+ 1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -15,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ]
+ ],
+ [
+ [
+ 8775,
+ 9527
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ]
+ ],
+ [
+ [
+ 9246,
+ 9568
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 8889,
+ 9551
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 12,
+ -8
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 44,
+ -16
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -14,
+ -9
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -11,
+ 3
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 10,
+ -13
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ -10,
+ -6
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -18,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -21,
+ 6
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 11,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 9,
+ -4
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 8,
+ -8
+ ]
+ ],
+ [
+ [
+ 7681,
+ 9577
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 8,
+ -2
+ ]
+ ],
+ [
+ [
+ 7690,
+ 9573
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ]
+ ],
+ [
+ [
+ 8124,
+ 9597
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ]
+ ],
+ [
+ [
+ 7710,
+ 9596
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ -6
+ ]
+ ],
+ [
+ [
+ 9142,
+ 9599
+ ],
+ [
+ -21,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 19,
+ 2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 6882,
+ 9575
+ ],
+ [
+ -11,
+ -4
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -11,
+ -4
+ ],
+ [
+ -18,
+ -4
+ ],
+ [
+ -12,
+ -4
+ ],
+ [
+ -12,
+ -3
+ ],
+ [
+ -14,
+ -4
+ ],
+ [
+ -13,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -10,
+ -4
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -28,
+ -9
+ ],
+ [
+ -12,
+ -6
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -10,
+ 5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -11,
+ 2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -19,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -9,
+ -6
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -14,
+ 1
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -10,
+ 9
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 9,
+ 13
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 18,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 8,
+ 9
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 12,
+ -3
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 15,
+ 4
+ ],
+ [
+ 26,
+ 4
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 14,
+ 5
+ ],
+ [
+ 12,
+ 3
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 13,
+ -3
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -9,
+ -7
+ ],
+ [
+ -10,
+ -8
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -11,
+ -3
+ ]
+ ],
+ [
+ [
+ 7674,
+ 9620
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 19,
+ 7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ]
+ ],
+ [
+ [
+ 7486,
+ 9630
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ]
+ ],
+ [
+ [
+ 7983,
+ 9633
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -7,
+ -1
+ ]
+ ],
+ [
+ [
+ 6367,
+ 7853
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ -9
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 1,
+ -12
+ ],
+ [
+ 3,
+ 16
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 7,
+ -15
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ]
+ ],
+ [
+ [
+ 6110,
+ 7685
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -10,
+ 14
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ -17,
+ 23
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -9,
+ 16
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -7,
+ 9
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -7,
+ -5
+ ]
+ ],
+ [
+ [
+ 6061,
+ 7896
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -7,
+ 8
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -8,
+ 12
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ]
+ ],
+ [
+ [
+ 5778,
+ 8610
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 15,
+ -3
+ ],
+ [
+ 12,
+ -5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -7,
+ 8
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -9,
+ -6
+ ],
+ [
+ -10,
+ -2
+ ]
+ ],
+ [
+ [
+ 5857,
+ 9203
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 11,
+ -5
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -16,
+ 4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 15,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 14,
+ -5
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 15,
+ -5
+ ],
+ [
+ 22,
+ -11
+ ],
+ [
+ 30,
+ -18
+ ],
+ [
+ 18,
+ -16
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 21,
+ -14
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ -16
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -12
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -19,
+ -22
+ ],
+ [
+ -12,
+ -8
+ ],
+ [
+ -22,
+ -10
+ ],
+ [
+ -18,
+ -4
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -14,
+ 2
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -10,
+ 5
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -11,
+ 1
+ ],
+ [
+ -24,
+ 5
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -15,
+ 10
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -9,
+ 5
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -15,
+ 4
+ ],
+ [
+ -14,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 15,
+ -6
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 8,
+ -10
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 9,
+ -8
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 12,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -7,
+ 12
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 11,
+ -5
+ ],
+ [
+ 13,
+ -13
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 12,
+ -4
+ ],
+ [
+ 14,
+ -8
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -6,
+ 11
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 15,
+ 9
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 11,
+ 5
+ ],
+ [
+ 9,
+ 8
+ ],
+ [
+ 8,
+ 12
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 9,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 5,
+ 11
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 5,
+ 14
+ ],
+ [
+ 5,
+ 18
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -21,
+ 17
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 16,
+ -8
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 26,
+ 2
+ ],
+ [
+ 12,
+ -2
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 8,
+ -11
+ ],
+ [
+ 7,
+ -10
+ ],
+ [
+ 7,
+ -8
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -18,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -12,
+ -13
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 12,
+ -5
+ ],
+ [
+ 5,
+ -12
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 23,
+ 6
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 14
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 11,
+ 3
+ ],
+ [
+ 11,
+ 3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 21,
+ 11
+ ],
+ [
+ 9,
+ 7
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 11,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 10,
+ 7
+ ],
+ [
+ 20,
+ 10
+ ],
+ [
+ 11,
+ 5
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -14,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 20,
+ 15
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 16,
+ 5
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -9,
+ 20
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 21,
+ -5
+ ],
+ [
+ 24,
+ -1
+ ],
+ [
+ 20,
+ -4
+ ],
+ [
+ 23,
+ -8
+ ],
+ [
+ 12,
+ -6
+ ],
+ [
+ 9,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 13,
+ -10
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 12,
+ -6
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 9,
+ 12
+ ],
+ [
+ 6,
+ 15
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -7,
+ 10
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -16,
+ 6
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 1,
+ 14
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 12,
+ 8
+ ],
+ [
+ 9,
+ 8
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 6,
+ 21
+ ],
+ [
+ 6,
+ 16
+ ],
+ [
+ 10,
+ 17
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 13,
+ -1
+ ],
+ [
+ 23,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -3,
+ -16
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ -11
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 6,
+ -9
+ ],
+ [
+ 13,
+ -9
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -1,
+ -21
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -22
+ ],
+ [
+ 0,
+ -18
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -13
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 10,
+ -6
+ ],
+ [
+ 10,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -10,
+ -6
+ ],
+ [
+ -21,
+ -34
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -15,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 23,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 10,
+ -5
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 26,
+ 14
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 14
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 17,
+ 16
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 15,
+ 6
+ ],
+ [
+ 13,
+ 2
+ ],
+ [
+ 14,
+ 5
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 10,
+ -10
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -22
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 16,
+ 1
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -11,
+ 2
+ ],
+ [
+ -15,
+ 4
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -4,
+ 16
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -19,
+ 9
+ ],
+ [
+ -18,
+ 7
+ ],
+ [
+ -12,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -10,
+ -7
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -12,
+ 3
+ ],
+ [
+ -11,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 7,
+ 22
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 8,
+ 10
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -16,
+ 24
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 17,
+ 23
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -11
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 7,
+ -9
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ 18,
+ -1
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 17,
+ -1
+ ],
+ [
+ 13,
+ -10
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -5,
+ 11
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -11,
+ 6
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -13,
+ 6
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 13,
+ 2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 13,
+ -9
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 11,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 26,
+ -1
+ ],
+ [
+ 15,
+ -9
+ ],
+ [
+ 15,
+ -4
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 18,
+ -13
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 13,
+ 3
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -12,
+ -7
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 4,
+ 12
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -7,
+ 13
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -12,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -9,
+ 8
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -8,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 24,
+ 4
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 48,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 21,
+ 2
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 17,
+ 2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -9,
+ -6
+ ],
+ [
+ -10,
+ -6
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -16,
+ 10
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 20,
+ 3
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -14,
+ 18
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -11,
+ 2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 12,
+ -8
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 11,
+ 9
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 14,
+ -4
+ ],
+ [
+ 23,
+ 9
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 16,
+ 6
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 16,
+ 8
+ ],
+ [
+ 23,
+ 3
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 11,
+ 4
+ ],
+ [
+ 15,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 26,
+ 4
+ ],
+ [
+ 14,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ -13,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 13,
+ -2
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -10,
+ -7
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 16,
+ 5
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -10,
+ 6
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 19,
+ -3
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 14,
+ 3
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -13,
+ 3
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 31,
+ 18
+ ],
+ [
+ 14,
+ 7
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 13,
+ 6
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 18,
+ -5
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 12,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -9,
+ -6
+ ],
+ [
+ -14,
+ -4
+ ],
+ [
+ -16,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 31,
+ -1
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -9,
+ -9
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 20,
+ 1
+ ],
+ [
+ 17,
+ -2
+ ],
+ [
+ 14,
+ 3
+ ],
+ [
+ 18,
+ -2
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 4,
+ -13
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -14,
+ 8
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 6,
+ -9
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -19,
+ -16
+ ],
+ [
+ -20,
+ -10
+ ],
+ [
+ -9,
+ -6
+ ],
+ [
+ -16,
+ -5
+ ],
+ [
+ -11,
+ -6
+ ],
+ [
+ -15,
+ -5
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -12,
+ -3
+ ],
+ [
+ -24,
+ -20
+ ],
+ [
+ -12,
+ -4
+ ],
+ [
+ -14,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -10,
+ -12
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -14,
+ -2
+ ],
+ [
+ -14,
+ -20
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 10,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 17,
+ 2
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 14,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 16,
+ 9
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -9,
+ -3
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 18,
+ -4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 11,
+ -5
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 21,
+ 1
+ ],
+ [
+ 14,
+ 6
+ ],
+ [
+ 32,
+ -2
+ ],
+ [
+ 23,
+ -4
+ ],
+ [
+ 31,
+ -1
+ ],
+ [
+ 12,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 15,
+ -8
+ ],
+ [
+ 13,
+ -3
+ ],
+ [
+ 9,
+ -5
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 19,
+ 0
+ ],
+ [
+ 11,
+ -2
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 23,
+ -11
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 19,
+ -4
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -9,
+ -5
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 16,
+ 0
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -13,
+ 10
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -11,
+ 7
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 10,
+ -9
+ ],
+ [
+ 15,
+ -19
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 11,
+ -17
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 5,
+ 11
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 6,
+ 10
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 8,
+ -9
+ ],
+ [
+ 8,
+ -6
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 11,
+ -3
+ ],
+ [
+ 17,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 20,
+ -9
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 7,
+ -6
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -15,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 9,
+ 8
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 24,
+ 0
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 10,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -9,
+ 7
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 14,
+ -2
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 15,
+ -4
+ ],
+ [
+ 41,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 18,
+ -2
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 17,
+ -2
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -21,
+ 1
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 16,
+ 5
+ ],
+ [
+ 43,
+ 2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -10,
+ -3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 17,
+ 3
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 15,
+ 16
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 27,
+ -2
+ ],
+ [
+ 16,
+ -4
+ ],
+ [
+ 15,
+ -5
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -16,
+ -1
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 15,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 16,
+ 5
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 12,
+ -5
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 9,
+ -11
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ 20,
+ -8
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 19,
+ 2
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 17,
+ 6
+ ],
+ [
+ 17,
+ 3
+ ],
+ [
+ 16,
+ 1
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 22,
+ 0
+ ],
+ [
+ 22,
+ -1
+ ],
+ [
+ 16,
+ -2
+ ],
+ [
+ 18,
+ -6
+ ],
+ [
+ 18,
+ -9
+ ],
+ [
+ 11,
+ -8
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 8,
+ -3
+ ],
+ [
+ 17,
+ -4
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -13
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -6,
+ -15
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 12,
+ 9
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 16,
+ 2
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 10,
+ -7
+ ],
+ [
+ 35,
+ -1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 23,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 15,
+ 11
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 13,
+ 2
+ ],
+ [
+ 13,
+ 13
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -4,
+ 12
+ ],
+ [
+ -11,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 20,
+ -4
+ ],
+ [
+ 16,
+ -2
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 13,
+ -2
+ ],
+ [
+ 14,
+ 1
+ ],
+ [
+ 13,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 8,
+ -6
+ ],
+ [
+ 15,
+ -7
+ ],
+ [
+ 13,
+ -2
+ ],
+ [
+ 15,
+ -6
+ ],
+ [
+ 14,
+ -3
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 16,
+ -14
+ ],
+ [
+ -9995,
+ -2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 11,
+ -4
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -11,
+ 8
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 15,
+ -11
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 43,
+ -25
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 16,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -12,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 11,
+ -3
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 10,
+ -10
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -13,
+ 4
+ ],
+ [
+ -11,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -17,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -8,
+ -6
+ ],
+ [
+ 9994,
+ -2
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -12,
+ -9
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -15,
+ 2
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -7,
+ 9
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -10,
+ 6
+ ],
+ [
+ -8,
+ -6
+ ],
+ [
+ -11,
+ -4
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -15,
+ -6
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 11,
+ 4
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 10,
+ 5
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 7,
+ -8
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 8,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -26,
+ 11
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -20,
+ -9
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -10,
+ -6
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -9,
+ -7
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -7,
+ -10
+ ],
+ [
+ -7,
+ -8
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -15,
+ -12
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -13
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ -10,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -12,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -11,
+ -4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -11,
+ -4
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -14,
+ -20
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -10,
+ -7
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -9,
+ -15
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 12,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -12
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -14
+ ],
+ [
+ -4,
+ -11
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -7,
+ -9
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -2,
+ -13
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -12,
+ -7
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -4,
+ -12
+ ],
+ [
+ -6,
+ -16
+ ],
+ [
+ -8,
+ -12
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -8,
+ -11
+ ],
+ [
+ -10,
+ -12
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 25
+ ],
+ [
+ -3,
+ 26
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -4,
+ 42
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -6,
+ 34
+ ],
+ [
+ -2,
+ 20
+ ],
+ [
+ -2,
+ 19
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 3,
+ 25
+ ],
+ [
+ 2,
+ 16
+ ],
+ [
+ 7,
+ 36
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 13,
+ 14
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 6,
+ 13
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ 10,
+ 8
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 7,
+ 18
+ ],
+ [
+ 14,
+ 16
+ ],
+ [
+ 6,
+ 9
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 10,
+ 13
+ ],
+ [
+ 7,
+ 10
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 13,
+ 7
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 3,
+ 15
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -7,
+ 6
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -26,
+ -8
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -32,
+ -33
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 6,
+ 12
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -13,
+ -8
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -8,
+ -9
+ ],
+ [
+ -6,
+ -13
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -8,
+ -8
+ ],
+ [
+ -13,
+ -10
+ ],
+ [
+ -11,
+ -16
+ ],
+ [
+ -4,
+ -12
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 11,
+ -5
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -6,
+ 12
+ ],
+ [
+ 11,
+ 5
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -9,
+ 11
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -15,
+ 6
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -7,
+ 9
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -13,
+ 5
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ -12
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -29,
+ -2
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -17,
+ -7
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -9,
+ -9
+ ],
+ [
+ -7,
+ -15
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ -10,
+ -6
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -5,
+ -20
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -12,
+ -7
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -6,
+ -10
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ -12,
+ -19
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -11,
+ -17
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -9,
+ -7
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ -12,
+ -11
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -8,
+ -10
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 12,
+ -6
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -16
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 11,
+ -6
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 11,
+ 5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 9,
+ -9
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 9,
+ -12
+ ],
+ [
+ 9,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -3,
+ -12
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -11
+ ],
+ [
+ -1,
+ -15
+ ],
+ [
+ 2,
+ -24
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -5,
+ -11
+ ],
+ [
+ -1,
+ -14
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -7,
+ -8
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -6,
+ -15
+ ],
+ [
+ -5,
+ -14
+ ],
+ [
+ -11,
+ -19
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -3,
+ -12
+ ],
+ [
+ -9,
+ -19
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -8,
+ -10
+ ],
+ [
+ -7,
+ -15
+ ],
+ [
+ -10,
+ -12
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -9,
+ -24
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -7,
+ -9
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -15,
+ -14
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -9,
+ -7
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ 1,
+ 20
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -6,
+ -12
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ -2,
+ -2
+ ]
+ ],
+ [
+ [
+ 7991,
+ 9684
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -16,
+ 3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 26,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -3
+ ]
+ ],
+ [
+ [
+ 7951,
+ 9688
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ -3
+ ]
+ ],
+ [
+ [
+ 7857,
+ 9749
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -8,
+ -13
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -14,
+ -8
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -16,
+ -5
+ ],
+ [
+ -20,
+ 0
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -12,
+ -1
+ ],
+ [
+ -14,
+ 0
+ ],
+ [
+ -14,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -14,
+ -6
+ ],
+ [
+ -13,
+ -4
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 10,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 7117,
+ 9772
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 25,
+ -5
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -22,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 7781,
+ 9769
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ -4,
+ -4
+ ]
+ ],
+ [
+ [
+ 7574,
+ 9774
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -13,
+ 6
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 12,
+ -1
+ ],
+ [
+ 11,
+ -3
+ ],
+ [
+ 25,
+ -3
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -7,
+ -1
+ ]
+ ],
+ [
+ [
+ 6427,
+ 9788
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -17,
+ -1
+ ],
+ [
+ -10,
+ 4
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 6657,
+ 9789
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 15,
+ 4
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ -7,
+ -2
+ ]
+ ],
+ [
+ [
+ 7712,
+ 9801
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -11,
+ -6
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -17,
+ -1
+ ],
+ [
+ -11,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -16,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -12,
+ 3
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ 9,
+ 7
+ ],
+ [
+ 12,
+ 4
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 10,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 20,
+ 2
+ ],
+ [
+ 13,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 6390,
+ 9796
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -10,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 6540,
+ 9807
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 6585,
+ 9812
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -22,
+ 0
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 17,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ]
+ ],
+ [
+ [
+ 6486,
+ 9802
+ ],
+ [
+ -18,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 10,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ]
+ ],
+ [
+ [
+ 6609,
+ 9799
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -11,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 12,
+ -1
+ ],
+ [
+ 27,
+ -1
+ ],
+ [
+ 13,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ -23,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -6,
+ -4
+ ]
+ ],
+ [
+ [
+ 6511,
+ 9819
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -13,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 6317,
+ 9841
+ ],
+ [
+ 13,
+ -3
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -16,
+ 2
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 33,
+ 5
+ ],
+ [
+ 13,
+ 1
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 6726,
+ 9840
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -12,
+ 3
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 13,
+ 2
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 6396,
+ 9845
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 15,
+ -8
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ -16,
+ -5
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -19,
+ -1
+ ],
+ [
+ -12,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -19,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 21,
+ 8
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 17,
+ 3
+ ],
+ [
+ 4,
+ 0
+ ]
+ ],
+ [
+ [
+ 7222,
+ 9841
+ ],
+ [
+ -26,
+ -3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 16,
+ 1
+ ],
+ [
+ 13,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -9,
+ -1
+ ]
+ ],
+ [
+ [
+ 6698,
+ 9846
+ ],
+ [
+ -9,
+ -1
+ ],
+ [
+ -14,
+ 2
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 12,
+ 4
+ ],
+ [
+ 24,
+ 1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -9,
+ -4
+ ]
+ ],
+ [
+ [
+ 6519,
+ 9856
+ ],
+ [
+ 21,
+ -6
+ ],
+ [
+ 20,
+ 1
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 12,
+ -5
+ ],
+ [
+ 18,
+ -5
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -21,
+ -5
+ ],
+ [
+ -14,
+ -2
+ ],
+ [
+ -12,
+ 0
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -12,
+ 3
+ ],
+ [
+ -12,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 6628,
+ 9852
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 11,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ]
+ ],
+ [
+ [
+ 6409,
+ 9852
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 6760,
+ 9832
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 13,
+ 1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -12,
+ -6
+ ],
+ [
+ -13,
+ -4
+ ],
+ [
+ -32,
+ -3
+ ]
+ ],
+ [
+ [
+ 7543,
+ 9857
+ ],
+ [
+ -10,
+ -4
+ ],
+ [
+ -34,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 29,
+ -1
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ]
+ ],
+ [
+ [
+ 7681,
+ 9854
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 18,
+ -7
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -12,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -37,
+ -4
+ ],
+ [
+ -25,
+ -2
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -12,
+ -4
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -18,
+ 6
+ ],
+ [
+ -23,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ -14,
+ -1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 17,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 6647,
+ 9867
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -11,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 6605,
+ 9881
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 12,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -14,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -13,
+ -2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 6767,
+ 9884
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -18,
+ 0
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -11,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 15,
+ 1
+ ],
+ [
+ 25,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ]
+ ],
+ [
+ [
+ 6619,
+ 9890
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 32,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -29,
+ -3
+ ]
+ ],
+ [
+ [
+ 5847,
+ 5122
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 5821,
+ 5104
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 4526,
+ 6382
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 30
+ ],
+ [
+ 0,
+ 3
+ ]
+ ],
+ [
+ [
+ 6166,
+ 6147
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 6024,
+ 6646
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ]
+ ],
+ [
+ [
+ 6016,
+ 6665
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 6345,
+ 6828
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 3,
+ -13
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -12
+ ],
+ [
+ 8,
+ -7
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ -4
+ ]
+ ],
+ [
+ [
+ 6423,
+ 6601
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 6443,
+ 6278
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -10,
+ -3
+ ],
+ [
+ -9,
+ -2
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -8,
+ -8
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ -11
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -3,
+ -12
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -8
+ ]
+ ],
+ [
+ [
+ 6188,
+ 6127
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ -6,
+ 14
+ ],
+ [
+ -9,
+ 12
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -5,
+ 14
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ -5,
+ 13
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -6,
+ 23
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ -11,
+ 16
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -4,
+ 12
+ ],
+ [
+ -6,
+ 14
+ ],
+ [
+ -5,
+ 19
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -5,
+ 15
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -5,
+ 11
+ ],
+ [
+ -5,
+ 9
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -5,
+ 11
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -6,
+ 20
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -8,
+ 29
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -5,
+ 11
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -5,
+ 10
+ ],
+ [
+ -5,
+ 17
+ ],
+ [
+ -6,
+ 18
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 3,
+ 14
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 4,
+ 37
+ ]
+ ],
+ [
+ [
+ 6024,
+ 6451
+ ],
+ [
+ 0,
+ -13
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 4,
+ -15
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 1,
+ -16
+ ],
+ [
+ 1,
+ -19
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 3,
+ -29
+ ],
+ [
+ 3,
+ -15
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 7,
+ -8
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 5946,
+ 5729
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -12,
+ 21
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 42
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -14,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -19,
+ -1
+ ],
+ [
+ 8,
+ -16
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -14,
+ -23
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -12,
+ -25
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -7,
+ 14
+ ],
+ [
+ -13,
+ 17
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -22,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 13
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -21,
+ 2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -11,
+ 26
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -14,
+ -6
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5634,
+ 5813
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 18
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 26
+ ],
+ [
+ 0,
+ 26
+ ],
+ [
+ 0,
+ 25
+ ],
+ [
+ 0,
+ 26
+ ],
+ [
+ 0,
+ 26
+ ],
+ [
+ 0,
+ 25
+ ],
+ [
+ 0,
+ 26
+ ],
+ [
+ 0,
+ 26
+ ]
+ ],
+ [
+ [
+ 5943,
+ 5427
+ ],
+ [
+ -6,
+ -14
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 4535,
+ 5895
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ]
+ ],
+ [
+ [
+ 4539,
+ 5966
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ 9,
+ 22
+ ],
+ [
+ 7,
+ 25
+ ],
+ [
+ 1,
+ 6
+ ]
+ ],
+ [
+ [
+ 7887,
+ 5260
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 4270,
+ 1818
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 3969,
+ 2070
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -9,
+ 7
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 4,
+ 0
+ ]
+ ],
+ [
+ [
+ 4841,
+ 4262
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 4601,
+ 4724
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 9636,
+ 4512
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 9460,
+ 4504
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 10,
+ -12
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ]
+ ],
+ [
+ [
+ 9614,
+ 4564
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 9491,
+ 4586
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ -12
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -7,
+ 8
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 9486,
+ 4629
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -15
+ ]
+ ],
+ [
+ [
+ 9437,
+ 4650
+ ],
+ [
+ 6,
+ -10
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 9448,
+ 4666
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ]
+ ],
+ [
+ [
+ 9421,
+ 4658
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 9378,
+ 4679
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 9394,
+ 4676
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 9391,
+ 4684
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 9371,
+ 4682
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ]
+ ],
+ [
+ [
+ 9435,
+ 4694
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 9464,
+ 4705
+ ],
+ [
+ 7,
+ -17
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 12
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -3,
+ 20
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 9381,
+ 4709
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ]
+ ],
+ [
+ [
+ 9349,
+ 4713
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 9365,
+ 4717
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 9352,
+ 4727
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 9440,
+ 4692
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -8,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 11,
+ -17
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 9328,
+ 4775
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 9374,
+ 4762
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -6,
+ 16
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 4652,
+ 5612
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -9,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ]
+ ],
+ [
+ [
+ 4680,
+ 5582
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -11,
+ 9
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ]
+ ],
+ [
+ [
+ 2560,
+ 5956
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -10,
+ 6
+ ],
+ [
+ -11,
+ 11
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -4,
+ 3
+ ]
+ ],
+ [
+ [
+ 6359,
+ 5832
+ ],
+ [
+ 0,
+ -16
+ ],
+ [
+ 0,
+ -15
+ ],
+ [
+ 0,
+ -16
+ ],
+ [
+ 0,
+ -27
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 0,
+ -14
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -4,
+ -12
+ ],
+ [
+ -5,
+ -16
+ ],
+ [
+ -5,
+ -16
+ ],
+ [
+ -5,
+ -14
+ ],
+ [
+ -4,
+ -13
+ ],
+ [
+ -4,
+ -13
+ ]
+ ],
+ [
+ [
+ 6201,
+ 5846
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 5,
+ -18
+ ],
+ [
+ 7,
+ -14
+ ],
+ [
+ 8,
+ -13
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 16,
+ 0
+ ],
+ [
+ 11,
+ 12
+ ],
+ [
+ 10,
+ 9
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 11,
+ 10
+ ],
+ [
+ 7,
+ 10
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 12,
+ 9
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 7,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 6359,
+ 5832
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 13,
+ 5
+ ],
+ [
+ 10,
+ 11
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 11,
+ -8
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ 1,
+ -15
+ ],
+ [
+ 1,
+ -24
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -19
+ ],
+ [
+ -2,
+ -12
+ ],
+ [
+ 0,
+ -16
+ ],
+ [
+ -4,
+ -11
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -6,
+ -15
+ ],
+ [
+ -3,
+ -13
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -5,
+ -18
+ ],
+ [
+ -7,
+ -14
+ ],
+ [
+ -2,
+ -17
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -6,
+ -18
+ ],
+ [
+ -3,
+ -12
+ ],
+ [
+ -4,
+ -21
+ ],
+ [
+ -1,
+ -14
+ ],
+ [
+ -11,
+ -39
+ ],
+ [
+ -12,
+ -31
+ ],
+ [
+ -7,
+ -26
+ ],
+ [
+ -13,
+ -31
+ ],
+ [
+ -17,
+ -39
+ ],
+ [
+ -23,
+ -47
+ ],
+ [
+ -7,
+ -9
+ ],
+ [
+ -25,
+ -29
+ ],
+ [
+ -16,
+ -24
+ ],
+ [
+ -8,
+ -17
+ ],
+ [
+ -9,
+ -14
+ ],
+ [
+ -7,
+ -13
+ ],
+ [
+ -21,
+ -46
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -5,
+ -13
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -13
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -3,
+ -7
+ ]
+ ],
+ [
+ [
+ 3440,
+ 7877
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 3437,
+ 7882
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 5184,
+ 5191
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -3,
+ -7
+ ]
+ ],
+ [
+ [
+ 5206,
+ 5274
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 3411,
+ 5503
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 14,
+ -3
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 14,
+ -5
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -9
+ ]
+ ],
+ [
+ [
+ 5626,
+ 8010
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -1,
+ -9
+ ]
+ ],
+ [
+ [
+ 5377,
+ 7806
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 3
+ ]
+ ],
+ [
+ [
+ 5459,
+ 8426
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 6,
+ 18
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -5,
+ -13
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -7,
+ -30
+ ]
+ ],
+ [
+ [
+ 5529,
+ 8515
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -13
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ]
+ ],
+ [
+ [
+ 5532,
+ 8520
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ]
+ ],
+ [
+ [
+ 5511,
+ 8584
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ -4
+ ]
+ ],
+ [
+ [
+ 5516,
+ 8609
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5670,
+ 8974
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ -7,
+ -18
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -14
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -4,
+ -16
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -13,
+ -4
+ ],
+ [
+ -13,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -7,
+ 14
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -8,
+ 18
+ ],
+ [
+ -3,
+ 13
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 13
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ]
+ ],
+ [
+ [
+ 5891,
+ 3638
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 12
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 3249,
+ 6225
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 6542,
+ 4913
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ -8
+ ]
+ ],
+ [
+ [
+ 5999,
+ 7178
+ ],
+ [
+ -2,
+ 13
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ 2,
+ 16
+ ],
+ [
+ 1,
+ 4
+ ]
+ ],
+ [
+ [
+ 5996,
+ 7253
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 12,
+ 10
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -7
+ ]
+ ],
+ [
+ [
+ 2990,
+ 6442
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ]
+ ],
+ [
+ [
+ 3009,
+ 6437
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3003,
+ 6442
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 5045,
+ 5542
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ]
+ ],
+ [
+ [
+ 7768,
+ 5559
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 7751,
+ 5621
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 7738,
+ 5641
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ]
+ ],
+ [
+ [
+ 7733,
+ 5639
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 7730,
+ 5705
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 7779,
+ 5736
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 7779,
+ 5742
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 7849,
+ 5856
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 7844,
+ 5874
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 7858,
+ 5858
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -10,
+ 3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ -3,
+ -16
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -20
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -11
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ -6,
+ -18
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -14
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -26
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 5,
+ -48
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 4,
+ -13
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 5,
+ -16
+ ],
+ [
+ 8,
+ -14
+ ]
+ ],
+ [
+ [
+ 7780,
+ 5555
+ ],
+ [
+ -7,
+ 18
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 11
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 1,
+ 19
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 15
+ ],
+ [
+ 4,
+ 21
+ ]
+ ],
+ [
+ [
+ 6962,
+ 7542
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 6882,
+ 7325
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 14
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 13
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 6475,
+ 7419
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 2,
+ -13
+ ]
+ ],
+ [
+ [
+ 6497,
+ 7335
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 15
+ ],
+ [
+ -1,
+ 14
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 14
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -9,
+ 10
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -3,
+ 13
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -16
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ -3,
+ 14
+ ]
+ ],
+ [
+ [
+ 6554,
+ 7564
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 13
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 2,
+ -17
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 7,
+ -9
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 6,
+ -11
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 6,
+ -9
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 7,
+ -7
+ ],
+ [
+ 9,
+ -11
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 0,
+ -6
+ ]
+ ],
+ [
+ [
+ 8445,
+ 4646
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 7,
+ 3
+ ]
+ ],
+ [
+ [
+ 8469,
+ 4669
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 12,
+ 5
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -9,
+ -6
+ ],
+ [
+ -6,
+ -8
+ ],
+ [
+ -4,
+ -6
+ ]
+ ],
+ [
+ [
+ 8489,
+ 4715
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ]
+ ],
+ [
+ [
+ 141,
+ 3957
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ]
+ ],
+ [
+ [
+ 134,
+ 3964
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 168,
+ 4110
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3305,
+ 5768
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 16
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 3312,
+ 5828
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -6,
+ -5
+ ]
+ ],
+ [
+ [
+ 5304,
+ 7126
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5313,
+ 7186
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 5238,
+ 7311
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 6,
+ 9
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 16,
+ 9
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -5,
+ -14
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -4,
+ -12
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -5,
+ -12
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -9,
+ -12
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 4,
+ -8
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -11
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ]
+ ],
+ [
+ [
+ 5721,
+ 7496
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 5996,
+ 7253
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -9,
+ -11
+ ],
+ [
+ -7,
+ -15
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -8,
+ -6
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -9,
+ -3
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -12,
+ 10
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -15
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -9,
+ 6
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -13,
+ -2
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -10,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 7,
+ 12
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 13,
+ 4
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -12,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 17,
+ -4
+ ],
+ [
+ 11,
+ 3
+ ],
+ [
+ 13,
+ -7
+ ],
+ [
+ 13,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 18,
+ 15
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 12,
+ 5
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 22,
+ -3
+ ],
+ [
+ 16,
+ -1
+ ],
+ [
+ 7,
+ 7
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 10,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -15
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 6,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 10,
+ -4
+ ],
+ [
+ 9,
+ -2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 14,
+ -4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 16,
+ 5
+ ],
+ [
+ 10,
+ -7
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 12,
+ 9
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 9,
+ 10
+ ],
+ [
+ 2,
+ 5
+ ]
+ ],
+ [
+ [
+ 5778,
+ 7601
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 4,
+ -10
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 17,
+ -12
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -14,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -8,
+ -13
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ]
+ ],
+ [
+ [
+ 8288,
+ 6596
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 3
+ ]
+ ],
+ [
+ [
+ 8361,
+ 6487
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 15
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 13,
+ 45
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -14
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ -1,
+ -14
+ ],
+ [
+ -3,
+ -14
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ -4,
+ -9
+ ]
+ ],
+ [
+ [
+ 6102,
+ 4724
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ]
+ ],
+ [
+ [
+ 6097,
+ 4828
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 6107,
+ 4901
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 14
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ]
+ ],
+ [
+ [
+ 6089,
+ 4914
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -12
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -16
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -2,
+ -10
+ ],
+ [
+ 0,
+ -16
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ -3,
+ -13
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 2,
+ -16
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 6,
+ -15
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 5914,
+ 4642
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 4
+ ]
+ ],
+ [
+ [
+ 5847,
+ 5122
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ]
+ ],
+ [
+ [
+ 5889,
+ 7845
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 11,
+ -4
+ ]
+ ],
+ [
+ [
+ 6061,
+ 7896
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -12,
+ -14
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 7,
+ -15
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -5,
+ -11
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -7,
+ 9
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 9,
+ 11
+ ],
+ [
+ 9,
+ 9
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -8,
+ 7
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -12
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -7,
+ -13
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 3517,
+ 3240
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -6,
+ -13
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -7,
+ -8
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -15,
+ -11
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -9,
+ 2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -11,
+ 5
+ ],
+ [
+ -8,
+ 13
+ ],
+ [
+ -11,
+ 1
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -7,
+ 11
+ ],
+ [
+ -6,
+ 11
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 2,
+ 14
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 11
+ ],
+ [
+ -1,
+ 5
+ ]
+ ],
+ [
+ [
+ 678,
+ 6279
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 15
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 12,
+ -10
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -6,
+ -9
+ ],
+ [
+ -2,
+ -5
+ ]
+ ],
+ [
+ [
+ 643,
+ 6380
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 653,
+ 6389
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 633,
+ 6406
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 617,
+ 6420
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 551,
+ 6442
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 573,
+ 6447
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 2728,
+ 6598
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 2734,
+ 6601
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2740,
+ 6604
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2749,
+ 6607
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2754,
+ 6612
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 2760,
+ 6618
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 2767,
+ 6632
+ ],
+ [
+ -6,
+ -11
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ -12
+ ]
+ ],
+ [
+ [
+ 2721,
+ 6707
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 2720,
+ 6713
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -7
+ ]
+ ],
+ [
+ [
+ 2301,
+ 6691
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ -4,
+ 29
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ -22
+ ],
+ [
+ 4,
+ -29
+ ],
+ [
+ 1,
+ -8
+ ]
+ ],
+ [
+ [
+ 2296,
+ 6756
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 5,
+ 15
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -6,
+ -16
+ ],
+ [
+ -2,
+ -14
+ ]
+ ],
+ [
+ [
+ 2772,
+ 6755
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -3,
+ 15
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 4,
+ -23
+ ]
+ ],
+ [
+ [
+ 2305,
+ 6791
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -6
+ ]
+ ],
+ [
+ [
+ 2312,
+ 6805
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -6,
+ -7
+ ]
+ ],
+ [
+ [
+ 2360,
+ 6863
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 6,
+ 9
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -5,
+ -6
+ ]
+ ],
+ [
+ [
+ 2450,
+ 6883
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 2641,
+ 6891
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -5,
+ -5
+ ]
+ ],
+ [
+ [
+ 2531,
+ 6895
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 2532,
+ 6901
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -7
+ ]
+ ],
+ [
+ [
+ 2521,
+ 6917
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 2540,
+ 6924
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2553,
+ 6926
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 2738,
+ 6968
+ ],
+ [
+ -1,
+ -14
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ]
+ ],
+ [
+ [
+ 1712,
+ 7075
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 1682,
+ 7097
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 1712,
+ 7107
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 1665,
+ 7137
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ]
+ ],
+ [
+ [
+ 1658,
+ 7144
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 1670,
+ 7147
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 2873,
+ 7180
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 2875,
+ 7179
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -4,
+ -8
+ ],
+ [
+ -4,
+ -9
+ ]
+ ],
+ [
+ [
+ 2895,
+ 7211
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ]
+ ],
+ [
+ [
+ 2901,
+ 7214
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 2899,
+ 7249
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 2907,
+ 7366
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 4,
+ 12
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -4,
+ -11
+ ]
+ ],
+ [
+ [
+ 2940,
+ 7469
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 2939,
+ 7518
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 2986,
+ 7545
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -12,
+ -10
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -12,
+ -8
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -10,
+ -4
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 3056,
+ 7561
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 3041,
+ 7567
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 3017,
+ 7573
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 3021,
+ 7574
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -9
+ ]
+ ],
+ [
+ [
+ 3093,
+ 7729
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 3106,
+ 7737
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 1587,
+ 7903
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 1600,
+ 7914
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 1597,
+ 7925
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 1595,
+ 7958
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 1588,
+ 7973
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 1583,
+ 7977
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 1589,
+ 7987
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ]
+ ],
+ [
+ [
+ 3135,
+ 7785
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -6,
+ -9
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -4,
+ -13
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -10,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -8,
+ -10
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -11,
+ -8
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -9
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -12
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -12
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -7,
+ -25
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 3,
+ 13
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -12
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 6,
+ -11
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -9
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -8,
+ 15
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -6,
+ 11
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -8,
+ 6
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -24
+ ],
+ [
+ 6,
+ -21
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 13
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ -2,
+ 17
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -5,
+ -8
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 10,
+ -7
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ -8
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -7,
+ -9
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -6,
+ -14
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -22
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 3,
+ -20
+ ],
+ [
+ 4,
+ -20
+ ],
+ [
+ 6,
+ -23
+ ],
+ [
+ 9,
+ -28
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 14
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 12,
+ -56
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 0,
+ -14
+ ],
+ [
+ -2,
+ -25
+ ],
+ [
+ 0,
+ -17
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -11
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 12
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ -1,
+ 16
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -5,
+ 20
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 22
+ ],
+ [
+ 3,
+ 15
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -15,
+ 23
+ ],
+ [
+ -11,
+ 27
+ ],
+ [
+ -10,
+ 11
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -5,
+ 9
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -9,
+ 7
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -7,
+ -2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -11,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -10,
+ 6
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 8,
+ -5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ 3
+ ],
+ [
+ -8,
+ 6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -11,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -9,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -13,
+ -11
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -7,
+ -9
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 4,
+ -12
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ -2,
+ -15
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -12
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 5,
+ -19
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 1746,
+ 7058
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -4,
+ 12
+ ],
+ [
+ -9,
+ 14
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -9,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -6,
+ 13
+ ],
+ [
+ -6,
+ 10
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -6,
+ 13
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ -3,
+ 10
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -7,
+ 14
+ ],
+ [
+ -1,
+ 12
+ ],
+ [
+ -3,
+ 14
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -7,
+ 13
+ ],
+ [
+ -6,
+ 9
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -4,
+ 8
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 19
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 21
+ ],
+ [
+ 1,
+ 16
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 3,
+ 36
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ -1,
+ 15
+ ],
+ [
+ 1,
+ 17
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -2,
+ 15
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 10
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 19,
+ -3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -6,
+ -14
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 8
+ ]
+ ],
+ [
+ [
+ 9984,
+ 8143
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -10,
+ 9
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 103,
+ 8167
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 111,
+ 8168
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 59,
+ 8159
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 79,
+ 8163
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ]
+ ],
+ [
+ [
+ 95,
+ 8171
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 9959,
+ 8174
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 9991,
+ 8173
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ -2,
+ -4
+ ]
+ ],
+ [
+ [
+ 111,
+ 8179
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 9927,
+ 8172
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -5,
+ -4
+ ]
+ ],
+ [
+ [
+ 179,
+ 8187
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ]
+ ],
+ [
+ [
+ 209,
+ 8195
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ]
+ ],
+ [
+ [
+ 148,
+ 8181
+ ],
+ [
+ -15,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -9,
+ -2
+ ]
+ ],
+ [
+ [
+ 9825,
+ 8200
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 257,
+ 8212
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 286,
+ 8228
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 9799,
+ 8237
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 5,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 3,
+ 0
+ ]
+ ],
+ [
+ [
+ 334,
+ 8256
+ ],
+ [
+ -8,
+ -6
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -9,
+ -7
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ]
+ ],
+ [
+ [
+ 383,
+ 8278
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 372,
+ 8288
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -6
+ ]
+ ],
+ [
+ [
+ 393,
+ 8298
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ]
+ ],
+ [
+ [
+ 401,
+ 8302
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ]
+ ],
+ [
+ [
+ 485,
+ 8317
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ]
+ ],
+ [
+ [
+ 492,
+ 8343
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 459,
+ 8351
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -14,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 5,
+ 11
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 573,
+ 8350
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 569,
+ 8360
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -5
+ ]
+ ],
+ [
+ [
+ 1352,
+ 8356
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -8
+ ]
+ ],
+ [
+ [
+ 559,
+ 8359
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 1309,
+ 8346
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -6
+ ]
+ ],
+ [
+ [
+ 546,
+ 8371
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 536,
+ 8370
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 1297,
+ 8383
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 679,
+ 8399
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 1362,
+ 8380
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 15
+ ],
+ [
+ 10,
+ 7
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ]
+ ],
+ [
+ [
+ 1290,
+ 8429
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 9,
+ -5
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ]
+ ],
+ [
+ [
+ 1312,
+ 8424
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ]
+ ],
+ [
+ [
+ 1330,
+ 8416
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 4,
+ -9
+ ],
+ [
+ -1,
+ -7
+ ]
+ ],
+ [
+ [
+ 703,
+ 8434
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ -5
+ ]
+ ],
+ [
+ [
+ 716,
+ 8439
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 285,
+ 8446
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ]
+ ],
+ [
+ [
+ 1312,
+ 8440
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 1278,
+ 8458
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 1295,
+ 8467
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 9,
+ -4
+ ]
+ ],
+ [
+ [
+ 750,
+ 8474
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 10,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ]
+ ],
+ [
+ [
+ 273,
+ 8478
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 1251,
+ 8487
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ -12
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 8
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ -6
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -4
+ ]
+ ],
+ [
+ [
+ 743,
+ 8516
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 753,
+ 8514
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 8,
+ 9
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ]
+ ],
+ [
+ [
+ 1230,
+ 8539
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -8,
+ 5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -8,
+ 9
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ]
+ ],
+ [
+ [
+ 1269,
+ 8538
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ]
+ ],
+ [
+ [
+ 1259,
+ 8534
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 5,
+ -10
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -5,
+ -9
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 15
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 2,
+ -3
+ ]
+ ],
+ [
+ [
+ 766,
+ 8545
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ]
+ ],
+ [
+ [
+ 764,
+ 8552
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -4
+ ]
+ ],
+ [
+ [
+ 530,
+ 8558
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -6,
+ -12
+ ]
+ ],
+ [
+ [
+ 984,
+ 8629
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -5,
+ -6
+ ]
+ ],
+ [
+ [
+ 888,
+ 8643
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ -3,
+ -2
+ ]
+ ],
+ [
+ [
+ 896,
+ 8629
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -9,
+ -10
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ]
+ ],
+ [
+ [
+ 385,
+ 8662
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -10,
+ 7
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -4,
+ 7
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 12,
+ -1
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 969,
+ 8659
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ]
+ ],
+ [
+ [
+ 933,
+ 8666
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ]
+ ],
+ [
+ [
+ 898,
+ 8666
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 777,
+ 8661
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -1,
+ 0
+ ]
+ ],
+ [
+ [
+ 202,
+ 8666
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -9,
+ 7
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 4,
+ -3
+ ]
+ ],
+ [
+ [
+ 891,
+ 8687
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ]
+ ],
+ [
+ [
+ 237,
+ 8849
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 7,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -9,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ -5
+ ]
+ ],
+ [
+ [
+ 386,
+ 8998
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -3
+ ]
+ ],
+ [
+ [
+ 1388,
+ 8403
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 2,
+ -7
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 1373,
+ 8338
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -7,
+ 1
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -5,
+ 9
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -10,
+ -5
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 5,
+ 14
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -16,
+ 7
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ -3,
+ 13
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -9,
+ 9
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 9,
+ -1
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -5,
+ 11
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 14
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 2,
+ -8
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -8,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ 10
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -13,
+ 11
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -13,
+ 8
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ -7,
+ 4
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -7,
+ -8
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -8,
+ -5
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -14,
+ 7
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -12,
+ 4
+ ],
+ [
+ -13,
+ 3
+ ],
+ [
+ -11,
+ 0
+ ],
+ [
+ -15,
+ -2
+ ],
+ [
+ -9,
+ -3
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -13,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 6,
+ 12
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ -8
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -6,
+ -7
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -9,
+ -8
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 10,
+ 6
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 9,
+ 7
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 13,
+ -5
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -11,
+ 7
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -10,
+ -1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -9,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -8,
+ -9
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 4,
+ -4
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -7,
+ -6
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 6,
+ -4
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -12,
+ -3
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -5,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -18,
+ -9
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -6,
+ -11
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 14,
+ 7
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 4,
+ -7
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 14,
+ 7
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -15,
+ -7
+ ],
+ [
+ -10,
+ -7
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 6
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 3,
+ -12
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ -8,
+ 14
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -6,
+ 7
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -11,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -6,
+ 16
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -6,
+ -12
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -10,
+ -4
+ ],
+ [
+ -13,
+ -3
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -10,
+ 9
+ ],
+ [
+ -5,
+ 9
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 9,
+ 11
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -8,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -13,
+ 0
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -6,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 7,
+ 11
+ ],
+ [
+ 7,
+ 10
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -4,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 7,
+ 11
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -2,
+ 13
+ ],
+ [
+ -6,
+ 8
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -8,
+ -7
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -9,
+ -9
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 8
+ ],
+ [
+ -9,
+ 8
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -6,
+ 5
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -16,
+ 0
+ ],
+ [
+ -11,
+ -5
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -9,
+ 3
+ ],
+ [
+ -19,
+ 4
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -5,
+ 6
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -8,
+ 8
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -11,
+ 3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -20,
+ 5
+ ],
+ [
+ -16,
+ 8
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 5,
+ 6
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 11,
+ 6
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 10,
+ -8
+ ],
+ [
+ 14,
+ 0
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 8,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 7,
+ 12
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -11,
+ 4
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ -8,
+ 11
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 9,
+ -6
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 8,
+ -6
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 12,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -9,
+ -6
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -5,
+ 4
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -7,
+ 2
+ ],
+ [
+ -12,
+ -2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -15,
+ 5
+ ],
+ [
+ -5,
+ 5
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -4,
+ 11
+ ],
+ [
+ -5,
+ 8
+ ],
+ [
+ -35,
+ 25
+ ],
+ [
+ -16,
+ 6
+ ],
+ [
+ -8,
+ 8
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 19,
+ -1
+ ],
+ [
+ 13,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 16,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 9,
+ 8
+ ],
+ [
+ 8,
+ 10
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 16,
+ 19
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 18,
+ 4
+ ],
+ [
+ 10,
+ 7
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 14,
+ 9
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ 11,
+ 9
+ ],
+ [
+ 11,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 18,
+ -6
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -9,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 13,
+ -3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 5,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ -5,
+ -4
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 20,
+ -2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 11,
+ -5
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 18,
+ -2
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 13,
+ -1
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 11,
+ -6
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 16,
+ -1
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ -1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 14,
+ -4
+ ],
+ [
+ 8,
+ -6
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 17,
+ -6
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 6,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ]
+ ],
+ [
+ [
+ 3296,
+ 5915
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 3299,
+ 5932
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 3300,
+ 5942
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3305,
+ 5695
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ -1
+ ]
+ ],
+ [
+ [
+ 3310,
+ 5710
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3188,
+ 5812
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 3226,
+ 5825
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 3019,
+ 5867
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -11,
+ -5
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 3,
+ -13
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 5,
+ -7
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 3,
+ -6
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -2,
+ -13
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -4,
+ -17
+ ],
+ [
+ 3,
+ -10
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -3,
+ 7
+ ],
+ [
+ -2,
+ 12
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 12,
+ 12
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 9,
+ 7
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -8,
+ -3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 5,
+ -3
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 6,
+ -7
+ ],
+ [
+ 6,
+ -8
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 7,
+ -1
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 13,
+ 3
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 20,
+ 1
+ ],
+ [
+ 4,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 6,
+ -12
+ ],
+ [
+ 6,
+ -2
+ ],
+ [
+ 5,
+ -4
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 19,
+ 21
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -8,
+ 1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 11,
+ -1
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 13,
+ -3
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -9,
+ 1
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ -15
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 6,
+ -12
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 6,
+ -3
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -10,
+ 0
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 9,
+ -3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ -1
+ ],
+ [
+ 5,
+ -4
+ ]
+ ],
+ [
+ [
+ 3205,
+ 6244
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ]
+ ],
+ [
+ [
+ 3211,
+ 6247
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ]
+ ],
+ [
+ [
+ 3214,
+ 6263
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ]
+ ],
+ [
+ [
+ 3201,
+ 6209
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 4,
+ 2
+ ]
+ ],
+ [
+ [
+ 3204,
+ 6241
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ]
+ ],
+ [
+ [
+ 3198,
+ 6240
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 7961,
+ 5684
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 7890,
+ 5782
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ 13
+ ],
+ [
+ -3,
+ 5
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 7976,
+ 5783
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 7972,
+ 6379
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 7968,
+ 6383
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 7986,
+ 6389
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ]
+ ],
+ [
+ [
+ 7988,
+ 6406
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ 0
+ ]
+ ],
+ [
+ [
+ 7998,
+ 6423
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -5,
+ -7
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ -9
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -6,
+ -12
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -7,
+ -13
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -5,
+ -20
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 4,
+ -11
+ ],
+ [
+ 3,
+ -3
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 5,
+ -9
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 6,
+ -17
+ ],
+ [
+ 5,
+ -8
+ ],
+ [
+ 6,
+ -10
+ ],
+ [
+ 1,
+ -9
+ ],
+ [
+ 5,
+ -6
+ ],
+ [
+ 6,
+ -9
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 4,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 3,
+ -7
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 3,
+ -11
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -12
+ ],
+ [
+ 1,
+ -10
+ ],
+ [
+ 3,
+ -12
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ 2,
+ -10
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 0,
+ -5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ 0,
+ -15
+ ],
+ [
+ 1,
+ -8
+ ],
+ [
+ 0,
+ -10
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -14
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ 2,
+ -14
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ 0,
+ -20
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ -8
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -10
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -8,
+ -8
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -10
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 4,
+ -2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -9,
+ 17
+ ],
+ [
+ 2,
+ -5
+ ],
+ [
+ 9,
+ -19
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ -7,
+ 17
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ 8,
+ -19
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -18,
+ -17
+ ],
+ [
+ -3,
+ -8
+ ],
+ [
+ -2,
+ -9
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 0,
+ 22
+ ],
+ [
+ 1,
+ 24
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -2,
+ 4
+ ]
+ ],
+ [
+ [
+ 7929,
+ 6229
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ]
+ ],
+ [
+ [
+ 9718,
+ 4021
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ -2
+ ]
+ ],
+ [
+ [
+ 9707,
+ 4058
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ -3,
+ 2
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -7
+ ],
+ [
+ 4,
+ -5
+ ]
+ ],
+ [
+ [
+ 9703,
+ 4093
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -7,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ],
+ [
+ 1,
+ -4
+ ]
+ ],
+ [
+ [
+ 9678,
+ 4173
+ ],
+ [
+ 3,
+ -8
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ]
+ ],
+ [
+ [
+ 9678,
+ 4217
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 2,
+ -2
+ ]
+ ],
+ [
+ [
+ 9674,
+ 4243
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -6
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 9649,
+ 4257
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 4,
+ -6
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -4
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -2,
+ -4
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -2,
+ -5
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 2,
+ -10
+ ]
+ ],
+ [
+ [
+ 9644,
+ 4278
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 0,
+ -5
+ ]
+ ],
+ [
+ [
+ 9672,
+ 4264
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 14
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 2,
+ -23
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ -1,
+ -1
+ ]
+ ],
+ [
+ [
+ 9663,
+ 4295
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ -3,
+ -9
+ ]
+ ],
+ [
+ [
+ 9671,
+ 4301
+ ],
+ [
+ -1,
+ -4
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 18
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ -13
+ ],
+ [
+ 0,
+ -7
+ ]
+ ],
+ [
+ [
+ 9631,
+ 4330
+ ],
+ [
+ 2,
+ -19
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 1,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -15
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 6
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ -3,
+ 20
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ -6
+ ],
+ [
+ 2,
+ -5
+ ]
+ ],
+ [
+ [
+ 9654,
+ 4362
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ -1,
+ -5
+ ]
+ ],
+ [
+ [
+ 9652,
+ 4383
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 54,
+ 4359
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 107,
+ 4416
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 237,
+ 4375
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -4,
+ 6
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 7,
+ -5
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 2,
+ -1
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 0,
+ -3
+ ],
+ [
+ 0,
+ -1
+ ]
+ ],
+ [
+ [
+ 213,
+ 4408
+ ],
+ [
+ 3,
+ -5
+ ],
+ [
+ 1,
+ -7
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -4,
+ -1
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 9
+ ],
+ [
+ -2,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ 1
+ ]
+ ],
+ [
+ [
+ 6493,
+ 5912
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 9,
+ -6
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -11,
+ -3
+ ],
+ [
+ -4,
+ 2
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -5,
+ 7
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ -4
+ ]
+ ],
+ [
+ [
+ 6187,
+ 5973
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ -1,
+ -4
+ ]
+ ],
+ [
+ [
+ 6188,
+ 5989
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ 1
+ ],
+ [
+ -2,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 1,
+ -3
+ ],
+ [
+ 0,
+ -2
+ ]
+ ],
+ [
+ [
+ 6182,
+ 6065
+ ],
+ [
+ 0,
+ -1
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ -4
+ ],
+ [
+ 0,
+ -2
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 6474,
+ 6143
+ ],
+ [
+ -14,
+ -11
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -6
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -1,
+ -12
+ ],
+ [
+ 1,
+ -11
+ ],
+ [
+ 0,
+ -6
+ ],
+ [
+ -4,
+ -4
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -4,
+ -5
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -8,
+ -6
+ ],
+ [
+ -9,
+ -5
+ ],
+ [
+ -13,
+ -6
+ ],
+ [
+ -5,
+ -6
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -10,
+ -6
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -7,
+ -8
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -5
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -4,
+ -9
+ ],
+ [
+ -3,
+ -4
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -8,
+ 3
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -7,
+ -11
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ -5,
+ -5
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -8,
+ -2
+ ],
+ [
+ -7,
+ -3
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -6,
+ -4
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -7
+ ],
+ [
+ -4,
+ -2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -4,
+ 3
+ ],
+ [
+ -7,
+ -8
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -3,
+ 4
+ ],
+ [
+ -6,
+ 4
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ -7,
+ 25
+ ],
+ [
+ 2,
+ 21
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ -2,
+ 10
+ ],
+ [
+ -4,
+ 9
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 13
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -1,
+ 7
+ ],
+ [
+ -6,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ -2
+ ],
+ [
+ 1,
+ -2
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ -2,
+ 16
+ ],
+ [
+ 3,
+ 22
+ ],
+ [
+ -1,
+ 20
+ ]
+ ],
+ [
+ [
+ 6051,
+ 2480
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -6,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ -1
+ ],
+ [
+ 2,
+ -3
+ ],
+ [
+ 1,
+ -1
+ ],
+ [
+ -1,
+ -2
+ ]
+ ],
+ [
+ [
+ 5913,
+ 3637
+ ],
+ [
+ -1,
+ -13
+ ],
+ [
+ -4,
+ -21
+ ],
+ [
+ -1,
+ -9
+ ],
+ [
+ -4,
+ -34
+ ],
+ [
+ -4,
+ -18
+ ],
+ [
+ -3,
+ -7
+ ],
+ [
+ -7,
+ -12
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -2
+ ],
+ [
+ -12,
+ -25
+ ],
+ [
+ -5,
+ -13
+ ],
+ [
+ -4,
+ -17
+ ],
+ [
+ -4,
+ -10
+ ],
+ [
+ -6,
+ -21
+ ],
+ [
+ -5,
+ -16
+ ],
+ [
+ -5,
+ -15
+ ],
+ [
+ -9,
+ -20
+ ],
+ [
+ -4,
+ -6
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -7,
+ -12
+ ],
+ [
+ -9,
+ -19
+ ],
+ [
+ -8,
+ -16
+ ],
+ [
+ -11,
+ -19
+ ],
+ [
+ -7,
+ -9
+ ],
+ [
+ -10,
+ -16
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -11,
+ -16
+ ],
+ [
+ -8,
+ -9
+ ],
+ [
+ -13,
+ -11
+ ],
+ [
+ -5,
+ -3
+ ],
+ [
+ -13,
+ 3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -4,
+ -7
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -2,
+ -2
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -3,
+ -5
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -6,
+ -1
+ ],
+ [
+ -12,
+ 7
+ ],
+ [
+ -13,
+ 4
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -7,
+ -5
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -10,
+ 1
+ ],
+ [
+ -5,
+ 3
+ ],
+ [
+ -5,
+ 0
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -5,
+ -1
+ ],
+ [
+ -12,
+ -17
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -6,
+ -2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -6,
+ 2
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -7,
+ -1
+ ],
+ [
+ -3,
+ -3
+ ],
+ [
+ -11,
+ -16
+ ],
+ [
+ -3,
+ 1
+ ],
+ [
+ -2,
+ 1
+ ],
+ [
+ -6,
+ 0
+ ],
+ [
+ -7,
+ 9
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -1,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -2,
+ -1
+ ],
+ [
+ -1,
+ -1
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ -1,
+ 4
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -1,
+ 0
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -2,
+ 0
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ 0,
+ -11
+ ],
+ [
+ -1,
+ 3
+ ],
+ [
+ -2,
+ 7
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 8
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ -1,
+ 5
+ ],
+ [
+ -3,
+ 11
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -2,
+ 9
+ ],
+ [
+ -3,
+ 3
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -2,
+ 5
+ ],
+ [
+ -1,
+ 8
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ -4
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ -1,
+ 9
+ ],
+ [
+ -3,
+ 21
+ ],
+ [
+ -1,
+ 6
+ ],
+ [
+ -6,
+ 15
+ ],
+ [
+ -8,
+ 21
+ ],
+ [
+ -9,
+ 33
+ ],
+ [
+ -4,
+ 20
+ ],
+ [
+ -7,
+ 40
+ ],
+ [
+ -6,
+ 23
+ ],
+ [
+ -7,
+ 21
+ ],
+ [
+ -1,
+ 1
+ ]
+ ],
+ [
+ [
+ 5815,
+ 3905
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 7,
+ -2
+ ],
+ [
+ 8,
+ -6
+ ],
+ [
+ 8,
+ -2
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 5,
+ -1
+ ],
+ [
+ 3,
+ -2
+ ],
+ [
+ 3,
+ -4
+ ]
+ ],
+ [
+ [
+ 5844,
+ 4283
+ ],
+ [
+ -4,
+ 0
+ ],
+ [
+ -7,
+ 0
+ ],
+ [
+ -8,
+ 0
+ ],
+ [
+ -6,
+ -3
+ ],
+ [
+ -6,
+ -5
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ -2,
+ -3
+ ],
+ [
+ -1,
+ -2
+ ],
+ [
+ -1,
+ -3
+ ],
+ [
+ -1,
+ -6
+ ],
+ [
+ 0,
+ -9
+ ],
+ [
+ -1,
+ -7
+ ],
+ [
+ -2,
+ -6
+ ],
+ [
+ -10,
+ -8
+ ],
+ [
+ -6,
+ -6
+ ],
+ [
+ -7,
+ -7
+ ],
+ [
+ -5,
+ -10
+ ],
+ [
+ -3,
+ -11
+ ],
+ [
+ -5,
+ -15
+ ],
+ [
+ -6,
+ -12
+ ],
+ [
+ -6,
+ -14
+ ],
+ [
+ -7,
+ -4
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -7,
+ 5
+ ],
+ [
+ -5,
+ 1
+ ],
+ [
+ -4,
+ -3
+ ],
+ [
+ -4,
+ 1
+ ],
+ [
+ -4,
+ 5
+ ],
+ [
+ -2,
+ 2
+ ],
+ [
+ -3,
+ -1
+ ],
+ [
+ -3,
+ 0
+ ],
+ [
+ -5,
+ 3
+ ]
+ ]
+ ],
+ "transform": {
+ "scale": [
+ 0.036003600360036005,
+ 0.01736158967459246
+ ],
+ "translate": [
+ -180,
+ -89.99892578124998
+ ]
+ }
+} \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/data/sprites/clouds.json b/framework/src/onos/web/gui/src/main/webapp/data/sprites/clouds.json
new file mode 100644
index 00000000..e0c56030
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/data/sprites/clouds.json
@@ -0,0 +1,59 @@
+{
+ "defn_name": "clouds",
+ "defn_desc": "Sample Subnet Cloud layout",
+
+ "_comment": [
+ "Sample cloud sprite layout",
+ "(1) Register on the server with ...",
+ " onos-upload-sprites localhost clouds.json",
+ "(2) Load into topology view with ...",
+ " http://localhost:8181/onos/ui/index.html#/topo?sprites=clouds"
+ ],
+
+ "paths": [
+ {
+ "tag": "cloud-dashed",
+ "stroke": {
+ "width": 0.8,
+ "dasharray": [4,2]
+ },
+ "glyph": "cloud"
+ },
+ {
+ "tag": "cloud-solid",
+ "stroke": {
+ "width": 1
+ },
+ "glyph": "cloud"
+ }
+ ],
+
+ "defn": [
+ {
+ "id": "subnetA",
+ "path": "cloud-dashed",
+ "dim": [400,400],
+ "labelyoff": 0.35
+ },
+ {
+ "id": "subnetB",
+ "path": "cloud-solid",
+ "dim": [600,600],
+ "labelyoff": 0.35
+ }
+ ],
+
+ "load": {
+ "sprites": [
+ { "id": "subnetA", "pos":[-200,40], "label":"apples", "class":"blue1" },
+ { "id": "subnetA", "pos":[250,40], "label":"bananas", "class":"blue1" },
+ { "id": "subnetA", "pos":[700,40], "label":"cherries", "class":"blue1" },
+ { "id": "subnetB", "pos":[-200,400], "label":"Menlo Park", "class":"gold1" },
+ { "id": "subnetB", "pos":[500,400], "label":"Stanford", "class":"gold1" }
+ ],
+ "labels": [
+ { "pos":[0,50], "text":"Sample Subnets", "size":1.4 }
+ ]
+ }
+
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/data/sprites/demo-clouds.json b/framework/src/onos/web/gui/src/main/webapp/data/sprites/demo-clouds.json
new file mode 100644
index 00000000..98ebc264
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/data/sprites/demo-clouds.json
@@ -0,0 +1,45 @@
+{
+ "defn_name": "demo-clouds",
+ "defn_desc": "Demo Sample Subnet Clouds",
+
+ "_comment": [
+ "Sample cloud sprite layout",
+ "(1) Register on the server with ...",
+ " onos-upload-sprites localhost demo-clouds.json",
+ "(2) Load into topology view with ...",
+ " http://localhost:8181/onos/ui/index.html#/topo?sprites=demo-clouds"
+ ],
+
+ "paths": [
+ {
+ "tag": "dotted-cloud",
+ "stroke": {
+ "width": 0.8,
+ "dasharray": [2,2]
+ },
+ "glyph": "cloud"
+ }
+ ],
+
+ "defn": [
+ {
+ "id": "subnetA",
+ "path": "dotted-cloud",
+ "dim": [400,400],
+ "labelyoff": 0.85
+ }
+ ],
+
+ "load": {
+ "sprites": [
+ { "id": "subnetA", "pos":[250,40], "label":"192.168.2.0/24", "class":"blue1" },
+ { "id": "subnetA", "pos":[-200,400], "label":"192.168.1.0/24", "class":"gold1" },
+ { "id": "subnetA", "pos":[700,400], "label":"192.168.3.0/24", "class":"gold1" }
+ ],
+ "labels": [
+ { "pos":[450,700], "text":"Demo Subnets", "size":1.6 }
+ ]
+ }
+
+}
+
diff --git a/framework/src/onos/web/gui/src/main/webapp/data/sprites/layout.json b/framework/src/onos/web/gui/src/main/webapp/data/sprites/layout.json
new file mode 100644
index 00000000..243681a9
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/data/sprites/layout.json
@@ -0,0 +1,129 @@
+{
+ "defn_name": "layout",
+ "defn_desc": "Sample Layout Sprite Data",
+
+ "_comment": [
+ "Sample sprite layout file, demonstrating user-defined paths",
+ "(1) Register on the server with ...",
+ " onos-upload-sprites localhost layout.json",
+ "(2) Load into topology view with ...",
+ " http://localhost:8181/onos/ui/index.html#/topo?sprites=layout"
+ ],
+
+ "_comment_paths": [
+ "The 'paths' array contains custom path data.",
+ "Note that viewbox defaults to [0 0 1000 1000], which is the logical",
+ "coordinate space of the topology view."
+ ],
+ "paths": [
+ {
+ "tag": "border",
+ "viewbox": "0 0 1 1",
+ "d": "M0,0h1v1h-1z",
+ "_comment": "path defined in single string"
+ },
+ {
+ "tag": "banner",
+ "viewbox": "0 0 4 8",
+ "d": [
+ "M0,0h4v6l-2,-2l-2,2z",
+ "M1,6h2v2h-2z"
+ ],
+ "_comment": "path defined in multiple strings"
+ },
+ {
+ "tag": "triangle",
+ "viewbox": "0 0 1 1",
+ "d": "M.5,.2l.3,.6,h-.6z",
+ "_comment": "defines its own viewbox"
+ },
+ {
+ "tag": "diamond",
+ "viewbox": "0 0 1 1",
+ "d": "M.2,.5l.3,-.3l.3,.3l-.3,.3z"
+ }
+ ],
+
+ "_comment_defn": [
+ "The 'defn' array contains sprite definitions that combine",
+ "path, dimensions, and label-offset into 'sprites' that can be",
+ "replicated (stamped) in different positions in the view.",
+ "",
+ "The 'glyph' property refers to glyphs registered with the UI.",
+ "Alternatively, the 'path' property refers to a custom path defined in",
+ " the path array above.",
+ "The 'dim' property provides the [width,height] bounds within which the",
+ " glyph/path is drawn. (default is [40,40])",
+ "The 'labelyoff' property defines the Y-offset of the label as a",
+ " percentage from the top of the sprite; for example, 0.4 = 40%. The",
+ " label is centered horizontally.",
+ "The 'scale' property (default is 1) defines the scaling factor, which",
+ " is applied after the sprite has been translated to its position."
+ ],
+ "defn": [
+ {
+ "id": "border",
+ "path": "border",
+ "dim":[1000,1000]
+ },
+ {
+ "id": "multi",
+ "path": "multi"
+ },
+ {
+ "id": "small_tri",
+ "path": "triangle",
+ "scale":4
+ },
+ {
+ "id": "big_tri",
+ "path": "triangle",
+ "scale":12
+ },
+ {
+ "id": "subnet",
+ "glyph": "cloud",
+ "scale":8,
+ "labelyoff": 0.4
+ },
+ {
+ "id": "subnet2",
+ "glyph": "cloud",
+ "dim":[200,200],
+ "labelyoff": 0.4
+ }
+ ],
+
+ "_comment_load": [
+ "The 'load' object contains sprites and labels to load into the view.",
+ "",
+ "Items in the sprite list associate sprites with a position,",
+ "style class, and optional label. Note that the coordinates of",
+ "the position define the top-left corner of the sprite.",
+ "Default 'pos' is [0,0]. Default 'class' is 'gray1'.",
+ "",
+ "Items in the label list associate labels with a position and",
+ "style class. Note that the text is centered on the x-coordinate."
+ ],
+ "load": {
+ "sprites": [
+ { "id": "border", "class": "gold1" },
+ { "id": "subnet", "pos":[-40,20], "label":"apples", "class": "blue1" },
+ { "id": "subnet", "pos":[400,40], "label":"bananas", "class": "blue1" },
+ { "id": "subnet", "pos":[840,60], "label":"cherries", "class": "blue1" },
+ { "id": "subnet2", "pos":[300,400], "class": "gray1" }
+ ],
+ "labels": [
+ { "pos":[500,850], "text":"Sample Layout", "class":"blue1", "size":1.6 },
+ { "pos":[500,900], "text":"Illustrating Sprites", "class":"gray1" }
+ ]
+ },
+ "junk":[
+ { "id": "border" },
+ { "id": "multi", "class": "gray1" },
+ { "id": "small_tri", "pos":[10, 20] },
+ { "id": "small_tri", "pos":[110, 20] },
+ { "id": "small_tri", "pos":[210, 20] },
+ { "id": "small_tri", "pos":[310, 20] }
+ ]
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/data/sprites/menlo.json b/framework/src/onos/web/gui/src/main/webapp/data/sprites/menlo.json
new file mode 100644
index 00000000..68253d34
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/data/sprites/menlo.json
@@ -0,0 +1,76 @@
+{
+ "defn_name": "menlo",
+ "defn_desc": "Office Floor Plan of ONLab at Menlo Park",
+
+ "paths": [
+ {
+ "tag": "outerwalls",
+ "stroke": {
+ "width": 4
+ },
+ "viewbox": "0 0 925 550",
+ "d": [
+ "M36,342V516",
+ "M36,516H892",
+ "M36,24H892",
+ "M36,24V250",
+ "M892,516V274",
+ "M892,188V24"
+ ]
+ },
+ {
+ "tag": "innerwalls",
+ "stroke": {
+ "width": 2
+ },
+ "viewbox": "0 0 925 550",
+ "d": [
+ "M892,188H730V158",
+ "M640,24V254H676H676V368",
+ "M892,312H742",
+ "M742,342V516",
+ "M638,368H546V272",
+ "M544,282H674",
+ "M546,232V66H494V26",
+ "M494,130V60",
+ "M454,130H340",
+ "M400,24V130",
+ "M640,178H546",
+ "M638,188H672V158",
+ "M700,410H602",
+ "M518,410H444",
+ "M400,410H276",
+ "M238,408V516",
+ "M352,410V516",
+ "M444,410V516",
+ "M562,410V516",
+ "M650,410V516",
+ "M88,178H300V24",
+ "M88,60H186V178",
+ "M88,140H108V60"
+ ]
+ }
+ ],
+
+ "defn": [
+ { "id": "owalls", "path": "outerwalls", "dim":[1400,1400] },
+ { "id": "iwalls", "path": "innerwalls", "dim":[1400,1400] }
+ ],
+
+ "load": {
+ "alpha": 0.9,
+ "sprites": [
+ { "id": "owalls", "pos":[-200,-200] },
+ { "id": "iwalls", "pos":[-200,-200] }
+ ],
+ "labels": [
+ { "pos":[160,220], "text":"Kitchen", "class":"gold1" },
+ { "pos":[480,220], "text":"Guru", "class":"gold1" },
+ { "pos":[980,220], "text":"Admin", "class":"gold1" },
+ { "pos":[700,400], "text":"Servers", "class":"gold1" },
+ { "pos":[720,580], "text":"Sm.Conf.", "class":"gold1" },
+ { "pos":[1040,700], "text":"Lg.Conf.", "class":"gold1" },
+ { "pos":[500,80], "text":"ONLab at Menlo Park", "class":"blue1", "size":1.4 }
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/data/sprites/packetOptical.json b/framework/src/onos/web/gui/src/main/webapp/data/sprites/packetOptical.json
new file mode 100644
index 00000000..ae19bee1
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/data/sprites/packetOptical.json
@@ -0,0 +1,42 @@
+{
+ "defn_name": "packetOptical",
+ "defn_desc": "Packet-Optical Demo - ONS 2015",
+
+ "paths": [
+ {
+ "tag": "outline",
+ "stroke": {
+ "width": 1.0
+ },
+ "viewbox": "0 0 140 170",
+ "d": "M10,10h100v150h-100z"
+ }
+ ],
+
+ "defn": [
+ {
+ "id": "group",
+ "path": "outline",
+ "dim": [700, 1000]
+ }
+ ],
+
+ "load": {
+ "sprites": [
+ { "id": "group", "pos": [-300, 0], "class": "gold1" },
+ { "id": "group", "pos": [200, 0], "class": "gold1" },
+ { "id": "group", "pos": [700, 0], "class": "gold1" }
+ ],
+
+ "labels": [
+ { "pos":[0,800], "text":"Ciena", "class":"blue1", "size":1.4 },
+ { "pos":[0,840], "text":"Ottawa, Ontario", "class":"blue1", "size":1.0 },
+
+ { "pos":[500,800], "text":"Fujitsu", "class":"blue1", "size":1.4 },
+ { "pos":[500,840], "text":"Richardson, TX", "class":"blue1", "size":1.0 },
+
+ { "pos":[1000,800], "text":"Huawei", "class":"blue1", "size":1.4 },
+ { "pos":[1000,840], "text":"Plano, TX", "class":"blue1", "size":1.0 }
+ ]
+ }
+} \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/data/sprites/segmentRouting.json b/framework/src/onos/web/gui/src/main/webapp/data/sprites/segmentRouting.json
new file mode 100644
index 00000000..58d4702b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/data/sprites/segmentRouting.json
@@ -0,0 +1,52 @@
+{
+ "defn_name": "segmentRouting",
+ "defn_desc": "Schematic of Data Center",
+
+ "paths": [
+ {
+ "tag": "chassis",
+ "stroke": {
+ "width": 3.5
+ },
+ "viewbox": "0 0 120 170",
+ "d": "M10,10h80v150h-80z"
+ },
+ {
+ "tag": "module",
+ "stroke": {
+ "width": 2
+ },
+ "viewbox": "0 0 120 20",
+ "d": "M15,5h70v12h-70z"
+ }
+ ],
+
+ "defn": [
+ {
+ "id": "rack",
+ "path": "chassis",
+ "fill": "gray2",
+ "subpathfill": "blue2",
+ "subpaths": [
+ { "path": "module", "pos": [0, 0]},
+ { "path": "module", "pos": [0, 20]},
+ { "path": "module", "pos": [0, 40]},
+ { "path": "module", "pos": [0, 60]}
+ ],
+ "dim":[120,170]
+ }
+ ],
+
+ "load": {
+ "alpha": 0.9,
+ "sprites": [
+ { "id": "rack", "pos":[200,600], "class":"blue1" },
+ { "id": "rack", "pos":[400,600], "class":"blue1" },
+ { "id": "rack", "pos":[600,600], "class":"blue1" },
+ { "id": "rack", "pos":[800,600], "class":"blue1" }
+ ],
+ "labels": [
+ { "pos":[550,80], "text":"", "class":"blue1", "size":1.4 }
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/main/webapp/error.html b/framework/src/onos/web/gui/src/main/webapp/error.html
new file mode 100644
index 00000000..564e284b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/error.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="UTF-8">
+ <title>ONOS Login</title>
+
+ <style type="text/css">
+ img {
+ margin: 24px;
+ }
+ td {
+ font: normal 16px Helvetica, Arial, sans-serif !important;
+ text-align: left;
+ padding: 4px;
+ }
+ input {
+ font: normal 16px Helvetica, Arial, sans-serif !important;
+ padding: 3px;
+ }
+
+ input[type="submit"] {
+ margin-top: 20px;
+ margin-left: auto;
+ margin-right: auto;
+ display: block;
+ padding: 4px 16px;
+ background-color: #CE5650;
+ color: #fff;
+ /*width: 100%; /!* width of image *!/*/
+ height: 32px;
+ border-radius: 3px;
+ border: 0;
+ -moz-outline-radius: 6px;
+ }
+
+ input[type="submit"]:hover {
+ border-radius: 3px;
+ border: 1px;
+ border-color: #fff;
+ border-style: solid;
+ box-shadow: 0px 0px 10px #3399ff;
+ outline-style: solid;
+ outline-width: 3px;
+ outline-color: #3399ff;
+ }
+
+ #error {
+ margin: 16px auto;
+ color: #CE5650;
+ text-align: center;
+
+ }
+ </style>
+</head>
+<body>
+<div align="center">
+ <img src="data/img/onos-logo.lg.png"/>
+
+ <form method="post" action="j_security_check">
+ <table>
+ <tr>
+ <td>User:</td>
+ <td><input id="username" name="j_username" type="text" autofocus/></td>
+ </tr>
+ <tr>
+ <td>Password:</td>
+ <td><input id="password" name="j_password" type="password"/></td>
+ </tr>
+ <tr>
+ <td colspan="2"><input id="submit" type="submit" value="Login"/></td>
+ </tr>
+ <tr>
+ <td colspan="2"><div id="error">Incorrect login credentials!</div></td>
+ </tr>
+ </table>
+ </form>
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/index.html b/framework/src/onos/web/gui/src/main/webapp/index.html
new file mode 100644
index 00000000..154f9416
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/index.html
@@ -0,0 +1,183 @@
+<!DOCTYPE html>
+<!--
+~ Copyright 2014,2015 Open Networking Laboratory
+~
+~ Licensed under the Apache License, Version 2.0 (the "License");
+~ you may not use this file except in compliance with the License.
+~ You may obtain a copy of the License at
+~
+~ http://www.apache.org/licenses/LICENSE-2.0
+~
+~ Unless required by applicable law or agreed to in writing, software
+~ distributed under the License is distributed on an "AS IS" BASIS,
+~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+~ See the License for the specific language governing permissions and
+~ limitations under the License.
+-->
+<html>
+<head>
+ <meta charset="utf-8">
+ <link rel="shortcut icon" href="data/img/onos-logo.png">
+
+ <link rel="apple-touch-icon" href="data/img/apple-touch-icon.png">
+ <meta name="apple-mobile-web-app-capable" content="yes">
+ <meta name="apple-mobile-web-app-status-bar-style" content="black">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <title>ONOS</title>
+
+ <!-- Third party library code included here -->
+ <!--TODO: use minified versions, once debugging is complete -->
+ <script src="tp/angular.js"></script>
+ <script src="tp/angular-route.js"></script>
+ <script src="tp/angular-cookies.js"></script>
+
+ <script src="tp/d3.js"></script>
+ <script src="tp/topojson.v1.min.js"></script>
+
+ <!-- ONOS UI Framework included here -->
+ <!-- TODO: use a single catenated-minified file here -->
+ <script src="onos.js"></script>
+ <script src="app/directives.js"></script>
+
+ <script src="app/fw/util/util.js"></script>
+ <script src="app/fw/util/fn.js"></script>
+ <script src="app/fw/util/random.js"></script>
+ <script src="app/fw/util/theme.js"></script>
+ <script src="app/fw/util/keys.js"></script>
+ <script src="app/fw/util/prefs.js"></script>
+
+ <script src="app/fw/mast/mast.js"></script>
+ <script src="app/fw/nav/nav.js"></script>
+
+ <script src="app/fw/svg/svg.js"></script>
+ <script src="app/fw/svg/glyph.js"></script>
+ <script src="app/fw/svg/icon.js"></script>
+ <script src="app/fw/svg/geodata.js"></script>
+ <script src="app/fw/svg/map.js"></script>
+ <script src="app/fw/svg/zoom.js"></script>
+ <script src="app/fw/svg/svgUtil.js"></script>
+
+ <script src="app/fw/remote/remote.js"></script>
+ <script src="app/fw/remote/urlfn.js"></script>
+ <script src="app/fw/remote/rest.js"></script>
+ <script src="app/fw/remote/wsock.js"></script>
+ <script src="app/fw/remote/websocket.js"></script>
+
+ <script src="app/fw/widget/widget.js"></script>
+ <script src="app/fw/widget/table.js"></script>
+ <script src="app/fw/widget/toolbar.js"></script>
+ <script src="app/fw/widget/tooltip.js"></script>
+ <script src="app/fw/widget/button.js"></script>
+ <script src="app/fw/widget/tableBuilder.js"></script>
+
+ <script src="app/fw/layer/layer.js"></script>
+ <script src="app/fw/layer/panel.js"></script>
+ <script src="app/fw/layer/flash.js"></script>
+ <script src="app/fw/layer/quickhelp.js"></script>
+ <script src="app/fw/layer/veil.js"></script>
+
+ <!-- Framework and library stylesheets included here -->
+ <!-- TODO: use a single catenated-minified file here -->
+ <link rel="stylesheet" href="app/onos.css">
+ <link rel="stylesheet" href="app/common.css">
+ <link rel="stylesheet" href="app/fw/mast/mast.css">
+ <link rel="stylesheet" href="app/fw/svg/glyph.css">
+ <link rel="stylesheet" href="app/fw/svg/icon.css">
+ <link rel="stylesheet" href="app/fw/layer/panel.css">
+ <link rel="stylesheet" href="app/fw/layer/flash.css">
+ <link rel="stylesheet" href="app/fw/layer/quickhelp.css">
+ <link rel="stylesheet" href="app/fw/layer/veil.css">
+ <link rel="stylesheet" href="app/fw/nav/nav.css">
+ <link rel="stylesheet" href="app/fw/widget/button.css">
+ <link rel="stylesheet" href="app/fw/widget/toolbar.css">
+ <link rel="stylesheet" href="app/fw/widget/tooltip.css">
+ <link rel="stylesheet" href="app/fw/widget/table.css">
+
+ <!-- Builtin views javascript. -->
+ <script src="app/view/topo/topo.js"></script>
+ <script src="app/view/topo/topoD3.js"></script>
+ <script src="app/view/topo/topoEvent.js"></script>
+ <script src="app/view/topo/topoFilter.js"></script>
+ <script src="app/view/topo/topoForce.js"></script>
+ <script src="app/view/topo/topoInst.js"></script>
+ <script src="app/view/topo/topoLink.js"></script>
+ <script src="app/view/topo/topoModel.js"></script>
+ <script src="app/view/topo/topoOblique.js"></script>
+ <script src="app/view/topo/topoOverlay.js"></script>
+ <script src="app/view/topo/topoPanel.js"></script>
+ <script src="app/view/topo/topoSelect.js"></script>
+ <script src="app/view/topo/topoSprite.js"></script>
+ <script src="app/view/topo/topoTraffic.js"></script>
+ <script src="app/view/topo/topoTrafficNew.js"></script>
+ <script src="app/view/topo/topoToolbar.js"></script>
+ <script src="app/view/device/device.js"></script>
+ <script src="app/view/flow/flow.js"></script>
+ <script src="app/view/port/port.js"></script>
+ <script src="app/view/group/group.js"></script>
+ <script src="app/view/link/link.js"></script>
+ <script src="app/view/host/host.js"></script>
+ <script src="app/view/intent/intent.js"></script>
+ <script src="app/view/app/app.js"></script>
+ <script src="app/view/settings/settings.js"></script>
+ <script src="app/view/cluster/cluster.js"></script>
+ <script src="app/view/tunnel/tunnel.js"></script>
+
+ <!-- This is where contributed javascript will get injected -->
+ <!-- {INJECTED-JAVASCRIPT-START} -->
+ <!-- {INJECTED-JAVASCRIPT-END} -->
+
+ <!-- Builtin views stylesheets. -->
+ <link rel="stylesheet" href="app/view/topo/topo.css">
+ <link rel="stylesheet" href="app/view/device/device.css">
+ <link rel="stylesheet" href="app/view/flow/flow.css">
+ <link rel="stylesheet" href="app/view/port/port.css">
+ <link rel="stylesheet" href="app/view/group/group.css">
+ <link rel="stylesheet" href="app/view/link/link.css">
+ <link rel="stylesheet" href="app/view/host/host.css">
+ <link rel="stylesheet" href="app/view/intent/intent.css">
+ <link rel="stylesheet" href="app/view/app/app.css">
+ <link rel="stylesheet" href="app/view/settings/settings.css">
+ <link rel="stylesheet" href="app/view/cluster/cluster.css">
+ <link rel="stylesheet" href="app/view/tunnel/tunnel.css">
+
+ <!-- This is where contributed stylesheets will get injected -->
+ <!-- {INJECTED-STYLESHEETS-START} -->
+ <!-- {INJECTED-STYLESHEETS-END} -->
+
+</head>
+<body class="light" ng-app="onosApp">
+<div id="frame" ng-controller="OnosCtrl as onosCtrl" detect-browser>
+ <div id="mast"
+ ng-controller="MastCtrl as mastCtrl"
+ ng-include="'app/fw/mast/mast.html'"></div>
+
+ <div id="view" ng-view></div>
+
+ <div id="nav"
+ ng-controller="NavCtrl as navCtrl"
+ ng-include="'nav.html'"></div>
+
+ <div id="floatpanels"></div>
+ <div id="alerts"></div>
+ <div id="tooltip"></div>
+ <div id="flash"></div>
+ <div id="quickhelp"></div>
+ <div id="veil">
+ <div class="msg"></div>
+ <svg resize></svg>
+ </div>
+</div>
+
+<script>
+ <!-- Inject user agent info into html element to allow CSS sensitivity. -->
+ (function () {
+ var t = !!('ontouchstart' in window) || !!('onmsgesturechange' in window);
+ d3.select(document.documentElement)
+ .attr('data-useragent', navigator.userAgent)
+ .attr('data-platform', navigator.platform)
+ .classed('touch', t);
+ }());
+</script>
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/login.html b/framework/src/onos/web/gui/src/main/webapp/login.html
new file mode 100644
index 00000000..d05260fa
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/login.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="UTF-8">
+ <title>ONOS Login</title>
+
+ <style type="text/css">
+ img {
+ margin: 24px;
+ }
+ td {
+ font: normal 16px Helvetica, Arial, sans-serif !important;
+ text-align: left;
+ padding: 4px;
+ }
+ input {
+ font: normal 16px Helvetica, Arial, sans-serif !important;
+ padding: 3px;
+ }
+
+ input[type="submit"] {
+ margin-top: 20px;
+ margin-left: auto;
+ margin-right: auto;
+ display: block;
+ padding: 4px 16px;
+ background-color: #CE5650;
+ color: #fff;
+ /*width: 100%; /!* width of image *!/*/
+ height: 32px;
+ border-radius: 3px;
+ border: 0;
+ -moz-outline-radius: 6px;
+ }
+
+ input[type="submit"]:hover {
+ border-radius: 3px;
+ border: 1px;
+ border-color: #fff;
+ border-style: solid;
+ box-shadow: 0px 0px 10px #3399ff;
+ outline-style: solid;
+ outline-width: 3px;
+ outline-color: #3399ff;
+ }
+ </style>
+</head>
+<body>
+<div align="center">
+ <img src="data/img/onos-logo.lg.png"/>
+
+ <form method="post" action="j_security_check">
+ <table>
+ <tr>
+ <td>User:</td>
+ <td><input id="username" name="j_username" type="text" autofocus/></td>
+ </tr>
+ <tr>
+ <td>Password:</td>
+ <td><input id="password" name="j_password" type="password"/></td>
+ </tr>
+ <tr>
+ <td colspan="2"><input id="submit" type="submit" value="Login"/></td>
+ </tr>
+ </table>
+ </form>
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/nav.html b/framework/src/onos/web/gui/src/main/webapp/nav.html
new file mode 100644
index 00000000..453efc39
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/nav.html
@@ -0,0 +1,4 @@
+<!-- {INJECTED-VIEW-NAV-START} -->
+<a ng-click="navCtrl.hideNav()" href="#/topo">Network Topology</a>
+<a ng-click="navCtrl.hideNav()" href="#/device">Device List</a>
+<!-- {INJECTED-VIEW-NAV-END} -->
diff --git a/framework/src/onos/web/gui/src/main/webapp/not-ready.html b/framework/src/onos/web/gui/src/main/webapp/not-ready.html
new file mode 100644
index 00000000..bf1e5445
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/not-ready.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<!--
+ ~ Copyright 2015 Open Networking Laboratory
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<html>
+<link>
+ <meta charset="utf-8">
+ <link rel="shortcut icon" href="data/img/onos-logo.png">
+
+ <link rel="apple-touch-icon" href="data/img/apple-touch-icon.png">
+ <meta name="apple-mobile-web-app-capable" content="yes">
+ <meta name="apple-mobile-web-app-status-bar-style" content="black">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+ <meta http-equiv="refresh" content="5;URL=/onos/ui">
+
+ <style>
+ body { padding: 16px; }
+ h1 { font-family: Arial, Helvetica, sans-serif }
+ </style>
+
+ <title>ONOS</title>
+
+</head>
+<body>
+<h1>ONOS GUI not ready yet... please stand by...</h1>
+</body>
+</html>
diff --git a/framework/src/onos/web/gui/src/main/webapp/onos.js b/framework/src/onos/web/gui/src/main/webapp/onos.js
new file mode 100644
index 00000000..a0de495b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/onos.js
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Main Application Module
+ */
+
+(function () {
+ 'use strict';
+
+ // define core module dependencies here...
+ var coreDependencies = [
+ 'ngRoute',
+ 'onosMast',
+ 'onosNav',
+ 'onosUtil',
+ 'onosSvg',
+ 'onosRemote',
+ 'onosLayer',
+ 'onosWidget'
+ ];
+
+ // view IDs.. note the first view listed is loaded at startup
+ var viewIds = [
+ // {INJECTED-VIEW-IDS-START}
+ 'topo',
+ 'device',
+ 'flow',
+ 'port',
+ 'group',
+ 'host',
+ 'app',
+ 'intent',
+ 'cluster',
+ 'link',
+ // {INJECTED-VIEW-IDS-END}
+
+ // dummy entry
+ ''
+ ];
+
+ var viewDependencies = [];
+
+ viewIds.forEach(function (id) {
+ if (id) {
+ viewDependencies.push('ov' + capitalize(id));
+ }
+ });
+
+ var moduleDependencies = coreDependencies.concat(viewDependencies);
+
+ function capitalize(word) {
+ return word ? word[0].toUpperCase() + word.slice(1) : word;
+ }
+
+ angular.module('onosApp', moduleDependencies)
+
+ .controller('OnosCtrl', [
+ '$log', '$scope', '$route', '$routeParams', '$location',
+ 'KeyService', 'ThemeService', 'GlyphService', 'VeilService',
+ 'PanelService', 'FlashService', 'QuickHelpService',
+ 'WebSocketService',
+
+ function ($log, $scope, $route, $routeParams, $location,
+ ks, ts, gs, vs, ps, flash, qhs, wss) {
+ var self = this;
+
+ self.$route = $route;
+ self.$routeParams = $routeParams;
+ self.$location = $location;
+ self.version = '1.3.0';
+
+ // shared object inherited by all views:
+ $scope.onos = {};
+
+ // initialize services...
+ ts.init();
+ ks.installOn(d3.select('body'));
+ ks.bindQhs(qhs);
+ gs.init();
+ vs.init();
+ ps.init();
+ flash.initFlash();
+ qhs.initQuickHelp();
+
+ // TODO: register handler for user settings, etc.
+
+ wss.createWebSocket({
+ wsport: $location.search().wsport
+ });
+
+ $log.log('OnosCtrl has been created');
+
+ $log.debug('route: ', self.$route);
+ $log.debug('routeParams: ', self.$routeParams);
+ $log.debug('location: ', self.$location);
+ }])
+
+ .config(['$routeProvider', function ($routeProvider) {
+ // If view ID not provided, route to the first view in the list.
+ $routeProvider
+ .otherwise({
+ redirectTo: '/topo'
+ });
+
+ function viewCtrlName(vid) {
+ return 'Ov' + capitalize(vid) + 'Ctrl';
+ }
+
+ function viewTemplateUrl(vid) {
+ return 'app/view/' + vid + '/' + vid + '.html';
+ }
+
+ // Add routes for each defined view.
+ viewIds.forEach(function (vid) {
+ if (vid) {
+ $routeProvider.when('/' + vid, {
+ controller: viewCtrlName(vid),
+ controllerAs: 'ctrl',
+ templateUrl: viewTemplateUrl(vid)
+ });
+ }
+ });
+ }])
+
+ .directive('detectBrowser', ['$log', 'FnService',
+ function ($log, fs) {
+ return function (scope) {
+ var body = d3.select('body'),
+ browser = '';
+ if (fs.isChrome()) {
+ browser = 'chrome';
+ } else if (fs.isSafari()) {
+ browser = 'safari';
+ } else if (fs.isFirefox()) {
+ browser = 'firefox';
+ }
+ body.classed(browser, true);
+ scope.onos.browser = browser;
+
+ if (fs.isMobile()) {
+ body.classed('mobile', true);
+ scope.onos.mobile = true;
+ }
+
+ $log.debug('Detected browser is', fs.cap(browser));
+ };
+ }]);
+}());
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/README.txt b/framework/src/onos/web/gui/src/main/webapp/tests/README.txt
new file mode 100644
index 00000000..213b4841
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/README.txt
@@ -0,0 +1,31 @@
+####
+# Unit and integration tests for code under the /app directory
+####
+
+To run these tests, karma, node.js etc needs to be installed in the
+build environment.
+
+From the karma installation directory, execute the following:
+
+ $ karma start {_path_to_}/src/main/webapp/tests/karma.conf.js
+
+This will launch and capture a browser, install and run the unit tests.
+
+The configuration is currently set to re-run the tests every time a
+file change is detected, (i.e. each time a source file is saved).
+
+----------------------------------------------------------------------
+Useful Notes
+============
+
+Set a 'breakpoint' with the debugger command:
+
+ it('should define four functions', function () {
+ debugger;
+
+ expect(fs.isF(gs.init)).toBeTruthy();
+ // ...
+ });
+
+Open Developer Tools in the captured Chrome browser, and reload the page.
+The debugger will break at the given point, allowing you to inspect context.
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/layer/flash-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/layer/flash-spec.js
new file mode 100644
index 00000000..a17f9e78
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/layer/flash-spec.js
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Layer -- Flash Service - Unit Tests
+ */
+describe('factory: fw/layer/flash.js', function () {
+ var $log, $timeout, fs, flash, d3Elem;
+
+ beforeEach(module('onosLayer'));
+
+ beforeEach(inject(function (_$log_, _$timeout_, FnService, FlashService) {
+ $log = _$log_;
+ $timeout = _$timeout_;
+ fs = FnService;
+ flash = FlashService;
+ jasmine.clock().install();
+ d3Elem = d3.select('body').append('div').attr('id', 'myflashdiv');
+ flash.initFlash();
+ }));
+
+ afterEach(function () {
+ jasmine.clock().uninstall();
+ d3.select('#myflashdiv').remove();
+ });
+
+ function flashItemSelection() {
+ return d3Elem.selectAll('.flashItem');
+ }
+
+ it('should define FlashService', function () {
+ expect(flash).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(flash, [
+ 'initFlash', 'flash', 'enable'
+ ])).toBe(true);
+ });
+
+ it('should have no items to start', function () {
+ expect(flashItemSelection().size()).toBe(0);
+ });
+
+ it('should flash the message Foo', function () {
+ var item, rect, text;
+ flash.flash('foo');
+ jasmine.clock().tick(101);
+ setTimeout(function () {
+ item = flashItemSelection();
+ expect(item.size()).toEqual(1);
+ expect(item.classed('flashItem')).toBeTruthy();
+ expect(item.select('rect').size()).toEqual(1);
+ text = item.select('text');
+ expect(text.size()).toEqual(1);
+ expect(text.text()).toEqual('foo');
+ }, 100);
+ });
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/layer/panel-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/layer/panel-spec.js
new file mode 100644
index 00000000..24ed9900
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/layer/panel-spec.js
@@ -0,0 +1,189 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Layer -- Panel Service - Unit Tests
+ */
+describe('factory: fw/layer/panel.js', function () {
+ var $log, $timeout, fs, ps, d3Elem;
+
+ beforeEach(module('onosLayer'));
+
+ beforeEach(inject(function (_$log_, _$timeout_, FnService, PanelService) {
+ $log = _$log_;
+ $timeout = _$timeout_;
+ fs = FnService;
+ ps = PanelService;
+ d3Elem = d3.select('body').append('div').attr('id', 'floatpanels');
+ ps.init();
+ }));
+
+ afterEach(function () {
+ d3.select('#floatpanels').remove();
+ ps.init();
+ });
+
+ function floatPanelSelection() {
+ return d3Elem.selectAll('.floatpanel');
+ }
+
+ it('should define PanelService', function () {
+ expect(ps).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(ps, [
+ 'init', 'createPanel', 'destroyPanel'
+ ])).toBeTruthy();
+ });
+
+ it('should have no panels to start', function () {
+ expect(floatPanelSelection().size()).toBe(0);
+ });
+
+ it('should log a warning if no ID is given', function () {
+ spyOn($log, 'warn');
+ var p = ps.createPanel();
+ expect(p).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith('createPanel: no ID given');
+ expect(floatPanelSelection().size()).toBe(0);
+ });
+
+ it('should create a default panel', function () {
+ spyOn($log, 'warn');
+ spyOn($log, 'debug');
+ var p = ps.createPanel('foo');
+ expect(p).not.toBeNull();
+ expect($log.warn).not.toHaveBeenCalled();
+ expect(floatPanelSelection().size()).toBe(1);
+ expect($log.debug).toHaveBeenCalledWith('creating panel:', 'foo', {
+ edge: 'right',
+ width: 200,
+ margin: 20,
+ hideMargin: 20,
+ xtnTime: 750,
+ fade: true
+ });
+
+ // check basic properties
+ expect(p.width()).toEqual(200);
+ expect(p.isVisible()).toBeFalsy();
+
+ var el = floatPanelSelection();
+ expect(el.style('width')).toEqual('200px');
+ });
+
+ it('should provide an api of panel functions', function () {
+ var p = ps.createPanel('foo');
+ expect(fs.areFunctions(p, [
+ 'show', 'hide', 'toggle', 'empty', 'append',
+ 'width', 'height', 'isVisible', 'classed', 'el'
+ ])).toBeTruthy();
+ });
+
+ it('should complain when a duplicate ID is used', function () {
+ spyOn($log, 'warn');
+ var p = ps.createPanel('foo');
+ expect(p).not.toBeNull();
+ expect($log.warn).not.toHaveBeenCalled();
+ expect(floatPanelSelection().size()).toBe(1);
+
+ var dup = ps.createPanel('foo');
+ expect(dup).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith('Panel with ID "foo" already exists');
+ expect(floatPanelSelection().size()).toBe(1);
+ });
+
+ it('should note when there is no panel to destroy', function () {
+ spyOn($log, 'debug');
+ ps.destroyPanel('bar');
+ expect($log.debug).toHaveBeenCalledWith('no panel to destroy:', 'bar');
+ });
+
+ it('should destroy the panel', function () {
+ spyOn($log, 'debug');
+ var p = ps.createPanel('foo');
+ expect(floatPanelSelection().size()).toBe(1);
+
+ ps.destroyPanel('foo');
+ expect($log.debug).toHaveBeenCalledWith('destroying panel:', 'foo');
+ expect(floatPanelSelection().size()).toBe(0);
+ });
+
+ it('should allow alternate settings to be given', function () {
+ spyOn($log, 'debug');
+ var p = ps.createPanel('foo', { width: 250, edge: 'left' });
+ expect($log.debug).toHaveBeenCalledWith('creating panel:', 'foo', {
+ edge: 'left',
+ width: 250,
+ margin: 20,
+ hideMargin: 20,
+ xtnTime: 750,
+ fade: true
+ });
+ });
+
+ it('should show and hide the panel', function () {
+ var p = ps.createPanel('foo', {xtnTime:0});
+ expect(p.isVisible()).toBeFalsy();
+
+ p.show();
+ expect(p.isVisible()).toBeTruthy();
+
+ p.hide();
+ expect(p.isVisible()).toBeFalsy();
+ });
+
+ it('should append content to the panel', function () {
+ var p = ps.createPanel('foo');
+ var span = p.append('span').attr('id', 'thisIsMySpan');
+
+ expect(floatPanelSelection().selectAll('span').attr('id'))
+ .toEqual('thisIsMySpan');
+ });
+
+ it('should remove content on empty', function () {
+ var p = ps.createPanel('voop');
+ p.append('span');
+ p.append('span');
+ p.append('span');
+ expect(floatPanelSelection().selectAll('span').size()).toEqual(3);
+
+ p.empty();
+ expect(floatPanelSelection().selectAll('span').size()).toEqual(0);
+ expect(floatPanelSelection().html()).toEqual('');
+ });
+
+ it('should allow programmatic setting of width', function () {
+ var p = ps.createPanel('whatcha', {width:234});
+ expect(floatPanelSelection().style('width')).toEqual('234px');
+ expect(p.width()).toEqual(234);
+
+ p.width(345);
+ expect(floatPanelSelection().style('width')).toEqual('345px');
+ expect(p.width()).toEqual(345);
+ });
+
+ it('should allow programmatic setting of height', function () {
+ var p = ps.createPanel('ciao', {height:50});
+ expect(floatPanelSelection().style('height')).toEqual('50px');
+ expect(p.height()).toEqual(50);
+
+ p.height(100);
+ expect(floatPanelSelection().style('height')).toEqual('100px');
+ expect(p.height()).toEqual(100);
+ });
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/layer/quickhelp-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/layer/quickhelp-spec.js
new file mode 100644
index 00000000..0f473b42
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/layer/quickhelp-spec.js
@@ -0,0 +1,214 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Layer -- Flash Service - Unit Tests
+ */
+describe('factory: fw/layer/quickhelp.js', function () {
+ var $log, fs, qhs, d3Elem,
+ fade = 500,
+ noop = function () {},
+ mockBindings = {
+ globalKeys: {
+ slash: [noop, 'Show / hide Quick Help'],
+ T: [noop, 'Toggle Theme']
+ },
+ globalFormat: ['slash', 'T'],
+ viewKeys: {
+ H: [noop, 'Show / hide hosts'],
+ I: [noop, 'Toggle instances panel']
+ },
+ viewGestures: []
+ };
+
+ // list of needed bindings to use in aggregateData
+ var neededBindings = [
+ 'globalKeys', 'globalFormat', 'viewKeys', 'viewGestures'
+ ];
+
+ beforeEach(module('onosUtil', 'onosSvg', 'onosLayer'));
+
+ beforeEach(inject(function (_$log_, FnService, QuickHelpService) {
+ $log = _$log_;
+ fs = FnService;
+ qhs = QuickHelpService;
+
+ jasmine.clock().install();
+ d3Elem = d3.select('body').append('div').attr('id', 'quickhelp');
+ qhs.initQuickHelp();
+ }));
+
+ afterEach(function () {
+ jasmine.clock().uninstall();
+ d3.select('#quickhelp').remove();
+ });
+
+ function helpItemSelection() {
+ return d3Elem.selectAll('.help');
+ }
+
+ it('should define QuickHelpService', function () {
+ expect(qhs).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(qhs, [
+ 'initQuickHelp', 'showQuickHelp', 'hideQuickHelp'
+ ])).toBeTruthy();
+ });
+
+ it('should have no items to start', function () {
+ expect(helpItemSelection().size()).toBe(0);
+ });
+
+ // === showQuickHelp
+
+ it('should warn if bad bindings are provided', function () {
+ var warning =
+ 'Quickhelp Service: showQuickHelp(), invalid bindings object';
+ spyOn($log, 'warn');
+
+ expect(qhs.showQuickHelp()).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith(warning);
+
+ expect(qhs.showQuickHelp({})).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith(warning);
+
+ expect(qhs.showQuickHelp([1, 2, 3])).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith(warning);
+ });
+
+ it('should warn if not all needed bindings are provided', function () {
+ var warning =
+ 'Quickhelp Service: showQuickHelp(),' +
+ ' needed bindings for help panel not provided:';
+ spyOn($log, 'warn');
+
+ expect(qhs.showQuickHelp({
+ foo: 'foo', bar: 'bar'
+ })).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith(warning, neededBindings);
+
+ expect(qhs.showQuickHelp({
+ globalKeys: {}
+ })).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith(warning, neededBindings);
+
+ expect(qhs.showQuickHelp({
+ globalKeys: {},
+ globalFormat: {},
+ viewKeys: {}
+ })).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith(warning, neededBindings);
+ });
+
+ it('should not warn if bindings are provided', function () {
+ spyOn($log, 'warn');
+ expect(qhs.showQuickHelp(mockBindings)).toBe(undefined);
+ expect($log.warn).not.toHaveBeenCalled();
+ });
+
+ it('should append an svg', function () {
+ var svg = d3Elem.select('svg');
+ expect(d3Elem.empty()).toBe(false);
+ expect(svg.empty()).toBe(true);
+
+ qhs.showQuickHelp(mockBindings);
+
+ svg = d3Elem.select('svg');
+ expect(svg.empty()).toBe(false);
+ expect(svg.attr('width')).toBe('100%');
+ expect(svg.attr('height')).toBe('80%');
+ expect(svg.attr('viewBox')).toBe('-200 0 400 400');
+ });
+
+ it('should create the quick help panel', function () {
+ var helpItems, g, rect, text, rows;
+ qhs.showQuickHelp(mockBindings);
+
+ helpItems = helpItemSelection();
+ expect(helpItems.size()).toBe(1);
+
+ g = d3.select('g.help');
+ expect(g.attr('opacity')).toBe('0');
+
+ rect = g.select('rect');
+ expect(rect.attr('rx')).toBe('8');
+
+ text = g.select('text');
+ expect(text.text()).toBe('Quick Help');
+ expect(text.classed('title')).toBe(true);
+ expect(text.attr('dy')).toBe('1.2em');
+ expect(text.attr('transform')).toBeTruthy();
+
+ rows = g.select('g');
+ expect(rows.empty()).toBe(false);
+
+ jasmine.clock().tick(fade + 1);
+ setTimeout(function () {
+ expect(g.attr('opacity')).toBe('1');
+ }, fade);
+
+ // TODO: test aggregate data helper function
+ });
+
+ it('should show panel with custom fade time', function () {
+ var g,
+ ctmFade = 200;
+ qhs.initQuickHelp({ fade: ctmFade });
+ qhs.showQuickHelp(mockBindings);
+
+ g = d3.select('g.help');
+ expect(g.attr('opacity')).toBe('0');
+
+ jasmine.clock().tick(ctmFade + 1);
+ setTimeout(function () {
+ expect(g.attr('opacity')).toBe('1');
+ }, ctmFade);
+ });
+
+ // === hideQuickHelp
+
+ it('should hide quick help if svg exists', function () {
+ var svg;
+
+ expect(qhs.hideQuickHelp()).toBe(false);
+
+ svg = d3.select('#quickhelp')
+ .append('svg');
+ svg.append('g')
+ .classed('help', true)
+ .attr('opacity', 1);
+
+ expect(qhs.hideQuickHelp()).toBe(true);
+
+ jasmine.clock().tick(fade + 1);
+ setTimeout(function () {
+ expect(svg.select('g.help').attr('opacity')).toBe('0');
+ }, fade);
+
+ jasmine.clock().tick(20);
+ setTimeout(function () {
+ expect(svg.empty()).toBe(true);
+ }, fade + 20);
+ });
+
+ it('should not hide quick help if svg does not exist', function () {
+ expect(qhs.hideQuickHelp()).toBe(false);
+ });
+
+});
+
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/layer/veil-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/layer/veil-spec.js
new file mode 100644
index 00000000..155ebaab
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/layer/veil-spec.js
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Layer -- Veil Service - Unit Tests
+ */
+
+describe('factory: fw/layer/veil.js', function () {
+ var $log, $route, vs, fs, ks, gs;
+
+ beforeEach(module('onosLayer', 'onosNav', 'onosSvg', 'ngRoute'));
+
+ beforeEach(inject(function (_$log_, _$route_, VeilService, FnService,
+ KeyService, GlyphService) {
+ $log = _$log_;
+ $route = _$route_;
+ vs = VeilService;
+ fs = FnService;
+ ks = KeyService;
+ gs = GlyphService;
+ }));
+
+ it('should define VeilService', function () {
+ expect(vs).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(vs, [
+ 'init', 'show', 'hide', 'lostServer'
+ ])).toBeTruthy();
+ });
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/mast/mast-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/mast/mast-spec.js
new file mode 100644
index 00000000..26ccef8a
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/mast/mast-spec.js
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Masthead Controller - Unit Tests
+ */
+describe('Controller: MastCtrl', function () {
+ // instantiate the masthead module
+ beforeEach(module('onosMast', 'onosUtil'));
+
+ var $log, ctrl, ms, fs;
+
+ // we need an instance of the controller
+ beforeEach(inject(function(_$log_, $controller, MastService, FnService) {
+ $log = _$log_;
+ ctrl = $controller('MastCtrl');
+ ms = MastService;
+ fs = FnService;
+ }));
+
+ it('should declare height to be 36', function () {
+ expect(ms.mastHeight()).toBe(36);
+ })
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/nav/nav-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/nav/nav-spec.js
new file mode 100644
index 00000000..d14d5147
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/nav/nav-spec.js
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Util -- Theme Service - Unit Tests
+ */
+describe('factory: fw/nav/nav.js', function() {
+ var $log, $location, $window, ns, fs;
+ var d3Elem;
+
+ beforeEach(module('onosNav', 'onosUtil'));
+
+ var mockWindow = {
+ location: {
+ href: 'http://server/#/mock/url'
+ }
+ };
+
+ beforeEach(function () {
+ module(function ($provide) {
+ $provide.value('$window', mockWindow);
+ });
+ });
+
+ beforeEach(inject(function (_$log_, _$location_, _$window_,
+ NavService, FnService) {
+ $log = _$log_;
+ $location = _$location_;
+ $window = _$window_;
+ ns = NavService;
+ fs = FnService;
+ d3Elem = d3.select('body').append('div').attr('id', 'nav');
+ ns.hideNav();
+ }));
+
+ afterEach(function () {
+ d3.select('#nav').remove();
+ });
+
+ it('should define NavService', function () {
+ expect(ns).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(ns, [
+ 'showNav', 'hideNav', 'toggleNav', 'hideIfShown', 'navTo'
+ ])).toBeTruthy();
+ });
+
+ function checkHidden(b) {
+ var what = b ? 'hidden' : 'visible';
+ expect(d3.select('#nav').style('visibility')).toEqual(what);
+ }
+
+ it('should start hidden', function () {
+ checkHidden(true);
+ });
+
+ it('should be shown then hidden', function () {
+ ns.showNav();
+ checkHidden(false);
+ ns.hideNav();
+ checkHidden(true);
+ });
+
+ it('should toggle hidden', function () {
+ ns.toggleNav();
+ checkHidden(false);
+ ns.toggleNav();
+ checkHidden(true);
+ });
+
+ it('should show idempotently', function () {
+ checkHidden(true);
+ ns.showNav();
+ checkHidden(false);
+ ns.showNav();
+ checkHidden(false);
+ });
+
+ it('should hide idempotently', function () {
+ checkHidden(true);
+ ns.hideNav();
+ checkHidden(true);
+ });
+
+ it('should be a noop if already hidden', function () {
+ checkHidden(true);
+ expect(ns.hideIfShown()).toBe(false);
+ checkHidden(true);
+ });
+
+ it('should hide if shown', function () {
+ ns.showNav();
+ checkHidden(false);
+ expect(ns.hideIfShown()).toBe(true);
+ checkHidden(true);
+ });
+
+ it('should take correct navTo parameters', function () {
+ spyOn($log, 'warn');
+
+ ns.navTo('foo');
+ expect($log.warn).not.toHaveBeenCalled();
+
+ ns.navTo('bar', { q1: 'thing', q2: 'thing2' });
+ expect($log.warn).not.toHaveBeenCalled();
+
+ });
+
+ it('should check navTo parameter warnings', function () {
+ spyOn($log, 'warn');
+
+ expect(ns.navTo()).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith('Not a valid navigation path');
+
+ ns.navTo('baz', [1, 2, 3]);
+ expect($log.warn).toHaveBeenCalledWith(
+ 'Query params not an object', [1, 2, 3]
+ );
+
+ ns.navTo('zoom', 'not a query param');
+ expect($log.warn).toHaveBeenCalledWith(
+ 'Query params not an object', 'not a query param'
+ );
+ });
+
+ it('should verify where the window is navigating', function () {
+ ns.navTo('foo');
+ expect($window.location.href).toBe('http://server/#/foo');
+
+ ns.navTo('bar');
+ expect($window.location.href).toBe('http://server/#/bar');
+
+ ns.navTo('baz', { q1: 'thing1', q2: 'thing2' });
+ expect($window.location.href).toBe(
+ 'http://server/#/baz?q1=thing1&q2=thing2'
+ );
+
+ ns.navTo('zip', { q3: 'thing3' });
+ expect($window.location.href).toBe(
+ 'http://server/#/zip?q3=thing3'
+ );
+
+ ns.navTo('zoom', {});
+ expect($window.location.href).toBe('http://server/#/zoom');
+
+ ns.navTo('roof', [1, 2, 3]);
+ expect($window.location.href).toBe('http://server/#/roof');
+ });
+
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/remote/rest-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/remote/rest-spec.js
new file mode 100644
index 00000000..55e22782
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/remote/rest-spec.js
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Remote -- REST Service - Unit Tests
+ */
+describe('factory: fw/remote/rest.js', function() {
+ var $log, $httpBackend, fs, rs, promise;
+
+ beforeEach(module('onosUtil', 'onosRemote'));
+
+ beforeEach(module(function($provide) {
+ $provide.factory('$location', function (){
+ return {
+ protocol: function () { return 'http'; },
+ host: function () { return 'foo'; },
+ port: function () { return '80'; }
+ };
+ })
+ }));
+
+ beforeEach(inject(function (_$log_, _$httpBackend_, FnService, RestService) {
+ $log = _$log_;
+ $httpBackend = _$httpBackend_;
+ fs = FnService;
+ rs = RestService;
+ }));
+
+ it('should define RestService', function () {
+ expect(rs).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(rs, [
+ 'get'
+ ])).toBeTruthy();
+ });
+
+ var mockData = {
+ id: 1,
+ prop: 'abc'
+ };
+
+ it('should fetch remote data', function () {
+ var called = 0,
+ capture = null;
+ $httpBackend.whenGET(/.*/).respond(mockData);
+ spyOn($log, 'warn');
+
+ rs.get('bar', function (data) {
+ called++;
+ capture = data;
+ });
+
+ expect(called).toEqual(0);
+ expect(capture).toBeNull();
+ $httpBackend.flush();
+ expect(called).toEqual(1);
+ expect(capture).toEqual(mockData);
+ expect($log.warn).not.toHaveBeenCalled();
+ });
+
+ it('should fail to fetch remote data', function () {
+ var called = 0,
+ capture = null;
+ $httpBackend.whenGET(/.*/).respond(404, 'Not Found');
+ spyOn($log, 'warn');
+
+ rs.get('bar', function (data) {
+ called++;
+ capture = data;
+ });
+
+ expect(called).toEqual(0);
+ expect(capture).toBeNull();
+ $httpBackend.flush();
+ expect(called).toEqual(0);
+ expect(capture).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith(
+ 'Failed to retrieve JSON data: http://foo:80/onos/ui/rs/bar',
+ 404, 'Not Found');
+ });
+
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/remote/urlfn-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/remote/urlfn-spec.js
new file mode 100644
index 00000000..eddbf8b2
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/remote/urlfn-spec.js
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Remote -- General Functions - Unit Tests
+ */
+describe('factory: fw/remote/urlfn.js', function () {
+ var $log, $loc, ufs, fs;
+
+ var protocol, host, port;
+
+ beforeEach(module('onosRemote'));
+
+ beforeEach(module(function($provide) {
+ $provide.factory('$location', function (){
+ return {
+ protocol: function () { return protocol; },
+ host: function () { return host; },
+ port: function () { return port; }
+ };
+ })
+ }));
+
+ beforeEach(inject(function (_$log_, $location, UrlFnService, FnService) {
+ $log = _$log_;
+ $loc = $location;
+ ufs = UrlFnService;
+ fs = FnService;
+ }));
+
+ function setLoc(prot, h, p) {
+ protocol = prot;
+ host = h;
+ port = p;
+ }
+
+ it('should define UrlFnService', function () {
+ expect(ufs).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(ufs, [
+ 'rsUrl', 'wsUrl'
+ ])).toBeTruthy();
+ });
+
+ it('should return the correct (http) RS url', function () {
+ setLoc('http', 'foo', '123');
+ expect(ufs.rsUrl('path')).toEqual('http://foo:123/onos/ui/rs/path');
+ });
+
+ it('should return the correct (https) RS url', function () {
+ setLoc('https', 'foo', '123');
+ expect(ufs.rsUrl('path')).toEqual('https://foo:123/onos/ui/rs/path');
+ });
+
+ it('should return the correct (ws) WS url', function () {
+ setLoc('http', 'foo', '123');
+ expect(ufs.wsUrl('path')).toEqual('ws://foo:123/onos/ui/websock/path');
+ });
+
+ it('should return the correct (wss) WS url', function () {
+ setLoc('https', 'foo', '123');
+ expect(ufs.wsUrl('path')).toEqual('wss://foo:123/onos/ui/websock/path');
+ });
+
+ it('should allow us to define an alternate WS port', function () {
+ setLoc('http', 'foo', '123');
+ expect(ufs.wsUrl('xyyzy', 456)).toEqual('ws://foo:456/onos/ui/websock/xyyzy');
+ });
+
+ it('should allow us to define an alternate host', function () {
+ setLoc('http', 'foo', '123');
+ expect(ufs.wsUrl('core', 456, 'bar')).toEqual('ws://bar:456/onos/ui/websock/core');
+ });
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/remote/websocket-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/remote/websocket-spec.js
new file mode 100644
index 00000000..9673f16e
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/remote/websocket-spec.js
@@ -0,0 +1,268 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Remote -- Web Socket Service - Unit Tests
+ */
+describe('factory: fw/remote/websocket.js', function () {
+ var $log, fs, wss;
+
+ var noop = function () {},
+ send = jasmine.createSpy('send').and.callFake(function (ev) {
+ return ev;
+ }),
+ mockWebSocket = {
+ send: send
+ };
+
+ beforeEach(module('onosRemote', 'onosLayer', 'ngRoute', 'onosNav', 'onosSvg'));
+
+ beforeEach(function () {
+ mockWebSocket = {
+ send: send
+ };
+ });
+
+ beforeEach(function () {
+ module(function ($provide) {
+ $provide.factory('WSock', function () {
+ return {
+ newWebSocket: function () {
+ return mockWebSocket;
+ }
+ };
+ });
+ });
+ });
+
+ beforeEach(module(function($provide) {
+ $provide.factory('$location', function () {
+ return {
+ protocol: function () { return 'http'; },
+ host: function () { return 'foo'; },
+ port: function () { return '80'; }
+ };
+ })
+ }));
+
+ beforeEach(inject(function (_$log_, FnService, WebSocketService) {
+ $log = _$log_;
+ fs = FnService;
+ wss = WebSocketService;
+ wss.resetState();
+ }));
+
+
+ it('should define WebSocketService', function () {
+ expect(wss).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(wss, [
+ 'resetSid', 'resetState',
+ 'createWebSocket', 'bindHandlers', 'unbindHandlers',
+ 'addOpenListener', 'removeOpenListener', 'sendEvent'
+ ])).toBeTruthy();
+ });
+
+ it('should use the appropriate URL, createWebsocket', function () {
+ var url = wss.createWebSocket();
+ expect(url).toEqual('ws://foo:80/onos/ui/websock/core');
+ });
+
+ it('should use the appropriate URL with modified port, createWebsocket',
+ function () {
+ var url = wss.createWebSocket({ wsport: 1243 });
+ expect(url).toEqual('ws://foo:1243/onos/ui/websock/core');
+ });
+
+ it('should verify websocket event handlers, createWebsocket', function () {
+ wss.createWebSocket({ wsport: 1234 });
+ expect(fs.isF(mockWebSocket.onopen)).toBeTruthy();
+ expect(fs.isF(mockWebSocket.onmessage)).toBeTruthy();
+ expect(fs.isF(mockWebSocket.onclose)).toBeTruthy();
+ });
+
+ it('should invoke listener callbacks when websocket is up, handleOpen',
+ function () {
+ var num = 0;
+ function incrementNum() { num++; }
+ wss.addOpenListener(incrementNum);
+ wss.createWebSocket({ wsport: 1234 });
+ mockWebSocket.onopen();
+ expect(num).toBe(1);
+ });
+
+ it('should send pending events, handleOpen', function () {
+ var fakeEvent = {
+ event: 'mockEv',
+ sid: 1,
+ payload: { mock: 'thing' }
+ };
+ wss.sendEvent(fakeEvent.event, fakeEvent.payload);
+ expect(mockWebSocket.send).not.toHaveBeenCalled();
+ wss.createWebSocket({ wsport: 1234 });
+ mockWebSocket.onopen();
+ expect(mockWebSocket.send).toHaveBeenCalledWith(JSON.stringify(fakeEvent));
+ });
+
+ it('should handle an incoming bad JSON message, handleMessage', function () {
+ spyOn($log, 'error');
+ var badMsg = {
+ data: 'bad message'
+ };
+ wss.createWebSocket({ wsport: 1234 });
+ expect(mockWebSocket.onmessage(badMsg)).toBeNull();
+ expect($log.error).toHaveBeenCalled();
+ });
+
+ it('should verify message was handled, handleMessage', function () {
+ var num = 0,
+ fakeHandler = {
+ mockEvResp: function () { num++; }
+ },
+ data = JSON.stringify({
+ event: 'mockEvResp',
+ payload: {}
+ }),
+ event = {
+ data: data
+ };
+ wss.createWebSocket({ wsport: 1234 });
+ wss.bindHandlers(fakeHandler);
+ expect(mockWebSocket.onmessage(event)).toBe(undefined);
+ expect(num).toBe(1);
+ });
+
+ it('should warn if there is an unhandled event, handleMessage', function () {
+ spyOn($log, 'warn');
+ var data = { foo: 'bar', bar: 'baz'},
+ dataString = JSON.stringify(data),
+ badEv = {
+ data: dataString
+ };
+ wss.createWebSocket({ wsport: 1234 });
+ mockWebSocket.onmessage(badEv);
+ expect($log.warn).toHaveBeenCalledWith('Unhandled event:', data);
+ });
+
+ it('should not warn if valid input, bindHandlers', function () {
+ spyOn($log, 'warn');
+ expect(wss.bindHandlers({
+ foo: noop,
+ bar: noop
+ })).toBe(undefined);
+ expect($log.warn).not.toHaveBeenCalled();
+ });
+
+ it('should warn if no arguments, bindHandlers', function () {
+ spyOn($log, 'warn');
+ expect(wss.bindHandlers()).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith(
+ 'WSS.bindHandlers(): no event handlers'
+ );
+ expect(wss.bindHandlers({})).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith(
+ 'WSS.bindHandlers(): no event handlers'
+ );
+ });
+
+ it('should warn if handler is not a function, bindHandlers', function () {
+ spyOn($log, 'warn');
+ expect(wss.bindHandlers({
+ foo: 'handler1',
+ bar: 3,
+ baz: noop
+ })).toBe(undefined);
+ expect($log.warn).toHaveBeenCalledWith('foo handler not a function');
+ expect($log.warn).toHaveBeenCalledWith('bar handler not a function');
+ });
+
+ it('should warn if duplicate handlers were given, bindHandlers',
+ function () {
+ spyOn($log, 'warn');
+ wss.bindHandlers({
+ foo: noop
+ });
+ expect(wss.bindHandlers({
+ foo: noop
+ })).toBe(undefined);
+ expect($log.warn).toHaveBeenCalledWith('duplicate bindings ignored:',
+ ['foo']);
+ });
+
+ it('should warn if no arguments, unbindHandlers', function () {
+ spyOn($log, 'warn');
+ expect(wss.unbindHandlers()).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith(
+ 'WSS.unbindHandlers(): no event handlers'
+ );
+ expect(wss.unbindHandlers({})).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith(
+ 'WSS.unbindHandlers(): no event handlers'
+ );
+ });
+ // Note: cannot test unbindHandlers' forEach due to it using closure variable
+
+ it('should not warn if valid argument, addOpenListener', function () {
+ spyOn($log, 'warn');
+ var o = wss.addOpenListener(noop);
+ expect(o.id === 1);
+ expect(o.cb === noop);
+ expect($log.warn).not.toHaveBeenCalled();
+ o = wss.addOpenListener(noop);
+ expect(o.id === 2);
+ expect(o.cb === noop);
+ expect($log.warn).not.toHaveBeenCalled();
+ });
+
+ it('should log error if callback not a function, addOpenListener',
+ function () {
+ spyOn($log, 'error');
+ var o = wss.addOpenListener('foo');
+ expect(o.id === 1);
+ expect(o.cb === 'foo');
+ expect(o.error === 'No callback defined');
+ expect($log.error).toHaveBeenCalledWith(
+ 'WSS.addOpenListener(): callback not a function'
+ );
+ });
+
+ it('should not warn if valid listener object, removeOpenListener', function () {
+ spyOn($log, 'warn');
+ expect(wss.removeOpenListener({
+ id: 1,
+ cb: noop
+ })).toBe(undefined);
+ expect($log.warn).not.toHaveBeenCalled();
+ });
+
+ it('should warn if listener is invalid, removeOpenListener', function () {
+ spyOn($log, 'warn');
+ expect(wss.removeOpenListener({})).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith(
+ 'WSS.removeOpenListener(): invalid listener', {}
+ );
+ expect(wss.removeOpenListener('listener')).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith(
+ 'WSS.removeOpenListener(): invalid listener', 'listener'
+ );
+ });
+
+ // Note: handleClose is not currently tested due to all work it does relies
+ // on closure variables that cannot be mocked
+
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/remote/wsevent-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/remote/wsevent-spec.js
new file mode 100644
index 00000000..23d3153f
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/remote/wsevent-spec.js
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Remote -- Web Socket Event Service - Unit Tests
+ */
+describe('factory: fw/remote/wsevent.js', function () {
+ var $log, fs, wse;
+
+ beforeEach(module('onosRemote'));
+
+ beforeEach(inject(function (_$log_, FnService, WsEventService) {
+ $log = _$log_;
+ fs = FnService;
+ wse = WsEventService;
+ wse.resetSid();
+ }));
+
+
+ it('should define WsEventService', function () {
+ expect(wse).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(wse, [
+ 'sendEvent', 'resetSid'
+ ])).toBeTruthy();
+ });
+
+ var event,
+ fakeWs = {
+ send: function (ev) {
+ event = ev;
+ }
+ };
+
+ it('should construct an event object with no payload', function () {
+ wse.sendEvent(fakeWs, 'foo');
+ expect(event.event).toEqual('foo');
+ expect(event.sid).toEqual(1);
+ expect(event.payload).toEqual({});
+ });
+
+ it('should construct an event object with some payload', function () {
+ wse.sendEvent(fakeWs, 'bar', { val: 42 });
+ expect(event.event).toEqual('bar');
+ expect(event.sid).toEqual(1);
+ expect(event.payload).toEqual({ val: 42 });
+ });
+
+ it('should increment the sid', function () {
+ wse.sendEvent(fakeWs, 'one');
+ expect(event.event).toEqual('one');
+ expect(event.sid).toEqual(1);
+
+ wse.sendEvent(fakeWs, 'dos');
+ expect(event.event).toEqual('dos');
+ expect(event.sid).toEqual(2);
+
+ wse.sendEvent(fakeWs, 'tres');
+ expect(event.event).toEqual('tres');
+ expect(event.sid).toEqual(3);
+ });
+
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/geodata-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/geodata-spec.js
new file mode 100644
index 00000000..ccf4782f
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/geodata-spec.js
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- SVG -- GeoData Service - Unit Tests
+ */
+describe('factory: fw/svg/geodata.js', function() {
+ var $log, $httpBackend, fs, gds, promise;
+
+ beforeEach(module('onosUtil', 'onosSvg'));
+
+ beforeEach(inject(function (_$log_, _$httpBackend_, FnService, GeoDataService) {
+ $log = _$log_;
+ $httpBackend = _$httpBackend_;
+ fs = FnService;
+ gds = GeoDataService;
+ gds.clearCache();
+ }));
+
+
+ it('should define GeoDataService', function () {
+ expect(gds).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(gds, [
+ 'clearCache', 'fetchTopoData', 'createPathGenerator'
+ ])).toBeTruthy();
+ });
+
+ it('should return null when no parameters given', function () {
+ promise = gds.fetchTopoData();
+ expect(promise).toBeNull();
+ });
+
+ it('should augment the id of a bundled map', function () {
+ var id = '*foo';
+ promise = gds.fetchTopoData(id);
+ expect(promise.meta).toBeDefined();
+ expect(promise.meta.id).toBe(id);
+ expect(promise.meta.url).toBe('data/map/foo.json');
+ });
+
+ it('should treat an external id as the url itself', function () {
+ var id = 'some/path/to/foo';
+ promise = gds.fetchTopoData(id);
+ expect(promise.meta).toBeDefined();
+ expect(promise.meta.id).toBe(id);
+ expect(promise.meta.url).toBe(id + '.json');
+ });
+
+ it('should cache the returned objects', function () {
+ var id = 'foo';
+ promise = gds.fetchTopoData(id);
+ expect(promise).toBeDefined();
+ expect(promise.meta.wasCached).toBeFalsy();
+ expect(promise.tagged).toBeUndefined();
+
+ promise.tagged = 'I woz here';
+
+ promise = gds.fetchTopoData(id);
+ expect(promise).toBeDefined();
+ expect(promise.meta.wasCached).toBeTruthy();
+ expect(promise.tagged).toEqual('I woz here');
+ });
+
+ it('should clear the cache when asked', function () {
+ var id = 'foo';
+ promise = gds.fetchTopoData(id);
+ expect(promise.meta.wasCached).toBeFalsy();
+
+ promise = gds.fetchTopoData(id);
+ expect(promise.meta.wasCached).toBeTruthy();
+
+ gds.clearCache();
+ promise = gds.fetchTopoData(id);
+ expect(promise.meta.wasCached).toBeFalsy();
+ });
+
+
+ it('should log a warning if data fails to load', function () {
+ var id = 'foo';
+ $httpBackend.expectGET('foo.json').respond(404, 'Not found');
+ spyOn($log, 'warn');
+
+ promise = gds.fetchTopoData(id);
+ $httpBackend.flush();
+ expect(promise.topodata).toBeUndefined();
+ expect($log.warn)
+ .toHaveBeenCalledWith('Failed to retrieve map TopoJSON data: foo.json',
+ 404, 'Not found');
+ });
+
+ // --- path generator tests
+
+ function simpleTopology(object) {
+ return {
+ type: "Topology",
+ transform: {scale: [1, 1], translate: [0, 0]},
+ objects: {states: object},
+ arcs: [
+ [[0, 0], [1, 0], [0, 1], [-1, 0], [0, -1]],
+ [[0, 0], [1, 0], [0, 1]],
+ [[1, 1], [-1, 0], [0, -1]],
+ [[1, 1]],
+ [[0, 0]]
+ ]
+ };
+ }
+
+ function simpleLineStringTopo() {
+ return simpleTopology({type: "LineString", arcs: [1, 2]});
+ }
+
+ it('should use default settings if none are supplied', function () {
+ var gen = gds.createPathGenerator(simpleLineStringTopo());
+ expect(gen.settings.objectTag).toBe('states');
+ expect(gen.settings.logicalSize).toBe(1000);
+ expect(gen.settings.mapFillScale).toBe(.95);
+ // best we can do for now is test that projection is a function ...
+ expect(fs.isF(gen.settings.projection)).toBeTruthy();
+ });
+
+ it('should allow us to override default settings', function () {
+ var gen = gds.createPathGenerator(simpleLineStringTopo(), {
+ mapFillScale: .80
+ });
+ expect(gen.settings.objectTag).toBe('states');
+ expect(gen.settings.logicalSize).toBe(1000);
+ expect(gen.settings.mapFillScale).toBe(.80);
+ });
+
+ it('should create transformed geodata, and a path generator', function () {
+ var gen = gds.createPathGenerator(simpleLineStringTopo());
+ expect(fs.isO(gen.settings)).toBeTruthy();
+ expect(fs.isO(gen.geodata)).toBeTruthy();
+ expect(fs.isF(gen.pathgen)).toBeTruthy();
+ });
+ // NOTE: we probably should have more unit tests that assert stuff about
+ // the transformed data (geo data) -- though perhaps we can rely on
+ // the unit testing of TopoJSON? See...
+ // https://github.com/mbostock/topojson/blob/master/test/feature-test.js
+ // and, what about the path generator?, and the computed bounds?
+ // In summary, more work should be done here..
+
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/glyph-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/glyph-spec.js
new file mode 100644
index 00000000..9709ec73
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/glyph-spec.js
@@ -0,0 +1,425 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- SVG -- Glyph Service - Unit Tests
+ */
+describe('factory: fw/svg/glyph.js', function() {
+ var $log, fs, gs, d3Elem, svg;
+
+ var numBaseGlyphs = 42,
+ vbBird = '352 224 113 112',
+ vbGlyph = '0 0 110 110',
+ vbBadge = '0 0 10 10',
+ longPrefix = 'M95.8,9.2H14.2c-2.8,0-5,2.2-5,5v81.5c0,2.8,2.2,5,5,' +
+ '5h81.5c2.8,0,5-2.2,5-5V14.2C100.8,11.5,98.5,9.2,95.8,9.2z ',
+ tablePrefix = 'M15.9,19.1h-8v-13h8V19.1z M90.5,6.1H75.6v13h14.9V6.1' +
+ 'z M71.9,6.1H56.9v13h14.9V6.1z M53.2,6.1H38.3v13h14.9V6.1z M34.5,' +
+ '6.1H19.6v13h14.9V6.1z M102.2,6.1h-8v13h8V6.1z ',
+ prefixLookup = {
+ bird: 'M427.7,300.4',
+ unknown: 'M35,40a5',
+ node: 'M15,100a5',
+ switch: 'M10,20a10',
+ roadm: 'M10,35l25-',
+ endstation: 'M10,15a5,5',
+ router: 'M10,55A45,45',
+ bgpSpeaker: 'M10,40a45,35',
+ chain: 'M60.4,77.6c-',
+ crown: 'M99.5,21.6c0,',
+ lock: 'M79.4,48.6h',
+ topo: 'M97.2,76.3H86.6',
+ refresh: 'M102.6,40.8L88.4',
+ garbage: 'M94.6,20.2c',
+
+ // navigation specific glyphs
+ flowTable: tablePrefix + 'M102.2,23.6H7.9v',
+ portTable: tablePrefix + 'M102.6,23.6v78.5H',
+ groupTable: 'M16,19.1H8v-13h',
+
+ // toolbar specific glyphs
+ summary: longPrefix + 'M16.7',
+ details: longPrefix + 'M16.9',
+ ports: 'M98,9.2H79.6c',
+ map: 'M95.8,9.2H14.2c-2.8,0-5,2.2-5,5v66',
+ cycleLabels: 'M72.5,33.9c',
+ oblique: 'M80.9,30.2h',
+ filters: 'M24.8,13.3L',
+ resetZoom: 'M86,79.8L',
+ relatedIntents: 'M99.9,43.7',
+ nextIntent: 'M88.1,55.7',
+ prevIntent: 'M22.5,55.6',
+ intentTraffic: 'M14.7,71.5h',
+ allTraffic: 'M15.7,64.5h-7v',
+ flows: 'M93.8,46.1c',
+ eqMaster: 'M100.1,46.9l',
+
+ // badges
+ uiAttached: 'M2,2.5a.5,.5',
+ checkMark: 'M2.6,4.5c0',
+ xMark: 'M9.0,7.2C8.2',
+ triangleUp: 'M0.5,6.2c0',
+ triangleDown: 'M9.5,4.2c0',
+ plus: 'M4,2h2v2h2v2',
+ minus: 'M2,4h6v2',
+ play: 'M2.5,2l5.5,3',
+ stop: 'M2.5,2.5h5',
+
+ cloud: 'M37.6,79.5c-6.9,8.7-20.4,8.6',
+
+ // our test ones..
+ triangle: 'M.5,.2',
+ diamond: 'M.2,.5'
+ },
+ glyphIds = [
+ 'unknown', 'node', 'switch', 'roadm', 'endstation', 'router',
+ 'bgpSpeaker', 'chain', 'crown', 'lock', 'topo', 'refresh',
+ 'garbage',
+ 'flowTable', 'portTable', 'groupTable',
+ 'summary', 'details', 'ports', 'map', 'cycleLabels',
+ 'oblique', 'filters', 'resetZoom', 'relatedIntents', 'nextIntent',
+ 'prevIntent', 'intentTraffic', 'allTraffic', 'flows', 'eqMaster'
+ ],
+ badgeIds = [
+ 'uiAttached', 'checkMark', 'xMark', 'triangleUp', 'triangleDown',
+ 'plus', 'minus', 'play', 'stop'
+ ],
+ spriteIds = [
+ 'cloud'
+ ];
+
+ beforeEach(module('onosUtil', 'onosSvg'));
+
+ beforeEach(inject(function (_$log_, FnService, GlyphService) {
+ var body = d3.select('body');
+ $log = _$log_;
+ fs = FnService;
+ gs = GlyphService;
+ d3Elem = body.append('defs').attr('id', 'myDefs');
+ svg = body.append('svg').attr('id', 'mySvg');
+ }));
+
+ afterEach(function () {
+ d3.select('#mySvg').remove();
+ d3.select('#myDefs').remove();
+ gs.clear();
+ });
+
+ it('should define GlyphService', function () {
+ expect(gs).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(gs, [
+ 'clear', 'init', 'registerGlyphs', 'registerGlyphSet',
+ 'ids', 'glyph', 'loadDefs', 'addGlyph'
+ ])).toBe(true);
+ });
+
+ it('should start with no glyphs loaded', function () {
+ expect(gs.ids()).toEqual([]);
+ });
+
+ it('should load the base set of glyphs into the cache', function () {
+ gs.init();
+ expect(gs.ids().length).toEqual(numBaseGlyphs);
+ });
+
+ it('should remove glyphs from the cache on clear', function () {
+ gs.init();
+ expect(gs.ids().length).toEqual(numBaseGlyphs);
+ gs.clear();
+ expect(gs.ids().length).toEqual(0);
+ });
+
+ function verifyGlyphLoadedInCache(id, vbox, expPfxId) {
+ var pfxId = expPfxId || id,
+ glyph = gs.glyph(id),
+ prefix = prefixLookup[pfxId],
+ plen = prefix.length;
+ expect(fs.contains(gs.ids(), id)).toBe(true);
+ expect(glyph).toBeDefined();
+ expect(glyph.id).toEqual(id);
+ expect(glyph.vb).toEqual(vbox);
+ expect(glyph.d.slice(0, plen)).toEqual(prefix);
+ }
+
+ it('should be configured with the correct number of glyphs', function () {
+ var nGlyphs = 1 + glyphIds.length + badgeIds.length + spriteIds.length;
+ expect(nGlyphs).toEqual(numBaseGlyphs);
+ });
+
+ it('should load the bird glyph', function() {
+ gs.init();
+ verifyGlyphLoadedInCache('bird', vbBird);
+ });
+
+ it('should load the regular glyphs', function () {
+ gs.init();
+ glyphIds.forEach(function (id) {
+ verifyGlyphLoadedInCache(id, vbGlyph);
+ });
+ });
+
+ it('should load the badge glyphs', function () {
+ gs.init();
+ badgeIds.forEach(function (id) {
+ verifyGlyphLoadedInCache(id, vbBadge);
+ });
+ });
+
+ it('should load the sprites', function () {
+ gs.init();
+ spriteIds.forEach(function (id) {
+ verifyGlyphLoadedInCache(id, vbGlyph);
+ });
+ });
+
+
+ // define some glyphs that we want to install
+
+ var testVbox = '0 0 1 1',
+ triVbox = '0 0 12 12',
+ diaVbox = '0 0 15 15',
+ dTriangle = 'M.5,.2l.3,.6,h-.6z',
+ dDiamond = 'M.2,.5l.3,-.3l.3,.3l-.3,.3z',
+ newGlyphs = {
+ _viewbox: testVbox,
+ triangle: dTriangle,
+ diamond: dDiamond
+ },
+ dupGlyphs = {
+ _viewbox: testVbox,
+ router: dTriangle,
+ switch: dDiamond
+ },
+ altNewGlyphs = {
+ _triangle: triVbox,
+ triangle: dTriangle,
+ _diamond: diaVbox,
+ diamond: dDiamond
+ },
+ altDupGlyphs = {
+ _router: triVbox,
+ router: dTriangle,
+ _switch: diaVbox,
+ switch: dDiamond
+ },
+ badGlyphSet = {
+ triangle: dTriangle,
+ diamond: dDiamond
+ },
+ warnMsg = 'GlyphService.registerGlyphs(): ',
+ warnMsgSet = 'GlyphService.registerGlyphSet(): ',
+ idCollision = warnMsg + 'ID collision: ',
+ idCollisionSet = warnMsgSet + 'ID collision: ',
+ missVbSet = warnMsgSet + 'no "_viewbox" property found',
+ missVbCustom = warnMsg + 'Missing viewbox property: ',
+ missVbTri = missVbCustom + '"_triangle"',
+ missVbDia = missVbCustom + '"_diamond"';
+
+
+ it('should install new glyphs as a glyph-set', function () {
+ gs.init();
+ expect(gs.ids().length).toEqual(numBaseGlyphs);
+ spyOn($log, 'warn');
+
+ var ok = gs.registerGlyphSet(newGlyphs);
+ expect(ok).toBe(true);
+ expect($log.warn).not.toHaveBeenCalled();
+
+ expect(gs.ids().length).toEqual(numBaseGlyphs + 2);
+ verifyGlyphLoadedInCache('triangle', testVbox);
+ verifyGlyphLoadedInCache('diamond', testVbox);
+ });
+
+ it('should not overwrite glyphs (via glyph-set) with dup IDs', function () {
+ gs.init();
+ expect(gs.ids().length).toEqual(numBaseGlyphs);
+ spyOn($log, 'warn');
+
+ var ok = gs.registerGlyphSet(dupGlyphs);
+ expect(ok).toBe(false);
+ expect($log.warn).toHaveBeenCalledWith(idCollisionSet + '"switch"');
+ expect($log.warn).toHaveBeenCalledWith(idCollisionSet + '"router"');
+
+ expect(gs.ids().length).toEqual(numBaseGlyphs);
+ // verify original glyphs still exist...
+ verifyGlyphLoadedInCache('router', vbGlyph);
+ verifyGlyphLoadedInCache('switch', vbGlyph);
+ });
+
+ it('should replace glyphs (via glyph-set) if asked nicely', function () {
+ gs.init();
+ expect(gs.ids().length).toEqual(numBaseGlyphs);
+ spyOn($log, 'warn');
+
+ var ok = gs.registerGlyphSet(dupGlyphs, true);
+ expect(ok).toBe(true);
+ expect($log.warn).not.toHaveBeenCalled();
+
+ expect(gs.ids().length).toEqual(numBaseGlyphs);
+ // verify glyphs have been overwritten...
+ verifyGlyphLoadedInCache('router', testVbox, 'triangle');
+ verifyGlyphLoadedInCache('switch', testVbox, 'diamond');
+ });
+
+ it ('should complain if missing _viewbox in a glyph-set', function () {
+ gs.init();
+ expect(gs.ids().length).toEqual(numBaseGlyphs);
+ spyOn($log, 'warn');
+
+ var ok = gs.registerGlyphSet(badGlyphSet);
+ expect(ok).toBe(false);
+ expect($log.warn).toHaveBeenCalledWith(missVbSet);
+ expect(gs.ids().length).toEqual(numBaseGlyphs);
+ });
+
+ it('should install new glyphs', function () {
+ gs.init();
+ expect(gs.ids().length).toEqual(numBaseGlyphs);
+ spyOn($log, 'warn');
+
+ var ok = gs.registerGlyphs(altNewGlyphs);
+ expect(ok).toBe(true);
+ expect($log.warn).not.toHaveBeenCalled();
+
+ expect(gs.ids().length).toEqual(numBaseGlyphs + 2);
+ verifyGlyphLoadedInCache('triangle', triVbox);
+ verifyGlyphLoadedInCache('diamond', diaVbox);
+ });
+
+ it('should not overwrite glyphs with dup IDs', function () {
+ gs.init();
+ expect(gs.ids().length).toEqual(numBaseGlyphs);
+ spyOn($log, 'warn');
+
+ var ok = gs.registerGlyphs(altDupGlyphs);
+ expect(ok).toBe(false);
+ expect($log.warn).toHaveBeenCalledWith(idCollision + '"switch"');
+ expect($log.warn).toHaveBeenCalledWith(idCollision + '"router"');
+
+ expect(gs.ids().length).toEqual(numBaseGlyphs);
+ // verify original glyphs still exist...
+ verifyGlyphLoadedInCache('router', vbGlyph);
+ verifyGlyphLoadedInCache('switch', vbGlyph);
+ });
+
+ it('should replace glyphs if asked nicely', function () {
+ gs.init();
+ expect(gs.ids().length).toEqual(numBaseGlyphs);
+ spyOn($log, 'warn');
+
+ var ok = gs.registerGlyphs(altDupGlyphs, true);
+ expect(ok).toBe(true);
+ expect($log.warn).not.toHaveBeenCalled();
+
+ expect(gs.ids().length).toEqual(numBaseGlyphs);
+ // verify glyphs have been overwritten...
+ verifyGlyphLoadedInCache('router', triVbox, 'triangle');
+ verifyGlyphLoadedInCache('switch', diaVbox, 'diamond');
+ });
+
+ it ('should complain if missing custom viewbox', function () {
+ gs.init();
+ expect(gs.ids().length).toEqual(numBaseGlyphs);
+ spyOn($log, 'warn');
+
+ var ok = gs.registerGlyphs(badGlyphSet);
+ expect(ok).toBe(false);
+ expect($log.warn).toHaveBeenCalledWith(missVbTri);
+ expect($log.warn).toHaveBeenCalledWith(missVbDia);
+ expect(gs.ids().length).toEqual(numBaseGlyphs);
+ });
+
+ function verifyPathPrefix(elem, prefix) {
+ var plen = prefix.length,
+ d = elem.select('path').attr('d');
+ expect(d.slice(0, plen)).toEqual(prefix);
+ }
+
+ function verifyLoadedInDom(id, vb, expPfxId) {
+ var pfxId = expPfxId || id,
+ symbol = d3Elem.select('#' + id);
+ expect(symbol.size()).toEqual(1);
+ expect(symbol.attr('viewBox')).toEqual(vb);
+ verifyPathPrefix(symbol, prefixLookup[pfxId]);
+ }
+
+ it('should load base glyphs into the DOM', function () {
+ gs.init();
+ gs.loadDefs(d3Elem);
+ expect(d3Elem.selectAll('symbol').size()).toEqual(numBaseGlyphs);
+ verifyLoadedInDom('bgpSpeaker', vbGlyph);
+ });
+
+ it('should load custom glyphs into the DOM', function () {
+ gs.init();
+ gs.registerGlyphSet(newGlyphs);
+ gs.loadDefs(d3Elem);
+ expect(d3Elem.selectAll('symbol').size()).toEqual(numBaseGlyphs + 2);
+ verifyLoadedInDom('diamond', testVbox);
+ });
+
+ it('should load only specified glyphs into the DOM', function () {
+ gs.init();
+ gs.loadDefs(d3Elem, ['crown', 'chain', 'node']);
+ expect(d3Elem.selectAll('symbol').size()).toEqual(3);
+ verifyLoadedInDom('crown', vbGlyph);
+ verifyLoadedInDom('chain', vbGlyph);
+ verifyLoadedInDom('node', vbGlyph);
+ });
+
+ it('should add a glyph with default size', function () {
+ gs.init();
+ var retval = gs.addGlyph(svg, 'crown');
+ var what = svg.selectAll('use');
+ expect(what.size()).toEqual(1);
+ expect(what.attr('width')).toEqual('40');
+ expect(what.attr('height')).toEqual('40');
+ expect(what.attr('xlink:href')).toEqual('#crown');
+ expect(what.classed('glyph')).toBeTruthy();
+ expect(what.classed('overlay')).toBeFalsy();
+
+ // check a couple on retval, which should be the same thing..
+ expect(retval.attr('xlink:href')).toEqual('#crown');
+ expect(retval.classed('glyph')).toBeTruthy();
+ });
+
+ it('should add a glyph with given size', function () {
+ gs.init();
+ gs.addGlyph(svg, 'crown', 37);
+ var what = svg.selectAll('use');
+ expect(what.size()).toEqual(1);
+ expect(what.attr('width')).toEqual('37');
+ expect(what.attr('height')).toEqual('37');
+ expect(what.attr('xlink:href')).toEqual('#crown');
+ expect(what.classed('glyph')).toBeTruthy();
+ expect(what.classed('overlay')).toBeFalsy();
+ });
+
+ it('should add a glyph marked as overlay', function () {
+ gs.init();
+ gs.addGlyph(svg, 'crown', 20, true);
+ var what = svg.selectAll('use');
+ expect(what.size()).toEqual(1);
+ expect(what.attr('width')).toEqual('20');
+ expect(what.attr('height')).toEqual('20');
+ expect(what.attr('xlink:href')).toEqual('#crown');
+ expect(what.classed('glyph')).toBeTruthy();
+ expect(what.classed('overlay')).toBeTruthy();
+ });
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/icon-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/icon-spec.js
new file mode 100644
index 00000000..99d7bc38
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/icon-spec.js
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- SVG -- Icon Service - Unit Tests
+ */
+describe('factory: fw/svg/icon.js', function() {
+ var is, d3Elem;
+
+ var viewBox = '0 0 50 50',
+ glyphSize = '50',
+ iconSize = '20';
+
+
+ beforeEach(module('onosSvg'));
+
+ beforeEach(inject(function (IconService) {
+ is = IconService;
+ d3Elem = d3.select('body').append('div').attr('id', 'myDiv');
+ }));
+
+ afterEach(function () {
+ d3.select('#myDiv').remove();
+ });
+
+ it('should define IconService', function () {
+ expect(is).toBeDefined();
+ });
+
+ function checkElemSize(elem, dim) {
+ expect(elem.attr('width')).toEqual(dim);
+ expect(elem.attr('height')).toEqual(dim);
+ }
+
+ function verifyIconStructure(iconClass, useHref, iSize, vBox, gSize) {
+ var isz = iSize || iconSize,
+ vbx = vBox || viewBox,
+ gsz = gSize || glyphSize;
+
+ var svg = d3Elem.selectAll('svg');
+ expect(svg.size()).toBe(1);
+ checkElemSize(svg, isz);
+ expect(svg.attr('viewBox')).toEqual(vbx);
+
+ var g = svg.selectAll('g');
+ expect(g.size()).toBe(1);
+ expect(g.classed('icon')).toBeTruthy();
+ expect(g.classed(iconClass)).toBeTruthy();
+
+ var rect = g.select('rect');
+ expect(rect.size()).toBe(1);
+ checkElemSize(rect, gsz);
+ expect(rect.attr('rx')).toEqual('5');
+
+ if (useHref) {
+ var use = g.select('use');
+ expect(use.classed('glyph')).toBeTruthy();
+ expect(use.attr('xlink:href')).toEqual(useHref);
+ checkElemSize(use, gsz);
+ }
+ }
+
+ it('should load an icon into a div', function () {
+ expect(d3Elem.html()).toEqual('');
+ is.loadIconByClass(d3Elem, 'active');
+ verifyIconStructure('active', '#checkMark');
+ });
+
+ it('should allow us to specify the icon size', function () {
+ expect(d3Elem.html()).toEqual('');
+ is.loadIconByClass(d3Elem, 'inactive', 32);
+ verifyIconStructure('inactive', '#xMark', '32');
+ });
+
+ it('should verify triangleUp icon', function () {
+ expect(d3Elem.html()).toEqual('');
+ is.loadIconByClass(d3Elem, 'upArrow', 10);
+ verifyIconStructure('upArrow', '#triangleUp', '10');
+ });
+
+ it('should verify triangleDown icon', function () {
+ expect(d3Elem.html()).toEqual('');
+ is.loadIconByClass(d3Elem, 'downArrow', 10);
+ verifyIconStructure('downArrow', '#triangleDown', '10');
+ });
+
+ it('should verify no icon is displayed', function () {
+ expect(d3Elem.html()).toEqual('');
+ is.loadIconByClass(d3Elem, 'tableColSortNone', 10);
+ verifyIconStructure('tableColSortNone', null, '10');
+ });
+
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/map-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/map-spec.js
new file mode 100644
index 00000000..27848d1a
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/map-spec.js
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- SVG -- Map Service - Unit Tests
+ */
+describe('factory: fw/svg/map.js', function() {
+ var $log, $httpBackend, fs, ms, d3Elem, promise;
+
+ beforeEach(module('onosUtil', 'onosSvg'));
+
+ beforeEach(inject(function (_$log_, _$httpBackend_, FnService, MapService) {
+ $log = _$log_;
+ $httpBackend = _$httpBackend_;
+ fs = FnService;
+ ms = MapService;
+ //ms.clearCache();
+ d3Elem = d3.select('body').append('svg').append('g').attr('id', 'mapLayer');
+ }));
+
+ afterEach(function () {
+ d3.select('svg').remove();
+ });
+
+ it('should define MapService', function () {
+ expect(ms).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(ms, [
+ 'loadMapInto'
+ ])).toBeTruthy();
+ });
+
+ var fakeMapId = '../tests/app/fw/svg/fake-map-data',
+ fakeMapUrl = fakeMapId + '.json';
+
+ var fakeMapData = {
+ "type": "Topology",
+ "objects": {
+ "states": {
+ "type": "GeometryCollection",
+ "geometries": [
+ { "type": "Polygon", "arcs": [[0, 1]]},
+ { "type": "Polygon", "arcs": [[2, 3]]}
+ ]
+ }
+ },
+ "arcs": [
+ [ [6347, 2300], [ -16, -9], [ -22, 1], [ -5, 3], [ 9, 6], [ 27, 7], [ 7, -8]],
+ [ [6447, 2350], [ -4, -4], [ -19, -41], [ -66, -14], [ 4, 9], [ 14, 2]],
+ [ [6290, 2347], [ -2, 83], [ -2, 76], [ -2, 75], [ -2, 76], [ -2, 76], [ -2, 75]],
+ [ [6329, 4211], [ -3, 6], [ -2, 4], [ 2, 1], [ 28, -1], [ 28, 0]]
+ ],
+ "transform": {
+ "scale": [0.005772872856602365, 0.0024829805705001468],
+ "translate": [-124.70997774915153, 24.542349340056283]
+ }
+ };
+
+
+ it('should load map into layer', function () {
+ $httpBackend.expectGET(fakeMapUrl).respond(fakeMapData);
+
+ var obj = ms.loadMapInto(d3Elem, fakeMapId);
+ //$httpBackend.flush();
+ // TODO: figure out how to test this function as a black box test.
+
+ expect(obj).toBeTruthy();
+
+ // todo: assert that paths are added to map layer element
+ });
+
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/svgUtil-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/svgUtil-spec.js
new file mode 100644
index 00000000..ab2bfa3e
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/svgUtil-spec.js
@@ -0,0 +1,237 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- SVG -- SVG Util Service - Unit Tests
+ */
+describe('factory: fw/svg/svgUtil.js', function() {
+ var $log, fs, sus, svg, defs, force;
+
+ var noop = function () {};
+
+ beforeEach(module('onosUtil', 'onosSvg'));
+
+ beforeEach(inject(function (_$log_, FnService, SvgUtilService) {
+ $log = _$log_;
+ fs = FnService;
+ sus = SvgUtilService;
+ svg = d3.select('body').append('svg').attr('id', 'mySvg');
+ defs = svg.append('defs');
+ force = d3.layout.force();
+ }));
+
+ afterEach(function () {
+ d3.select('svg').remove();
+ });
+
+ it('should define SvgUtilService', function () {
+ expect(sus).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(sus, [
+ 'createDragBehavior', 'loadGlowDefs', 'cat7',
+ 'translate', 'scale', 'skewX', 'rotate',
+ 'stripPx', 'safeId', 'visible'
+ ])).toBeTruthy();
+ });
+
+ // === createDragBehavior
+ // TODO: break up drag into separate functions for testing
+ // d3 needs better testing support...
+
+ // Note: just checking to see if error message was called
+ // because jasmine spy isn't catching the right newline char
+ it('should complain if function given no parameters', function () {
+ spyOn($log, 'error');
+ expect(sus.createDragBehavior()).toBeNull();
+ expect($log.error).toHaveBeenCalled();
+ });
+
+ it('should complain if function is not given clickEnabled', function () {
+ spyOn($log, 'error');
+ expect(sus.createDragBehavior(force, noop, noop, noop)).toBeNull();
+ expect($log.error).toHaveBeenCalled();
+ });
+
+ it('should complain if function is not given dragEnabled', function () {
+ spyOn($log, 'error');
+ expect(sus.createDragBehavior(force, noop, noop)).toBeNull();
+ expect($log.error).toHaveBeenCalled();
+ });
+
+ it('should complain if function is not given atDragEnd', function () {
+ spyOn($log, 'error');
+ expect(sus.createDragBehavior(force, noop)).toBeNull();
+ expect($log.error).toHaveBeenCalled();
+ });
+
+ it('should complain if function is not given selectCb', function () {
+ spyOn($log, 'error');
+ expect(sus.createDragBehavior(force)).toBeNull();
+ expect($log.error).toHaveBeenCalled();
+ });
+
+ // === loadGlowDefs
+ function checkAttrs(glow, r, g, b) {
+ var filterEffects, feColor, feBlur, feMerge, feMergeNodes;
+
+ // filter attrs
+ expect(glow.attr('x')).toBe('-50%');
+ expect(glow.attr('y')).toBe('-50%');
+ expect(glow.attr('width')).toBe('200%');
+ expect(glow.attr('height')).toBe('200%');
+
+ filterEffects = d3.selectAll(glow.node().childNodes);
+ expect(filterEffects.size()).toBe(3);
+
+ // Note: d3 didn't recognize 'feColorMatrix' and others as valid selectors
+ // this is a work around
+ feColor = d3.select(filterEffects[0].shift());
+ feBlur = d3.select(filterEffects[0].shift());
+ feMerge = d3.select(filterEffects[0].shift());
+
+ // feColorMatrix attrs
+ expect(feColor.empty()).toBe(false);
+ expect(feColor.attr('type')).toBe('matrix');
+ expect(feColor.attr('values')).toBe(
+ '0 0 0 0 ' + r + ' ' +
+ '0 0 0 0 ' + g + ' ' +
+ '0 0 0 0 ' + b + ' ' +
+ '0 0 0 1 0 '
+ );
+
+ // feGuassianBlur attrs
+ expect(feBlur.empty()).toBe(false);
+ expect(feBlur.attr('stdDeviation')).toBe('3');
+ expect(feBlur.attr('result')).toBe('coloredBlur');
+
+ // feMerge attrs
+ feMergeNodes = d3.selectAll(feMerge.node().childNodes);
+ expect(feMergeNodes.size()).toBe(2);
+ expect(d3.select(feMergeNodes[0][0]).attr('in')).toBe('coloredBlur');
+ expect(d3.select(feMergeNodes[0][1]).attr('in')).toBe('SourceGraphic');
+ }
+
+ it('should load glow definitions', function () {
+ var blue, yellow;
+ sus.loadGlowDefs(defs);
+
+ expect(defs.empty()).toBe(false);
+ expect((defs.selectAll('filter')).size()).toBe(2);
+
+ // blue-glow specific
+ blue = defs.select('#blue-glow');
+ expect(blue.empty()).toBe(false);
+ checkAttrs(blue, 0.0, 0.0, 0.7);
+
+ // yellow-glow specific
+ yellow = defs.select('#yellow-glow');
+ expect(yellow.empty()).toBe(false);
+ checkAttrs(yellow, 1.0, 1.0, 0.3);
+ });
+
+ // === cat7
+
+ it('should define two methods on the api', function () {
+ var cat7 = sus.cat7();
+ expect(fs.areFunctions(cat7, [
+ 'testCard', 'getColor'
+ ])).toBeTruthy();
+ });
+
+ it('should provide a certain shade of blue', function () {
+ expect(sus.cat7().getColor('foo', false, 'light')).toEqual('#3E5780');
+ });
+
+ it('should not matter what the ID really is for shade of blue', function () {
+ expect(sus.cat7().getColor('bar', false, 'light')).toEqual('#3E5780');
+ });
+
+ it('should provide different shade of blue for muted', function () {
+ expect(sus.cat7().getColor('foo', true, 'light')).toEqual('#A8B8CC');
+ });
+
+
+ it('should provide an alternate (dark) shade of blue', function () {
+ expect(sus.cat7().getColor('foo', false, 'dark')).toEqual('#304860');
+ });
+
+ it('should provide an alternate (dark) shade of blue for muted', function () {
+ expect(sus.cat7().getColor('foo', true, 'dark')).toEqual('#304860');
+ });
+
+ it('should iterate across the colors', function () {
+ expect(sus.cat7().getColor('foo', false, 'light')).toEqual('#3E5780');
+ expect(sus.cat7().getColor('bar', false, 'light')).toEqual('#78533B');
+ expect(sus.cat7().getColor('baz', false, 'light')).toEqual('#CB4D28');
+ expect(sus.cat7().getColor('goo', false, 'light')).toEqual('#018D61');
+ expect(sus.cat7().getColor('zoo', false, 'light')).toEqual('#8A2979');
+ expect(sus.cat7().getColor('pip', false, 'light')).toEqual('#006D73');
+ expect(sus.cat7().getColor('sdh', false, 'light')).toEqual('#56AF00');
+ // and cycle back to the first color for item #8
+ expect(sus.cat7().getColor('bri', false, 'light')).toEqual('#3E5780');
+ // and return the same color for the same ID
+ expect(sus.cat7().getColor('zoo', false, 'light')).toEqual('#8A2979');
+ });
+
+ // === translate(), scale(), skewX(), rotate()
+
+ it('should translate from two args', function () {
+ expect(sus.translate(1,2)).toEqual('translate(1,2)');
+ });
+
+ it('should translate from an array', function () {
+ expect(sus.translate([3,4])).toEqual('translate(3,4)');
+ });
+
+ it('should scale', function () {
+ expect(sus.scale(1.5,2.5)).toEqual('scale(1.5,2.5)');
+ });
+
+ it('should skewX', function () {
+ expect(sus.skewX(3.14)).toEqual('skewX(3.14)');
+ });
+
+ it('should rotate', function () {
+ expect(sus.rotate(45)).toEqual('rotate(45)');
+ });
+
+
+ // === stripPx()
+
+ it('should not affect a number', function () {
+ expect(sus.stripPx('4')).toEqual('4');
+ });
+
+ it('should remove trailing px', function () {
+ expect(sus.stripPx('4px')).toEqual('4');
+ });
+
+ // === visible()
+
+ it('should hide and show an element', function () {
+ var r = svg.append('rect');
+
+ sus.visible(r, false);
+ expect(r.style('visibility')).toEqual('hidden');
+ expect(sus.visible(r)).toBe(false);
+
+ sus.visible(r, true);
+ expect(r.style('visibility')).toEqual('visible');
+ expect(sus.visible(r)).toBe(true);
+ });
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/zoom-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/zoom-spec.js
new file mode 100644
index 00000000..d70c87fb
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/svg/zoom-spec.js
@@ -0,0 +1,152 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- SVG -- Zoom Service - Unit Tests
+ */
+describe('factory: fw/svg/zoom.js', function() {
+ var $log, fs, zs, svg, zoomLayer, zoomer;
+
+ var cz = 'ZoomService.createZoomer(): ',
+ d3s = ' (D3 selection) property defined';
+
+ beforeEach(module('onosUtil', 'onosSvg'));
+
+ beforeEach(inject(function (_$log_, FnService, ZoomService) {
+ $log = _$log_;
+ fs = FnService;
+ zs = ZoomService;
+ svg = d3.select('body').append('svg').attr('id', 'mySvg');
+ zoomLayer = svg.append('g').attr('id', 'myZoomlayer');
+ }));
+
+ afterEach(function () {
+ d3.select('#mySvg').remove();
+ // Note: since zoomLayer is a child of svg, it should be removed also
+ });
+
+ it('should define ZoomService', function () {
+ expect(zs).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(zs, ['createZoomer'])).toBeTruthy();
+ });
+
+ function verifyZoomerApi() {
+ expect(fs.areFunctions(zoomer, [
+ 'panZoom', 'reset', 'translate', 'scale', 'scaleExtent'
+ ])).toBeTruthy();
+ }
+
+ it('should fail gracefully with no option object', function () {
+ spyOn($log, 'error');
+
+ zoomer = zs.createZoomer();
+ expect($log.error).toHaveBeenCalledWith(cz + 'No "svg" (svg tag)' + d3s);
+ expect($log.error).toHaveBeenCalledWith(cz + 'No "zoomLayer" (g tag)' + d3s);
+ expect(zoomer).toBeNull();
+ });
+
+ it('should complain if we miss required options', function () {
+ spyOn($log, 'error');
+
+ zoomer = zs.createZoomer({});
+ expect($log.error).toHaveBeenCalledWith(cz + 'No "svg" (svg tag)' + d3s);
+ expect($log.error).toHaveBeenCalledWith(cz + 'No "zoomLayer" (g tag)' + d3s);
+ expect(zoomer).toBeNull();
+ });
+
+ it('should work with minimal parameters', function () {
+ spyOn($log, 'error');
+
+ zoomer = zs.createZoomer({
+ svg: svg,
+ zoomLayer: zoomLayer
+ });
+ expect($log.error).not.toHaveBeenCalled();
+ verifyZoomerApi();
+ });
+
+ it('should start at scale 1 and translate 0,0', function () {
+ zoomer = zs.createZoomer({
+ svg: svg,
+ zoomLayer: zoomLayer
+ });
+ verifyZoomerApi();
+ expect(zoomer.translate()).toEqual([0,0]);
+ expect(zoomer.scale()).toEqual(1);
+ });
+
+ it('should allow programmatic pan/zoom', function () {
+ zoomer = zs.createZoomer({
+ svg: svg,
+ zoomLayer: zoomLayer
+ });
+ verifyZoomerApi();
+ expect(zoomer.translate()).toEqual([0,0]);
+ expect(zoomer.scale()).toEqual(1);
+
+ zoomer.panZoom([20,30], 3);
+ expect(zoomer.translate()).toEqual([20,30]);
+ expect(zoomer.scale()).toEqual(3);
+ });
+
+ it('should provide default scale extent', function () {
+ zoomer = zs.createZoomer({
+ svg: svg,
+ zoomLayer: zoomLayer
+ });
+ expect(zoomer.scaleExtent()).toEqual([0.25, 10]);
+ });
+
+ it('should allow us to override the minimum zoom', function () {
+ zoomer = zs.createZoomer({
+ svg: svg,
+ zoomLayer: zoomLayer,
+ zoomMin: 1.23
+ });
+ expect(zoomer.scaleExtent()).toEqual([1.23, 10]);
+ });
+
+ it('should allow us to override the maximum zoom', function () {
+ zoomer = zs.createZoomer({
+ svg: svg,
+ zoomLayer: zoomLayer,
+ zoomMax: 13
+ });
+ expect(zoomer.scaleExtent()).toEqual([0.25, 13]);
+ });
+
+ // TODO: test zoomed() where we fake out the d3.event.sourceEvent etc...
+ // need to check default enabled (true) and custom enabled predicate
+ // need to check that the callback is invoked also
+
+ it('should invoke the callback on programmatic pan/zoom', function () {
+ var foo = { cb: function () {} };
+ spyOn(foo, 'cb');
+
+ zoomer = zs.createZoomer({
+ svg: svg,
+ zoomLayer: zoomLayer,
+ zoomCallback: foo.cb
+ });
+
+ zoomer.panZoom([0,0], 2);
+ expect(foo.cb).toHaveBeenCalled();
+ });
+
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/util/fn-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/util/fn-spec.js
new file mode 100644
index 00000000..c9f3bef6
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/util/fn-spec.js
@@ -0,0 +1,446 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Util -- General Purpose Functions - Unit Tests
+ */
+describe('factory: fw/util/fn.js', function() {
+ var $window,
+ fs,
+ someFunction = function () {},
+ someArray = [1, 2, 3],
+ someObject = { foo: 'bar'},
+ someNumber = 42,
+ someString = 'xyyzy',
+ someDate = new Date(),
+ stringArray = ['foo', 'bar'];
+
+ beforeEach(module('onosUtil'));
+
+ var mockWindow = {
+ innerWidth: 400,
+ innerHeight: 200,
+ navigator: {
+ userAgent: 'defaultUA'
+ }
+ };
+
+ beforeEach(function () {
+ module(function ($provide) {
+ $provide.value('$window', mockWindow);
+ });
+ });
+
+ beforeEach(inject(function (_$window_, FnService) {
+ $window = _$window_;
+ fs = FnService;
+ }));
+
+ // === Tests for isF()
+ it('isF(): null for undefined', function () {
+ expect(fs.isF(undefined)).toBeNull();
+ });
+ it('isF(): null for null', function () {
+ expect(fs.isF(null)).toBeNull();
+ });
+ it('isF(): the reference for function', function () {
+ expect(fs.isF(someFunction)).toBe(someFunction);
+ });
+ it('isF(): null for string', function () {
+ expect(fs.isF(someString)).toBeNull();
+ });
+ it('isF(): null for number', function () {
+ expect(fs.isF(someNumber)).toBeNull();
+ });
+ it('isF(): null for Date', function () {
+ expect(fs.isF(someDate)).toBeNull();
+ });
+ it('isF(): null for array', function () {
+ expect(fs.isF(someArray)).toBeNull();
+ });
+ it('isF(): null for object', function () {
+ expect(fs.isF(someObject)).toBeNull();
+ });
+
+
+ // === Tests for isA()
+ it('isA(): null for undefined', function () {
+ expect(fs.isA(undefined)).toBeNull();
+ });
+ it('isA(): null for null', function () {
+ expect(fs.isA(null)).toBeNull();
+ });
+ it('isA(): null for function', function () {
+ expect(fs.isA(someFunction)).toBeNull();
+ });
+ it('isA(): null for string', function () {
+ expect(fs.isA(someString)).toBeNull();
+ });
+ it('isA(): null for number', function () {
+ expect(fs.isA(someNumber)).toBeNull();
+ });
+ it('isA(): null for Date', function () {
+ expect(fs.isA(someDate)).toBeNull();
+ });
+ it('isA(): the reference for array', function () {
+ expect(fs.isA(someArray)).toBe(someArray);
+ });
+ it('isA(): null for object', function () {
+ expect(fs.isA(someObject)).toBeNull();
+ });
+
+
+ // === Tests for isS()
+ it('isS(): null for undefined', function () {
+ expect(fs.isS(undefined)).toBeNull();
+ });
+ it('isS(): null for null', function () {
+ expect(fs.isS(null)).toBeNull();
+ });
+ it('isS(): null for function', function () {
+ expect(fs.isS(someFunction)).toBeNull();
+ });
+ it('isS(): the reference for string', function () {
+ expect(fs.isS(someString)).toBe(someString);
+ });
+ it('isS(): null for number', function () {
+ expect(fs.isS(someNumber)).toBeNull();
+ });
+ it('isS(): null for Date', function () {
+ expect(fs.isS(someDate)).toBeNull();
+ });
+ it('isS(): null for array', function () {
+ expect(fs.isS(someArray)).toBeNull();
+ });
+ it('isS(): null for object', function () {
+ expect(fs.isS(someObject)).toBeNull();
+ });
+
+
+ // === Tests for isO()
+ it('isO(): null for undefined', function () {
+ expect(fs.isO(undefined)).toBeNull();
+ });
+ it('isO(): null for null', function () {
+ expect(fs.isO(null)).toBeNull();
+ });
+ it('isO(): null for function', function () {
+ expect(fs.isO(someFunction)).toBeNull();
+ });
+ it('isO(): null for string', function () {
+ expect(fs.isO(someString)).toBeNull();
+ });
+ it('isO(): null for number', function () {
+ expect(fs.isO(someNumber)).toBeNull();
+ });
+ it('isO(): null for Date', function () {
+ expect(fs.isO(someDate)).toBeNull();
+ });
+ it('isO(): null for array', function () {
+ expect(fs.isO(someArray)).toBeNull();
+ });
+ it('isO(): the reference for object', function () {
+ expect(fs.isO(someObject)).toBe(someObject);
+ });
+
+ // === Tests for contains()
+ it('contains(): false for improper args', function () {
+ expect(fs.contains()).toBeFalsy();
+ });
+ it('contains(): false for non-array', function () {
+ expect(fs.contains(null, 1)).toBeFalsy();
+ });
+ it('contains(): true for contained item', function () {
+ expect(fs.contains(someArray, 1)).toBeTruthy();
+ expect(fs.contains(stringArray, 'bar')).toBeTruthy();
+ });
+ it('contains(): false for non-contained item', function () {
+ expect(fs.contains(someArray, 109)).toBeFalsy();
+ expect(fs.contains(stringArray, 'zonko')).toBeFalsy();
+ });
+
+ // === Tests for areFunctions()
+ it('areFunctions(): false for non-array', function () {
+ expect(fs.areFunctions({}, 'not-an-array')).toBeFalsy();
+ });
+ it('areFunctions(): true for empty-array', function () {
+ expect(fs.areFunctions({}, [])).toBeTruthy();
+ });
+ it('areFunctions(): true for some api', function () {
+ expect(fs.areFunctions({
+ a: function () {},
+ b: function () {}
+ }, ['b', 'a'])).toBeTruthy();
+ });
+ it('areFunctions(): false for some other api', function () {
+ expect(fs.areFunctions({
+ a: function () {},
+ b: 'not-a-function'
+ }, ['b', 'a'])).toBeFalsy();
+ });
+ it('areFunctions(): extraneous stuff NOT ignored', function () {
+ expect(fs.areFunctions({
+ a: function () {},
+ b: function () {},
+ c: 1,
+ d: 'foo'
+ }, ['a', 'b'])).toBeFalsy();
+ });
+ it('areFunctions(): extraneous stuff ignored (alternate fn)', function () {
+ expect(fs.areFunctionsNonStrict({
+ a: function () {},
+ b: function () {},
+ c: 1,
+ d: 'foo'
+ }, ['a', 'b'])).toBeTruthy();
+ });
+
+ // == use the now-tested areFunctions() on our own api:
+ it('should define api functions', function () {
+ expect(fs.areFunctions(fs, [
+ 'isF', 'isA', 'isS', 'isO', 'contains',
+ 'areFunctions', 'areFunctionsNonStrict', 'windowSize', 'isMobile',
+ 'find', 'inArray', 'removeFromArray', 'isEmptyObject', 'cap',
+ 'noPx', 'noPxStyle', 'endsWith', 'parseBitRate'
+ ])).toBeTruthy();
+ });
+
+
+ // === Tests for windowSize()
+ it('windowSize(): noargs', function () {
+ var dim = fs.windowSize();
+ expect(dim.width).toEqual(400);
+ expect(dim.height).toEqual(200);
+ });
+
+ it('windowSize(): adjust height', function () {
+ var dim = fs.windowSize(50);
+ expect(dim.width).toEqual(400);
+ expect(dim.height).toEqual(150);
+ });
+
+ it('windowSize(): adjust width', function () {
+ var dim = fs.windowSize(0, 50);
+ expect(dim.width).toEqual(350);
+ expect(dim.height).toEqual(200);
+ });
+
+ it('windowSize(): adjust width and height', function () {
+ var dim = fs.windowSize(101, 201);
+ expect(dim.width).toEqual(199);
+ expect(dim.height).toEqual(99);
+ });
+
+ // === Tests for isMobile()
+ var uaMap = {
+ chrome: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) " +
+ "AppleWebKit/537.36 (KHTML, like Gecko) " +
+ "Chrome/41.0.2272.89 Safari/537.36",
+
+ iPad: "Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) " +
+ "AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 " +
+ "Mobile/11A465 Safari/9537.53",
+
+ iPhone: "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X) " +
+ "AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 " +
+ "Mobile/11A465 Safari/9537.53"
+ };
+
+ function setUa(key) {
+ var str = uaMap[key];
+ expect(str).toBeTruthy();
+ mockWindow.navigator.userAgent = str;
+ }
+
+ it('isMobile(): should be false for Chrome on Mac OS X', function () {
+ setUa('chrome');
+ expect(fs.isMobile()).toBe(false);
+ });
+ it('isMobile(): should be true for Safari on iPad', function () {
+ setUa('iPad');
+ expect(fs.isMobile()).toBe(true);
+ });
+ it('isMobile(): should be true for Safari on iPhone', function () {
+ setUa('iPhone');
+ expect(fs.isMobile()).toBe(true);
+ });
+
+ // === Tests for find()
+ var dataset = [
+ { id: 'foo', name: 'Furby'},
+ { id: 'bar', name: 'Barbi'},
+ { id: 'baz', name: 'Basil'},
+ { id: 'goo', name: 'Gabby'},
+ { id: 'zoo', name: 'Zevvv'}
+ ];
+
+ it('should not find ooo', function () {
+ expect(fs.find('ooo', dataset)).toEqual(-1);
+ });
+ it('should find foo', function () {
+ expect(fs.find('foo', dataset)).toEqual(0);
+ });
+ it('should find zoo', function () {
+ expect(fs.find('zoo', dataset)).toEqual(4);
+ });
+
+ it('should not find Simon', function () {
+ expect(fs.find('Simon', dataset, 'name')).toEqual(-1);
+ });
+ it('should find Furby', function () {
+ expect(fs.find('Furby', dataset, 'name')).toEqual(0);
+ });
+ it('should find Zevvv', function () {
+ expect(fs.find('Zevvv', dataset, 'name')).toEqual(4);
+ });
+
+
+ // === Tests for inArray()
+ var objRef = { x:1, y:2 },
+ array = [1, 3.14, 'hey', objRef, 'there', true],
+ array2 = ['b', 'a', 'd', 'a', 's', 's'];
+
+ it('should return -1 on non-arrays', function () {
+ expect(fs.inArray(1, {x:1})).toEqual(-1);
+ });
+ it('should not find HOO', function () {
+ expect(fs.inArray('HOO', array)).toEqual(-1);
+ });
+ it('should find 1', function () {
+ expect(fs.inArray(1, array)).toEqual(0);
+ });
+ it('should find pi', function () {
+ expect(fs.inArray(3.14, array)).toEqual(1);
+ });
+ it('should find hey', function () {
+ expect(fs.inArray('hey', array)).toEqual(2);
+ });
+ it('should find the object', function () {
+ expect(fs.inArray(objRef, array)).toEqual(3);
+ });
+ it('should find there', function () {
+ expect(fs.inArray('there', array)).toEqual(4);
+ });
+ it('should find true', function () {
+ expect(fs.inArray(true, array)).toEqual(5);
+ });
+
+ it('should find the first occurrence A', function () {
+ expect(fs.inArray('a', array2)).toEqual(1);
+ });
+ it('should find the first occurrence S', function () {
+ expect(fs.inArray('s', array2)).toEqual(4);
+ });
+ it('should not find X', function () {
+ expect(fs.inArray('x', array2)).toEqual(-1);
+ });
+
+ // === Tests for removeFromArray()
+ it('should ignore non-arrays', function () {
+ expect(fs.removeFromArray(1, {x:1})).toBe(false);
+ });
+ it('should keep the array the same, for non-match', function () {
+ var array = [1, 2, 3];
+ expect(fs.removeFromArray(4, array)).toBe(false);
+ expect(array).toEqual([1, 2, 3]);
+ });
+ it('should remove a value', function () {
+ var array = [1, 2, 3];
+ expect(fs.removeFromArray(2, array)).toBe(true);
+ expect(array).toEqual([1, 3]);
+ });
+ it('should remove the first occurrence', function () {
+ var array = ['x', 'y', 'z', 'z', 'y'];
+ expect(fs.removeFromArray('y', array)).toBe(true);
+ expect(array).toEqual(['x', 'z', 'z', 'y']);
+ expect(fs.removeFromArray('x', array)).toBe(true);
+ expect(array).toEqual(['z', 'z', 'y']);
+ });
+
+ // === Tests for isEmptyObject()
+ it('should return true if an object is empty', function () {
+ expect(fs.isEmptyObject({})).toBe(true);
+ });
+ it('should return false if an object is not empty', function () {
+ expect(fs.isEmptyObject({foo: 'bar'})).toBe(false);
+ });
+
+ // === Tests for cap()
+ it('should ignore non-alpha', function () {
+ expect(fs.cap('123')).toEqual('123');
+ });
+ it('should capitalize first char', function () {
+ expect(fs.cap('Foo')).toEqual('Foo');
+ expect(fs.cap('foo')).toEqual('Foo');
+ expect(fs.cap('foo bar')).toEqual('Foo bar');
+ expect(fs.cap('FOO BAR')).toEqual('Foo bar');
+ expect(fs.cap('foo Bar')).toEqual('Foo bar');
+ });
+
+ // === Tests for noPx()
+ it('should return the value without px suffix', function () {
+ expect(fs.noPx('10px')).toBe(10);
+ expect(fs.noPx('500px')).toBe(500);
+ expect(fs.noPx('-80px')).toBe(-80);
+ });
+
+ // === Tests for noPxStyle()
+ it("should give a style's property without px suffix", function () {
+ var d3Elem = d3.select('body')
+ .append('div')
+ .attr('id', 'fooElem')
+ .style({
+ width: '500px',
+ height: '200px',
+ 'font-size': '12px'
+ });
+ expect(fs.noPxStyle(d3Elem, 'width')).toBe(500);
+ expect(fs.noPxStyle(d3Elem, 'height')).toBe(200);
+ expect(fs.noPxStyle(d3Elem, 'font-size')).toBe(12);
+ d3.select('#fooElem').remove();
+ });
+
+ // === Tests for endsWith()
+ it('should return true if string ends with foo', function () {
+ expect(fs.endsWith("barfoo", "foo")).toBe(true);
+ });
+
+ it('should return false if string doesnt end with foo', function () {
+ expect(fs.endsWith("barfood", "foo")).toBe(false);
+ });
+
+ // === Tests for parseBitRate()
+ it('should return 5 - a', function () {
+ expect(fs.parseBitRate('5.47 KBps')).toBe(5);
+ });
+
+ it('should return 5 - b', function () {
+ expect(fs.parseBitRate('5. KBps')).toBe(5);
+ });
+
+ it('should return 5 - c', function () {
+ expect(fs.parseBitRate('5 KBps')).toBe(5);
+ });
+
+ it('should return 5 - d', function () {
+ expect(fs.parseBitRate('5 Kbps')).toBe(5);
+ });
+
+ it('should return 2001', function () {
+ expect(fs.parseBitRate('2,001.59 Gbps')).toBe(2001);
+ });
+});
+
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/util/keys-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/util/keys-spec.js
new file mode 100644
index 00000000..227d7904
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/util/keys-spec.js
@@ -0,0 +1,278 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Key Handler Service - Unit Tests
+ */
+describe('factory: fw/util/keys.js', function() {
+ var $log, ks, fs, qhs,
+ d3Elem, elem, last;
+
+
+ beforeEach(module('onosUtil', 'onosSvg', 'onosLayer', 'onosNav'));
+
+ beforeEach(inject(function (_$log_, KeyService, FnService, QuickHelpService) {
+ $log = _$log_;
+ ks = KeyService;
+ fs = FnService;
+ qhs = QuickHelpService;
+ d3Elem = d3.select('body').append('p').attr('id', 'ptest');
+ elem = d3Elem.node();
+ ks.installOn(d3Elem);
+ ks.bindQhs(qhs);
+ last = {
+ view: null,
+ key: null,
+ code: null,
+ ev: null
+ };
+ }));
+
+ afterEach(function () {
+ d3.select('#ptest').remove();
+ });
+
+ it('should define the key service', function () {
+ expect(ks).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(ks, [
+ 'bindQhs', 'installOn', 'keyBindings', 'gestureNotes', 'enableKeys'
+ ])).toBeTruthy();
+ });
+
+ // This no longer works because 'initKeyboardEvent' has been depreciated.
+ // Now there is a constructor for 'KeyboardEvent' where you can modify
+ // the new event with a dictionary(?) 'KeyboardEventInit'.
+ // However, the below code has been so recently depreciated, there are no
+ // examples online of how to use the new interface, and some browsers
+ // don't support it still. These tests will have to be put off for a
+ // while more. (Investigated 4/28/15)
+ // Also tried was Angular's triggerHandler() function, but it doesn't seem
+ // that it can take arguments about the event.
+ // Using jQuery in tests might be a good idea, for triggering test events.
+ function jsKeyDown(element, code) {
+ var ev = document.createEvent('KeyboardEvent');
+
+ // Chromium Hack
+ if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1) {
+ Object.defineProperty(ev, 'keyCode', {
+ get: function () { return this.keyCodeVal; }
+ });
+ Object.defineProperty(ev, 'which', {
+ get: function () { return this.keyCodeVal; }
+ });
+ }
+
+ if (ev.initKeyboardEvent) {
+ ev.initKeyboardEvent('keydown', true, true, document.defaultView,
+ false, false, false, false, code, code);
+ } else {
+ ev.initKeyEvent('keydown', true, true, document.defaultView,
+ false, false, false, false, code, 0);
+ }
+
+ ev.keyCodeVal = code;
+
+ if (ev.keyCode !== code) {
+ console.warn("keyCode mismatch " + ev.keyCode +
+ "(" + ev.which + ") -> "+ code);
+ }
+ element.dispatchEvent(ev);
+ }
+
+ // === Key binding related tests
+ it('should start with default key bindings', function () {
+ var state = ks.keyBindings(),
+ gk = state.globalKeys,
+ mk = state.maskedKeys,
+ vk = state.viewKeys,
+ vf = state.viewFunction;
+
+ expect(gk.length).toEqual(4);
+ ['backSlash', 'slash', 'esc', 'T'].forEach(function (k) {
+ expect(fs.contains(gk, k)).toBeTruthy();
+ });
+
+ expect(mk.length).toEqual(3);
+ ['backSlash', 'slash', 'T'].forEach(function (k) {
+ expect(fs.contains(mk, k)).toBeTruthy();
+ });
+
+ expect(vk.length).toEqual(0);
+ expect(vf).toBeFalsy();
+ });
+
+ function bindTestKeys(withDescs) {
+ var keys = ['A', '1', 'F5', 'equals'],
+ kb = {};
+
+ function cb(view, key, code, ev) {
+ last.view = view;
+ last.key = key;
+ last.code = code;
+ last.ev = ev;
+ }
+
+ function bind(k) {
+ return withDescs ? [cb, 'desc for key ' + k] : cb;
+ }
+
+ keys.forEach(function (k) {
+ kb[k] = bind(k);
+ });
+
+ ks.keyBindings(kb);
+ }
+
+ function verifyCall(key, code) {
+ // TODO: update expectation, when view tokens are implemented
+ expect(last.view).toEqual('NotYetAViewToken');
+ last.view = null;
+
+ expect(last.key).toEqual(key);
+ last.key = null;
+
+ expect(last.code).toEqual(code);
+ last.code = null;
+
+ expect(last.ev).toBeTruthy();
+ last.ev = null;
+ }
+
+ function verifyNoCall() {
+ expect(last.view).toBeNull();
+ expect(last.key).toBeNull();
+ expect(last.code).toBeNull();
+ expect(last.ev).toBeNull();
+ }
+
+ function verifyTestKeys() {
+ jsKeyDown(elem, 65); // 'A'
+ verifyCall('A', 65);
+ jsKeyDown(elem, 66); // 'B'
+ verifyNoCall();
+
+ jsKeyDown(elem, 49); // '1'
+ verifyCall('1', 49);
+ jsKeyDown(elem, 50); // '2'
+ verifyNoCall();
+
+ jsKeyDown(elem, 116); // 'F5'
+ verifyCall('F5', 116);
+ jsKeyDown(elem, 117); // 'F6'
+ verifyNoCall();
+
+ jsKeyDown(elem, 187); // 'equals'
+ verifyCall('equals', 187);
+ jsKeyDown(elem, 189); // 'dash'
+ verifyNoCall();
+
+ var vk = ks.keyBindings().viewKeys;
+
+ expect(vk.length).toEqual(4);
+ ['A', '1', 'F5', 'equals'].forEach(function (k) {
+ expect(fs.contains(vk, k)).toBeTruthy();
+ });
+
+ expect(ks.keyBindings().viewFunction).toBeFalsy();
+ }
+
+ // TODO: jsKeyDown(...) no longer emulates key presses ?! :(
+ // The following four unit tests ignored until we can figure this out.
+ // INVESTIGATED: see jsKeyDown for details...
+
+ xit('should allow specific key bindings', function () {
+ bindTestKeys();
+ verifyTestKeys();
+ });
+
+ xit('should allow specific key bindings with descriptions', function () {
+ bindTestKeys(true);
+ verifyTestKeys();
+ });
+
+ xit('should warn about masked keys', function () {
+ var k = {'space': cb, 'T': cb},
+ count = 0;
+
+ function cb(token, key, code, ev) {
+ count++;
+ //console.debug('count = ' + count, token, key, code);
+ }
+
+ spyOn($log, 'warn');
+
+ ks.keyBindings(k);
+
+ expect($log.warn).toHaveBeenCalledWith('setKeyBindings(): Key "T" is reserved');
+
+ // the 'T' key should NOT invoke our callback
+ expect(count).toEqual(0);
+ jsKeyDown(elem, 84); // 'T'
+ expect(count).toEqual(0);
+
+ // but the 'space' key SHOULD invoke our callback
+ jsKeyDown(elem, 32); // 'space'
+ expect(count).toEqual(1);
+ });
+
+ xit('should block keys when disabled', function () {
+ var cbCount = 0;
+
+ function cb() { cbCount++; }
+
+ function pressA() { jsKeyDown(elem, 65); } // 65 == 'A' keycode
+
+ ks.keyBindings({ A: cb });
+
+ expect(cbCount).toBe(0);
+
+ pressA();
+ expect(cbCount).toBe(1);
+
+ ks.enableKeys(false);
+ pressA();
+ expect(cbCount).toBe(1);
+
+ ks.enableKeys(true);
+ pressA();
+ expect(cbCount).toBe(2);
+ });
+
+ // === Gesture notes related tests
+ it('should start with no notes', function () {
+ expect(ks.gestureNotes()).toEqual([]);
+ });
+
+ it('should allow us to add nodes', function () {
+ var notes = [
+ ['one', 'something about one'],
+ ['two', 'description of two']
+ ];
+ ks.gestureNotes(notes);
+
+ expect(ks.gestureNotes()).toEqual(notes);
+ });
+
+ it('should ignore non-arrays', function () {
+ ks.gestureNotes({foo:4});
+ expect(ks.gestureNotes()).toEqual([]);
+ });
+
+ // Consider adding test to ensure array contains 2-tuples of strings
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/util/prefs-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/util/prefs-spec.js
new file mode 100644
index 00000000..02152895
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/util/prefs-spec.js
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Util -- User Preference Service - Unit Tests
+ */
+describe('factory: fw/util/prefs.js', function() {
+ var $cookies, ps, fs;
+
+ beforeEach(module('onosUtil'));
+
+ var mockCookies = {
+ foo: 'bar'
+ };
+
+ beforeEach(function () {
+ module(function ($provide) {
+ $provide.value('$cookies', mockCookies);
+ });
+ });
+
+ beforeEach(inject(function (PrefsService, FnService, _$cookies_) {
+ ps = PrefsService;
+ fs = FnService;
+ $cookies = _$cookies_;
+ }));
+
+ it('should define PrefsService', function () {
+ expect(ps).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(ps, [
+ 'getPrefs', 'asNumbers', 'setPrefs'
+ ])).toBe(true);
+ });
+
+ // === Tests for getPrefs()
+ // TODO unit tests for getPrefs()
+
+ // === Tests for asNumbers()
+ // TODO unit tests for asNumbers()
+
+ // === Tests for setPrefs()
+ // TODO unit tests for setPrefs()
+
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/util/random-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/util/random-spec.js
new file mode 100644
index 00000000..c4c61f1a
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/util/random-spec.js
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Util -- Random Service - Unit Tests
+ */
+describe('factory: fw/util/random.js', function() {
+ var rnd, $log, fs;
+
+ beforeEach(module('onosUtil'));
+
+ beforeEach(inject(function (RandomService, _$log_, FnService) {
+ rnd = RandomService;
+ $log = _$log_;
+ fs = FnService;
+ }));
+
+ // interesting use of a custom matcher...
+ beforeEach(function () {
+ jasmine.addMatchers({
+ toBeWithinOf: function () {
+ return {
+ compare: function (actual, distance, base) {
+ var lower = base - distance,
+ upper = base + distance,
+ result = {};
+
+ result.pass = Math.abs(actual - base) <= distance;
+
+ if (result.pass) {
+ // for negation with ".not"
+ result.message = 'Expected ' + actual +
+ ' to be outside ' + lower + ' and ' +
+ upper + ' (inclusive)';
+ } else {
+ result.message = 'Expected ' + actual +
+ ' to be between ' + lower + ' and ' +
+ upper + ' (inclusive)';
+ }
+ return result;
+ }
+ }
+ }
+ });
+ });
+
+ it('should define RandomService', function () {
+ expect(rnd).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(rnd, [
+ 'spread', 'randDim'
+ ])).toBeTruthy();
+ });
+
+ // really, can only do this heuristically.. hope this doesn't break
+ it('should spread results across the range', function () {
+ var load = 1000,
+ s = 12,
+ low = 0,
+ high = 0,
+ i, res,
+ which = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+ minCount = load / s * 0.5; // generous error
+
+ for (i=0; i<load; i++) {
+ res = rnd.spread(s);
+ if (res < low) low = res;
+ if (res > high) high = res;
+ which[res + s/2]++;
+ }
+ expect(low).toBe(-6);
+ expect(high).toBe(5);
+
+ // check we got a good number of hits in each bucket
+ for (i=0; i<s; i++) {
+ expect(which[i]).toBeGreaterThan(minCount);
+ }
+ });
+
+ // really, can only do this heuristically.. hope this doesn't break
+ it('should choose results across the dimension', function () {
+ var load = 1000,
+ dim = 100,
+ low = 999,
+ high = 0,
+ i, res;
+
+ for (i=0; i<load; i++) {
+ res = rnd.randDim(dim);
+ if (res < low) low = res;
+ if (res > high) high = res;
+ expect(res).toBeWithinOf(36, 50);
+ }
+ });
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/util/theme-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/util/theme-spec.js
new file mode 100644
index 00000000..1d400ed1
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/util/theme-spec.js
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Util -- Theme Service - Unit Tests
+ */
+describe('factory: fw/util/theme.js', function() {
+ var ts, $log, fs;
+
+ beforeEach(module('onosUtil'));
+
+ beforeEach(inject(function (ThemeService, _$log_, FnService) {
+ ts = ThemeService;
+ $log = _$log_;
+ fs = FnService;
+ ts.init();
+ }));
+
+ it('should define ThemeService', function () {
+ expect(ts).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(ts, [
+ 'init', 'theme', 'toggleTheme', 'addListener', 'removeListener'
+ ])).toBeTruthy();
+ });
+
+
+ function verifyBodyClass(yes, no) {
+ function bodyHasClass(c) {
+ return d3.select('body').classed(c);
+ }
+ expect(bodyHasClass(yes)).toBeTruthy();
+ expect(bodyHasClass(no)).toBeFalsy();
+ }
+
+ it('should default to light theme', function () {
+ expect(ts.theme()).toEqual('light');
+ });
+
+ it('should toggle to dark, then to light again', function () {
+ // Note: re-work this once theme-change listeners are implemented
+ spyOn($log, 'debug');
+
+ expect(ts.toggleTheme()).toEqual('dark');
+ expect(ts.theme()).toEqual('dark');
+ expect($log.debug).toHaveBeenCalledWith('Theme-Change-(toggle): dark');
+ verifyBodyClass('dark', 'light');
+
+ expect(ts.toggleTheme()).toEqual('light');
+ expect(ts.theme()).toEqual('light');
+ expect($log.debug).toHaveBeenCalledWith('Theme-Change-(toggle): light');
+ verifyBodyClass('light', 'dark');
+ });
+
+ it('should let us set the theme by name', function () {
+ // Note: re-work this once theme-change listeners are implemented
+ spyOn($log, 'debug');
+
+ expect(ts.theme()).toEqual('light');
+ ts.theme('dark');
+ expect(ts.theme()).toEqual('dark');
+ expect($log.debug).toHaveBeenCalledWith('Theme-Change-(set): dark');
+ verifyBodyClass('dark', 'light');
+ });
+
+ it('should ignore unknown theme names', function () {
+ // Note: re-work this once theme-change listeners are implemented
+ spyOn($log, 'debug');
+
+ expect(ts.theme()).toEqual('light');
+ verifyBodyClass('light', 'dark');
+
+ ts.theme('turquoise');
+ expect(ts.theme()).toEqual('light');
+ expect($log.debug).not.toHaveBeenCalled();
+ verifyBodyClass('light', 'dark');
+ });
+
+
+ // === Unit Tests for listeners
+
+ it('should report lack of callback', function () {
+ spyOn($log, 'error');
+ var list = ts.addListener();
+ expect($log.error).toHaveBeenCalledWith(
+ 'ThemeService.addListener(): callback not a function'
+ );
+ expect(list.error).toEqual('No callback defined');
+ });
+
+ it('should report non-functional callback', function () {
+ spyOn($log, 'error');
+ var list = ts.addListener(['some array']);
+ expect($log.error).toHaveBeenCalledWith(
+ 'ThemeService.addListener(): callback not a function'
+ );
+ expect(list.error).toEqual('No callback defined');
+ });
+
+ it('should invoke our callback with an event', function () {
+ var event;
+
+ function cb(ev) {
+ event = ev;
+ }
+
+ expect(event).toBeUndefined();
+ ts.addListener(cb);
+ ts.theme('dark');
+ expect(event).toEqual({
+ event: 'themeChange',
+ value: 'dark'
+ });
+ });
+
+ it('should invoke our callback at appropriate times', function () {
+ var calls = [],
+ phase,
+ listener;
+
+ function cb() {
+ calls.push(phase);
+ }
+
+ expect(calls).toEqual([]);
+
+ phase = 'pre';
+ ts.toggleTheme(); // -> dark
+
+ phase = 'added';
+ listener = ts.addListener(cb);
+ ts.toggleTheme(); // -> light
+
+ phase = 'same';
+ ts.theme('light'); // (still light - no event)
+
+ phase = 'diff';
+ ts.theme('dark'); // -> dark
+
+ phase = 'post';
+ ts.removeListener(listener);
+ ts.toggleTheme(); // -> light
+
+ expect(calls).toEqual(['added', 'diff']);
+ });
+
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/widget/button-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/widget/button-spec.js
new file mode 100644
index 00000000..5226984d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/widget/button-spec.js
@@ -0,0 +1,300 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Widget -- Button Service - Unit Tests
+ */
+describe('factory: fw/widget/button.js', function () {
+ var $log, fs, bns, d3Elem;
+
+ beforeEach(module('onosWidget', 'onosSvg'));
+
+ beforeEach(inject(function (_$log_, FnService, ButtonService) {
+ $log = _$log_;
+ fs = FnService;
+ bns = ButtonService;
+ }));
+
+ beforeEach(function () {
+ d3Elem = d3.select('body').append('div').attr('id', 'testDiv');
+ });
+
+ afterEach(function () {
+ d3.select('#testDiv').remove();
+ });
+
+
+ // re-usable null function
+ function nullFunc () {}
+
+ it('should define ButtonService', function () {
+ expect(bns).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(bns, [
+ 'button', 'toggle', 'radioSet'
+ ])).toBeTruthy();
+ });
+
+ it('should verify button glyph', function () {
+ var btn = bns.button(d3Elem, 'foo-id', 'crown', nullFunc);
+ var el = d3Elem.select('#foo-id');
+ expect(el.classed('button')).toBeTruthy();
+ expect(el.attr('id')).toBe('foo-id');
+ expect(el.select('svg')).toBeTruthy();
+ expect(el.select('use')).toBeTruthy();
+ expect(el.select('use').classed('glyph')).toBeTruthy();
+ expect(el.select('use').attr('xlink:href')).toBe('#crown');
+ });
+
+
+ it('should not append button to an undefined div', function () {
+ spyOn($log, 'warn');
+ expect(bns.button(null, 'id', 'gid', nullFunc)).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith('div undefined (button)');
+ });
+
+ it('should verify button callback', function () {
+ var count = 0;
+ function cb() { count++; }
+ var btn = bns.button(d3Elem, 'test', 'nothing', cb);
+ expect(count).toBe(0);
+ d3Elem.select('#test').on('click')();
+ expect(count).toBe(1);
+ });
+
+ it('should ignore non-function callbacks button', function () {
+ var count = 0;
+ var btn = bns.button(d3Elem, 'test', 'nothing', 'foo');
+ expect(count).toBe(0);
+ d3Elem.select('#test').on('click')();
+ expect(count).toBe(0);
+ });
+
+ it('should not append toggle to an undefined div', function () {
+ spyOn($log, 'warn');
+ expect(bns.toggle(undefined, 'id', 'gid', false, nullFunc)).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith('div undefined (toggle button)');
+ });
+
+ it('should verify toggle glyph', function () {
+ var tog = bns.toggle(d3Elem, 'foo-id', 'crown', false, nullFunc);
+ var el = d3Elem.select('#foo-id');
+ expect(el.classed('toggleButton')).toBeTruthy();
+ expect(el.attr('id')).toBe('foo-id');
+ expect(el.select('svg')).toBeTruthy();
+ expect(el.select('use')).toBeTruthy();
+ expect(el.select('use').classed('glyph')).toBeTruthy();
+ expect(el.select('use').attr('xlink:href')).toBe('#crown');
+ });
+
+ it('should toggle the selected state', function () {
+ var tog = bns.toggle(d3Elem, 'test', 'nothing');
+ expect(tog.selected()).toBe(false);
+ tog.toggle();
+ expect(tog.selected()).toBe(true);
+ tog.toggle();
+ expect(tog.selected()).toBe(false);
+ });
+
+ it('should set toggle state', function () {
+ var tog = bns.toggle(d3Elem, 'test', 'nothing');
+ tog.toggle(true);
+ expect(tog.selected()).toBe(true);
+ tog.toggle();
+ expect(tog.selected()).toBe(false);
+ tog.toggle('truthy string');
+ expect(tog.selected()).toBe(true);
+ tog.toggle(null);
+ expect(tog.selected()).toBe(false);
+ tog.toggle('');
+ expect(tog.selected()).toBe(false);
+ });
+
+ it('should verity toggle initial state', function () {
+ var tog = bns.toggle(d3Elem, 'id', 'gid', true);
+ expect(tog.selected()).toBe(true);
+ tog = bns.toggle(d3Elem, 'id', 'gid', false);
+ expect(tog.selected()).toBe(false);
+ tog = bns.toggle(d3Elem, 'id', 'gid', '');
+ expect(tog.selected()).toBe(false);
+ tog = bns.toggle(d3Elem, 'id', 'gid', 'something');
+ expect(tog.selected()).toBe(true);
+ });
+
+ it('should not append radio button set to an undefined div', function () {
+ spyOn($log, 'warn');
+ expect(bns.radioSet(undefined, 'id', [])).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith('div undefined (radio button set)');
+ });
+
+ it('should not create radio button set from a non-array', function () {
+ var rads = {test: 'test'};
+ var warning = 'invalid array (radio button set)';
+
+ spyOn($log, 'warn');
+
+ expect(bns.radioSet(d3Elem, 'test', rads)).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith(warning);
+ rads = 'rads';
+ expect(bns.radioSet(d3Elem, 'test', rads)).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith(warning);
+ rads = {arr: [1, 2, 3]};
+ expect(bns.radioSet(d3Elem, 'test', rads)).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith(warning);
+ });
+
+ it('should not create radio button set from empty array', function () {
+ var rads = [];
+ spyOn($log, 'warn');
+ expect(bns.radioSet(d3Elem, 'test', rads)).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith('invalid array (radio button set)');
+ });
+
+ it('should verify radio button glyph structure', function () {
+ var rads = [
+ { gid: 'crown', cb: nullFunc, tooltip: 'n/a'}
+ ], rdiv;
+
+ spyOn($log, 'warn');
+ expect(bns.radioSet(d3Elem, 'foo', rads)).toBeTruthy();
+ expect($log.warn).not.toHaveBeenCalled();
+
+ rdiv = d3Elem.select('div');
+ expect(rdiv.classed('radioSet')).toBe(true);
+ expect(rdiv.select('div').classed('radioButton')).toBe(true);
+ expect(rdiv.select('div').attr('id')).toBe('foo-0');
+ expect(rdiv.select('div').select('svg')).toBeTruthy();
+ expect(rdiv.select('use').classed('glyph')).toBeTruthy();
+ expect(rdiv.select('use').attr('xlink:href')).toBe('#crown');
+ });
+
+ it('should verify more than one radio button glyph was added', function () {
+ var rads = [
+ { gid: 'crown', cb: nullFunc, tooltip: 'n/a'},
+ { gid: 'router', cb: nullFunc, tooltip: 'n/a'}
+ ], rdiv;
+
+ expect(bns.radioSet(d3Elem, 'foo', rads)).toBeTruthy();
+ rdiv = d3Elem.select('div');
+ expect(rdiv.select('#foo-0')).toBeTruthy();
+ expect(rdiv.select('#foo-1')).toBeTruthy();
+
+ expect(rdiv.select('#foo-0')
+ .select('use')
+ .classed('glyph'))
+ .toBeTruthy();
+ expect(rdiv.select('#foo-0')
+ .select('use')
+ .attr('xlink:href'))
+ .toBe('#crown');
+
+ expect(rdiv.select('#foo-1')
+ .select('use')
+ .classed('glyph'))
+ .toBeTruthy();
+ expect(rdiv.select('#foo-1')
+ .select('use')
+ .attr('xlink:href'))
+ .toBe('#router');
+ });
+
+ it('should select radio button by index', function () {
+ var count0 = 0,
+ count1 = 9;
+ function cb0() { count0++; }
+ function cb1() { count1++; }
+
+ function validate(expSel, exp0, exp1) {
+ expect(rset.selected()).toBe(expSel);
+ expect(count0).toBe(exp0);
+ expect(count1).toBe(exp1);
+ }
+
+ function checkWarn(msg, index) {
+ expect($log.warn).toHaveBeenCalledWith(msg, index);
+ }
+
+ var rads = [
+ { gid: 'crown', cb: cb0, tooltip: 'n/a'},
+ { gid: 'router', cb: cb1, tooltip: 'n/a'}
+ ],
+ rset = bns.radioSet(d3Elem, 'test', rads);
+ spyOn($log, 'warn');
+
+ validate(0, 0, 9);
+ rset.selectedIndex(0);
+ validate(0, 0, 9);
+
+ rset.selectedIndex(1);
+ validate(1, 0, 10);
+
+ rset.selectedIndex(-1);
+ checkWarn('invalid radio button index:', -1);
+ validate(1, 0, 10);
+
+ rset.selectedIndex(66);
+ checkWarn('invalid radio button index:', 66);
+ validate(1, 0, 10);
+
+ rset.selectedIndex(0);
+ validate(0, 1, 10);
+ });
+
+ it('should select radio button by key', function () {
+ var count0 = 0,
+ count1 = 9;
+ function cb0() { count0++; }
+ function cb1() { count1++; }
+
+ function validate(expSel, exp0, exp1) {
+ expect(rset.selected()).toBe(expSel);
+ expect(count0).toBe(exp0);
+ expect(count1).toBe(exp1);
+ }
+
+ function checkWarn(msg, index) {
+ expect($log.warn).toHaveBeenCalledWith(msg, index);
+ }
+
+ var rads = [
+ { key: 'foo', gid: 'crown', cb: cb0, tooltip: 'n/a'},
+ { key: 'bar', gid: 'router', cb: cb1, tooltip: 'n/a'}
+ ],
+ rset = bns.radioSet(d3Elem, 'test', rads);
+ spyOn($log, 'warn');
+
+ validate('foo', 0, 9);
+ rset.selected('foo');
+ validate('foo', 0, 9);
+
+ rset.selected('bar');
+ validate('bar', 0, 10);
+
+ rset.selected('blob');
+ checkWarn('no radio button with key:', 'blob');
+ validate('bar', 0, 10);
+
+ rset.selected('foo');
+ validate('foo', 1, 10);
+
+ rset.selected('foo');
+ validate('foo', 1, 10);
+ checkWarn('current index already selected:', 0);
+ });
+
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/widget/table-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/widget/table-spec.js
new file mode 100644
index 00000000..4f8f0c0f
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/widget/table-spec.js
@@ -0,0 +1,340 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Widget -- Table Service - Unit Tests
+ */
+describe('factory: fw/widget/table.js', function () {
+ var $log, $compile, $rootScope,
+ fs, ts, mast, is,
+ scope,
+ containerDiv,
+ headerDiv, bodyDiv,
+ header, body,
+ mockHeader,
+ mockHeaderHeight = 40;
+
+ var onosFixedHeaderTags =
+ '<div class="summary-list" onos-fixed-header>' +
+ '<div class="table-header">' +
+ '<table>' +
+ '<tr>' +
+ '<td colId="type" class="table-icon"></td>' +
+ '<td colId="id">Host ID </td>' +
+ '<td colId="mac" sortable>MAC Address </td>' +
+ '<td colId="location" col-width="110px">Location </td>' +
+ '</tr>' +
+ '</table>' +
+ '</div>' +
+
+ '<div class="table-body">' +
+ '<table>' +
+ '<tr class="ignore-width">' +
+ '<td class="not-picked"></td>' +
+ '</tr>' +
+ '<tr>' +
+ '<td class="table-icon">Some Icon</td>' +
+ '<td>Some ID</td>' +
+ '<td>Some MAC Address</td>' +
+ '<td>Some Location</td>' +
+ '</tr>' +
+ '</table>' +
+ '</div>' +
+ '</div>',
+
+ onosSortableHeaderTags =
+ '<div onos-sortable-header ' +
+ 'sort-callback="sortCallback(requestParams)">' +
+ '<table>' +
+ '<tr>' +
+ '<td colId="type"></td>' +
+ '<td colId="id" sortable>Host ID </td>' +
+ '<td colId="mac" sortable>MAC Address </td>' +
+ '<td colId="location" sortable>Location </td>' +
+ '</tr>' +
+ '</table>' +
+ '</div>';
+
+ beforeEach(module('onosWidget', 'onosUtil', 'onosMast', 'onosSvg'));
+
+ var mockWindow = {
+ innerWidth: 600,
+ innerHeight: 400,
+ navigator: {
+ userAgent: 'defaultUA'
+ },
+ on: function () {},
+ addEventListener: function () {}
+ };
+
+ beforeEach(function () {
+ module(function ($provide) {
+ $provide.value('$window', mockWindow);
+ });
+ });
+
+ beforeEach(inject(function (_$log_, _$compile_, _$rootScope_,
+ FnService, TableService, MastService, IconService) {
+ $log = _$log_;
+ $compile = _$compile_;
+ $rootScope = _$rootScope_;
+ fs = FnService;
+ ts = TableService;
+ mast = MastService;
+ is = IconService;
+ }));
+
+ beforeEach(function () {
+ scope = $rootScope.$new();
+ scope.tableData = [];
+ });
+
+ // Note: dummy header so that d3 doesn't trip up.
+ // $compile has to be used on the directive tag element, so it can't
+ // be included in the tag strings declared above.
+ beforeEach(function () {
+ mockHeader = d3.select('body')
+ .append('h2')
+ .classed('tabular-header', true)
+ .style({
+ height: mockHeaderHeight + 'px',
+ margin: 0,
+ padding: 0
+ })
+ .text('Some Header');
+ });
+
+ afterEach(function () {
+ containerDiv = undefined;
+ headerDiv = undefined;
+ bodyDiv = undefined;
+ header = undefined;
+ body = undefined;
+ mockHeader.remove();
+ });
+
+ function populateTableData() {
+ scope.tableData = [
+ {
+ type: 'endstation',
+ id: '1234',
+ mac: '00:00:03',
+ location: 'USA'
+ }
+ ];
+ }
+
+ it('should define TableBuilderService', function () {
+ expect(ts).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(ts, [
+ 'resetSortIcons'
+ ])).toBeTruthy();
+ });
+
+ function compile(elem) {
+ var compiled = $compile(elem);
+ compiled(scope);
+ scope.$digest();
+ }
+
+ function selectTables() {
+ expect(containerDiv.find('div').length).toBe(2);
+
+ headerDiv = angular.element(containerDiv[0].querySelector('.table-header'));
+ expect(headerDiv.length).toBe(1);
+
+ bodyDiv = angular.element(containerDiv[0].querySelector('.table-body'));
+ expect(bodyDiv.length).toBe(1);
+
+ header = headerDiv.find('table');
+ expect(header.length).toBe(1);
+
+ body = bodyDiv.find('table');
+ expect(body.length).toBe(1);
+ }
+
+ function verifyGivenTags(dirName, div) {
+ expect(div).toBeDefined();
+ expect(div.attr(dirName)).toBe('');
+ }
+
+ function verifyDefaultSize() {
+ expect(header.css('width')).toBe('570px');
+ expect(body.css('width')).toBe('570px');
+ }
+
+ function verifyHeight() {
+ var padding = 22,
+ mastHeight = 36,
+ tableHeight = (mockWindow.innerHeight - mockHeaderHeight) -
+ (fs.noPx(headerDiv.css('height')) + mastHeight + padding);
+
+ expect(bodyDiv.css('height')).toBe(tableHeight + 'px');
+ }
+
+ function verifyColWidth() {
+ var hdrs = header.find('td'),
+ cols = body.find('td');
+
+ expect(angular.element(hdrs[0]).css('width')).toBe('33px');
+ expect(angular.element(hdrs[3]).css('width')).toBe('110px');
+
+ expect(angular.element(cols[1]).css('width')).toBe('33px');
+ expect(angular.element(cols[4]).css('width')).toBe('110px');
+ }
+
+ function verifyCallbacks(h) {
+ expect(scope.sortCallback).not.toHaveBeenCalled();
+
+ h[0].click();
+ expect(scope.sortCallback).not.toHaveBeenCalled();
+
+ h[1].click();
+ expect(scope.sortCallback).toHaveBeenCalledWith({
+ sortCol: 'id',
+ sortDir: 'asc'
+ });
+ h[1].click();
+ expect(scope.sortCallback).toHaveBeenCalledWith({
+ sortCol: 'id',
+ sortDir: 'desc'
+ });
+ h[1].click();
+ expect(scope.sortCallback).toHaveBeenCalledWith({
+ sortCol: 'id',
+ sortDir: 'asc'
+ });
+
+ h[2].click();
+ expect(scope.sortCallback).toHaveBeenCalledWith({
+ sortCol: 'mac',
+ sortDir: 'asc'
+ });
+ h[2].click();
+ expect(scope.sortCallback).toHaveBeenCalledWith({
+ sortCol: 'mac',
+ sortDir: 'desc'
+ });
+ h[2].click();
+ expect(scope.sortCallback).toHaveBeenCalledWith({
+ sortCol: 'mac',
+ sortDir: 'asc'
+ });
+
+ h[3].click();
+ expect(scope.sortCallback).toHaveBeenCalledWith({
+ sortCol: 'location',
+ sortDir: 'asc'
+ });
+ h[3].click();
+ expect(scope.sortCallback).toHaveBeenCalledWith({
+ sortCol: 'location',
+ sortDir: 'desc'
+ });
+ h[3].click();
+ expect(scope.sortCallback).toHaveBeenCalledWith({
+ sortCol: 'location',
+ sortDir: 'asc'
+ });
+ }
+
+ function verifyIcons(h) {
+ var currH, div;
+
+ h[1].click();
+ currH = angular.element(h[1]);
+ div = currH.find('div');
+ expect(div.html()).toBe(
+ '<svg class="embeddedIcon" width="10" height="10" viewBox="0 0 ' +
+ '50 50"><g class="icon upArrow"><rect width="50" height="50" ' +
+ 'rx="5"></rect><use width="50" height="50" class="glyph" xmlns:' +
+ 'xlink="http://www.w3.org/1999/xlink" xlink:href="#triangleUp">' +
+ '</use></g></svg>'
+ );
+ h[1].click();
+ div = currH.find('div');
+ expect(div.html()).toBe(
+ '<svg class="embeddedIcon" width="10" height="10" viewBox="0 0 ' +
+ '50 50"><g class="icon downArrow"><rect width="50" height="50" ' +
+ 'rx="5"></rect><use width="50" height="50" class="glyph" xmlns:' +
+ 'xlink="http://www.w3.org/1999/xlink" xlink:href="#triangleDown">' +
+ '</use></g></svg>'
+ );
+
+ h[2].click();
+ div = currH.children();
+ // clicked on a new element, so the previous icon should have been deleted
+ expect(div.html()).toBeFalsy();
+
+ // the new element should have the ascending icon
+ currH = angular.element(h[2]);
+ div = currH.children();
+ expect(div.html()).toBe(
+ '<svg class="embeddedIcon" width="10" height="10" viewBox="0 0 ' +
+ '50 50"><g class="icon upArrow"><rect width="50" height="50" ' +
+ 'rx="5"></rect><use width="50" height="50" class="glyph" xmlns:' +
+ 'xlink="http://www.w3.org/1999/xlink" xlink:href="#triangleUp">' +
+ '</use></g></svg>'
+ );
+ }
+
+ it('should affirm that onos-fixed-header is working', function () {
+ containerDiv = angular.element(onosFixedHeaderTags);
+
+ compile(containerDiv);
+
+ verifyGivenTags('onos-fixed-header', containerDiv);
+ selectTables();
+ verifyDefaultSize();
+
+ populateTableData();
+
+ scope.$emit('LastElement');
+ scope.$digest();
+
+ verifyHeight();
+ verifyColWidth();
+
+ mockWindow.innerHeight = 300;
+ scope.$digest();
+ verifyHeight();
+
+ mockWindow.innerWidth = 500;
+ scope.$digest();
+ verifyColWidth();
+ });
+
+ it('should affirm that onos-sortable-header is working', function () {
+ headerDiv = angular.element(onosSortableHeaderTags);
+
+ compile(headerDiv);
+ verifyGivenTags('onos-sortable-header', headerDiv);
+
+ scope.sortCallback = jasmine.createSpy('sortCallback');
+
+ header = headerDiv.find('td');
+ verifyCallbacks(header);
+ verifyIcons(header);
+ });
+
+ // Note: testing resetSortIcons isn't feasible because due to the nature of
+ // directive compilation: they are jQuery elements, not d3 elements,
+ // so the function doesn't work.
+
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/widget/tableBuilder-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/widget/tableBuilder-spec.js
new file mode 100644
index 00000000..0372a25f
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/widget/tableBuilder-spec.js
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Widget -- Table Builder Service - Unit Tests
+ */
+
+describe('factory: fw/widget/tableBuilder.js', function () {
+ var $log, $rootScope, fs, tbs, is;
+
+ var mockObj,
+ mockWss = {
+ bindHandlers: function () {},
+ sendEvent: function () {},
+ unbindHandlers: function () {}
+ };
+
+ beforeEach(module('onosWidget', 'onosUtil', 'onosRemote', 'onosSvg'));
+
+ beforeEach(function () {
+ module(function ($provide) {
+ $provide.value('WebSocketService', mockWss);
+ });
+ });
+
+ beforeEach(inject(function (_$log_, _$rootScope_,
+ FnService, TableBuilderService, IconService) {
+ $log = _$log_;
+ $rootScope = _$rootScope_;
+ fs = FnService;
+ tbs = TableBuilderService;
+ is = IconService;
+ }));
+
+ function mockSelCb(event, sel) {}
+
+ beforeEach(function () {
+ mockObj = {
+ scope: $rootScope.$new(),
+ tag: 'foo',
+ selCb: mockSelCb
+ };
+ });
+
+ afterEach(function () {
+ mockObj = {};
+ });
+
+ it('should define TableBuilderService', function () {
+ expect(tbs).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(tbs, [
+ 'buildTable'
+ ])).toBeTruthy();
+ });
+
+ it('should verify sortCb', function () {
+ spyOn(mockWss, 'sendEvent');
+ expect(mockObj.scope.sortCallback).not.toBeDefined();
+ tbs.buildTable(mockObj);
+ expect(mockObj.scope.sortCallback).toBeDefined();
+ expect(mockWss.sendEvent).toHaveBeenCalled();
+ });
+
+ it('should set tableData', function () {
+ expect(mockObj.scope.tableData).not.toBeDefined();
+ tbs.buildTable(mockObj);
+ expect(fs.isA(mockObj.scope.tableData)).toBeTruthy();
+ expect(mockObj.scope.tableData.length).toBe(0);
+ });
+
+ it('should unbind handlers on destroyed scope', function () {
+ spyOn(mockWss, 'unbindHandlers');
+ tbs.buildTable(mockObj);
+ expect(mockWss.unbindHandlers).not.toHaveBeenCalled();
+ mockObj.scope.$destroy();
+ expect(mockWss.unbindHandlers).toHaveBeenCalled();
+ });
+
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/widget/toolbar-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/widget/toolbar-spec.js
new file mode 100644
index 00000000..83fd042e
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/widget/toolbar-spec.js
@@ -0,0 +1,180 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Widget -- Toolbar Service - Unit Tests
+ */
+describe('factory: fw/widget/toolbar.js', function () {
+ var $log, fs, tbs, ps, bns, is;
+
+ beforeEach(module('onosWidget', 'onosUtil', 'onosLayer', 'onosSvg'));
+
+ beforeEach(inject(function (_$log_, FnService, ToolbarService,
+ PanelService, ButtonService, IconService) {
+ $log = _$log_;
+ fs = FnService;
+ tbs = ToolbarService;
+ ps = PanelService;
+ bns = ButtonService;
+ is = IconService;
+ }));
+
+ beforeEach(function () {
+ // panel service expects #floatpanels div into which panels are placed
+ d3.select('body').append('div').attr('id', 'floatpanels');
+ tbs.init();
+ ps.init();
+ });
+
+ afterEach(function () {
+ tbs.init();
+ ps.init();
+ d3.select('#floatpanels').remove();
+ });
+
+ function nullFunc() { }
+
+ it('should define ToolbarService', function () {
+ expect(tbs).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(tbs, [
+ 'init',
+ 'createToolbar', 'destroyToolbar'
+ ])).toBeTruthy();
+ });
+
+ it('should warn when no id is given', function () {
+ spyOn($log, 'warn');
+ expect(tbs.createToolbar()).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith('createToolbar: ' +
+ 'no ID given: [undefined]');
+ });
+
+ it('should warn when a duplicate id is given', function () {
+ spyOn($log, 'warn');
+ expect(tbs.createToolbar('test')).toBeTruthy();
+ expect(tbs.createToolbar('test')).toBeNull();
+ expect($log.warn).toHaveBeenCalledWith('createToolbar: ' +
+ 'duplicate ID given: [test]');
+ });
+
+ it('should verify the toolbar arrow div exists', function () {
+ tbs.createToolbar('test');
+
+ // NOTE: toolbar service prefixes id with 'toolbar-'
+ var tbar = d3.select('#toolbar-test'),
+ arrow = tbar.select('.tbar-arrow');
+
+ expect(arrow.size()).toBe(1);
+ expect(arrow.select('svg').size()).toBe(1);
+ expect(arrow.select('svg').select('g').select('use')
+ .attr('xlink:href')).toEqual('#triangleUp');
+ });
+
+
+ it('should create a button', function () {
+ spyOn($log, 'warn');
+ var toolbar = tbs.createToolbar('foo'),
+ btn = toolbar.addButton('btn0', 'gid');
+ expect(btn).not.toBeNull();
+ expect(btn.id).toBe('toolbar-foo-btn0');
+ expect($log.warn).not.toHaveBeenCalled();
+ });
+
+ it('should not create an item with a duplicate id', function () {
+ spyOn($log, 'warn');
+ var toolbar = tbs.createToolbar('foo'),
+ btn = toolbar.addButton('btn0', 'gid'),
+ dup;
+ expect(btn).not.toBeNull();
+ expect(btn.id).toBe('toolbar-foo-btn0');
+
+ dup = toolbar.addButton('btn0', 'gid');
+ expect($log.warn).toHaveBeenCalledWith('addButton: duplicate ID:', 'btn0');
+ expect(dup).toBeNull();
+
+ dup = toolbar.addToggle('btn0', 'gid');
+ expect($log.warn).toHaveBeenCalledWith('addToggle: duplicate ID:', 'btn0');
+ expect(dup).toBeNull();
+
+ dup = toolbar.addRadioSet('btn0', []);
+ expect($log.warn).toHaveBeenCalledWith('addRadioSet: duplicate ID:', 'btn0');
+ expect(dup).toBeNull();
+ });
+
+ it('should create a toggle', function () {
+ spyOn($log, 'warn');
+ var toolbar = tbs.createToolbar('foo'),
+ tog = toolbar.addButton('tog0', 'gid');
+ expect(tog).not.toBeNull();
+ expect(tog.id).toBe('toolbar-foo-tog0');
+ expect($log.warn).not.toHaveBeenCalled();
+ });
+
+ it('should create a radio button set', function () {
+ spyOn($log, 'warn');
+ var toolbar = tbs.createToolbar('foo'),
+ rset = [
+ { gid: 'crown', cb: nullFunc, tooltip: 'A Crown' },
+ { gid: 'bird', cb: nullFunc, tooltip: 'A Bird' }
+ ],
+ rad = toolbar.addRadioSet('rad0', rset);
+ expect(rad).not.toBeNull();
+ expect(rad.selectedIndex()).toBe(0);
+ expect($log.warn).not.toHaveBeenCalled();
+ });
+
+ it('should create a separator div', function () {
+ spyOn($log, 'warn');
+ var toolbar = tbs.createToolbar('foo'),
+ tbar = d3.select('#toolbar-foo');
+
+ toolbar.addSeparator();
+ expect($log.warn).not.toHaveBeenCalled();
+
+ expect(tbar.select('.separator').size()).toBe(1);
+ });
+
+ it('should add another row of buttons', function () {
+ var toolbar = tbs.createToolbar('foo'),
+ tbar = d3.select('#toolbar-foo'),
+ rows;
+ toolbar.addButton('btn0', 'gid');
+ toolbar.addRow();
+ toolbar.addButton('btn1', 'gid');
+
+ rows = tbar.selectAll('.tbar-row');
+ expect(rows.size()).toBe(2);
+ rows.each(function (d, i) {
+ expect(d3.select(this)
+ .select('div')
+ .attr('id','toolbar-foo-btn' + i)
+ .empty())
+ .toBe(false);
+ });
+ });
+
+ it('should not add a row if current row is empty', function () {
+ var toolbar = tbs.createToolbar('foo');
+ expect(toolbar.addRow()).toBeNull();
+ toolbar.addButton('btn0', 'gid');
+ expect(toolbar.addRow()).not.toBeNull();
+ expect(toolbar.addRow()).toBeNull();
+ });
+
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/widget/tooltip-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/widget/tooltip-spec.js
new file mode 100644
index 00000000..0ae1f65d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/fw/widget/tooltip-spec.js
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Widget -- Tooltip Service - Unit Tests
+ */
+describe('factory: fw/widget/tooltip.js', function () {
+ var $log, fs, tts, d3Elem;
+
+ beforeEach(module('onosWidget', 'onosUtil'));
+
+ beforeEach(inject(function (_$log_, FnService, TooltipService) {
+ $log = _$log_;
+ fs = FnService;
+ tts = TooltipService;
+ }));
+
+ beforeEach(function () {
+ d3Elem = d3.select('body').append('div').attr('id', 'tooltip');
+ });
+
+ afterEach(function () {
+ d3.select('#tooltip').remove();
+ });
+
+ it('should define TooltipService', function () {
+ expect(tts).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(tts, [
+ 'showTooltip', 'cancelTooltip'
+ ])).toBeTruthy();
+ });
+
+ it('should not accept undefined arguments', function () {
+ var btn = d3.select('body').append('div');
+ expect(tts.showTooltip()).toBeFalsy();
+ expect(tts.showTooltip(btn)).toBeFalsy();
+
+ expect(tts.cancelTooltip()).toBeFalsy();
+ });
+
+ // TODO: figure out how to test this
+ // testing mouse events is tough
+ // showTooltip needs a d3 event, which currently has no test backend
+ // .each is a workaround, which provides this, d, and i
+ xit('should show a tooltip', function () {
+ var btn = d3.select('body').append('div').attr('id', 'foo');
+ btn.each(function () {
+ tts.showTooltip(this, 'yay a tooltip');
+ });
+ // tests here
+ });
+
+ // can't cancel a tooltip until we show one
+ // because currElemId isn't set otherwise
+ xit('should cancel an existing tooltip', function () {
+ var btn = d3.select('body').append('div').attr('id', 'foo');
+ btn.each(function () {
+ tts.cancelTooltip(this);
+ });
+ expect(d3Elem.text()).toBe('');
+ expect(d3Elem.style('display')).toBe('none');
+ });
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/onos-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/onos-spec.js
new file mode 100644
index 00000000..3bf0ce82
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/onos-spec.js
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2014,2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Main App Controller - Unit Tests
+ */
+describe('Controller: OnosCtrl', function () {
+ // instantiate the main module
+ beforeEach(module('onosApp'));
+
+ var $log, ctrl;
+
+ // we need an instance of the controller
+ beforeEach(inject(function(_$log_, $controller) {
+ $log = _$log_;
+ ctrl = $controller('OnosCtrl');
+ }));
+
+ it('should report version 1.2.0', function () {
+ expect(ctrl.version).toEqual('1.2.0');
+ });
+}); \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/view/device/device-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/device/device-spec.js
new file mode 100644
index 00000000..c4957843
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/device/device-spec.js
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Device Controller - Unit Tests
+ */
+describe('Controller: OvDeviceCtrl', function () {
+ var $log, $scope, $controller, ctrl, $mockHttp;
+
+ // instantiate the Device module
+ beforeEach(module('ovDevice', 'onosRemote', 'onosLayer', 'onosSvg',
+ 'onosNav', 'ngRoute'));
+
+ beforeEach(inject(function(_$log_, $rootScope, _$controller_, $httpBackend) {
+ $log = _$log_;
+ $scope = $rootScope.$new();
+ $controller = _$controller_;
+ $mockHttp = $httpBackend;
+ }));
+
+ beforeEach(function() {
+ ctrl = $controller('OvDeviceCtrl', { $scope: $scope });
+ });
+
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/view/device/fakeData.json b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/device/fakeData.json
new file mode 100644
index 00000000..a6bd78f0
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/device/fakeData.json
@@ -0,0 +1,88 @@
+{
+ "devices": [
+ {
+ "id": "of:0000000000000001",
+ "available": true,
+ "role": "MASTER",
+ "mfr": "Nicira, Inc.",
+ "hw": "Open vSwitch",
+ "sw": "2.0.1",
+ "serial": "None",
+ "annotations": {
+ "protocol": "OF_10"
+ }
+ },
+ {
+ "id": "of:0000000000000004",
+ "available": true,
+ "role": "MASTER",
+ "mfr": "Nicira, Inc.",
+ "hw": "Open vSwitch",
+ "sw": "2.0.1",
+ "serial": "None",
+ "annotations": {
+ "protocol": "OF_10"
+ }
+ },
+ {
+ "id": "of:0000000000000005",
+ "available": true,
+ "role": "MASTER",
+ "mfr": "Nicira, Inc.",
+ "hw": "Open vSwitch",
+ "sw": "2.0.1",
+ "serial": "None",
+ "annotations": {
+ "protocol": "OF_10"
+ }
+ },
+ {
+ "id": "of:0000000000000002",
+ "available": true,
+ "role": "MASTER",
+ "mfr": "Nicira, Inc.",
+ "hw": "Open vSwitch",
+ "sw": "2.0.1",
+ "serial": "None",
+ "annotations": {
+ "protocol": "OF_10"
+ }
+ },
+ {
+ "id": "of:0000000000000003",
+ "available": true,
+ "role": "MASTER",
+ "mfr": "Nicira, Inc.",
+ "hw": "Open vSwitch",
+ "sw": "2.0.1",
+ "serial": "None",
+ "annotations": {
+ "protocol": "OF_10"
+ }
+ },
+ {
+ "id": "of:0000000000000006",
+ "available": true,
+ "role": "MASTER",
+ "mfr": "Nicira, Inc.",
+ "hw": "Open vSwitch",
+ "sw": "2.0.1",
+ "serial": "None",
+ "annotations": {
+ "protocol": "OF_10"
+ }
+ },
+ {
+ "id": "of:0000000000000007",
+ "available": true,
+ "role": "MASTER",
+ "mfr": "Nicira, Inc.",
+ "hw": "Open vSwitch",
+ "sw": "2.0.1",
+ "serial": "None",
+ "annotations": {
+ "protocol": "OF_10"
+ }
+ }
+ ]
+} \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoEvent-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoEvent-spec.js
new file mode 100644
index 00000000..ef94711e
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoEvent-spec.js
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topo View -- Topo Event Service - Unit Tests
+ */
+describe('factory: view/topo/topoEvent.js', function() {
+ var $log, fs, tes, bns;
+
+ beforeEach(module('ovTopo', 'onosNav', 'onosUtil', 'onosLayer', 'ngRoute',
+ 'onosWidget'));
+
+ beforeEach(inject(function (_$log_, FnService,
+ TopoEventService, ButtonService) {
+ $log = _$log_;
+ fs = FnService;
+ tes = TopoEventService;
+ bns = ButtonService;
+ }));
+
+ it('should define TopoEventService', function () {
+ expect(tes).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(tes, [
+ 'start', 'stop'
+ ])).toBeTruthy();
+ });
+
+ // TODO: more tests...
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoFilter-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoFilter-spec.js
new file mode 100644
index 00000000..eebccfca
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoFilter-spec.js
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topo View -- Topo Filter Service - Unit Tests
+ */
+describe('factory: view/topo/topoFilter.js', function() {
+ var $log, fs, fltr, bns, api;
+
+ var mockNodes = {
+ each: function () {},
+ classed: function () {}
+ },
+ mockLinks = {
+ each: function () {},
+ classed: function () {}
+ };
+
+ beforeEach(module('ovTopo', 'onosUtil', 'onosLayer', 'ngRoute', 'onosNav',
+ 'onosWidget'));
+
+ beforeEach(inject(function (_$log_, FnService,
+ TopoFilterService, ButtonService) {
+ $log = _$log_;
+ fs = FnService;
+ fltr = TopoFilterService;
+ bns = ButtonService;
+
+ api = {
+ node: function () { return mockNodes; },
+ link: function () { return mockLinks; }
+ };
+ }));
+
+ afterEach(function () {
+
+ });
+
+ it('should define TopoFilterService', function () {
+ expect(fltr).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(fltr, [
+ 'initFilter',
+ 'clickAction', 'selected', 'inLayer'
+ ])).toBeTruthy();
+ });
+
+ it('should report the selected button', function () {
+ fltr.initFilter(api);
+ expect(fltr.selected()).toEqual('all');
+ });
+
+ // TODO: test the on click functions
+
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoForce-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoForce-spec.js
new file mode 100644
index 00000000..edb1cc56
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoForce-spec.js
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topo View -- Topo Force Service - Unit Tests
+ */
+describe('factory: view/topo/topoForce.js', function() {
+ var $log, fs, tfs, bns;
+
+ beforeEach(module('ovTopo', 'onosUtil', 'onosLayer', 'ngRoute', 'onosNav',
+ 'onosWidget'));
+
+ beforeEach(inject(function (_$log_, FnService,
+ TopoForceService, ButtonService) {
+ $log = _$log_;
+ fs = FnService;
+ tfs = TopoForceService;
+ bns = ButtonService;
+ }));
+
+ it('should define TopoForceService', function () {
+ expect(tfs).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(tfs, [
+ 'initForce', 'newDim', 'destroyForce',
+
+ 'updateDeviceColors', 'toggleHosts',
+ 'togglePorts', 'toggleOffline',
+ 'cycleDeviceLabels', 'unpin', 'showMastership', 'showBadLinks',
+
+ 'addDevice', 'updateDevice', 'removeDevice',
+ 'addHost', 'updateHost', 'removeHost',
+ 'addLink', 'updateLink', 'removeLink'
+ ])).toBeTruthy();
+ });
+
+ // TODO: more tests...
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoInst-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoInst-spec.js
new file mode 100644
index 00000000..a6a12651
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoInst-spec.js
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topo View -- Topo Instance Service - Unit Tests
+ */
+describe('factory: view/topo/topoInst.js', function() {
+ var $log, fs, tis;
+
+ beforeEach(module('ovTopo', 'onosUtil', 'onosLayer'));
+
+ beforeEach(inject(function (_$log_, FnService, TopoInstService) {
+ $log = _$log_;
+ fs = FnService;
+ tis = TopoInstService;
+ }));
+
+ it('should define TopoInstService', function () {
+ expect(tis).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(tis, [
+ 'initInst', 'destroyInst',
+ 'addInstance', 'updateInstance', 'removeInstance',
+ 'cancelAffinity',
+ 'isVisible', 'show', 'hide', 'toggle', 'showMaster'
+ ])).toBeTruthy();
+ });
+
+ // TODO: more tests...
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoModel-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoModel-spec.js
new file mode 100644
index 00000000..725bd475
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoModel-spec.js
@@ -0,0 +1,414 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topo View -- Topo Model Service - Unit Tests
+ */
+describe('factory: view/topo/topoModel.js', function() {
+ var $log, fs, rnd, tms;
+
+ // stop random numbers from being quite so random
+ var mockRandom = {
+ // mock spread returns s + 1
+ spread: function (s) {
+ return s + 1;
+ },
+ // mock random dimension returns d / 2 - 1
+ randDim: function (d) {
+ return d/2 - 1;
+ },
+ mock: 'yup'
+ };
+
+ // to mock out the [lng,lat] <=> [x,y] transformations, we will
+ // add/subtract 2000, 3000 respectively:
+ // lng:2005 === x:5, lat:3004 === y:4
+
+ var mockProjection = function (lnglat) {
+ return [lnglat[0] - 2000, lnglat[1] - 3000];
+ };
+
+ mockProjection.invert = function (xy) {
+ return [xy[0] + 2000, xy[1] + 3000];
+ };
+
+ // our test devices and hosts:
+ var dev1 = {
+ 'class': 'device',
+ id: 'dev1',
+ x: 17,
+ y: 27,
+ online: true
+ },
+ dev2 = {
+ 'class': 'device',
+ id: 'dev2',
+ x: 18,
+ y: 28,
+ online: true
+ },
+ host1 = {
+ 'class': 'host',
+ id: 'host1',
+ x: 23,
+ y: 33,
+ cp: {
+ device: 'dev1',
+ port: 7
+ },
+ ingress: 'dev1/7-host1'
+ },
+ host2 = {
+ 'class': 'host',
+ id: 'host2',
+ x: 24,
+ y: 34,
+ cp: {
+ device: 'dev0',
+ port: 0
+ },
+ ingress: 'dev0/0-host2'
+ };
+
+
+ // our test api
+ var api = {
+ projection: function () { return mockProjection; },
+ network: {
+ nodes: [dev1, dev2, host1, host2],
+ links: [],
+ lookup: {dev1: dev1, dev2: dev2, host1: host1, host2: host2},
+ revLinkToKey: {}
+ },
+ restyleLinkElement: function () {},
+ removeLinkElement: function () {}
+ };
+
+ // our test dimensions and well known locations..
+ var dim = [20, 40],
+ randLoc = [9, 19], // random location using randDim(): d/2-1
+ randHostLoc = [40, 50], // host "near" random location
+ // given that 'nearDist' = 15
+ // and spread(15) = 16
+ // 9 + 15 + 16 = 40; 19 + 15 + 16 = 50
+ nearDev1 = [48,58], // [17+15+16, 27+15+16]
+ dev1Loc = [17,27],
+ dev2Loc = [18,28],
+ host1Loc = [23,33],
+ host2Loc = [24,34];
+
+ // implement some custom matchers...
+ beforeEach(function () {
+ jasmine.addMatchers({
+ toBePositionedAt: function () {
+ return {
+ compare: function (actual, xy) {
+ var result = {},
+ actCoord = [actual.x, actual.y];
+
+ result.pass = (actual.x === xy[0]) && (actual.y === xy[1]);
+
+ if (result.pass) {
+ // for negation with ".not"
+ result.message = 'Expected [' + actCoord +
+ '] NOT to be positioned at [' + xy + ']';
+ } else {
+ result.message = 'Expected [' + actCoord +
+ '] to be positioned at [' + xy + ']';
+ }
+ return result;
+ }
+ }
+ },
+ toHaveEndPoints: function () {
+ return {
+ compare: function (actual, xy1, xy2) {
+ var result = {};
+
+ result.pass = (actual.source.x === xy1[0]) &&
+ (actual.source.y === xy1[1]) &&
+ (actual.target.x === xy2[0]) &&
+ (actual.target.y === xy2[1]);
+
+ if (result.pass) {
+ // for negation with ".not"
+ result.message = 'Expected ' + actual +
+ ' NOT to have endpoints [' + xy1 + ']-[' + xy2 + ']';
+ } else {
+ result.message = 'Expected ' + actual +
+ ' to have endpoints [' + xy1 + ']-[' + xy2 + ']';
+ }
+ return result;
+ }
+ }
+ },
+ toBeFixed: function () {
+ return {
+ compare: function (actual) {
+ var result = {
+ pass: actual.fixed
+ };
+ if (result.pass) {
+ result.message = 'Expected ' + actual +
+ ' NOT to be fixed!';
+ } else {
+ result.message = 'Expected ' + actual +
+ ' to be fixed!';
+ }
+ return result;
+ }
+ }
+ }
+ });
+ });
+
+ beforeEach(module('ovTopo', 'onosUtil'));
+
+ beforeEach(function () {
+ module(function ($provide) {
+ $provide.value('RandomService', mockRandom);
+ });
+ });
+
+ beforeEach(inject(function (_$log_, FnService, RandomService, TopoModelService) {
+ $log = _$log_;
+ fs = FnService;
+ rnd = RandomService;
+ tms = TopoModelService;
+ tms.initModel(api, dim);
+ }));
+
+
+ it('should install the mock random service', function () {
+ expect(rnd.mock).toBe('yup');
+ expect(rnd.spread(4)).toBe(5);
+ expect(rnd.randDim(8)).toBe(3);
+ });
+
+ it('should install the mock projection', function () {
+ expect(tms.coordFromLngLat({lng: 2005, lat: 3004})).toEqual([5,4]);
+ expect(tms.lngLatFromCoord([5,4])).toEqual([2005,3004]);
+ });
+
+ it('should define TopoModelService', function () {
+ expect(tms).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(tms, [
+ 'initModel', 'newDim', 'destroyModel',
+ 'positionNode', 'createDeviceNode', 'createHostNode',
+ 'createHostLink', 'createLink',
+ 'coordFromLngLat', 'lngLatFromCoord',
+ 'findLink', 'findLinkById', 'findDevices',
+ 'findAttachedHosts', 'findAttachedLinks', 'findBadLinks'
+ ])).toBeTruthy();
+ });
+
+ // === unit tests for positionNode()
+
+ it('should position a node using meta x/y', function () {
+ var node = {
+ metaUi: { x:37, y:48 }
+ };
+ tms.positionNode(node);
+ expect(node).toBePositionedAt([37,48]);
+ expect(node).toBeFixed();
+ });
+
+ it('should position a node by translating lng/lat', function () {
+ var node = {
+ location: {
+ type: 'latlng',
+ lng: 2008,
+ lat: 3009
+ }
+ };
+ tms.positionNode(node);
+ expect(node).toBePositionedAt([8,9]);
+ expect(node).toBeFixed();
+ });
+
+ it('should position a device with no location randomly', function () {
+ var node = { 'class': 'device' };
+ tms.positionNode(node);
+ expect(node).toBePositionedAt(randLoc);
+ expect(node).not.toBeFixed();
+ });
+
+ it('should position a device randomly even if x/y set', function () {
+ var node = { 'class': 'device', x: 1, y: 2 };
+ tms.positionNode(node);
+ expect(node).toBePositionedAt(randLoc);
+ expect(node).not.toBeFixed();
+ });
+
+ it('should NOT reposition a device randomly on update', function () {
+ var node = { 'class': 'device', x: 1, y: 2 };
+ tms.positionNode(node, true);
+ expect(node).toBePositionedAt([1,2]);
+ expect(node).not.toBeFixed();
+ });
+
+ it('should position a host close to its device', function () {
+ var node = { 'class': 'host', cp: { device: 'dev1' } };
+ tms.positionNode(node);
+
+ // note: nearDist is 15; spread(15) adds 16; dev1 at [17,27]
+
+ expect(node).toBePositionedAt(nearDev1);
+ expect(node).not.toBeFixed();
+ });
+
+ it('should randomize host with no assoc device', function () {
+ var node = { 'class': 'host', cp: { device: 'dev0' } };
+ tms.positionNode(node);
+
+ // note: no device gives 'rand loc' [9,19]
+ // nearDist is 15; spread(15) adds 16
+
+ expect(node).toBePositionedAt(randHostLoc);
+ expect(node).not.toBeFixed();
+ });
+
+ // === unit tests for createDeviceNode()
+
+ it('should create a basic device node', function () {
+ var node = tms.createDeviceNode({ id: 'foo' });
+ expect(node).toBePositionedAt(randLoc);
+ expect(node).not.toBeFixed();
+ expect(node.class).toEqual('device');
+ expect(node.svgClass).toEqual('node device');
+ expect(node.id).toEqual('foo');
+ });
+
+ it('should create device node with type', function () {
+ var node = tms.createDeviceNode({ id: 'foo', type: 'cool' });
+ expect(node).toBePositionedAt(randLoc);
+ expect(node).not.toBeFixed();
+ expect(node.class).toEqual('device');
+ expect(node.svgClass).toEqual('node device cool');
+ expect(node.id).toEqual('foo');
+ });
+
+ it('should create online device node with type', function () {
+ var node = tms.createDeviceNode({ id: 'foo', type: 'cool', online: true });
+ expect(node).toBePositionedAt(randLoc);
+ expect(node).not.toBeFixed();
+ expect(node.class).toEqual('device');
+ expect(node.svgClass).toEqual('node device cool online');
+ expect(node.id).toEqual('foo');
+ });
+
+ it('should create online device node with type and lng/lat', function () {
+ var node = tms.createDeviceNode({
+ id: 'foo',
+ type: 'yowser',
+ online: true,
+ location: {
+ type: 'latlng',
+ lng: 2048,
+ lat: 3096
+ }
+ });
+ expect(node).toBePositionedAt([48,96]);
+ expect(node).toBeFixed();
+ expect(node.class).toEqual('device');
+ expect(node.svgClass).toEqual('node device yowser online');
+ expect(node.id).toEqual('foo');
+ });
+
+ // === unit tests for createHostNode()
+
+ it('should create a basic host node', function () {
+ var node = tms.createHostNode({ id: 'bar', cp: { device: 'dev0' } });
+ expect(node).toBePositionedAt(randHostLoc);
+ expect(node).not.toBeFixed();
+ expect(node.class).toEqual('host');
+ expect(node.svgClass).toEqual('node host endstation');
+ expect(node.id).toEqual('bar');
+ });
+
+ it('should create a host with type', function () {
+ var node = tms.createHostNode({
+ id: 'bar',
+ type: 'classic',
+ cp: { device: 'dev1' }
+ });
+ expect(node).toBePositionedAt(nearDev1);
+ expect(node).not.toBeFixed();
+ expect(node.class).toEqual('host');
+ expect(node.svgClass).toEqual('node host classic');
+ expect(node.id).toEqual('bar');
+ });
+
+ // === unit tests for createHostLink()
+
+ it('should create a basic host link', function () {
+ var link = tms.createHostLink(host1);
+ expect(link.source).toEqual(host1);
+ expect(link.target).toEqual(dev1);
+ expect(link).toHaveEndPoints(host1Loc, dev1Loc);
+ expect(link.key).toEqual('dev1/7-host1');
+ expect(link.class).toEqual('link');
+ expect(link.type()).toEqual('hostLink');
+ expect(link.linkWidth()).toEqual(1);
+ expect(link.online()).toEqual(true);
+ });
+
+ it('should return null for failed endpoint lookup', function () {
+ spyOn($log, 'error');
+ var link = tms.createHostLink(host2);
+ expect(link).toBeNull();
+ expect($log.error).toHaveBeenCalledWith(
+ 'Node(s) not on map for link:\n[dst] "dev0" missing'
+ );
+ });
+
+ // === unit tests for createLink()
+
+ it('should return null for missing endpoints', function () {
+ spyOn($log, 'error');
+ var link = tms.createLink({src: 'dev0', dst: 'dev00'});
+ expect(link).toBeNull();
+ expect($log.error).toHaveBeenCalledWith(
+ 'Node(s) not on map for link:\n[src] "dev0" missing\n[dst] "dev00" missing'
+ );
+ });
+
+ it('should create a basic link', function () {
+ var linkData = {
+ src: 'dev1',
+ dst: 'dev2',
+ id: 'baz',
+ type: 'zoo',
+ online: true,
+ linkWidth: 1.5
+ },
+ link = tms.createLink(linkData);
+ expect(link.source).toEqual(dev1);
+ expect(link.target).toEqual(dev2);
+ expect(link).toHaveEndPoints(dev1Loc, dev2Loc);
+ expect(link.key).toEqual('baz');
+ expect(link.class).toEqual('link');
+ expect(link.fromSource).toBe(linkData);
+ expect(link.type()).toEqual('zoo');
+ expect(link.online()).toEqual(true);
+ expect(link.linkWidth()).toEqual(1.5);
+ });
+
+ // TODO: more unit tests for additional functions....
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoOblique-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoOblique-spec.js
new file mode 100644
index 00000000..2b563295
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoOblique-spec.js
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topo View -- Topo Oblique View Service - Unit Tests
+ */
+describe('factory: view/topo/topoOblique.js', function() {
+ var $log, fs, tos, flash;
+
+ beforeEach(module('ovTopo', 'onosUtil', 'onosLayer'));
+
+ beforeEach(inject(function (_$log_, FnService,
+ TopoObliqueService, FlashService) {
+ $log = _$log_;
+ fs = FnService;
+ tos = TopoObliqueService;
+ flash = FlashService;
+ }));
+
+ it('should define TopoTrafficService', function () {
+ expect(tos).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(tos, [
+ 'initOblique', 'destroyOblique', 'isOblique', 'toggleOblique'
+ ])).toBeTruthy();
+ });
+
+ // TODO: more tests...
+});
+
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoPanel-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoPanel-spec.js
new file mode 100644
index 00000000..21513d1b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoPanel-spec.js
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topo View -- Topo Panel Service - Unit Tests
+ */
+describe('factory: view/topo/topoPanel.js', function() {
+ var $log, fs, tps, bns, ps, panelLayer;
+
+ var mockWindow = {
+ innerWidth: 300,
+ innerHeight: 100,
+ navigator: {
+ userAgent: 'defaultUA'
+ },
+ on: function () {},
+ addEventListener: function () {}
+ };
+
+ beforeEach(module('ovTopo', 'onosUtil', 'onosLayer', 'ngRoute', 'onosNav',
+ 'onosWidget'));
+
+ beforeEach(function () {
+ module(function ($provide) {
+ $provide.value('$window', mockWindow);
+ });
+ });
+
+ beforeEach(inject(function (_$log_, FnService,
+ TopoPanelService, ButtonService, PanelService) {
+ $log = _$log_;
+ fs = FnService;
+ tps = TopoPanelService;
+ bns = ButtonService;
+ ps = PanelService;
+ panelLayer = d3.select('body').append('div').attr('id', 'floatpanels');
+ }));
+
+ afterEach(function () {
+ panelLayer.remove();
+ });
+
+ it('should define TopoPanelService', function () {
+ expect(tps).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(tps, [
+ 'initPanels',
+ 'destroyPanels',
+ 'createTopoPanel',
+
+ 'showSummary',
+ 'toggleSummary',
+
+ 'toggleUseDetailsFlag',
+ 'displaySingle',
+ 'displayMulti',
+ 'displayLink',
+ 'displayNothing',
+ 'displaySomething',
+ 'addAction',
+
+ 'hideSummaryPanel',
+
+ 'detailVisible',
+ 'summaryVisible'
+ ])).toBeTruthy();
+ });
+
+ // === topoPanel api ------------------
+
+ it('should define topoPanel api functions', function () {
+ var panel = tps.createTopoPanel('foo');
+ expect(fs.areFunctions(panel, [
+ 'panel', 'setup', 'destroy',
+ 'appendHeader', 'appendBody', 'appendFooter',
+ 'adjustHeight'
+ ])).toBeTruthy();
+ panel.destroy();
+ });
+
+ it('should allow you to get panel', function () {
+ var panel = tps.createTopoPanel('foo');
+ expect(panel.panel()).toBeTruthy();
+ panel.destroy();
+ });
+
+ it('should set up panel', function () {
+ var p = tps.createTopoPanel('foo'),
+ h, b, f;
+ p.setup();
+ expect(p.panel().el().selectAll('div').size()).toBe(3);
+
+ h = p.panel().el().select('.header');
+ expect(h.empty()).toBe(false);
+ b = p.panel().el().select('.body');
+ expect(b.empty()).toBe(false);
+ f = p.panel().el().select('.footer');
+ expect(f.empty()).toBe(false);
+ p.destroy();
+ });
+
+ it('should destroy panel', function () {
+ spyOn(ps, 'destroyPanel').and.callThrough();
+ var p = tps.createTopoPanel('foo');
+ p.destroy();
+ expect(ps.destroyPanel).toHaveBeenCalledWith('foo');
+ });
+
+ it('should append to panel', function () {
+ var p = tps.createTopoPanel('foo');
+ p.setup();
+ p.appendHeader('div').attr('id', 'header-div');
+ expect(p.panel().el().select('#header-div').empty()).toBe(false);
+ p.appendBody('p').attr('id', 'body-paragraph');
+ expect(p.panel().el().select('#body-paragraph').empty()).toBe(false);
+ p.appendFooter('svg').attr('id', 'footer-svg');
+ expect(p.panel().el().select('#footer-svg').empty()).toBe(false);
+ p.destroy();
+ });
+
+ it('should warn if fromTop not given, adjustHeight', function () {
+ spyOn($log, 'warn');
+ var p = tps.createTopoPanel('foo');
+ p.adjustHeight();
+ expect($log.warn).toHaveBeenCalledWith(
+ 'adjustHeight: height from top of page not given'
+ );
+ p.destroy();
+ });
+
+ it('should warn if panel is not setup/defined, adjustHeight', function () {
+ spyOn($log, 'warn');
+ var p = tps.createTopoPanel('foo');
+ p.adjustHeight(50);
+ expect($log.warn).toHaveBeenCalledWith(
+ 'adjustHeight: panel contents are not defined'
+ );
+ p.destroy();
+ });
+
+ // TODO: test adjustHeight height adjustment
+
+ // TODO: more tests...
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoSelect-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoSelect-spec.js
new file mode 100644
index 00000000..c8c051c9
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoSelect-spec.js
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topo View -- Topo Selection Service - Unit Tests
+ */
+describe('factory: view/topo/topoSelect.js', function() {
+ var $log, fs, tss, bns;
+
+ beforeEach(module('ovTopo', 'onosUtil', 'onosLayer', 'ngRoute', 'onosNav',
+ 'onosWidget'));
+
+ beforeEach(inject(function (_$log_, FnService,
+ TopoSelectService, ButtonService) {
+ $log = _$log_;
+ fs = FnService;
+ tss = TopoSelectService;
+ bns = ButtonService;
+ }));
+
+ it('should define TopoSelectService', function () {
+ expect(tss).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(tss, [
+ 'initSelect', 'destroySelect',
+ 'showDetails',
+ 'nodeMouseOver', 'nodeMouseOut', 'selectObject', 'deselectObject',
+ 'deselectAll',
+ 'hovered', 'selectOrder',
+ 'validateSelectionContext',
+ 'clickConsumed'
+ ])).toBeTruthy();
+ });
+
+ // TODO: more tests...
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoToolbar-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoToolbar-spec.js
new file mode 100644
index 00000000..eedc476f
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoToolbar-spec.js
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topo View -- Topo Toolbar Service - Unit Tests
+ */
+describe('factory: view/topo/topoToolbar.js', function() {
+ var $log, fs, ttbs, prefs, ps,
+ d3Elem;
+
+ beforeEach(module('ovTopo', 'onosUtil', 'onosLayer', 'ngRoute', 'onosNav',
+ 'onosWidget'));
+
+ beforeEach(inject(function (_$log_, FnService,
+ TopoToolbarService, PanelService, PrefsService) {
+ $log = _$log_;
+ fs = FnService;
+ ttbs = TopoToolbarService;
+ prefs = PrefsService;
+ ps = PanelService;
+ d3Elem = d3.select('body').append('div').attr('id', 'floatpanels');
+ ps.init();
+ }));
+
+ it('should define TopoToolbarService', function () {
+ expect(ttbs).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(ttbs, [
+ 'init', 'createToolbar', 'destroyToolbar',
+ 'keyListener', 'toggleToolbar'
+ ])).toBeTruthy();
+ });
+
+ // NOTE: topoToolbar relies too much on topo's closure variables
+ // to adequately test it
+
+}); \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoTraffic-spec.js b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoTraffic-spec.js
new file mode 100644
index 00000000..a04c2021
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/app/view/topo/topoTraffic-spec.js
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ ONOS GUI -- Topo View -- Topo Traffic Service - Unit Tests
+ */
+describe('factory: view/topo/topoTraffic.js', function() {
+ var $log, fs, tts;
+
+ beforeEach(module('ovTopo', 'onosUtil', 'onosLayer', 'onosNav', 'ngRoute'));
+
+ beforeEach(inject(function (_$log_, FnService, TopoTrafficService) {
+ $log = _$log_;
+ fs = FnService;
+ tts = TopoTrafficService;
+ }));
+
+ it('should define TopoTrafficService', function () {
+ expect(tts).toBeDefined();
+ });
+
+ it('should define api functions', function () {
+ expect(fs.areFunctions(tts, [
+ 'initTraffic', 'destroyTraffic', 'showTraffic',
+ 'cancelTraffic', 'requestTrafficForMode',
+ 'showRelatedIntentsAction', 'addHostIntentAction',
+ 'addMultiSourceIntentAction', 'showDeviceLinkFlowsAction',
+ 'showNextIntentAction', 'showPrevIntentAction',
+ 'showSelectedIntentTrafficAction', 'showAllTrafficAction'
+ ])).toBeTruthy();
+ });
+
+ // TODO: more tests...
+});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/e2e/README.txt b/framework/src/onos/web/gui/src/main/webapp/tests/e2e/README.txt
new file mode 100644
index 00000000..4a23fa14
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/e2e/README.txt
@@ -0,0 +1,2 @@
+# End-to-End Tests (i.e. Scenario Tests)
+
diff --git a/framework/src/onos/web/gui/src/main/webapp/tests/karma.conf.js b/framework/src/onos/web/gui/src/main/webapp/tests/karma.conf.js
new file mode 100644
index 00000000..bd572c1b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tests/karma.conf.js
@@ -0,0 +1,90 @@
+// Karma configuration
+
+module.exports = function(config) {
+ config.set({
+
+ // base path that will be used to resolve all patterns (eg. files, exclude)
+ // the path is relative to this (karma.conf.js) file
+ basePath: '',
+
+
+ // frameworks to use
+ // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
+ frameworks: ['jasmine'],
+
+
+ // list of files / patterns to load in the browser
+ files: [
+ // library code...
+ '../tp/angular.js',
+ '../tp/angular-mocks.js',
+ '../tp/angular-route.js',
+ '../tp/angular-cookies.js',
+ '../tp/d3.js',
+ '../tp/topojson.v1.min.js',
+
+ // production code...
+ // make sure modules are defined first...
+ '../onos.js',
+
+ '../app/fw/util/util.js',
+ '../app/fw/svg/svg.js',
+ '../app/fw/remote/remote.js',
+ '../app/fw/widget/widget.js',
+ '../app/fw/layer/layer.js',
+
+ '../app/view/topo/topo.js',
+
+ // now load services etc. that augment the modules
+ '../app/**/*.js',
+
+ // unit test code...
+ 'app/*-spec.js',
+ 'app/**/*-spec.js'
+ ],
+
+
+ // list of files to exclude
+ exclude: [
+ ],
+
+
+ // preprocess matching files before serving them to the browser
+ // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
+ preprocessors: {
+ },
+
+
+ // test results reporter to use
+ // possible values: 'dots', 'progress'
+ // available reporters: https://npmjs.org/browse/keyword/karma-reporter
+ reporters: ['progress'],
+
+
+ // web server port
+ port: 9876,
+
+
+ // enable / disable colors in the output (reporters and logs)
+ colors: true,
+
+
+ // level of logging
+ // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
+ logLevel: config.LOG_INFO,
+
+
+ // enable / disable watching file and executing tests whenever any file changes
+ autoWatch: true,
+
+
+ // start these browsers
+ // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
+ browsers: ['Chrome'],
+
+
+ // Continuous Integration mode
+ // if true, Karma captures browsers, runs the tests and exits
+ singleRun: false
+ });
+};
diff --git a/framework/src/onos/web/gui/src/main/webapp/tp/AngularJS.LICENSE b/framework/src/onos/web/gui/src/main/webapp/tp/AngularJS.LICENSE
new file mode 100644
index 00000000..8d062757
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tp/AngularJS.LICENSE
@@ -0,0 +1,24 @@
+AngularJS uses the MIT License, as follows...
+-----------------------------------------------------------------------------
+
+The MIT License
+
+Copyright (c) 2010-2014 Google, Inc. http://angularjs.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/framework/src/onos/web/gui/src/main/webapp/tp/D3.LICENSE b/framework/src/onos/web/gui/src/main/webapp/tp/D3.LICENSE
new file mode 100644
index 00000000..83013469
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tp/D3.LICENSE
@@ -0,0 +1,26 @@
+Copyright (c) 2010-2014, Michael Bostock
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* The name Michael Bostock may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/framework/src/onos/web/gui/src/main/webapp/tp/README.txt b/framework/src/onos/web/gui/src/main/webapp/tp/README.txt
new file mode 100644
index 00000000..c4e0e80f
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tp/README.txt
@@ -0,0 +1 @@
+# Third Party libraries
diff --git a/framework/src/onos/web/gui/src/main/webapp/tp/angular-cookies.js b/framework/src/onos/web/gui/src/main/webapp/tp/angular-cookies.js
new file mode 100644
index 00000000..f400db28
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tp/angular-cookies.js
@@ -0,0 +1,206 @@
+/**
+ * @license AngularJS v1.3.5
+ * (c) 2010-2014 Google, Inc. http://angularjs.org
+ * License: MIT
+ */
+(function(window, angular, undefined) {'use strict';
+
+/**
+ * @ngdoc module
+ * @name ngCookies
+ * @description
+ *
+ * # ngCookies
+ *
+ * The `ngCookies` module provides a convenient wrapper for reading and writing browser cookies.
+ *
+ *
+ * <div doc-module-components="ngCookies"></div>
+ *
+ * See {@link ngCookies.$cookies `$cookies`} and
+ * {@link ngCookies.$cookieStore `$cookieStore`} for usage.
+ */
+
+
+angular.module('ngCookies', ['ng']).
+ /**
+ * @ngdoc service
+ * @name $cookies
+ *
+ * @description
+ * Provides read/write access to browser's cookies.
+ *
+ * Only a simple Object is exposed and by adding or removing properties to/from this object, new
+ * cookies are created/deleted at the end of current $eval.
+ * The object's properties can only be strings.
+ *
+ * Requires the {@link ngCookies `ngCookies`} module to be installed.
+ *
+ * @example
+ *
+ * ```js
+ * angular.module('cookiesExample', ['ngCookies'])
+ * .controller('ExampleController', ['$cookies', function($cookies) {
+ * // Retrieving a cookie
+ * var favoriteCookie = $cookies.myFavorite;
+ * // Setting a cookie
+ * $cookies.myFavorite = 'oatmeal';
+ * }]);
+ * ```
+ */
+ factory('$cookies', ['$rootScope', '$browser', function($rootScope, $browser) {
+ var cookies = {},
+ lastCookies = {},
+ lastBrowserCookies,
+ runEval = false,
+ copy = angular.copy,
+ isUndefined = angular.isUndefined;
+
+ //creates a poller fn that copies all cookies from the $browser to service & inits the service
+ $browser.addPollFn(function() {
+ var currentCookies = $browser.cookies();
+ if (lastBrowserCookies != currentCookies) { //relies on browser.cookies() impl
+ lastBrowserCookies = currentCookies;
+ copy(currentCookies, lastCookies);
+ copy(currentCookies, cookies);
+ if (runEval) $rootScope.$apply();
+ }
+ })();
+
+ runEval = true;
+
+ //at the end of each eval, push cookies
+ //TODO: this should happen before the "delayed" watches fire, because if some cookies are not
+ // strings or browser refuses to store some cookies, we update the model in the push fn.
+ $rootScope.$watch(push);
+
+ return cookies;
+
+
+ /**
+ * Pushes all the cookies from the service to the browser and verifies if all cookies were
+ * stored.
+ */
+ function push() {
+ var name,
+ value,
+ browserCookies,
+ updated;
+
+ //delete any cookies deleted in $cookies
+ for (name in lastCookies) {
+ if (isUndefined(cookies[name])) {
+ $browser.cookies(name, undefined);
+ }
+ }
+
+ //update all cookies updated in $cookies
+ for (name in cookies) {
+ value = cookies[name];
+ if (!angular.isString(value)) {
+ value = '' + value;
+ cookies[name] = value;
+ }
+ if (value !== lastCookies[name]) {
+ $browser.cookies(name, value);
+ updated = true;
+ }
+ }
+
+ //verify what was actually stored
+ if (updated) {
+ updated = false;
+ browserCookies = $browser.cookies();
+
+ for (name in cookies) {
+ if (cookies[name] !== browserCookies[name]) {
+ //delete or reset all cookies that the browser dropped from $cookies
+ if (isUndefined(browserCookies[name])) {
+ delete cookies[name];
+ } else {
+ cookies[name] = browserCookies[name];
+ }
+ updated = true;
+ }
+ }
+ }
+ }
+ }]).
+
+
+ /**
+ * @ngdoc service
+ * @name $cookieStore
+ * @requires $cookies
+ *
+ * @description
+ * Provides a key-value (string-object) storage, that is backed by session cookies.
+ * Objects put or retrieved from this storage are automatically serialized or
+ * deserialized by angular's toJson/fromJson.
+ *
+ * Requires the {@link ngCookies `ngCookies`} module to be installed.
+ *
+ * @example
+ *
+ * ```js
+ * angular.module('cookieStoreExample', ['ngCookies'])
+ * .controller('ExampleController', ['$cookieStore', function($cookieStore) {
+ * // Put cookie
+ * $cookieStore.put('myFavorite','oatmeal');
+ * // Get cookie
+ * var favoriteCookie = $cookieStore.get('myFavorite');
+ * // Removing a cookie
+ * $cookieStore.remove('myFavorite');
+ * }]);
+ * ```
+ */
+ factory('$cookieStore', ['$cookies', function($cookies) {
+
+ return {
+ /**
+ * @ngdoc method
+ * @name $cookieStore#get
+ *
+ * @description
+ * Returns the value of given cookie key
+ *
+ * @param {string} key Id to use for lookup.
+ * @returns {Object} Deserialized cookie value.
+ */
+ get: function(key) {
+ var value = $cookies[key];
+ return value ? angular.fromJson(value) : value;
+ },
+
+ /**
+ * @ngdoc method
+ * @name $cookieStore#put
+ *
+ * @description
+ * Sets a value for given cookie key
+ *
+ * @param {string} key Id for the `value`.
+ * @param {Object} value Value to be stored.
+ */
+ put: function(key, value) {
+ $cookies[key] = angular.toJson(value);
+ },
+
+ /**
+ * @ngdoc method
+ * @name $cookieStore#remove
+ *
+ * @description
+ * Remove given cookie
+ *
+ * @param {string} key Id of the key-value pair to delete.
+ */
+ remove: function(key) {
+ delete $cookies[key];
+ }
+ };
+
+ }]);
+
+
+})(window, window.angular);
diff --git a/framework/src/onos/web/gui/src/main/webapp/tp/angular-cookies.min.js b/framework/src/onos/web/gui/src/main/webapp/tp/angular-cookies.min.js
new file mode 100644
index 00000000..20333da3
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tp/angular-cookies.min.js
@@ -0,0 +1,8 @@
+/*
+ AngularJS v1.3.5
+ (c) 2010-2014 Google, Inc. http://angularjs.org
+ License: MIT
+*/
+(function(p,f,n){'use strict';f.module("ngCookies",["ng"]).factory("$cookies",["$rootScope","$browser",function(e,b){var c={},g={},h,k=!1,l=f.copy,m=f.isUndefined;b.addPollFn(function(){var a=b.cookies();h!=a&&(h=a,l(a,g),l(a,c),k&&e.$apply())})();k=!0;e.$watch(function(){var a,d,e;for(a in g)m(c[a])&&b.cookies(a,n);for(a in c)d=c[a],f.isString(d)||(d=""+d,c[a]=d),d!==g[a]&&(b.cookies(a,d),e=!0);if(e)for(a in d=b.cookies(),c)c[a]!==d[a]&&(m(d[a])?delete c[a]:c[a]=d[a])});return c}]).factory("$cookieStore",
+["$cookies",function(e){return{get:function(b){return(b=e[b])?f.fromJson(b):b},put:function(b,c){e[b]=f.toJson(c)},remove:function(b){delete e[b]}}}])})(window,window.angular);
+//# sourceMappingURL=angular-cookies.min.js.map
diff --git a/framework/src/onos/web/gui/src/main/webapp/tp/angular-mocks.js b/framework/src/onos/web/gui/src/main/webapp/tp/angular-mocks.js
new file mode 100644
index 00000000..3d33b223
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tp/angular-mocks.js
@@ -0,0 +1,2380 @@
+/**
+ * @license AngularJS v1.3.5
+ * (c) 2010-2014 Google, Inc. http://angularjs.org
+ * License: MIT
+ */
+(function(window, angular, undefined) {
+
+'use strict';
+
+/**
+ * @ngdoc object
+ * @name angular.mock
+ * @description
+ *
+ * Namespace from 'angular-mocks.js' which contains testing related code.
+ */
+angular.mock = {};
+
+/**
+ * ! This is a private undocumented service !
+ *
+ * @name $browser
+ *
+ * @description
+ * This service is a mock implementation of {@link ng.$browser}. It provides fake
+ * implementation for commonly used browser apis that are hard to test, e.g. setTimeout, xhr,
+ * cookies, etc...
+ *
+ * The api of this service is the same as that of the real {@link ng.$browser $browser}, except
+ * that there are several helper methods available which can be used in tests.
+ */
+angular.mock.$BrowserProvider = function() {
+ this.$get = function() {
+ return new angular.mock.$Browser();
+ };
+};
+
+angular.mock.$Browser = function() {
+ var self = this;
+
+ this.isMock = true;
+ self.$$url = "http://server/";
+ self.$$lastUrl = self.$$url; // used by url polling fn
+ self.pollFns = [];
+
+ // TODO(vojta): remove this temporary api
+ self.$$completeOutstandingRequest = angular.noop;
+ self.$$incOutstandingRequestCount = angular.noop;
+
+
+ // register url polling fn
+
+ self.onUrlChange = function(listener) {
+ self.pollFns.push(
+ function() {
+ if (self.$$lastUrl !== self.$$url || self.$$state !== self.$$lastState) {
+ self.$$lastUrl = self.$$url;
+ self.$$lastState = self.$$state;
+ listener(self.$$url, self.$$state);
+ }
+ }
+ );
+
+ return listener;
+ };
+
+ self.$$checkUrlChange = angular.noop;
+
+ self.cookieHash = {};
+ self.lastCookieHash = {};
+ self.deferredFns = [];
+ self.deferredNextId = 0;
+
+ self.defer = function(fn, delay) {
+ delay = delay || 0;
+ self.deferredFns.push({time:(self.defer.now + delay), fn:fn, id: self.deferredNextId});
+ self.deferredFns.sort(function(a, b) { return a.time - b.time;});
+ return self.deferredNextId++;
+ };
+
+
+ /**
+ * @name $browser#defer.now
+ *
+ * @description
+ * Current milliseconds mock time.
+ */
+ self.defer.now = 0;
+
+
+ self.defer.cancel = function(deferId) {
+ var fnIndex;
+
+ angular.forEach(self.deferredFns, function(fn, index) {
+ if (fn.id === deferId) fnIndex = index;
+ });
+
+ if (fnIndex !== undefined) {
+ self.deferredFns.splice(fnIndex, 1);
+ return true;
+ }
+
+ return false;
+ };
+
+
+ /**
+ * @name $browser#defer.flush
+ *
+ * @description
+ * Flushes all pending requests and executes the defer callbacks.
+ *
+ * @param {number=} number of milliseconds to flush. See {@link #defer.now}
+ */
+ self.defer.flush = function(delay) {
+ if (angular.isDefined(delay)) {
+ self.defer.now += delay;
+ } else {
+ if (self.deferredFns.length) {
+ self.defer.now = self.deferredFns[self.deferredFns.length - 1].time;
+ } else {
+ throw new Error('No deferred tasks to be flushed');
+ }
+ }
+
+ while (self.deferredFns.length && self.deferredFns[0].time <= self.defer.now) {
+ self.deferredFns.shift().fn();
+ }
+ };
+
+ self.$$baseHref = '/';
+ self.baseHref = function() {
+ return this.$$baseHref;
+ };
+};
+angular.mock.$Browser.prototype = {
+
+/**
+ * @name $browser#poll
+ *
+ * @description
+ * run all fns in pollFns
+ */
+ poll: function poll() {
+ angular.forEach(this.pollFns, function(pollFn) {
+ pollFn();
+ });
+ },
+
+ addPollFn: function(pollFn) {
+ this.pollFns.push(pollFn);
+ return pollFn;
+ },
+
+ url: function(url, replace, state) {
+ if (angular.isUndefined(state)) {
+ state = null;
+ }
+ if (url) {
+ this.$$url = url;
+ // Native pushState serializes & copies the object; simulate it.
+ this.$$state = angular.copy(state);
+ return this;
+ }
+
+ return this.$$url;
+ },
+
+ state: function() {
+ return this.$$state;
+ },
+
+ cookies: function(name, value) {
+ if (name) {
+ if (angular.isUndefined(value)) {
+ delete this.cookieHash[name];
+ } else {
+ if (angular.isString(value) && //strings only
+ value.length <= 4096) { //strict cookie storage limits
+ this.cookieHash[name] = value;
+ }
+ }
+ } else {
+ if (!angular.equals(this.cookieHash, this.lastCookieHash)) {
+ this.lastCookieHash = angular.copy(this.cookieHash);
+ this.cookieHash = angular.copy(this.cookieHash);
+ }
+ return this.cookieHash;
+ }
+ },
+
+ notifyWhenNoOutstandingRequests: function(fn) {
+ fn();
+ }
+};
+
+
+/**
+ * @ngdoc provider
+ * @name $exceptionHandlerProvider
+ *
+ * @description
+ * Configures the mock implementation of {@link ng.$exceptionHandler} to rethrow or to log errors
+ * passed to the `$exceptionHandler`.
+ */
+
+/**
+ * @ngdoc service
+ * @name $exceptionHandler
+ *
+ * @description
+ * Mock implementation of {@link ng.$exceptionHandler} that rethrows or logs errors passed
+ * to it. See {@link ngMock.$exceptionHandlerProvider $exceptionHandlerProvider} for configuration
+ * information.
+ *
+ *
+ * ```js
+ * describe('$exceptionHandlerProvider', function() {
+ *
+ * it('should capture log messages and exceptions', function() {
+ *
+ * module(function($exceptionHandlerProvider) {
+ * $exceptionHandlerProvider.mode('log');
+ * });
+ *
+ * inject(function($log, $exceptionHandler, $timeout) {
+ * $timeout(function() { $log.log(1); });
+ * $timeout(function() { $log.log(2); throw 'banana peel'; });
+ * $timeout(function() { $log.log(3); });
+ * expect($exceptionHandler.errors).toEqual([]);
+ * expect($log.assertEmpty());
+ * $timeout.flush();
+ * expect($exceptionHandler.errors).toEqual(['banana peel']);
+ * expect($log.log.logs).toEqual([[1], [2], [3]]);
+ * });
+ * });
+ * });
+ * ```
+ */
+
+angular.mock.$ExceptionHandlerProvider = function() {
+ var handler;
+
+ /**
+ * @ngdoc method
+ * @name $exceptionHandlerProvider#mode
+ *
+ * @description
+ * Sets the logging mode.
+ *
+ * @param {string} mode Mode of operation, defaults to `rethrow`.
+ *
+ * - `rethrow`: If any errors are passed to the handler in tests, it typically means that there
+ * is a bug in the application or test, so this mock will make these tests fail.
+ * - `log`: Sometimes it is desirable to test that an error is thrown, for this case the `log`
+ * mode stores an array of errors in `$exceptionHandler.errors`, to allow later
+ * assertion of them. See {@link ngMock.$log#assertEmpty assertEmpty()} and
+ * {@link ngMock.$log#reset reset()}
+ */
+ this.mode = function(mode) {
+ switch (mode) {
+ case 'rethrow':
+ handler = function(e) {
+ throw e;
+ };
+ break;
+ case 'log':
+ var errors = [];
+
+ handler = function(e) {
+ if (arguments.length == 1) {
+ errors.push(e);
+ } else {
+ errors.push([].slice.call(arguments, 0));
+ }
+ };
+
+ handler.errors = errors;
+ break;
+ default:
+ throw new Error("Unknown mode '" + mode + "', only 'log'/'rethrow' modes are allowed!");
+ }
+ };
+
+ this.$get = function() {
+ return handler;
+ };
+
+ this.mode('rethrow');
+};
+
+
+/**
+ * @ngdoc service
+ * @name $log
+ *
+ * @description
+ * Mock implementation of {@link ng.$log} that gathers all logged messages in arrays
+ * (one array per logging level). These arrays are exposed as `logs` property of each of the
+ * level-specific log function, e.g. for level `error` the array is exposed as `$log.error.logs`.
+ *
+ */
+angular.mock.$LogProvider = function() {
+ var debug = true;
+
+ function concat(array1, array2, index) {
+ return array1.concat(Array.prototype.slice.call(array2, index));
+ }
+
+ this.debugEnabled = function(flag) {
+ if (angular.isDefined(flag)) {
+ debug = flag;
+ return this;
+ } else {
+ return debug;
+ }
+ };
+
+ this.$get = function() {
+ var $log = {
+ log: function() { $log.log.logs.push(concat([], arguments, 0)); },
+ warn: function() { $log.warn.logs.push(concat([], arguments, 0)); },
+ info: function() { $log.info.logs.push(concat([], arguments, 0)); },
+ error: function() { $log.error.logs.push(concat([], arguments, 0)); },
+ debug: function() {
+ if (debug) {
+ $log.debug.logs.push(concat([], arguments, 0));
+ }
+ }
+ };
+
+ /**
+ * @ngdoc method
+ * @name $log#reset
+ *
+ * @description
+ * Reset all of the logging arrays to empty.
+ */
+ $log.reset = function() {
+ /**
+ * @ngdoc property
+ * @name $log#log.logs
+ *
+ * @description
+ * Array of messages logged using {@link ng.$log#log `log()`}.
+ *
+ * @example
+ * ```js
+ * $log.log('Some Log');
+ * var first = $log.log.logs.unshift();
+ * ```
+ */
+ $log.log.logs = [];
+ /**
+ * @ngdoc property
+ * @name $log#info.logs
+ *
+ * @description
+ * Array of messages logged using {@link ng.$log#info `info()`}.
+ *
+ * @example
+ * ```js
+ * $log.info('Some Info');
+ * var first = $log.info.logs.unshift();
+ * ```
+ */
+ $log.info.logs = [];
+ /**
+ * @ngdoc property
+ * @name $log#warn.logs
+ *
+ * @description
+ * Array of messages logged using {@link ng.$log#warn `warn()`}.
+ *
+ * @example
+ * ```js
+ * $log.warn('Some Warning');
+ * var first = $log.warn.logs.unshift();
+ * ```
+ */
+ $log.warn.logs = [];
+ /**
+ * @ngdoc property
+ * @name $log#error.logs
+ *
+ * @description
+ * Array of messages logged using {@link ng.$log#error `error()`}.
+ *
+ * @example
+ * ```js
+ * $log.error('Some Error');
+ * var first = $log.error.logs.unshift();
+ * ```
+ */
+ $log.error.logs = [];
+ /**
+ * @ngdoc property
+ * @name $log#debug.logs
+ *
+ * @description
+ * Array of messages logged using {@link ng.$log#debug `debug()`}.
+ *
+ * @example
+ * ```js
+ * $log.debug('Some Error');
+ * var first = $log.debug.logs.unshift();
+ * ```
+ */
+ $log.debug.logs = [];
+ };
+
+ /**
+ * @ngdoc method
+ * @name $log#assertEmpty
+ *
+ * @description
+ * Assert that all of the logging methods have no logged messages. If any messages are present,
+ * an exception is thrown.
+ */
+ $log.assertEmpty = function() {
+ var errors = [];
+ angular.forEach(['error', 'warn', 'info', 'log', 'debug'], function(logLevel) {
+ angular.forEach($log[logLevel].logs, function(log) {
+ angular.forEach(log, function(logItem) {
+ errors.push('MOCK $log (' + logLevel + '): ' + String(logItem) + '\n' +
+ (logItem.stack || ''));
+ });
+ });
+ });
+ if (errors.length) {
+ errors.unshift("Expected $log to be empty! Either a message was logged unexpectedly, or " +
+ "an expected log message was not checked and removed:");
+ errors.push('');
+ throw new Error(errors.join('\n---------\n'));
+ }
+ };
+
+ $log.reset();
+ return $log;
+ };
+};
+
+
+/**
+ * @ngdoc service
+ * @name $interval
+ *
+ * @description
+ * Mock implementation of the $interval service.
+ *
+ * Use {@link ngMock.$interval#flush `$interval.flush(millis)`} to
+ * move forward by `millis` milliseconds and trigger any functions scheduled to run in that
+ * time.
+ *
+ * @param {function()} fn A function that should be called repeatedly.
+ * @param {number} delay Number of milliseconds between each function call.
+ * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat
+ * indefinitely.
+ * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise
+ * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.
+ * @returns {promise} A promise which will be notified on each iteration.
+ */
+angular.mock.$IntervalProvider = function() {
+ this.$get = ['$browser', '$rootScope', '$q', '$$q',
+ function($browser, $rootScope, $q, $$q) {
+ var repeatFns = [],
+ nextRepeatId = 0,
+ now = 0;
+
+ var $interval = function(fn, delay, count, invokeApply) {
+ var iteration = 0,
+ skipApply = (angular.isDefined(invokeApply) && !invokeApply),
+ deferred = (skipApply ? $$q : $q).defer(),
+ promise = deferred.promise;
+
+ count = (angular.isDefined(count)) ? count : 0;
+ promise.then(null, null, fn);
+
+ promise.$$intervalId = nextRepeatId;
+
+ function tick() {
+ deferred.notify(iteration++);
+
+ if (count > 0 && iteration >= count) {
+ var fnIndex;
+ deferred.resolve(iteration);
+
+ angular.forEach(repeatFns, function(fn, index) {
+ if (fn.id === promise.$$intervalId) fnIndex = index;
+ });
+
+ if (fnIndex !== undefined) {
+ repeatFns.splice(fnIndex, 1);
+ }
+ }
+
+ if (skipApply) {
+ $browser.defer.flush();
+ } else {
+ $rootScope.$apply();
+ }
+ }
+
+ repeatFns.push({
+ nextTime:(now + delay),
+ delay: delay,
+ fn: tick,
+ id: nextRepeatId,
+ deferred: deferred
+ });
+ repeatFns.sort(function(a, b) { return a.nextTime - b.nextTime;});
+
+ nextRepeatId++;
+ return promise;
+ };
+ /**
+ * @ngdoc method
+ * @name $interval#cancel
+ *
+ * @description
+ * Cancels a task associated with the `promise`.
+ *
+ * @param {promise} promise A promise from calling the `$interval` function.
+ * @returns {boolean} Returns `true` if the task was successfully cancelled.
+ */
+ $interval.cancel = function(promise) {
+ if (!promise) return false;
+ var fnIndex;
+
+ angular.forEach(repeatFns, function(fn, index) {
+ if (fn.id === promise.$$intervalId) fnIndex = index;
+ });
+
+ if (fnIndex !== undefined) {
+ repeatFns[fnIndex].deferred.reject('canceled');
+ repeatFns.splice(fnIndex, 1);
+ return true;
+ }
+
+ return false;
+ };
+
+ /**
+ * @ngdoc method
+ * @name $interval#flush
+ * @description
+ *
+ * Runs interval tasks scheduled to be run in the next `millis` milliseconds.
+ *
+ * @param {number=} millis maximum timeout amount to flush up until.
+ *
+ * @return {number} The amount of time moved forward.
+ */
+ $interval.flush = function(millis) {
+ now += millis;
+ while (repeatFns.length && repeatFns[0].nextTime <= now) {
+ var task = repeatFns[0];
+ task.fn();
+ task.nextTime += task.delay;
+ repeatFns.sort(function(a, b) { return a.nextTime - b.nextTime;});
+ }
+ return millis;
+ };
+
+ return $interval;
+ }];
+};
+
+
+/* jshint -W101 */
+/* The R_ISO8061_STR regex is never going to fit into the 100 char limit!
+ * This directive should go inside the anonymous function but a bug in JSHint means that it would
+ * not be enacted early enough to prevent the warning.
+ */
+var R_ISO8061_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?:\:?(\d\d)(?:\:?(\d\d)(?:\.(\d{3}))?)?)?(Z|([+-])(\d\d):?(\d\d)))?$/;
+
+function jsonStringToDate(string) {
+ var match;
+ if (match = string.match(R_ISO8061_STR)) {
+ var date = new Date(0),
+ tzHour = 0,
+ tzMin = 0;
+ if (match[9]) {
+ tzHour = int(match[9] + match[10]);
+ tzMin = int(match[9] + match[11]);
+ }
+ date.setUTCFullYear(int(match[1]), int(match[2]) - 1, int(match[3]));
+ date.setUTCHours(int(match[4] || 0) - tzHour,
+ int(match[5] || 0) - tzMin,
+ int(match[6] || 0),
+ int(match[7] || 0));
+ return date;
+ }
+ return string;
+}
+
+function int(str) {
+ return parseInt(str, 10);
+}
+
+function padNumber(num, digits, trim) {
+ var neg = '';
+ if (num < 0) {
+ neg = '-';
+ num = -num;
+ }
+ num = '' + num;
+ while (num.length < digits) num = '0' + num;
+ if (trim)
+ num = num.substr(num.length - digits);
+ return neg + num;
+}
+
+
+/**
+ * @ngdoc type
+ * @name angular.mock.TzDate
+ * @description
+ *
+ * *NOTE*: this is not an injectable instance, just a globally available mock class of `Date`.
+ *
+ * Mock of the Date type which has its timezone specified via constructor arg.
+ *
+ * The main purpose is to create Date-like instances with timezone fixed to the specified timezone
+ * offset, so that we can test code that depends on local timezone settings without dependency on
+ * the time zone settings of the machine where the code is running.
+ *
+ * @param {number} offset Offset of the *desired* timezone in hours (fractions will be honored)
+ * @param {(number|string)} timestamp Timestamp representing the desired time in *UTC*
+ *
+ * @example
+ * !!!! WARNING !!!!!
+ * This is not a complete Date object so only methods that were implemented can be called safely.
+ * To make matters worse, TzDate instances inherit stuff from Date via a prototype.
+ *
+ * We do our best to intercept calls to "unimplemented" methods, but since the list of methods is
+ * incomplete we might be missing some non-standard methods. This can result in errors like:
+ * "Date.prototype.foo called on incompatible Object".
+ *
+ * ```js
+ * var newYearInBratislava = new TzDate(-1, '2009-12-31T23:00:00Z');
+ * newYearInBratislava.getTimezoneOffset() => -60;
+ * newYearInBratislava.getFullYear() => 2010;
+ * newYearInBratislava.getMonth() => 0;
+ * newYearInBratislava.getDate() => 1;
+ * newYearInBratislava.getHours() => 0;
+ * newYearInBratislava.getMinutes() => 0;
+ * newYearInBratislava.getSeconds() => 0;
+ * ```
+ *
+ */
+angular.mock.TzDate = function(offset, timestamp) {
+ var self = new Date(0);
+ if (angular.isString(timestamp)) {
+ var tsStr = timestamp;
+
+ self.origDate = jsonStringToDate(timestamp);
+
+ timestamp = self.origDate.getTime();
+ if (isNaN(timestamp))
+ throw {
+ name: "Illegal Argument",
+ message: "Arg '" + tsStr + "' passed into TzDate constructor is not a valid date string"
+ };
+ } else {
+ self.origDate = new Date(timestamp);
+ }
+
+ var localOffset = new Date(timestamp).getTimezoneOffset();
+ self.offsetDiff = localOffset * 60 * 1000 - offset * 1000 * 60 * 60;
+ self.date = new Date(timestamp + self.offsetDiff);
+
+ self.getTime = function() {
+ return self.date.getTime() - self.offsetDiff;
+ };
+
+ self.toLocaleDateString = function() {
+ return self.date.toLocaleDateString();
+ };
+
+ self.getFullYear = function() {
+ return self.date.getFullYear();
+ };
+
+ self.getMonth = function() {
+ return self.date.getMonth();
+ };
+
+ self.getDate = function() {
+ return self.date.getDate();
+ };
+
+ self.getHours = function() {
+ return self.date.getHours();
+ };
+
+ self.getMinutes = function() {
+ return self.date.getMinutes();
+ };
+
+ self.getSeconds = function() {
+ return self.date.getSeconds();
+ };
+
+ self.getMilliseconds = function() {
+ return self.date.getMilliseconds();
+ };
+
+ self.getTimezoneOffset = function() {
+ return offset * 60;
+ };
+
+ self.getUTCFullYear = function() {
+ return self.origDate.getUTCFullYear();
+ };
+
+ self.getUTCMonth = function() {
+ return self.origDate.getUTCMonth();
+ };
+
+ self.getUTCDate = function() {
+ return self.origDate.getUTCDate();
+ };
+
+ self.getUTCHours = function() {
+ return self.origDate.getUTCHours();
+ };
+
+ self.getUTCMinutes = function() {
+ return self.origDate.getUTCMinutes();
+ };
+
+ self.getUTCSeconds = function() {
+ return self.origDate.getUTCSeconds();
+ };
+
+ self.getUTCMilliseconds = function() {
+ return self.origDate.getUTCMilliseconds();
+ };
+
+ self.getDay = function() {
+ return self.date.getDay();
+ };
+
+ // provide this method only on browsers that already have it
+ if (self.toISOString) {
+ self.toISOString = function() {
+ return padNumber(self.origDate.getUTCFullYear(), 4) + '-' +
+ padNumber(self.origDate.getUTCMonth() + 1, 2) + '-' +
+ padNumber(self.origDate.getUTCDate(), 2) + 'T' +
+ padNumber(self.origDate.getUTCHours(), 2) + ':' +
+ padNumber(self.origDate.getUTCMinutes(), 2) + ':' +
+ padNumber(self.origDate.getUTCSeconds(), 2) + '.' +
+ padNumber(self.origDate.getUTCMilliseconds(), 3) + 'Z';
+ };
+ }
+
+ //hide all methods not implemented in this mock that the Date prototype exposes
+ var unimplementedMethods = ['getUTCDay',
+ 'getYear', 'setDate', 'setFullYear', 'setHours', 'setMilliseconds',
+ 'setMinutes', 'setMonth', 'setSeconds', 'setTime', 'setUTCDate', 'setUTCFullYear',
+ 'setUTCHours', 'setUTCMilliseconds', 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds',
+ 'setYear', 'toDateString', 'toGMTString', 'toJSON', 'toLocaleFormat', 'toLocaleString',
+ 'toLocaleTimeString', 'toSource', 'toString', 'toTimeString', 'toUTCString', 'valueOf'];
+
+ angular.forEach(unimplementedMethods, function(methodName) {
+ self[methodName] = function() {
+ throw new Error("Method '" + methodName + "' is not implemented in the TzDate mock");
+ };
+ });
+
+ return self;
+};
+
+//make "tzDateInstance instanceof Date" return true
+angular.mock.TzDate.prototype = Date.prototype;
+/* jshint +W101 */
+
+angular.mock.animate = angular.module('ngAnimateMock', ['ng'])
+
+ .config(['$provide', function($provide) {
+
+ var reflowQueue = [];
+ $provide.value('$$animateReflow', function(fn) {
+ var index = reflowQueue.length;
+ reflowQueue.push(fn);
+ return function cancel() {
+ reflowQueue.splice(index, 1);
+ };
+ });
+
+ $provide.decorator('$animate', ['$delegate', '$$asyncCallback', '$timeout', '$browser',
+ function($delegate, $$asyncCallback, $timeout, $browser) {
+ var animate = {
+ queue: [],
+ cancel: $delegate.cancel,
+ enabled: $delegate.enabled,
+ triggerCallbackEvents: function() {
+ $$asyncCallback.flush();
+ },
+ triggerCallbackPromise: function() {
+ $timeout.flush(0);
+ },
+ triggerCallbacks: function() {
+ this.triggerCallbackEvents();
+ this.triggerCallbackPromise();
+ },
+ triggerReflow: function() {
+ angular.forEach(reflowQueue, function(fn) {
+ fn();
+ });
+ reflowQueue = [];
+ }
+ };
+
+ angular.forEach(
+ ['animate','enter','leave','move','addClass','removeClass','setClass'], function(method) {
+ animate[method] = function() {
+ animate.queue.push({
+ event: method,
+ element: arguments[0],
+ options: arguments[arguments.length - 1],
+ args: arguments
+ });
+ return $delegate[method].apply($delegate, arguments);
+ };
+ });
+
+ return animate;
+ }]);
+
+ }]);
+
+
+/**
+ * @ngdoc function
+ * @name angular.mock.dump
+ * @description
+ *
+ * *NOTE*: this is not an injectable instance, just a globally available function.
+ *
+ * Method for serializing common angular objects (scope, elements, etc..) into strings, useful for
+ * debugging.
+ *
+ * This method is also available on window, where it can be used to display objects on debug
+ * console.
+ *
+ * @param {*} object - any object to turn into string.
+ * @return {string} a serialized string of the argument
+ */
+angular.mock.dump = function(object) {
+ return serialize(object);
+
+ function serialize(object) {
+ var out;
+
+ if (angular.isElement(object)) {
+ object = angular.element(object);
+ out = angular.element('<div></div>');
+ angular.forEach(object, function(element) {
+ out.append(angular.element(element).clone());
+ });
+ out = out.html();
+ } else if (angular.isArray(object)) {
+ out = [];
+ angular.forEach(object, function(o) {
+ out.push(serialize(o));
+ });
+ out = '[ ' + out.join(', ') + ' ]';
+ } else if (angular.isObject(object)) {
+ if (angular.isFunction(object.$eval) && angular.isFunction(object.$apply)) {
+ out = serializeScope(object);
+ } else if (object instanceof Error) {
+ out = object.stack || ('' + object.name + ': ' + object.message);
+ } else {
+ // TODO(i): this prevents methods being logged,
+ // we should have a better way to serialize objects
+ out = angular.toJson(object, true);
+ }
+ } else {
+ out = String(object);
+ }
+
+ return out;
+ }
+
+ function serializeScope(scope, offset) {
+ offset = offset || ' ';
+ var log = [offset + 'Scope(' + scope.$id + '): {'];
+ for (var key in scope) {
+ if (Object.prototype.hasOwnProperty.call(scope, key) && !key.match(/^(\$|this)/)) {
+ log.push(' ' + key + ': ' + angular.toJson(scope[key]));
+ }
+ }
+ var child = scope.$$childHead;
+ while (child) {
+ log.push(serializeScope(child, offset + ' '));
+ child = child.$$nextSibling;
+ }
+ log.push('}');
+ return log.join('\n' + offset);
+ }
+};
+
+/**
+ * @ngdoc service
+ * @name $httpBackend
+ * @description
+ * Fake HTTP backend implementation suitable for unit testing applications that use the
+ * {@link ng.$http $http service}.
+ *
+ * *Note*: For fake HTTP backend implementation suitable for end-to-end testing or backend-less
+ * development please see {@link ngMockE2E.$httpBackend e2e $httpBackend mock}.
+ *
+ * During unit testing, we want our unit tests to run quickly and have no external dependencies so
+ * we don’t want to send [XHR](https://developer.mozilla.org/en/xmlhttprequest) or
+ * [JSONP](http://en.wikipedia.org/wiki/JSONP) requests to a real server. All we really need is
+ * to verify whether a certain request has been sent or not, or alternatively just let the
+ * application make requests, respond with pre-trained responses and assert that the end result is
+ * what we expect it to be.
+ *
+ * This mock implementation can be used to respond with static or dynamic responses via the
+ * `expect` and `when` apis and their shortcuts (`expectGET`, `whenPOST`, etc).
+ *
+ * When an Angular application needs some data from a server, it calls the $http service, which
+ * sends the request to a real server using $httpBackend service. With dependency injection, it is
+ * easy to inject $httpBackend mock (which has the same API as $httpBackend) and use it to verify
+ * the requests and respond with some testing data without sending a request to a real server.
+ *
+ * There are two ways to specify what test data should be returned as http responses by the mock
+ * backend when the code under test makes http requests:
+ *
+ * - `$httpBackend.expect` - specifies a request expectation
+ * - `$httpBackend.when` - specifies a backend definition
+ *
+ *
+ * # Request Expectations vs Backend Definitions
+ *
+ * Request expectations provide a way to make assertions about requests made by the application and
+ * to define responses for those requests. The test will fail if the expected requests are not made
+ * or they are made in the wrong order.
+ *
+ * Backend definitions allow you to define a fake backend for your application which doesn't assert
+ * if a particular request was made or not, it just returns a trained response if a request is made.
+ * The test will pass whether or not the request gets made during testing.
+ *
+ *
+ * <table class="table">
+ * <tr><th width="220px"></th><th>Request expectations</th><th>Backend definitions</th></tr>
+ * <tr>
+ * <th>Syntax</th>
+ * <td>.expect(...).respond(...)</td>
+ * <td>.when(...).respond(...)</td>
+ * </tr>
+ * <tr>
+ * <th>Typical usage</th>
+ * <td>strict unit tests</td>
+ * <td>loose (black-box) unit testing</td>
+ * </tr>
+ * <tr>
+ * <th>Fulfills multiple requests</th>
+ * <td>NO</td>
+ * <td>YES</td>
+ * </tr>
+ * <tr>
+ * <th>Order of requests matters</th>
+ * <td>YES</td>
+ * <td>NO</td>
+ * </tr>
+ * <tr>
+ * <th>Request required</th>
+ * <td>YES</td>
+ * <td>NO</td>
+ * </tr>
+ * <tr>
+ * <th>Response required</th>
+ * <td>optional (see below)</td>
+ * <td>YES</td>
+ * </tr>
+ * </table>
+ *
+ * In cases where both backend definitions and request expectations are specified during unit
+ * testing, the request expectations are evaluated first.
+ *
+ * If a request expectation has no response specified, the algorithm will search your backend
+ * definitions for an appropriate response.
+ *
+ * If a request didn't match any expectation or if the expectation doesn't have the response
+ * defined, the backend definitions are evaluated in sequential order to see if any of them match
+ * the request. The response from the first matched definition is returned.
+ *
+ *
+ * # Flushing HTTP requests
+ *
+ * The $httpBackend used in production always responds to requests asynchronously. If we preserved
+ * this behavior in unit testing, we'd have to create async unit tests, which are hard to write,
+ * to follow and to maintain. But neither can the testing mock respond synchronously; that would
+ * change the execution of the code under test. For this reason, the mock $httpBackend has a
+ * `flush()` method, which allows the test to explicitly flush pending requests. This preserves
+ * the async api of the backend, while allowing the test to execute synchronously.
+ *
+ *
+ * # Unit testing with mock $httpBackend
+ * The following code shows how to setup and use the mock backend when unit testing a controller.
+ * First we create the controller under test:
+ *
+ ```js
+ // The module code
+ angular
+ .module('MyApp', [])
+ .controller('MyController', MyController);
+
+ // The controller code
+ function MyController($scope, $http) {
+ var authToken;
+
+ $http.get('/auth.py').success(function(data, status, headers) {
+ authToken = headers('A-Token');
+ $scope.user = data;
+ });
+
+ $scope.saveMessage = function(message) {
+ var headers = { 'Authorization': authToken };
+ $scope.status = 'Saving...';
+
+ $http.post('/add-msg.py', message, { headers: headers } ).success(function(response) {
+ $scope.status = '';
+ }).error(function() {
+ $scope.status = 'ERROR!';
+ });
+ };
+ }
+ ```
+ *
+ * Now we setup the mock backend and create the test specs:
+ *
+ ```js
+ // testing controller
+ describe('MyController', function() {
+ var $httpBackend, $rootScope, createController, authRequestHandler;
+
+ // Set up the module
+ beforeEach(module('MyApp'));
+
+ beforeEach(inject(function($injector) {
+ // Set up the mock http service responses
+ $httpBackend = $injector.get('$httpBackend');
+ // backend definition common for all tests
+ authRequestHandler = $httpBackend.when('GET', '/auth.py')
+ .respond({userId: 'userX'}, {'A-Token': 'xxx'});
+
+ // Get hold of a scope (i.e. the root scope)
+ $rootScope = $injector.get('$rootScope');
+ // The $controller service is used to create instances of controllers
+ var $controller = $injector.get('$controller');
+
+ createController = function() {
+ return $controller('MyController', {'$scope' : $rootScope });
+ };
+ }));
+
+
+ afterEach(function() {
+ $httpBackend.verifyNoOutstandingExpectation();
+ $httpBackend.verifyNoOutstandingRequest();
+ });
+
+
+ it('should fetch authentication token', function() {
+ $httpBackend.expectGET('/auth.py');
+ var controller = createController();
+ $httpBackend.flush();
+ });
+
+
+ it('should fail authentication', function() {
+
+ // Notice how you can change the response even after it was set
+ authRequestHandler.respond(401, '');
+
+ $httpBackend.expectGET('/auth.py');
+ var controller = createController();
+ $httpBackend.flush();
+ expect($rootScope.status).toBe('Failed...');
+ });
+
+
+ it('should send msg to server', function() {
+ var controller = createController();
+ $httpBackend.flush();
+
+ // now you don’t care about the authentication, but
+ // the controller will still send the request and
+ // $httpBackend will respond without you having to
+ // specify the expectation and response for this request
+
+ $httpBackend.expectPOST('/add-msg.py', 'message content').respond(201, '');
+ $rootScope.saveMessage('message content');
+ expect($rootScope.status).toBe('Saving...');
+ $httpBackend.flush();
+ expect($rootScope.status).toBe('');
+ });
+
+
+ it('should send auth header', function() {
+ var controller = createController();
+ $httpBackend.flush();
+
+ $httpBackend.expectPOST('/add-msg.py', undefined, function(headers) {
+ // check if the header was send, if it wasn't the expectation won't
+ // match the request and the test will fail
+ return headers['Authorization'] == 'xxx';
+ }).respond(201, '');
+
+ $rootScope.saveMessage('whatever');
+ $httpBackend.flush();
+ });
+ });
+ ```
+ */
+angular.mock.$HttpBackendProvider = function() {
+ this.$get = ['$rootScope', createHttpBackendMock];
+};
+
+/**
+ * General factory function for $httpBackend mock.
+ * Returns instance for unit testing (when no arguments specified):
+ * - passing through is disabled
+ * - auto flushing is disabled
+ *
+ * Returns instance for e2e testing (when `$delegate` and `$browser` specified):
+ * - passing through (delegating request to real backend) is enabled
+ * - auto flushing is enabled
+ *
+ * @param {Object=} $delegate Real $httpBackend instance (allow passing through if specified)
+ * @param {Object=} $browser Auto-flushing enabled if specified
+ * @return {Object} Instance of $httpBackend mock
+ */
+function createHttpBackendMock($rootScope, $delegate, $browser) {
+ var definitions = [],
+ expectations = [],
+ responses = [],
+ responsesPush = angular.bind(responses, responses.push),
+ copy = angular.copy;
+
+ function createResponse(status, data, headers, statusText) {
+ if (angular.isFunction(status)) return status;
+
+ return function() {
+ return angular.isNumber(status)
+ ? [status, data, headers, statusText]
+ : [200, status, data, headers];
+ };
+ }
+
+ // TODO(vojta): change params to: method, url, data, headers, callback
+ function $httpBackend(method, url, data, callback, headers, timeout, withCredentials) {
+ var xhr = new MockXhr(),
+ expectation = expectations[0],
+ wasExpected = false;
+
+ function prettyPrint(data) {
+ return (angular.isString(data) || angular.isFunction(data) || data instanceof RegExp)
+ ? data
+ : angular.toJson(data);
+ }
+
+ function wrapResponse(wrapped) {
+ if (!$browser && timeout && timeout.then) timeout.then(handleTimeout);
+
+ return handleResponse;
+
+ function handleResponse() {
+ var response = wrapped.response(method, url, data, headers);
+ xhr.$$respHeaders = response[2];
+ callback(copy(response[0]), copy(response[1]), xhr.getAllResponseHeaders(),
+ copy(response[3] || ''));
+ }
+
+ function handleTimeout() {
+ for (var i = 0, ii = responses.length; i < ii; i++) {
+ if (responses[i] === handleResponse) {
+ responses.splice(i, 1);
+ callback(-1, undefined, '');
+ break;
+ }
+ }
+ }
+ }
+
+ if (expectation && expectation.match(method, url)) {
+ if (!expectation.matchData(data))
+ throw new Error('Expected ' + expectation + ' with different data\n' +
+ 'EXPECTED: ' + prettyPrint(expectation.data) + '\nGOT: ' + data);
+
+ if (!expectation.matchHeaders(headers))
+ throw new Error('Expected ' + expectation + ' with different headers\n' +
+ 'EXPECTED: ' + prettyPrint(expectation.headers) + '\nGOT: ' +
+ prettyPrint(headers));
+
+ expectations.shift();
+
+ if (expectation.response) {
+ responses.push(wrapResponse(expectation));
+ return;
+ }
+ wasExpected = true;
+ }
+
+ var i = -1, definition;
+ while ((definition = definitions[++i])) {
+ if (definition.match(method, url, data, headers || {})) {
+ if (definition.response) {
+ // if $browser specified, we do auto flush all requests
+ ($browser ? $browser.defer : responsesPush)(wrapResponse(definition));
+ } else if (definition.passThrough) {
+ $delegate(method, url, data, callback, headers, timeout, withCredentials);
+ } else throw new Error('No response defined !');
+ return;
+ }
+ }
+ throw wasExpected ?
+ new Error('No response defined !') :
+ new Error('Unexpected request: ' + method + ' ' + url + '\n' +
+ (expectation ? 'Expected ' + expectation : 'No more request expected'));
+ }
+
+ /**
+ * @ngdoc method
+ * @name $httpBackend#when
+ * @description
+ * Creates a new backend definition.
+ *
+ * @param {string} method HTTP method.
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives
+ * data string and returns true if the data is as expected.
+ * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
+ * object and returns true if the headers match the current definition.
+ * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
+ * request is handled. You can save this object for later use and invoke `respond` again in
+ * order to change how a matched request is handled.
+ *
+ * - respond –
+ * `{function([status,] data[, headers, statusText])
+ * | function(function(method, url, data, headers)}`
+ * – The respond method takes a set of static data to be returned or a function that can
+ * return an array containing response status (number), response data (string), response
+ * headers (Object), and the text for the status (string). The respond method returns the
+ * `requestHandler` object for possible overrides.
+ */
+ $httpBackend.when = function(method, url, data, headers) {
+ var definition = new MockHttpExpectation(method, url, data, headers),
+ chain = {
+ respond: function(status, data, headers, statusText) {
+ definition.passThrough = undefined;
+ definition.response = createResponse(status, data, headers, statusText);
+ return chain;
+ }
+ };
+
+ if ($browser) {
+ chain.passThrough = function() {
+ definition.response = undefined;
+ definition.passThrough = true;
+ return chain;
+ };
+ }
+
+ definitions.push(definition);
+ return chain;
+ };
+
+ /**
+ * @ngdoc method
+ * @name $httpBackend#whenGET
+ * @description
+ * Creates a new backend definition for GET requests. For more info see `when()`.
+ *
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled. You can save this object for later use and invoke `respond` again in
+ * order to change how a matched request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name $httpBackend#whenHEAD
+ * @description
+ * Creates a new backend definition for HEAD requests. For more info see `when()`.
+ *
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled. You can save this object for later use and invoke `respond` again in
+ * order to change how a matched request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name $httpBackend#whenDELETE
+ * @description
+ * Creates a new backend definition for DELETE requests. For more info see `when()`.
+ *
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled. You can save this object for later use and invoke `respond` again in
+ * order to change how a matched request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name $httpBackend#whenPOST
+ * @description
+ * Creates a new backend definition for POST requests. For more info see `when()`.
+ *
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives
+ * data string and returns true if the data is as expected.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled. You can save this object for later use and invoke `respond` again in
+ * order to change how a matched request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name $httpBackend#whenPUT
+ * @description
+ * Creates a new backend definition for PUT requests. For more info see `when()`.
+ *
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives
+ * data string and returns true if the data is as expected.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled. You can save this object for later use and invoke `respond` again in
+ * order to change how a matched request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name $httpBackend#whenJSONP
+ * @description
+ * Creates a new backend definition for JSONP requests. For more info see `when()`.
+ *
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled. You can save this object for later use and invoke `respond` again in
+ * order to change how a matched request is handled.
+ */
+ createShortMethods('when');
+
+
+ /**
+ * @ngdoc method
+ * @name $httpBackend#expect
+ * @description
+ * Creates a new request expectation.
+ *
+ * @param {string} method HTTP method.
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that
+ * receives data string and returns true if the data is as expected, or Object if request body
+ * is in JSON format.
+ * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
+ * object and returns true if the headers match the current expectation.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled. You can save this object for later use and invoke `respond` again in
+ * order to change how a matched request is handled.
+ *
+ * - respond –
+ * `{function([status,] data[, headers, statusText])
+ * | function(function(method, url, data, headers)}`
+ * – The respond method takes a set of static data to be returned or a function that can
+ * return an array containing response status (number), response data (string), response
+ * headers (Object), and the text for the status (string). The respond method returns the
+ * `requestHandler` object for possible overrides.
+ */
+ $httpBackend.expect = function(method, url, data, headers) {
+ var expectation = new MockHttpExpectation(method, url, data, headers),
+ chain = {
+ respond: function(status, data, headers, statusText) {
+ expectation.response = createResponse(status, data, headers, statusText);
+ return chain;
+ }
+ };
+
+ expectations.push(expectation);
+ return chain;
+ };
+
+
+ /**
+ * @ngdoc method
+ * @name $httpBackend#expectGET
+ * @description
+ * Creates a new request expectation for GET requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @param {Object=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled. You can save this object for later use and invoke `respond` again in
+ * order to change how a matched request is handled. See #expect for more info.
+ */
+
+ /**
+ * @ngdoc method
+ * @name $httpBackend#expectHEAD
+ * @description
+ * Creates a new request expectation for HEAD requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @param {Object=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled. You can save this object for later use and invoke `respond` again in
+ * order to change how a matched request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name $httpBackend#expectDELETE
+ * @description
+ * Creates a new request expectation for DELETE requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @param {Object=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled. You can save this object for later use and invoke `respond` again in
+ * order to change how a matched request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name $httpBackend#expectPOST
+ * @description
+ * Creates a new request expectation for POST requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that
+ * receives data string and returns true if the data is as expected, or Object if request body
+ * is in JSON format.
+ * @param {Object=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled. You can save this object for later use and invoke `respond` again in
+ * order to change how a matched request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name $httpBackend#expectPUT
+ * @description
+ * Creates a new request expectation for PUT requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that
+ * receives data string and returns true if the data is as expected, or Object if request body
+ * is in JSON format.
+ * @param {Object=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled. You can save this object for later use and invoke `respond` again in
+ * order to change how a matched request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name $httpBackend#expectPATCH
+ * @description
+ * Creates a new request expectation for PATCH requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that
+ * receives data string and returns true if the data is as expected, or Object if request body
+ * is in JSON format.
+ * @param {Object=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled. You can save this object for later use and invoke `respond` again in
+ * order to change how a matched request is handled.
+ */
+
+ /**
+ * @ngdoc method
+ * @name $httpBackend#expectJSONP
+ * @description
+ * Creates a new request expectation for JSONP requests. For more info see `expect()`.
+ *
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @returns {requestHandler} Returns an object with `respond` method that control how a matched
+ * request is handled. You can save this object for later use and invoke `respond` again in
+ * order to change how a matched request is handled.
+ */
+ createShortMethods('expect');
+
+
+ /**
+ * @ngdoc method
+ * @name $httpBackend#flush
+ * @description
+ * Flushes all pending requests using the trained responses.
+ *
+ * @param {number=} count Number of responses to flush (in the order they arrived). If undefined,
+ * all pending requests will be flushed. If there are no pending requests when the flush method
+ * is called an exception is thrown (as this typically a sign of programming error).
+ */
+ $httpBackend.flush = function(count, digest) {
+ if (digest !== false) $rootScope.$digest();
+ if (!responses.length) throw new Error('No pending request to flush !');
+
+ if (angular.isDefined(count) && count !== null) {
+ while (count--) {
+ if (!responses.length) throw new Error('No more pending request to flush !');
+ responses.shift()();
+ }
+ } else {
+ while (responses.length) {
+ responses.shift()();
+ }
+ }
+ $httpBackend.verifyNoOutstandingExpectation(digest);
+ };
+
+
+ /**
+ * @ngdoc method
+ * @name $httpBackend#verifyNoOutstandingExpectation
+ * @description
+ * Verifies that all of the requests defined via the `expect` api were made. If any of the
+ * requests were not made, verifyNoOutstandingExpectation throws an exception.
+ *
+ * Typically, you would call this method following each test case that asserts requests using an
+ * "afterEach" clause.
+ *
+ * ```js
+ * afterEach($httpBackend.verifyNoOutstandingExpectation);
+ * ```
+ */
+ $httpBackend.verifyNoOutstandingExpectation = function(digest) {
+ if (digest !== false) $rootScope.$digest();
+ if (expectations.length) {
+ throw new Error('Unsatisfied requests: ' + expectations.join(', '));
+ }
+ };
+
+
+ /**
+ * @ngdoc method
+ * @name $httpBackend#verifyNoOutstandingRequest
+ * @description
+ * Verifies that there are no outstanding requests that need to be flushed.
+ *
+ * Typically, you would call this method following each test case that asserts requests using an
+ * "afterEach" clause.
+ *
+ * ```js
+ * afterEach($httpBackend.verifyNoOutstandingRequest);
+ * ```
+ */
+ $httpBackend.verifyNoOutstandingRequest = function() {
+ if (responses.length) {
+ throw new Error('Unflushed requests: ' + responses.length);
+ }
+ };
+
+
+ /**
+ * @ngdoc method
+ * @name $httpBackend#resetExpectations
+ * @description
+ * Resets all request expectations, but preserves all backend definitions. Typically, you would
+ * call resetExpectations during a multiple-phase test when you want to reuse the same instance of
+ * $httpBackend mock.
+ */
+ $httpBackend.resetExpectations = function() {
+ expectations.length = 0;
+ responses.length = 0;
+ };
+
+ return $httpBackend;
+
+
+ function createShortMethods(prefix) {
+ angular.forEach(['GET', 'DELETE', 'JSONP', 'HEAD'], function(method) {
+ $httpBackend[prefix + method] = function(url, headers) {
+ return $httpBackend[prefix](method, url, undefined, headers);
+ };
+ });
+
+ angular.forEach(['PUT', 'POST', 'PATCH'], function(method) {
+ $httpBackend[prefix + method] = function(url, data, headers) {
+ return $httpBackend[prefix](method, url, data, headers);
+ };
+ });
+ }
+}
+
+function MockHttpExpectation(method, url, data, headers) {
+
+ this.data = data;
+ this.headers = headers;
+
+ this.match = function(m, u, d, h) {
+ if (method != m) return false;
+ if (!this.matchUrl(u)) return false;
+ if (angular.isDefined(d) && !this.matchData(d)) return false;
+ if (angular.isDefined(h) && !this.matchHeaders(h)) return false;
+ return true;
+ };
+
+ this.matchUrl = function(u) {
+ if (!url) return true;
+ if (angular.isFunction(url.test)) return url.test(u);
+ if (angular.isFunction(url)) return url(u);
+ return url == u;
+ };
+
+ this.matchHeaders = function(h) {
+ if (angular.isUndefined(headers)) return true;
+ if (angular.isFunction(headers)) return headers(h);
+ return angular.equals(headers, h);
+ };
+
+ this.matchData = function(d) {
+ if (angular.isUndefined(data)) return true;
+ if (data && angular.isFunction(data.test)) return data.test(d);
+ if (data && angular.isFunction(data)) return data(d);
+ if (data && !angular.isString(data)) {
+ return angular.equals(angular.fromJson(angular.toJson(data)), angular.fromJson(d));
+ }
+ return data == d;
+ };
+
+ this.toString = function() {
+ return method + ' ' + url;
+ };
+}
+
+function createMockXhr() {
+ return new MockXhr();
+}
+
+function MockXhr() {
+
+ // hack for testing $http, $httpBackend
+ MockXhr.$$lastInstance = this;
+
+ this.open = function(method, url, async) {
+ this.$$method = method;
+ this.$$url = url;
+ this.$$async = async;
+ this.$$reqHeaders = {};
+ this.$$respHeaders = {};
+ };
+
+ this.send = function(data) {
+ this.$$data = data;
+ };
+
+ this.setRequestHeader = function(key, value) {
+ this.$$reqHeaders[key] = value;
+ };
+
+ this.getResponseHeader = function(name) {
+ // the lookup must be case insensitive,
+ // that's why we try two quick lookups first and full scan last
+ var header = this.$$respHeaders[name];
+ if (header) return header;
+
+ name = angular.lowercase(name);
+ header = this.$$respHeaders[name];
+ if (header) return header;
+
+ header = undefined;
+ angular.forEach(this.$$respHeaders, function(headerVal, headerName) {
+ if (!header && angular.lowercase(headerName) == name) header = headerVal;
+ });
+ return header;
+ };
+
+ this.getAllResponseHeaders = function() {
+ var lines = [];
+
+ angular.forEach(this.$$respHeaders, function(value, key) {
+ lines.push(key + ': ' + value);
+ });
+ return lines.join('\n');
+ };
+
+ this.abort = angular.noop;
+}
+
+
+/**
+ * @ngdoc service
+ * @name $timeout
+ * @description
+ *
+ * This service is just a simple decorator for {@link ng.$timeout $timeout} service
+ * that adds a "flush" and "verifyNoPendingTasks" methods.
+ */
+
+angular.mock.$TimeoutDecorator = ['$delegate', '$browser', function($delegate, $browser) {
+
+ /**
+ * @ngdoc method
+ * @name $timeout#flush
+ * @description
+ *
+ * Flushes the queue of pending tasks.
+ *
+ * @param {number=} delay maximum timeout amount to flush up until
+ */
+ $delegate.flush = function(delay) {
+ $browser.defer.flush(delay);
+ };
+
+ /**
+ * @ngdoc method
+ * @name $timeout#verifyNoPendingTasks
+ * @description
+ *
+ * Verifies that there are no pending tasks that need to be flushed.
+ */
+ $delegate.verifyNoPendingTasks = function() {
+ if ($browser.deferredFns.length) {
+ throw new Error('Deferred tasks to flush (' + $browser.deferredFns.length + '): ' +
+ formatPendingTasksAsString($browser.deferredFns));
+ }
+ };
+
+ function formatPendingTasksAsString(tasks) {
+ var result = [];
+ angular.forEach(tasks, function(task) {
+ result.push('{id: ' + task.id + ', ' + 'time: ' + task.time + '}');
+ });
+
+ return result.join(', ');
+ }
+
+ return $delegate;
+}];
+
+angular.mock.$RAFDecorator = ['$delegate', function($delegate) {
+ var queue = [];
+ var rafFn = function(fn) {
+ var index = queue.length;
+ queue.push(fn);
+ return function() {
+ queue.splice(index, 1);
+ };
+ };
+
+ rafFn.supported = $delegate.supported;
+
+ rafFn.flush = function() {
+ if (queue.length === 0) {
+ throw new Error('No rAF callbacks present');
+ }
+
+ var length = queue.length;
+ for (var i = 0; i < length; i++) {
+ queue[i]();
+ }
+
+ queue = [];
+ };
+
+ return rafFn;
+}];
+
+angular.mock.$AsyncCallbackDecorator = ['$delegate', function($delegate) {
+ var callbacks = [];
+ var addFn = function(fn) {
+ callbacks.push(fn);
+ };
+ addFn.flush = function() {
+ angular.forEach(callbacks, function(fn) {
+ fn();
+ });
+ callbacks = [];
+ };
+ return addFn;
+}];
+
+/**
+ *
+ */
+angular.mock.$RootElementProvider = function() {
+ this.$get = function() {
+ return angular.element('<div ng-app></div>');
+ };
+};
+
+/**
+ * @ngdoc module
+ * @name ngMock
+ * @packageName angular-mocks
+ * @description
+ *
+ * # ngMock
+ *
+ * The `ngMock` module provides support to inject and mock Angular services into unit tests.
+ * In addition, ngMock also extends various core ng services such that they can be
+ * inspected and controlled in a synchronous manner within test code.
+ *
+ *
+ * <div doc-module-components="ngMock"></div>
+ *
+ */
+angular.module('ngMock', ['ng']).provider({
+ $browser: angular.mock.$BrowserProvider,
+ $exceptionHandler: angular.mock.$ExceptionHandlerProvider,
+ $log: angular.mock.$LogProvider,
+ $interval: angular.mock.$IntervalProvider,
+ $httpBackend: angular.mock.$HttpBackendProvider,
+ $rootElement: angular.mock.$RootElementProvider
+}).config(['$provide', function($provide) {
+ $provide.decorator('$timeout', angular.mock.$TimeoutDecorator);
+ $provide.decorator('$$rAF', angular.mock.$RAFDecorator);
+ $provide.decorator('$$asyncCallback', angular.mock.$AsyncCallbackDecorator);
+ $provide.decorator('$rootScope', angular.mock.$RootScopeDecorator);
+}]);
+
+/**
+ * @ngdoc module
+ * @name ngMockE2E
+ * @module ngMockE2E
+ * @packageName angular-mocks
+ * @description
+ *
+ * The `ngMockE2E` is an angular module which contains mocks suitable for end-to-end testing.
+ * Currently there is only one mock present in this module -
+ * the {@link ngMockE2E.$httpBackend e2e $httpBackend} mock.
+ */
+angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
+ $provide.decorator('$httpBackend', angular.mock.e2e.$httpBackendDecorator);
+}]);
+
+/**
+ * @ngdoc service
+ * @name $httpBackend
+ * @module ngMockE2E
+ * @description
+ * Fake HTTP backend implementation suitable for end-to-end testing or backend-less development of
+ * applications that use the {@link ng.$http $http service}.
+ *
+ * *Note*: For fake http backend implementation suitable for unit testing please see
+ * {@link ngMock.$httpBackend unit-testing $httpBackend mock}.
+ *
+ * This implementation can be used to respond with static or dynamic responses via the `when` api
+ * and its shortcuts (`whenGET`, `whenPOST`, etc) and optionally pass through requests to the
+ * real $httpBackend for specific requests (e.g. to interact with certain remote apis or to fetch
+ * templates from a webserver).
+ *
+ * As opposed to unit-testing, in an end-to-end testing scenario or in scenario when an application
+ * is being developed with the real backend api replaced with a mock, it is often desirable for
+ * certain category of requests to bypass the mock and issue a real http request (e.g. to fetch
+ * templates or static files from the webserver). To configure the backend with this behavior
+ * use the `passThrough` request handler of `when` instead of `respond`.
+ *
+ * Additionally, we don't want to manually have to flush mocked out requests like we do during unit
+ * testing. For this reason the e2e $httpBackend flushes mocked out requests
+ * automatically, closely simulating the behavior of the XMLHttpRequest object.
+ *
+ * To setup the application to run with this http backend, you have to create a module that depends
+ * on the `ngMockE2E` and your application modules and defines the fake backend:
+ *
+ * ```js
+ * myAppDev = angular.module('myAppDev', ['myApp', 'ngMockE2E']);
+ * myAppDev.run(function($httpBackend) {
+ * phones = [{name: 'phone1'}, {name: 'phone2'}];
+ *
+ * // returns the current list of phones
+ * $httpBackend.whenGET('/phones').respond(phones);
+ *
+ * // adds a new phone to the phones array
+ * $httpBackend.whenPOST('/phones').respond(function(method, url, data) {
+ * var phone = angular.fromJson(data);
+ * phones.push(phone);
+ * return [200, phone, {}];
+ * });
+ * $httpBackend.whenGET(/^\/templates\//).passThrough();
+ * //...
+ * });
+ * ```
+ *
+ * Afterwards, bootstrap your app with this new module.
+ */
+
+/**
+ * @ngdoc method
+ * @name $httpBackend#when
+ * @module ngMockE2E
+ * @description
+ * Creates a new backend definition.
+ *
+ * @param {string} method HTTP method.
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
+ * object and returns true if the headers match the current definition.
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
+ * control how a matched request is handled. You can save this object for later use and invoke
+ * `respond` or `passThrough` again in order to change how a matched request is handled.
+ *
+ * - respond –
+ * `{function([status,] data[, headers, statusText])
+ * | function(function(method, url, data, headers)}`
+ * – The respond method takes a set of static data to be returned or a function that can return
+ * an array containing response status (number), response data (string), response headers
+ * (Object), and the text for the status (string).
+ * - passThrough – `{function()}` – Any request matching a backend definition with
+ * `passThrough` handler will be passed through to the real backend (an XHR request will be made
+ * to the server.)
+ * - Both methods return the `requestHandler` object for possible overrides.
+ */
+
+/**
+ * @ngdoc method
+ * @name $httpBackend#whenGET
+ * @module ngMockE2E
+ * @description
+ * Creates a new backend definition for GET requests. For more info see `when()`.
+ *
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
+ * control how a matched request is handled. You can save this object for later use and invoke
+ * `respond` or `passThrough` again in order to change how a matched request is handled.
+ */
+
+/**
+ * @ngdoc method
+ * @name $httpBackend#whenHEAD
+ * @module ngMockE2E
+ * @description
+ * Creates a new backend definition for HEAD requests. For more info see `when()`.
+ *
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
+ * control how a matched request is handled. You can save this object for later use and invoke
+ * `respond` or `passThrough` again in order to change how a matched request is handled.
+ */
+
+/**
+ * @ngdoc method
+ * @name $httpBackend#whenDELETE
+ * @module ngMockE2E
+ * @description
+ * Creates a new backend definition for DELETE requests. For more info see `when()`.
+ *
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
+ * control how a matched request is handled. You can save this object for later use and invoke
+ * `respond` or `passThrough` again in order to change how a matched request is handled.
+ */
+
+/**
+ * @ngdoc method
+ * @name $httpBackend#whenPOST
+ * @module ngMockE2E
+ * @description
+ * Creates a new backend definition for POST requests. For more info see `when()`.
+ *
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
+ * control how a matched request is handled. You can save this object for later use and invoke
+ * `respond` or `passThrough` again in order to change how a matched request is handled.
+ */
+
+/**
+ * @ngdoc method
+ * @name $httpBackend#whenPUT
+ * @module ngMockE2E
+ * @description
+ * Creates a new backend definition for PUT requests. For more info see `when()`.
+ *
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
+ * control how a matched request is handled. You can save this object for later use and invoke
+ * `respond` or `passThrough` again in order to change how a matched request is handled.
+ */
+
+/**
+ * @ngdoc method
+ * @name $httpBackend#whenPATCH
+ * @module ngMockE2E
+ * @description
+ * Creates a new backend definition for PATCH requests. For more info see `when()`.
+ *
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @param {(string|RegExp)=} data HTTP request body.
+ * @param {(Object|function(Object))=} headers HTTP headers.
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
+ * control how a matched request is handled. You can save this object for later use and invoke
+ * `respond` or `passThrough` again in order to change how a matched request is handled.
+ */
+
+/**
+ * @ngdoc method
+ * @name $httpBackend#whenJSONP
+ * @module ngMockE2E
+ * @description
+ * Creates a new backend definition for JSONP requests. For more info see `when()`.
+ *
+ * @param {string|RegExp|function(string)} url HTTP url or function that receives the url
+ * and returns true if the url match the current definition.
+ * @returns {requestHandler} Returns an object with `respond` and `passThrough` methods that
+ * control how a matched request is handled. You can save this object for later use and invoke
+ * `respond` or `passThrough` again in order to change how a matched request is handled.
+ */
+angular.mock.e2e = {};
+angular.mock.e2e.$httpBackendDecorator =
+ ['$rootScope', '$delegate', '$browser', createHttpBackendMock];
+
+
+/**
+ * @ngdoc type
+ * @name $rootScope.Scope
+ * @module ngMock
+ * @description
+ * {@link ng.$rootScope.Scope Scope} type decorated with helper methods useful for testing. These
+ * methods are automatically available on any {@link ng.$rootScope.Scope Scope} instance when
+ * `ngMock` module is loaded.
+ *
+ * In addition to all the regular `Scope` methods, the following helper methods are available:
+ */
+angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
+
+ var $rootScopePrototype = Object.getPrototypeOf($delegate);
+
+ $rootScopePrototype.$countChildScopes = countChildScopes;
+ $rootScopePrototype.$countWatchers = countWatchers;
+
+ return $delegate;
+
+ // ------------------------------------------------------------------------------------------ //
+
+ /**
+ * @ngdoc method
+ * @name $rootScope.Scope#$countChildScopes
+ * @module ngMock
+ * @description
+ * Counts all the direct and indirect child scopes of the current scope.
+ *
+ * The current scope is excluded from the count. The count includes all isolate child scopes.
+ *
+ * @returns {number} Total number of child scopes.
+ */
+ function countChildScopes() {
+ // jshint validthis: true
+ var count = 0; // exclude the current scope
+ var pendingChildHeads = [this.$$childHead];
+ var currentScope;
+
+ while (pendingChildHeads.length) {
+ currentScope = pendingChildHeads.shift();
+
+ while (currentScope) {
+ count += 1;
+ pendingChildHeads.push(currentScope.$$childHead);
+ currentScope = currentScope.$$nextSibling;
+ }
+ }
+
+ return count;
+ }
+
+
+ /**
+ * @ngdoc method
+ * @name $rootScope.Scope#$countWatchers
+ * @module ngMock
+ * @description
+ * Counts all the watchers of direct and indirect child scopes of the current scope.
+ *
+ * The watchers of the current scope are included in the count and so are all the watchers of
+ * isolate child scopes.
+ *
+ * @returns {number} Total number of watchers.
+ */
+ function countWatchers() {
+ // jshint validthis: true
+ var count = this.$$watchers ? this.$$watchers.length : 0; // include the current scope
+ var pendingChildHeads = [this.$$childHead];
+ var currentScope;
+
+ while (pendingChildHeads.length) {
+ currentScope = pendingChildHeads.shift();
+
+ while (currentScope) {
+ count += currentScope.$$watchers ? currentScope.$$watchers.length : 0;
+ pendingChildHeads.push(currentScope.$$childHead);
+ currentScope = currentScope.$$nextSibling;
+ }
+ }
+
+ return count;
+ }
+}];
+
+
+if (window.jasmine || window.mocha) {
+
+ var currentSpec = null,
+ isSpecRunning = function() {
+ return !!currentSpec;
+ };
+
+
+ (window.beforeEach || window.setup)(function() {
+ currentSpec = this;
+ });
+
+ (window.afterEach || window.teardown)(function() {
+ var injector = currentSpec.$injector;
+
+ angular.forEach(currentSpec.$modules, function(module) {
+ if (module && module.$$hashKey) {
+ module.$$hashKey = undefined;
+ }
+ });
+
+ currentSpec.$injector = null;
+ currentSpec.$modules = null;
+ currentSpec = null;
+
+ if (injector) {
+ injector.get('$rootElement').off();
+ injector.get('$browser').pollFns.length = 0;
+ }
+
+ // clean up jquery's fragment cache
+ angular.forEach(angular.element.fragments, function(val, key) {
+ delete angular.element.fragments[key];
+ });
+
+ MockXhr.$$lastInstance = null;
+
+ angular.forEach(angular.callbacks, function(val, key) {
+ delete angular.callbacks[key];
+ });
+ angular.callbacks.counter = 0;
+ });
+
+ /**
+ * @ngdoc function
+ * @name angular.mock.module
+ * @description
+ *
+ * *NOTE*: This function is also published on window for easy access.<br>
+ * *NOTE*: This function is declared ONLY WHEN running tests with jasmine or mocha
+ *
+ * This function registers a module configuration code. It collects the configuration information
+ * which will be used when the injector is created by {@link angular.mock.inject inject}.
+ *
+ * See {@link angular.mock.inject inject} for usage example
+ *
+ * @param {...(string|Function|Object)} fns any number of modules which are represented as string
+ * aliases or as anonymous module initialization functions. The modules are used to
+ * configure the injector. The 'ng' and 'ngMock' modules are automatically loaded. If an
+ * object literal is passed they will be registered as values in the module, the key being
+ * the module name and the value being what is returned.
+ */
+ window.module = angular.mock.module = function() {
+ var moduleFns = Array.prototype.slice.call(arguments, 0);
+ return isSpecRunning() ? workFn() : workFn;
+ /////////////////////
+ function workFn() {
+ if (currentSpec.$injector) {
+ throw new Error('Injector already created, can not register a module!');
+ } else {
+ var modules = currentSpec.$modules || (currentSpec.$modules = []);
+ angular.forEach(moduleFns, function(module) {
+ if (angular.isObject(module) && !angular.isArray(module)) {
+ modules.push(function($provide) {
+ angular.forEach(module, function(value, key) {
+ $provide.value(key, value);
+ });
+ });
+ } else {
+ modules.push(module);
+ }
+ });
+ }
+ }
+ };
+
+ /**
+ * @ngdoc function
+ * @name angular.mock.inject
+ * @description
+ *
+ * *NOTE*: This function is also published on window for easy access.<br>
+ * *NOTE*: This function is declared ONLY WHEN running tests with jasmine or mocha
+ *
+ * The inject function wraps a function into an injectable function. The inject() creates new
+ * instance of {@link auto.$injector $injector} per test, which is then used for
+ * resolving references.
+ *
+ *
+ * ## Resolving References (Underscore Wrapping)
+ * Often, we would like to inject a reference once, in a `beforeEach()` block and reuse this
+ * in multiple `it()` clauses. To be able to do this we must assign the reference to a variable
+ * that is declared in the scope of the `describe()` block. Since we would, most likely, want
+ * the variable to have the same name of the reference we have a problem, since the parameter
+ * to the `inject()` function would hide the outer variable.
+ *
+ * To help with this, the injected parameters can, optionally, be enclosed with underscores.
+ * These are ignored by the injector when the reference name is resolved.
+ *
+ * For example, the parameter `_myService_` would be resolved as the reference `myService`.
+ * Since it is available in the function body as _myService_, we can then assign it to a variable
+ * defined in an outer scope.
+ *
+ * ```
+ * // Defined out reference variable outside
+ * var myService;
+ *
+ * // Wrap the parameter in underscores
+ * beforeEach( inject( function(_myService_){
+ * myService = _myService_;
+ * }));
+ *
+ * // Use myService in a series of tests.
+ * it('makes use of myService', function() {
+ * myService.doStuff();
+ * });
+ *
+ * ```
+ *
+ * See also {@link angular.mock.module angular.mock.module}
+ *
+ * ## Example
+ * Example of what a typical jasmine tests looks like with the inject method.
+ * ```js
+ *
+ * angular.module('myApplicationModule', [])
+ * .value('mode', 'app')
+ * .value('version', 'v1.0.1');
+ *
+ *
+ * describe('MyApp', function() {
+ *
+ * // You need to load modules that you want to test,
+ * // it loads only the "ng" module by default.
+ * beforeEach(module('myApplicationModule'));
+ *
+ *
+ * // inject() is used to inject arguments of all given functions
+ * it('should provide a version', inject(function(mode, version) {
+ * expect(version).toEqual('v1.0.1');
+ * expect(mode).toEqual('app');
+ * }));
+ *
+ *
+ * // The inject and module method can also be used inside of the it or beforeEach
+ * it('should override a version and test the new version is injected', function() {
+ * // module() takes functions or strings (module aliases)
+ * module(function($provide) {
+ * $provide.value('version', 'overridden'); // override version here
+ * });
+ *
+ * inject(function(version) {
+ * expect(version).toEqual('overridden');
+ * });
+ * });
+ * });
+ *
+ * ```
+ *
+ * @param {...Function} fns any number of functions which will be injected using the injector.
+ */
+
+
+
+ var ErrorAddingDeclarationLocationStack = function(e, errorForStack) {
+ this.message = e.message;
+ this.name = e.name;
+ if (e.line) this.line = e.line;
+ if (e.sourceId) this.sourceId = e.sourceId;
+ if (e.stack && errorForStack)
+ this.stack = e.stack + '\n' + errorForStack.stack;
+ if (e.stackArray) this.stackArray = e.stackArray;
+ };
+ ErrorAddingDeclarationLocationStack.prototype.toString = Error.prototype.toString;
+
+ window.inject = angular.mock.inject = function() {
+ var blockFns = Array.prototype.slice.call(arguments, 0);
+ var errorForStack = new Error('Declaration Location');
+ return isSpecRunning() ? workFn.call(currentSpec) : workFn;
+ /////////////////////
+ function workFn() {
+ var modules = currentSpec.$modules || [];
+ var strictDi = !!currentSpec.$injectorStrict;
+ modules.unshift('ngMock');
+ modules.unshift('ng');
+ var injector = currentSpec.$injector;
+ if (!injector) {
+ if (strictDi) {
+ // If strictDi is enabled, annotate the providerInjector blocks
+ angular.forEach(modules, function(moduleFn) {
+ if (typeof moduleFn === "function") {
+ angular.injector.$$annotate(moduleFn);
+ }
+ });
+ }
+ injector = currentSpec.$injector = angular.injector(modules, strictDi);
+ currentSpec.$injectorStrict = strictDi;
+ }
+ for (var i = 0, ii = blockFns.length; i < ii; i++) {
+ if (currentSpec.$injectorStrict) {
+ // If the injector is strict / strictDi, and the spec wants to inject using automatic
+ // annotation, then annotate the function here.
+ injector.annotate(blockFns[i]);
+ }
+ try {
+ /* jshint -W040 *//* Jasmine explicitly provides a `this` object when calling functions */
+ injector.invoke(blockFns[i] || angular.noop, this);
+ /* jshint +W040 */
+ } catch (e) {
+ if (e.stack && errorForStack) {
+ throw new ErrorAddingDeclarationLocationStack(e, errorForStack);
+ }
+ throw e;
+ } finally {
+ errorForStack = null;
+ }
+ }
+ }
+ };
+
+
+ angular.mock.inject.strictDi = function(value) {
+ value = arguments.length ? !!value : true;
+ return isSpecRunning() ? workFn() : workFn;
+
+ function workFn() {
+ if (value !== currentSpec.$injectorStrict) {
+ if (currentSpec.$injector) {
+ throw new Error('Injector already created, can not modify strict annotations');
+ } else {
+ currentSpec.$injectorStrict = value;
+ }
+ }
+ }
+ };
+}
+
+
+})(window, window.angular);
diff --git a/framework/src/onos/web/gui/src/main/webapp/tp/angular-route.js b/framework/src/onos/web/gui/src/main/webapp/tp/angular-route.js
new file mode 100644
index 00000000..2959c50b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tp/angular-route.js
@@ -0,0 +1,996 @@
+/**
+ * @license AngularJS v1.3.5
+ * (c) 2010-2014 Google, Inc. http://angularjs.org
+ * License: MIT
+ */
+(function(window, angular, undefined) {'use strict';
+
+/**
+ * @ngdoc module
+ * @name ngRoute
+ * @description
+ *
+ * # ngRoute
+ *
+ * The `ngRoute` module provides routing and deeplinking services and directives for angular apps.
+ *
+ * ## Example
+ * See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`.
+ *
+ *
+ * <div doc-module-components="ngRoute"></div>
+ */
+ /* global -ngRouteModule */
+var ngRouteModule = angular.module('ngRoute', ['ng']).
+ provider('$route', $RouteProvider),
+ $routeMinErr = angular.$$minErr('ngRoute');
+
+/**
+ * @ngdoc provider
+ * @name $routeProvider
+ *
+ * @description
+ *
+ * Used for configuring routes.
+ *
+ * ## Example
+ * See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`.
+ *
+ * ## Dependencies
+ * Requires the {@link ngRoute `ngRoute`} module to be installed.
+ */
+function $RouteProvider() {
+ function inherit(parent, extra) {
+ return angular.extend(Object.create(parent), extra);
+ }
+
+ var routes = {};
+
+ /**
+ * @ngdoc method
+ * @name $routeProvider#when
+ *
+ * @param {string} path Route path (matched against `$location.path`). If `$location.path`
+ * contains redundant trailing slash or is missing one, the route will still match and the
+ * `$location.path` will be updated to add or drop the trailing slash to exactly match the
+ * route definition.
+ *
+ * * `path` can contain named groups starting with a colon: e.g. `:name`. All characters up
+ * to the next slash are matched and stored in `$routeParams` under the given `name`
+ * when the route matches.
+ * * `path` can contain named groups starting with a colon and ending with a star:
+ * e.g.`:name*`. All characters are eagerly stored in `$routeParams` under the given `name`
+ * when the route matches.
+ * * `path` can contain optional named groups with a question mark: e.g.`:name?`.
+ *
+ * For example, routes like `/color/:color/largecode/:largecode*\/edit` will match
+ * `/color/brown/largecode/code/with/slashes/edit` and extract:
+ *
+ * * `color: brown`
+ * * `largecode: code/with/slashes`.
+ *
+ *
+ * @param {Object} route Mapping information to be assigned to `$route.current` on route
+ * match.
+ *
+ * Object properties:
+ *
+ * - `controller` – `{(string|function()=}` – Controller fn that should be associated with
+ * newly created scope or the name of a {@link angular.Module#controller registered
+ * controller} if passed as a string.
+ * - `controllerAs` – `{string=}` – A controller alias name. If present the controller will be
+ * published to scope under the `controllerAs` name.
+ * - `template` – `{string=|function()=}` – html template as a string or a function that
+ * returns an html template as a string which should be used by {@link
+ * ngRoute.directive:ngView ngView} or {@link ng.directive:ngInclude ngInclude} directives.
+ * This property takes precedence over `templateUrl`.
+ *
+ * If `template` is a function, it will be called with the following parameters:
+ *
+ * - `{Array.<Object>}` - route parameters extracted from the current
+ * `$location.path()` by applying the current route
+ *
+ * - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html
+ * template that should be used by {@link ngRoute.directive:ngView ngView}.
+ *
+ * If `templateUrl` is a function, it will be called with the following parameters:
+ *
+ * - `{Array.<Object>}` - route parameters extracted from the current
+ * `$location.path()` by applying the current route
+ *
+ * - `resolve` - `{Object.<string, function>=}` - An optional map of dependencies which should
+ * be injected into the controller. If any of these dependencies are promises, the router
+ * will wait for them all to be resolved or one to be rejected before the controller is
+ * instantiated.
+ * If all the promises are resolved successfully, the values of the resolved promises are
+ * injected and {@link ngRoute.$route#$routeChangeSuccess $routeChangeSuccess} event is
+ * fired. If any of the promises are rejected the
+ * {@link ngRoute.$route#$routeChangeError $routeChangeError} event is fired. The map object
+ * is:
+ *
+ * - `key` – `{string}`: a name of a dependency to be injected into the controller.
+ * - `factory` - `{string|function}`: If `string` then it is an alias for a service.
+ * Otherwise if function, then it is {@link auto.$injector#invoke injected}
+ * and the return value is treated as the dependency. If the result is a promise, it is
+ * resolved before its value is injected into the controller. Be aware that
+ * `ngRoute.$routeParams` will still refer to the previous route within these resolve
+ * functions. Use `$route.current.params` to access the new route parameters, instead.
+ *
+ * - `redirectTo` – {(string|function())=} – value to update
+ * {@link ng.$location $location} path with and trigger route redirection.
+ *
+ * If `redirectTo` is a function, it will be called with the following parameters:
+ *
+ * - `{Object.<string>}` - route parameters extracted from the current
+ * `$location.path()` by applying the current route templateUrl.
+ * - `{string}` - current `$location.path()`
+ * - `{Object}` - current `$location.search()`
+ *
+ * The custom `redirectTo` function is expected to return a string which will be used
+ * to update `$location.path()` and `$location.search()`.
+ *
+ * - `[reloadOnSearch=true]` - {boolean=} - reload route when only `$location.search()`
+ * or `$location.hash()` changes.
+ *
+ * If the option is set to `false` and url in the browser changes, then
+ * `$routeUpdate` event is broadcasted on the root scope.
+ *
+ * - `[caseInsensitiveMatch=false]` - {boolean=} - match routes without being case sensitive
+ *
+ * If the option is set to `true`, then the particular route can be matched without being
+ * case sensitive
+ *
+ * @returns {Object} self
+ *
+ * @description
+ * Adds a new route definition to the `$route` service.
+ */
+ this.when = function(path, route) {
+ //copy original route object to preserve params inherited from proto chain
+ var routeCopy = angular.copy(route);
+ if (angular.isUndefined(routeCopy.reloadOnSearch)) {
+ routeCopy.reloadOnSearch = true;
+ }
+ if (angular.isUndefined(routeCopy.caseInsensitiveMatch)) {
+ routeCopy.caseInsensitiveMatch = this.caseInsensitiveMatch;
+ }
+ routes[path] = angular.extend(
+ routeCopy,
+ path && pathRegExp(path, routeCopy)
+ );
+
+ // create redirection for trailing slashes
+ if (path) {
+ var redirectPath = (path[path.length - 1] == '/')
+ ? path.substr(0, path.length - 1)
+ : path + '/';
+
+ routes[redirectPath] = angular.extend(
+ {redirectTo: path},
+ pathRegExp(redirectPath, routeCopy)
+ );
+ }
+
+ return this;
+ };
+
+ /**
+ * @ngdoc property
+ * @name $routeProvider#caseInsensitiveMatch
+ * @description
+ *
+ * A boolean property indicating if routes defined
+ * using this provider should be matched using a case insensitive
+ * algorithm. Defaults to `false`.
+ */
+ this.caseInsensitiveMatch = false;
+
+ /**
+ * @param path {string} path
+ * @param opts {Object} options
+ * @return {?Object}
+ *
+ * @description
+ * Normalizes the given path, returning a regular expression
+ * and the original path.
+ *
+ * Inspired by pathRexp in visionmedia/express/lib/utils.js.
+ */
+ function pathRegExp(path, opts) {
+ var insensitive = opts.caseInsensitiveMatch,
+ ret = {
+ originalPath: path,
+ regexp: path
+ },
+ keys = ret.keys = [];
+
+ path = path
+ .replace(/([().])/g, '\\$1')
+ .replace(/(\/)?:(\w+)([\?\*])?/g, function(_, slash, key, option) {
+ var optional = option === '?' ? option : null;
+ var star = option === '*' ? option : null;
+ keys.push({ name: key, optional: !!optional });
+ slash = slash || '';
+ return ''
+ + (optional ? '' : slash)
+ + '(?:'
+ + (optional ? slash : '')
+ + (star && '(.+?)' || '([^/]+)')
+ + (optional || '')
+ + ')'
+ + (optional || '');
+ })
+ .replace(/([\/$\*])/g, '\\$1');
+
+ ret.regexp = new RegExp('^' + path + '$', insensitive ? 'i' : '');
+ return ret;
+ }
+
+ /**
+ * @ngdoc method
+ * @name $routeProvider#otherwise
+ *
+ * @description
+ * Sets route definition that will be used on route change when no other route definition
+ * is matched.
+ *
+ * @param {Object|string} params Mapping information to be assigned to `$route.current`.
+ * If called with a string, the value maps to `redirectTo`.
+ * @returns {Object} self
+ */
+ this.otherwise = function(params) {
+ if (typeof params === 'string') {
+ params = {redirectTo: params};
+ }
+ this.when(null, params);
+ return this;
+ };
+
+
+ this.$get = ['$rootScope',
+ '$location',
+ '$routeParams',
+ '$q',
+ '$injector',
+ '$templateRequest',
+ '$sce',
+ function($rootScope, $location, $routeParams, $q, $injector, $templateRequest, $sce) {
+
+ /**
+ * @ngdoc service
+ * @name $route
+ * @requires $location
+ * @requires $routeParams
+ *
+ * @property {Object} current Reference to the current route definition.
+ * The route definition contains:
+ *
+ * - `controller`: The controller constructor as define in route definition.
+ * - `locals`: A map of locals which is used by {@link ng.$controller $controller} service for
+ * controller instantiation. The `locals` contain
+ * the resolved values of the `resolve` map. Additionally the `locals` also contain:
+ *
+ * - `$scope` - The current route scope.
+ * - `$template` - The current route template HTML.
+ *
+ * @property {Object} routes Object with all route configuration Objects as its properties.
+ *
+ * @description
+ * `$route` is used for deep-linking URLs to controllers and views (HTML partials).
+ * It watches `$location.url()` and tries to map the path to an existing route definition.
+ *
+ * Requires the {@link ngRoute `ngRoute`} module to be installed.
+ *
+ * You can define routes through {@link ngRoute.$routeProvider $routeProvider}'s API.
+ *
+ * The `$route` service is typically used in conjunction with the
+ * {@link ngRoute.directive:ngView `ngView`} directive and the
+ * {@link ngRoute.$routeParams `$routeParams`} service.
+ *
+ * @example
+ * This example shows how changing the URL hash causes the `$route` to match a route against the
+ * URL, and the `ngView` pulls in the partial.
+ *
+ * <example name="$route-service" module="ngRouteExample"
+ * deps="angular-route.js" fixBase="true">
+ * <file name="index.html">
+ * <div ng-controller="MainController">
+ * Choose:
+ * <a href="Book/Moby">Moby</a> |
+ * <a href="Book/Moby/ch/1">Moby: Ch1</a> |
+ * <a href="Book/Gatsby">Gatsby</a> |
+ * <a href="Book/Gatsby/ch/4?key=value">Gatsby: Ch4</a> |
+ * <a href="Book/Scarlet">Scarlet Letter</a><br/>
+ *
+ * <div ng-view></div>
+ *
+ * <hr />
+ *
+ * <pre>$location.path() = {{$location.path()}}</pre>
+ * <pre>$route.current.templateUrl = {{$route.current.templateUrl}}</pre>
+ * <pre>$route.current.params = {{$route.current.params}}</pre>
+ * <pre>$route.current.scope.name = {{$route.current.scope.name}}</pre>
+ * <pre>$routeParams = {{$routeParams}}</pre>
+ * </div>
+ * </file>
+ *
+ * <file name="book.html">
+ * controller: {{name}}<br />
+ * Book Id: {{params.bookId}}<br />
+ * </file>
+ *
+ * <file name="chapter.html">
+ * controller: {{name}}<br />
+ * Book Id: {{params.bookId}}<br />
+ * Chapter Id: {{params.chapterId}}
+ * </file>
+ *
+ * <file name="script.js">
+ * angular.module('ngRouteExample', ['ngRoute'])
+ *
+ * .controller('MainController', function($scope, $route, $routeParams, $location) {
+ * $scope.$route = $route;
+ * $scope.$location = $location;
+ * $scope.$routeParams = $routeParams;
+ * })
+ *
+ * .controller('BookController', function($scope, $routeParams) {
+ * $scope.name = "BookController";
+ * $scope.params = $routeParams;
+ * })
+ *
+ * .controller('ChapterController', function($scope, $routeParams) {
+ * $scope.name = "ChapterController";
+ * $scope.params = $routeParams;
+ * })
+ *
+ * .config(function($routeProvider, $locationProvider) {
+ * $routeProvider
+ * .when('/Book/:bookId', {
+ * templateUrl: 'book.html',
+ * controller: 'BookController',
+ * resolve: {
+ * // I will cause a 1 second delay
+ * delay: function($q, $timeout) {
+ * var delay = $q.defer();
+ * $timeout(delay.resolve, 1000);
+ * return delay.promise;
+ * }
+ * }
+ * })
+ * .when('/Book/:bookId/ch/:chapterId', {
+ * templateUrl: 'chapter.html',
+ * controller: 'ChapterController'
+ * });
+ *
+ * // configure html5 to get links working on jsfiddle
+ * $locationProvider.html5Mode(true);
+ * });
+ *
+ * </file>
+ *
+ * <file name="protractor.js" type="protractor">
+ * it('should load and compile correct template', function() {
+ * element(by.linkText('Moby: Ch1')).click();
+ * var content = element(by.css('[ng-view]')).getText();
+ * expect(content).toMatch(/controller\: ChapterController/);
+ * expect(content).toMatch(/Book Id\: Moby/);
+ * expect(content).toMatch(/Chapter Id\: 1/);
+ *
+ * element(by.partialLinkText('Scarlet')).click();
+ *
+ * content = element(by.css('[ng-view]')).getText();
+ * expect(content).toMatch(/controller\: BookController/);
+ * expect(content).toMatch(/Book Id\: Scarlet/);
+ * });
+ * </file>
+ * </example>
+ */
+
+ /**
+ * @ngdoc event
+ * @name $route#$routeChangeStart
+ * @eventType broadcast on root scope
+ * @description
+ * Broadcasted before a route change. At this point the route services starts
+ * resolving all of the dependencies needed for the route change to occur.
+ * Typically this involves fetching the view template as well as any dependencies
+ * defined in `resolve` route property. Once all of the dependencies are resolved
+ * `$routeChangeSuccess` is fired.
+ *
+ * The route change (and the `$location` change that triggered it) can be prevented
+ * by calling `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on}
+ * for more details about event object.
+ *
+ * @param {Object} angularEvent Synthetic event object.
+ * @param {Route} next Future route information.
+ * @param {Route} current Current route information.
+ */
+
+ /**
+ * @ngdoc event
+ * @name $route#$routeChangeSuccess
+ * @eventType broadcast on root scope
+ * @description
+ * Broadcasted after a route dependencies are resolved.
+ * {@link ngRoute.directive:ngView ngView} listens for the directive
+ * to instantiate the controller and render the view.
+ *
+ * @param {Object} angularEvent Synthetic event object.
+ * @param {Route} current Current route information.
+ * @param {Route|Undefined} previous Previous route information, or undefined if current is
+ * first route entered.
+ */
+
+ /**
+ * @ngdoc event
+ * @name $route#$routeChangeError
+ * @eventType broadcast on root scope
+ * @description
+ * Broadcasted if any of the resolve promises are rejected.
+ *
+ * @param {Object} angularEvent Synthetic event object
+ * @param {Route} current Current route information.
+ * @param {Route} previous Previous route information.
+ * @param {Route} rejection Rejection of the promise. Usually the error of the failed promise.
+ */
+
+ /**
+ * @ngdoc event
+ * @name $route#$routeUpdate
+ * @eventType broadcast on root scope
+ * @description
+ *
+ * The `reloadOnSearch` property has been set to false, and we are reusing the same
+ * instance of the Controller.
+ */
+
+ var forceReload = false,
+ preparedRoute,
+ preparedRouteIsUpdateOnly,
+ $route = {
+ routes: routes,
+
+ /**
+ * @ngdoc method
+ * @name $route#reload
+ *
+ * @description
+ * Causes `$route` service to reload the current route even if
+ * {@link ng.$location $location} hasn't changed.
+ *
+ * As a result of that, {@link ngRoute.directive:ngView ngView}
+ * creates new scope and reinstantiates the controller.
+ */
+ reload: function() {
+ forceReload = true;
+ $rootScope.$evalAsync(function() {
+ // Don't support cancellation of a reload for now...
+ prepareRoute();
+ commitRoute();
+ });
+ },
+
+ /**
+ * @ngdoc method
+ * @name $route#updateParams
+ *
+ * @description
+ * Causes `$route` service to update the current URL, replacing
+ * current route parameters with those specified in `newParams`.
+ * Provided property names that match the route's path segment
+ * definitions will be interpolated into the location's path, while
+ * remaining properties will be treated as query params.
+ *
+ * @param {Object} newParams mapping of URL parameter names to values
+ */
+ updateParams: function(newParams) {
+ if (this.current && this.current.$$route) {
+ var searchParams = {}, self=this;
+
+ angular.forEach(Object.keys(newParams), function(key) {
+ if (!self.current.pathParams[key]) searchParams[key] = newParams[key];
+ });
+
+ newParams = angular.extend({}, this.current.params, newParams);
+ $location.path(interpolate(this.current.$$route.originalPath, newParams));
+ $location.search(angular.extend({}, $location.search(), searchParams));
+ }
+ else {
+ throw $routeMinErr('norout', 'Tried updating route when with no current route');
+ }
+ }
+ };
+
+ $rootScope.$on('$locationChangeStart', prepareRoute);
+ $rootScope.$on('$locationChangeSuccess', commitRoute);
+
+ return $route;
+
+ /////////////////////////////////////////////////////
+
+ /**
+ * @param on {string} current url
+ * @param route {Object} route regexp to match the url against
+ * @return {?Object}
+ *
+ * @description
+ * Check if the route matches the current url.
+ *
+ * Inspired by match in
+ * visionmedia/express/lib/router/router.js.
+ */
+ function switchRouteMatcher(on, route) {
+ var keys = route.keys,
+ params = {};
+
+ if (!route.regexp) return null;
+
+ var m = route.regexp.exec(on);
+ if (!m) return null;
+
+ for (var i = 1, len = m.length; i < len; ++i) {
+ var key = keys[i - 1];
+
+ var val = m[i];
+
+ if (key && val) {
+ params[key.name] = val;
+ }
+ }
+ return params;
+ }
+
+ function prepareRoute($locationEvent) {
+ var lastRoute = $route.current;
+
+ preparedRoute = parseRoute();
+ preparedRouteIsUpdateOnly = preparedRoute && lastRoute && preparedRoute.$$route === lastRoute.$$route
+ && angular.equals(preparedRoute.pathParams, lastRoute.pathParams)
+ && !preparedRoute.reloadOnSearch && !forceReload;
+
+ if (!preparedRouteIsUpdateOnly && (lastRoute || preparedRoute)) {
+ if ($rootScope.$broadcast('$routeChangeStart', preparedRoute, lastRoute).defaultPrevented) {
+ if ($locationEvent) {
+ $locationEvent.preventDefault();
+ }
+ }
+ }
+ }
+
+ function commitRoute() {
+ var lastRoute = $route.current;
+ var nextRoute = preparedRoute;
+
+ if (preparedRouteIsUpdateOnly) {
+ lastRoute.params = nextRoute.params;
+ angular.copy(lastRoute.params, $routeParams);
+ $rootScope.$broadcast('$routeUpdate', lastRoute);
+ } else if (nextRoute || lastRoute) {
+ forceReload = false;
+ $route.current = nextRoute;
+ if (nextRoute) {
+ if (nextRoute.redirectTo) {
+ if (angular.isString(nextRoute.redirectTo)) {
+ $location.path(interpolate(nextRoute.redirectTo, nextRoute.params)).search(nextRoute.params)
+ .replace();
+ } else {
+ $location.url(nextRoute.redirectTo(nextRoute.pathParams, $location.path(), $location.search()))
+ .replace();
+ }
+ }
+ }
+
+ $q.when(nextRoute).
+ then(function() {
+ if (nextRoute) {
+ var locals = angular.extend({}, nextRoute.resolve),
+ template, templateUrl;
+
+ angular.forEach(locals, function(value, key) {
+ locals[key] = angular.isString(value) ?
+ $injector.get(value) : $injector.invoke(value, null, null, key);
+ });
+
+ if (angular.isDefined(template = nextRoute.template)) {
+ if (angular.isFunction(template)) {
+ template = template(nextRoute.params);
+ }
+ } else if (angular.isDefined(templateUrl = nextRoute.templateUrl)) {
+ if (angular.isFunction(templateUrl)) {
+ templateUrl = templateUrl(nextRoute.params);
+ }
+ templateUrl = $sce.getTrustedResourceUrl(templateUrl);
+ if (angular.isDefined(templateUrl)) {
+ nextRoute.loadedTemplateUrl = templateUrl;
+ template = $templateRequest(templateUrl);
+ }
+ }
+ if (angular.isDefined(template)) {
+ locals['$template'] = template;
+ }
+ return $q.all(locals);
+ }
+ }).
+ // after route change
+ then(function(locals) {
+ if (nextRoute == $route.current) {
+ if (nextRoute) {
+ nextRoute.locals = locals;
+ angular.copy(nextRoute.params, $routeParams);
+ }
+ $rootScope.$broadcast('$routeChangeSuccess', nextRoute, lastRoute);
+ }
+ }, function(error) {
+ if (nextRoute == $route.current) {
+ $rootScope.$broadcast('$routeChangeError', nextRoute, lastRoute, error);
+ }
+ });
+ }
+ }
+
+
+ /**
+ * @returns {Object} the current active route, by matching it against the URL
+ */
+ function parseRoute() {
+ // Match a route
+ var params, match;
+ angular.forEach(routes, function(route, path) {
+ if (!match && (params = switchRouteMatcher($location.path(), route))) {
+ match = inherit(route, {
+ params: angular.extend({}, $location.search(), params),
+ pathParams: params});
+ match.$$route = route;
+ }
+ });
+ // No route matched; fallback to "otherwise" route
+ return match || routes[null] && inherit(routes[null], {params: {}, pathParams:{}});
+ }
+
+ /**
+ * @returns {string} interpolation of the redirect path with the parameters
+ */
+ function interpolate(string, params) {
+ var result = [];
+ angular.forEach((string || '').split(':'), function(segment, i) {
+ if (i === 0) {
+ result.push(segment);
+ } else {
+ var segmentMatch = segment.match(/(\w+)(?:[?*])?(.*)/);
+ var key = segmentMatch[1];
+ result.push(params[key]);
+ result.push(segmentMatch[2] || '');
+ delete params[key];
+ }
+ });
+ return result.join('');
+ }
+ }];
+}
+
+ngRouteModule.provider('$routeParams', $RouteParamsProvider);
+
+
+/**
+ * @ngdoc service
+ * @name $routeParams
+ * @requires $route
+ *
+ * @description
+ * The `$routeParams` service allows you to retrieve the current set of route parameters.
+ *
+ * Requires the {@link ngRoute `ngRoute`} module to be installed.
+ *
+ * The route parameters are a combination of {@link ng.$location `$location`}'s
+ * {@link ng.$location#search `search()`} and {@link ng.$location#path `path()`}.
+ * The `path` parameters are extracted when the {@link ngRoute.$route `$route`} path is matched.
+ *
+ * In case of parameter name collision, `path` params take precedence over `search` params.
+ *
+ * The service guarantees that the identity of the `$routeParams` object will remain unchanged
+ * (but its properties will likely change) even when a route change occurs.
+ *
+ * Note that the `$routeParams` are only updated *after* a route change completes successfully.
+ * This means that you cannot rely on `$routeParams` being correct in route resolve functions.
+ * Instead you can use `$route.current.params` to access the new route's parameters.
+ *
+ * @example
+ * ```js
+ * // Given:
+ * // URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby
+ * // Route: /Chapter/:chapterId/Section/:sectionId
+ * //
+ * // Then
+ * $routeParams ==> {chapterId:'1', sectionId:'2', search:'moby'}
+ * ```
+ */
+function $RouteParamsProvider() {
+ this.$get = function() { return {}; };
+}
+
+ngRouteModule.directive('ngView', ngViewFactory);
+ngRouteModule.directive('ngView', ngViewFillContentFactory);
+
+
+/**
+ * @ngdoc directive
+ * @name ngView
+ * @restrict ECA
+ *
+ * @description
+ * # Overview
+ * `ngView` is a directive that complements the {@link ngRoute.$route $route} service by
+ * including the rendered template of the current route into the main layout (`index.html`) file.
+ * Every time the current route changes, the included view changes with it according to the
+ * configuration of the `$route` service.
+ *
+ * Requires the {@link ngRoute `ngRoute`} module to be installed.
+ *
+ * @animations
+ * enter - animation is used to bring new content into the browser.
+ * leave - animation is used to animate existing content away.
+ *
+ * The enter and leave animation occur concurrently.
+ *
+ * @scope
+ * @priority 400
+ * @param {string=} onload Expression to evaluate whenever the view updates.
+ *
+ * @param {string=} autoscroll Whether `ngView` should call {@link ng.$anchorScroll
+ * $anchorScroll} to scroll the viewport after the view is updated.
+ *
+ * - If the attribute is not set, disable scrolling.
+ * - If the attribute is set without value, enable scrolling.
+ * - Otherwise enable scrolling only if the `autoscroll` attribute value evaluated
+ * as an expression yields a truthy value.
+ * @example
+ <example name="ngView-directive" module="ngViewExample"
+ deps="angular-route.js;angular-animate.js"
+ animations="true" fixBase="true">
+ <file name="index.html">
+ <div ng-controller="MainCtrl as main">
+ Choose:
+ <a href="Book/Moby">Moby</a> |
+ <a href="Book/Moby/ch/1">Moby: Ch1</a> |
+ <a href="Book/Gatsby">Gatsby</a> |
+ <a href="Book/Gatsby/ch/4?key=value">Gatsby: Ch4</a> |
+ <a href="Book/Scarlet">Scarlet Letter</a><br/>
+
+ <div class="view-animate-container">
+ <div ng-view class="view-animate"></div>
+ </div>
+ <hr />
+
+ <pre>$location.path() = {{main.$location.path()}}</pre>
+ <pre>$route.current.templateUrl = {{main.$route.current.templateUrl}}</pre>
+ <pre>$route.current.params = {{main.$route.current.params}}</pre>
+ <pre>$routeParams = {{main.$routeParams}}</pre>
+ </div>
+ </file>
+
+ <file name="book.html">
+ <div>
+ controller: {{book.name}}<br />
+ Book Id: {{book.params.bookId}}<br />
+ </div>
+ </file>
+
+ <file name="chapter.html">
+ <div>
+ controller: {{chapter.name}}<br />
+ Book Id: {{chapter.params.bookId}}<br />
+ Chapter Id: {{chapter.params.chapterId}}
+ </div>
+ </file>
+
+ <file name="animations.css">
+ .view-animate-container {
+ position:relative;
+ height:100px!important;
+ position:relative;
+ background:white;
+ border:1px solid black;
+ height:40px;
+ overflow:hidden;
+ }
+
+ .view-animate {
+ padding:10px;
+ }
+
+ .view-animate.ng-enter, .view-animate.ng-leave {
+ -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;
+ transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;
+
+ display:block;
+ width:100%;
+ border-left:1px solid black;
+
+ position:absolute;
+ top:0;
+ left:0;
+ right:0;
+ bottom:0;
+ padding:10px;
+ }
+
+ .view-animate.ng-enter {
+ left:100%;
+ }
+ .view-animate.ng-enter.ng-enter-active {
+ left:0;
+ }
+ .view-animate.ng-leave.ng-leave-active {
+ left:-100%;
+ }
+ </file>
+
+ <file name="script.js">
+ angular.module('ngViewExample', ['ngRoute', 'ngAnimate'])
+ .config(['$routeProvider', '$locationProvider',
+ function($routeProvider, $locationProvider) {
+ $routeProvider
+ .when('/Book/:bookId', {
+ templateUrl: 'book.html',
+ controller: 'BookCtrl',
+ controllerAs: 'book'
+ })
+ .when('/Book/:bookId/ch/:chapterId', {
+ templateUrl: 'chapter.html',
+ controller: 'ChapterCtrl',
+ controllerAs: 'chapter'
+ });
+
+ $locationProvider.html5Mode(true);
+ }])
+ .controller('MainCtrl', ['$route', '$routeParams', '$location',
+ function($route, $routeParams, $location) {
+ this.$route = $route;
+ this.$location = $location;
+ this.$routeParams = $routeParams;
+ }])
+ .controller('BookCtrl', ['$routeParams', function($routeParams) {
+ this.name = "BookCtrl";
+ this.params = $routeParams;
+ }])
+ .controller('ChapterCtrl', ['$routeParams', function($routeParams) {
+ this.name = "ChapterCtrl";
+ this.params = $routeParams;
+ }]);
+
+ </file>
+
+ <file name="protractor.js" type="protractor">
+ it('should load and compile correct template', function() {
+ element(by.linkText('Moby: Ch1')).click();
+ var content = element(by.css('[ng-view]')).getText();
+ expect(content).toMatch(/controller\: ChapterCtrl/);
+ expect(content).toMatch(/Book Id\: Moby/);
+ expect(content).toMatch(/Chapter Id\: 1/);
+
+ element(by.partialLinkText('Scarlet')).click();
+
+ content = element(by.css('[ng-view]')).getText();
+ expect(content).toMatch(/controller\: BookCtrl/);
+ expect(content).toMatch(/Book Id\: Scarlet/);
+ });
+ </file>
+ </example>
+ */
+
+
+/**
+ * @ngdoc event
+ * @name ngView#$viewContentLoaded
+ * @eventType emit on the current ngView scope
+ * @description
+ * Emitted every time the ngView content is reloaded.
+ */
+ngViewFactory.$inject = ['$route', '$anchorScroll', '$animate'];
+function ngViewFactory($route, $anchorScroll, $animate) {
+ return {
+ restrict: 'ECA',
+ terminal: true,
+ priority: 400,
+ transclude: 'element',
+ link: function(scope, $element, attr, ctrl, $transclude) {
+ var currentScope,
+ currentElement,
+ previousLeaveAnimation,
+ autoScrollExp = attr.autoscroll,
+ onloadExp = attr.onload || '';
+
+ scope.$on('$routeChangeSuccess', update);
+ update();
+
+ function cleanupLastView() {
+ if (previousLeaveAnimation) {
+ $animate.cancel(previousLeaveAnimation);
+ previousLeaveAnimation = null;
+ }
+
+ if (currentScope) {
+ currentScope.$destroy();
+ currentScope = null;
+ }
+ if (currentElement) {
+ previousLeaveAnimation = $animate.leave(currentElement);
+ previousLeaveAnimation.then(function() {
+ previousLeaveAnimation = null;
+ });
+ currentElement = null;
+ }
+ }
+
+ function update() {
+ var locals = $route.current && $route.current.locals,
+ template = locals && locals.$template;
+
+ if (angular.isDefined(template)) {
+ var newScope = scope.$new();
+ var current = $route.current;
+
+ // Note: This will also link all children of ng-view that were contained in the original
+ // html. If that content contains controllers, ... they could pollute/change the scope.
+ // However, using ng-view on an element with additional content does not make sense...
+ // Note: We can't remove them in the cloneAttchFn of $transclude as that
+ // function is called before linking the content, which would apply child
+ // directives to non existing elements.
+ var clone = $transclude(newScope, function(clone) {
+ $animate.enter(clone, null, currentElement || $element).then(function onNgViewEnter() {
+ if (angular.isDefined(autoScrollExp)
+ && (!autoScrollExp || scope.$eval(autoScrollExp))) {
+ $anchorScroll();
+ }
+ });
+ cleanupLastView();
+ });
+
+ currentElement = clone;
+ currentScope = current.scope = newScope;
+ currentScope.$emit('$viewContentLoaded');
+ currentScope.$eval(onloadExp);
+ } else {
+ cleanupLastView();
+ }
+ }
+ }
+ };
+}
+
+// This directive is called during the $transclude call of the first `ngView` directive.
+// It will replace and compile the content of the element with the loaded template.
+// We need this directive so that the element content is already filled when
+// the link function of another directive on the same element as ngView
+// is called.
+ngViewFillContentFactory.$inject = ['$compile', '$controller', '$route'];
+function ngViewFillContentFactory($compile, $controller, $route) {
+ return {
+ restrict: 'ECA',
+ priority: -400,
+ link: function(scope, $element) {
+ var current = $route.current,
+ locals = current.locals;
+
+ $element.html(locals.$template);
+
+ var link = $compile($element.contents());
+
+ if (current.controller) {
+ locals.$scope = scope;
+ var controller = $controller(current.controller, locals);
+ if (current.controllerAs) {
+ scope[current.controllerAs] = controller;
+ }
+ $element.data('$ngControllerController', controller);
+ $element.children().data('$ngControllerController', controller);
+ }
+
+ link(scope);
+ }
+ };
+}
+
+
+})(window, window.angular);
diff --git a/framework/src/onos/web/gui/src/main/webapp/tp/angular-route.min.js b/framework/src/onos/web/gui/src/main/webapp/tp/angular-route.min.js
new file mode 100644
index 00000000..b03fc57a
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tp/angular-route.min.js
@@ -0,0 +1,15 @@
+/*
+ AngularJS v1.3.5
+ (c) 2010-2014 Google, Inc. http://angularjs.org
+ License: MIT
+*/
+(function(p,d,C){'use strict';function v(r,h,g){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(a,c,b,f,y){function z(){k&&(g.cancel(k),k=null);l&&(l.$destroy(),l=null);m&&(k=g.leave(m),k.then(function(){k=null}),m=null)}function x(){var b=r.current&&r.current.locals;if(d.isDefined(b&&b.$template)){var b=a.$new(),f=r.current;m=y(b,function(b){g.enter(b,null,m||c).then(function(){!d.isDefined(t)||t&&!a.$eval(t)||h()});z()});l=f.scope=b;l.$emit("$viewContentLoaded");
+l.$eval(w)}else z()}var l,m,k,t=b.autoscroll,w=b.onload||"";a.$on("$routeChangeSuccess",x);x()}}}function A(d,h,g){return{restrict:"ECA",priority:-400,link:function(a,c){var b=g.current,f=b.locals;c.html(f.$template);var y=d(c.contents());b.controller&&(f.$scope=a,f=h(b.controller,f),b.controllerAs&&(a[b.controllerAs]=f),c.data("$ngControllerController",f),c.children().data("$ngControllerController",f));y(a)}}}p=d.module("ngRoute",["ng"]).provider("$route",function(){function r(a,c){return d.extend(Object.create(a),
+c)}function h(a,d){var b=d.caseInsensitiveMatch,f={originalPath:a,regexp:a},g=f.keys=[];a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?\*])?/g,function(a,d,b,c){a="?"===c?c:null;c="*"===c?c:null;g.push({name:b,optional:!!a});d=d||"";return""+(a?"":d)+"(?:"+(a?d:"")+(c&&"(.+?)"||"([^/]+)")+(a||"")+")"+(a||"")}).replace(/([\/$\*])/g,"\\$1");f.regexp=new RegExp("^"+a+"$",b?"i":"");return f}var g={};this.when=function(a,c){var b=d.copy(c);d.isUndefined(b.reloadOnSearch)&&(b.reloadOnSearch=!0);
+d.isUndefined(b.caseInsensitiveMatch)&&(b.caseInsensitiveMatch=this.caseInsensitiveMatch);g[a]=d.extend(b,a&&h(a,b));if(a){var f="/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";g[f]=d.extend({redirectTo:a},h(f,b))}return this};this.caseInsensitiveMatch=!1;this.otherwise=function(a){"string"===typeof a&&(a={redirectTo:a});this.when(null,a);return this};this.$get=["$rootScope","$location","$routeParams","$q","$injector","$templateRequest","$sce",function(a,c,b,f,h,p,x){function l(b){var e=s.current;
+(v=(n=k())&&e&&n.$$route===e.$$route&&d.equals(n.pathParams,e.pathParams)&&!n.reloadOnSearch&&!w)||!e&&!n||a.$broadcast("$routeChangeStart",n,e).defaultPrevented&&b&&b.preventDefault()}function m(){var u=s.current,e=n;if(v)u.params=e.params,d.copy(u.params,b),a.$broadcast("$routeUpdate",u);else if(e||u)w=!1,(s.current=e)&&e.redirectTo&&(d.isString(e.redirectTo)?c.path(t(e.redirectTo,e.params)).search(e.params).replace():c.url(e.redirectTo(e.pathParams,c.path(),c.search())).replace()),f.when(e).then(function(){if(e){var a=
+d.extend({},e.resolve),b,c;d.forEach(a,function(b,e){a[e]=d.isString(b)?h.get(b):h.invoke(b,null,null,e)});d.isDefined(b=e.template)?d.isFunction(b)&&(b=b(e.params)):d.isDefined(c=e.templateUrl)&&(d.isFunction(c)&&(c=c(e.params)),c=x.getTrustedResourceUrl(c),d.isDefined(c)&&(e.loadedTemplateUrl=c,b=p(c)));d.isDefined(b)&&(a.$template=b);return f.all(a)}}).then(function(c){e==s.current&&(e&&(e.locals=c,d.copy(e.params,b)),a.$broadcast("$routeChangeSuccess",e,u))},function(b){e==s.current&&a.$broadcast("$routeChangeError",
+e,u,b)})}function k(){var a,b;d.forEach(g,function(f,g){var q;if(q=!b){var h=c.path();q=f.keys;var l={};if(f.regexp)if(h=f.regexp.exec(h)){for(var k=1,m=h.length;k<m;++k){var n=q[k-1],p=h[k];n&&p&&(l[n.name]=p)}q=l}else q=null;else q=null;q=a=q}q&&(b=r(f,{params:d.extend({},c.search(),a),pathParams:a}),b.$$route=f)});return b||g[null]&&r(g[null],{params:{},pathParams:{}})}function t(a,b){var c=[];d.forEach((a||"").split(":"),function(a,d){if(0===d)c.push(a);else{var f=a.match(/(\w+)(?:[?*])?(.*)/),
+g=f[1];c.push(b[g]);c.push(f[2]||"");delete b[g]}});return c.join("")}var w=!1,n,v,s={routes:g,reload:function(){w=!0;a.$evalAsync(function(){l();m()})},updateParams:function(a){if(this.current&&this.current.$$route){var b={},f=this;d.forEach(Object.keys(a),function(c){f.current.pathParams[c]||(b[c]=a[c])});a=d.extend({},this.current.params,a);c.path(t(this.current.$$route.originalPath,a));c.search(d.extend({},c.search(),b))}else throw B("norout");}};a.$on("$locationChangeStart",l);a.$on("$locationChangeSuccess",
+m);return s}]});var B=d.$$minErr("ngRoute");p.provider("$routeParams",function(){this.$get=function(){return{}}});p.directive("ngView",v);p.directive("ngView",A);v.$inject=["$route","$anchorScroll","$animate"];A.$inject=["$compile","$controller","$route"]})(window,window.angular);
+//# sourceMappingURL=angular-route.min.js.map
diff --git a/framework/src/onos/web/gui/src/main/webapp/tp/angular.js b/framework/src/onos/web/gui/src/main/webapp/tp/angular.js
new file mode 100644
index 00000000..754f9aaf
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tp/angular.js
@@ -0,0 +1,25917 @@
+/**
+ * @license AngularJS v1.3.5
+ * (c) 2010-2014 Google, Inc. http://angularjs.org
+ * License: MIT
+ */
+(function(window, document, undefined) {'use strict';
+
+/**
+ * @description
+ *
+ * This object provides a utility for producing rich Error messages within
+ * Angular. It can be called as follows:
+ *
+ * var exampleMinErr = minErr('example');
+ * throw exampleMinErr('one', 'This {0} is {1}', foo, bar);
+ *
+ * The above creates an instance of minErr in the example namespace. The
+ * resulting error will have a namespaced error code of example.one. The
+ * resulting error will replace {0} with the value of foo, and {1} with the
+ * value of bar. The object is not restricted in the number of arguments it can
+ * take.
+ *
+ * If fewer arguments are specified than necessary for interpolation, the extra
+ * interpolation markers will be preserved in the final string.
+ *
+ * Since data will be parsed statically during a build step, some restrictions
+ * are applied with respect to how minErr instances are created and called.
+ * Instances should have names of the form namespaceMinErr for a minErr created
+ * using minErr('namespace') . Error codes, namespaces and template strings
+ * should all be static strings, not variables or general expressions.
+ *
+ * @param {string} module The namespace to use for the new minErr instance.
+ * @param {function} ErrorConstructor Custom error constructor to be instantiated when returning
+ * error from returned function, for cases when a particular type of error is useful.
+ * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance
+ */
+
+function minErr(module, ErrorConstructor) {
+ ErrorConstructor = ErrorConstructor || Error;
+ return function() {
+ var code = arguments[0],
+ prefix = '[' + (module ? module + ':' : '') + code + '] ',
+ template = arguments[1],
+ templateArgs = arguments,
+
+ message, i;
+
+ message = prefix + template.replace(/\{\d+\}/g, function(match) {
+ var index = +match.slice(1, -1), arg;
+
+ if (index + 2 < templateArgs.length) {
+ return toDebugString(templateArgs[index + 2]);
+ }
+ return match;
+ });
+
+ message = message + '\nhttp://errors.angularjs.org/1.3.5/' +
+ (module ? module + '/' : '') + code;
+ for (i = 2; i < arguments.length; i++) {
+ message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
+ encodeURIComponent(toDebugString(arguments[i]));
+ }
+ return new ErrorConstructor(message);
+ };
+}
+
+/* We need to tell jshint what variables are being exported */
+/* global angular: true,
+ msie: true,
+ jqLite: true,
+ jQuery: true,
+ slice: true,
+ splice: true,
+ push: true,
+ toString: true,
+ ngMinErr: true,
+ angularModule: true,
+ uid: true,
+ REGEX_STRING_REGEXP: true,
+ VALIDITY_STATE_PROPERTY: true,
+
+ lowercase: true,
+ uppercase: true,
+ manualLowercase: true,
+ manualUppercase: true,
+ nodeName_: true,
+ isArrayLike: true,
+ forEach: true,
+ sortedKeys: true,
+ forEachSorted: true,
+ reverseParams: true,
+ nextUid: true,
+ setHashKey: true,
+ extend: true,
+ int: true,
+ inherit: true,
+ noop: true,
+ identity: true,
+ valueFn: true,
+ isUndefined: true,
+ isDefined: true,
+ isObject: true,
+ isString: true,
+ isNumber: true,
+ isDate: true,
+ isArray: true,
+ isFunction: true,
+ isRegExp: true,
+ isWindow: true,
+ isScope: true,
+ isFile: true,
+ isBlob: true,
+ isBoolean: true,
+ isPromiseLike: true,
+ trim: true,
+ escapeForRegexp: true,
+ isElement: true,
+ makeMap: true,
+ includes: true,
+ arrayRemove: true,
+ copy: true,
+ shallowCopy: true,
+ equals: true,
+ csp: true,
+ concat: true,
+ sliceArgs: true,
+ bind: true,
+ toJsonReplacer: true,
+ toJson: true,
+ fromJson: true,
+ startingTag: true,
+ tryDecodeURIComponent: true,
+ parseKeyValue: true,
+ toKeyValue: true,
+ encodeUriSegment: true,
+ encodeUriQuery: true,
+ angularInit: true,
+ bootstrap: true,
+ getTestability: true,
+ snake_case: true,
+ bindJQuery: true,
+ assertArg: true,
+ assertArgFn: true,
+ assertNotHasOwnProperty: true,
+ getter: true,
+ getBlockNodes: true,
+ hasOwnProperty: true,
+ createMap: true,
+
+ NODE_TYPE_ELEMENT: true,
+ NODE_TYPE_TEXT: true,
+ NODE_TYPE_COMMENT: true,
+ NODE_TYPE_DOCUMENT: true,
+ NODE_TYPE_DOCUMENT_FRAGMENT: true,
+*/
+
+////////////////////////////////////
+
+/**
+ * @ngdoc module
+ * @name ng
+ * @module ng
+ * @description
+ *
+ * # ng (core module)
+ * The ng module is loaded by default when an AngularJS application is started. The module itself
+ * contains the essential components for an AngularJS application to function. The table below
+ * lists a high level breakdown of each of the services/factories, filters, directives and testing
+ * components available within this core module.
+ *
+ * <div doc-module-components="ng"></div>
+ */
+
+var REGEX_STRING_REGEXP = /^\/(.+)\/([a-z]*)$/;
+
+// The name of a form control's ValidityState property.
+// This is used so that it's possible for internal tests to create mock ValidityStates.
+var VALIDITY_STATE_PROPERTY = 'validity';
+
+/**
+ * @ngdoc function
+ * @name angular.lowercase
+ * @module ng
+ * @kind function
+ *
+ * @description Converts the specified string to lowercase.
+ * @param {string} string String to be converted to lowercase.
+ * @returns {string} Lowercased string.
+ */
+var lowercase = function(string) {return isString(string) ? string.toLowerCase() : string;};
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+/**
+ * @ngdoc function
+ * @name angular.uppercase
+ * @module ng
+ * @kind function
+ *
+ * @description Converts the specified string to uppercase.
+ * @param {string} string String to be converted to uppercase.
+ * @returns {string} Uppercased string.
+ */
+var uppercase = function(string) {return isString(string) ? string.toUpperCase() : string;};
+
+
+var manualLowercase = function(s) {
+ /* jshint bitwise: false */
+ return isString(s)
+ ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);})
+ : s;
+};
+var manualUppercase = function(s) {
+ /* jshint bitwise: false */
+ return isString(s)
+ ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);})
+ : s;
+};
+
+
+// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish
+// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods
+// with correct but slower alternatives.
+if ('i' !== 'I'.toLowerCase()) {
+ lowercase = manualLowercase;
+ uppercase = manualUppercase;
+}
+
+
+var
+ msie, // holds major version number for IE, or NaN if UA is not IE.
+ jqLite, // delay binding since jQuery could be loaded after us.
+ jQuery, // delay binding
+ slice = [].slice,
+ splice = [].splice,
+ push = [].push,
+ toString = Object.prototype.toString,
+ ngMinErr = minErr('ng'),
+
+ /** @name angular */
+ angular = window.angular || (window.angular = {}),
+ angularModule,
+ uid = 0;
+
+/**
+ * documentMode is an IE-only property
+ * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
+ */
+msie = document.documentMode;
+
+
+/**
+ * @private
+ * @param {*} obj
+ * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments,
+ * String ...)
+ */
+function isArrayLike(obj) {
+ if (obj == null || isWindow(obj)) {
+ return false;
+ }
+
+ var length = obj.length;
+
+ if (obj.nodeType === NODE_TYPE_ELEMENT && length) {
+ return true;
+ }
+
+ return isString(obj) || isArray(obj) || length === 0 ||
+ typeof length === 'number' && length > 0 && (length - 1) in obj;
+}
+
+/**
+ * @ngdoc function
+ * @name angular.forEach
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * Invokes the `iterator` function once for each item in `obj` collection, which can be either an
+ * object or an array. The `iterator` function is invoked with `iterator(value, key, obj)`, where `value`
+ * is the value of an object property or an array element, `key` is the object property key or
+ * array element index and obj is the `obj` itself. Specifying a `context` for the function is optional.
+ *
+ * It is worth noting that `.forEach` does not iterate over inherited properties because it filters
+ * using the `hasOwnProperty` method.
+ *
+ * Unlike ES262's
+ * [Array.prototype.forEach](http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.18),
+ * Providing 'undefined' or 'null' values for `obj` will not throw a TypeError, but rather just
+ * return the value provided.
+ *
+ ```js
+ var values = {name: 'misko', gender: 'male'};
+ var log = [];
+ angular.forEach(values, function(value, key) {
+ this.push(key + ': ' + value);
+ }, log);
+ expect(log).toEqual(['name: misko', 'gender: male']);
+ ```
+ *
+ * @param {Object|Array} obj Object to iterate over.
+ * @param {Function} iterator Iterator function.
+ * @param {Object=} context Object to become context (`this`) for the iterator function.
+ * @returns {Object|Array} Reference to `obj`.
+ */
+
+function forEach(obj, iterator, context) {
+ var key, length;
+ if (obj) {
+ if (isFunction(obj)) {
+ for (key in obj) {
+ // Need to check if hasOwnProperty exists,
+ // as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function
+ if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) {
+ iterator.call(context, obj[key], key, obj);
+ }
+ }
+ } else if (isArray(obj) || isArrayLike(obj)) {
+ var isPrimitive = typeof obj !== 'object';
+ for (key = 0, length = obj.length; key < length; key++) {
+ if (isPrimitive || key in obj) {
+ iterator.call(context, obj[key], key, obj);
+ }
+ }
+ } else if (obj.forEach && obj.forEach !== forEach) {
+ obj.forEach(iterator, context, obj);
+ } else {
+ for (key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ iterator.call(context, obj[key], key, obj);
+ }
+ }
+ }
+ }
+ return obj;
+}
+
+function sortedKeys(obj) {
+ return Object.keys(obj).sort();
+}
+
+function forEachSorted(obj, iterator, context) {
+ var keys = sortedKeys(obj);
+ for (var i = 0; i < keys.length; i++) {
+ iterator.call(context, obj[keys[i]], keys[i]);
+ }
+ return keys;
+}
+
+
+/**
+ * when using forEach the params are value, key, but it is often useful to have key, value.
+ * @param {function(string, *)} iteratorFn
+ * @returns {function(*, string)}
+ */
+function reverseParams(iteratorFn) {
+ return function(value, key) { iteratorFn(key, value); };
+}
+
+/**
+ * A consistent way of creating unique IDs in angular.
+ *
+ * Using simple numbers allows us to generate 28.6 million unique ids per second for 10 years before
+ * we hit number precision issues in JavaScript.
+ *
+ * Math.pow(2,53) / 60 / 60 / 24 / 365 / 10 = 28.6M
+ *
+ * @returns {number} an unique alpha-numeric string
+ */
+function nextUid() {
+ return ++uid;
+}
+
+
+/**
+ * Set or clear the hashkey for an object.
+ * @param obj object
+ * @param h the hashkey (!truthy to delete the hashkey)
+ */
+function setHashKey(obj, h) {
+ if (h) {
+ obj.$$hashKey = h;
+ }
+ else {
+ delete obj.$$hashKey;
+ }
+}
+
+/**
+ * @ngdoc function
+ * @name angular.extend
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * Extends the destination object `dst` by copying own enumerable properties from the `src` object(s)
+ * to `dst`. You can specify multiple `src` objects. If you want to preserve original objects, you can do so
+ * by passing an empty object as the target: `var object = angular.extend({}, object1, object2)`.
+ * Note: Keep in mind that `angular.extend` does not support recursive merge (deep copy).
+ *
+ * @param {Object} dst Destination object.
+ * @param {...Object} src Source object(s).
+ * @returns {Object} Reference to `dst`.
+ */
+function extend(dst) {
+ var h = dst.$$hashKey;
+
+ for (var i = 1, ii = arguments.length; i < ii; i++) {
+ var obj = arguments[i];
+ if (obj) {
+ var keys = Object.keys(obj);
+ for (var j = 0, jj = keys.length; j < jj; j++) {
+ var key = keys[j];
+ dst[key] = obj[key];
+ }
+ }
+ }
+
+ setHashKey(dst, h);
+ return dst;
+}
+
+function int(str) {
+ return parseInt(str, 10);
+}
+
+
+function inherit(parent, extra) {
+ return extend(Object.create(parent), extra);
+}
+
+/**
+ * @ngdoc function
+ * @name angular.noop
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * A function that performs no operations. This function can be useful when writing code in the
+ * functional style.
+ ```js
+ function foo(callback) {
+ var result = calculateResult();
+ (callback || angular.noop)(result);
+ }
+ ```
+ */
+function noop() {}
+noop.$inject = [];
+
+
+/**
+ * @ngdoc function
+ * @name angular.identity
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * A function that returns its first argument. This function is useful when writing code in the
+ * functional style.
+ *
+ ```js
+ function transformer(transformationFn, value) {
+ return (transformationFn || angular.identity)(value);
+ };
+ ```
+ */
+function identity($) {return $;}
+identity.$inject = [];
+
+
+function valueFn(value) {return function() {return value;};}
+
+/**
+ * @ngdoc function
+ * @name angular.isUndefined
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * Determines if a reference is undefined.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is undefined.
+ */
+function isUndefined(value) {return typeof value === 'undefined';}
+
+
+/**
+ * @ngdoc function
+ * @name angular.isDefined
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * Determines if a reference is defined.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is defined.
+ */
+function isDefined(value) {return typeof value !== 'undefined';}
+
+
+/**
+ * @ngdoc function
+ * @name angular.isObject
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not
+ * considered to be objects. Note that JavaScript arrays are objects.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is an `Object` but not `null`.
+ */
+function isObject(value) {
+ // http://jsperf.com/isobject4
+ return value !== null && typeof value === 'object';
+}
+
+
+/**
+ * @ngdoc function
+ * @name angular.isString
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * Determines if a reference is a `String`.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is a `String`.
+ */
+function isString(value) {return typeof value === 'string';}
+
+
+/**
+ * @ngdoc function
+ * @name angular.isNumber
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * Determines if a reference is a `Number`.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is a `Number`.
+ */
+function isNumber(value) {return typeof value === 'number';}
+
+
+/**
+ * @ngdoc function
+ * @name angular.isDate
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * Determines if a value is a date.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is a `Date`.
+ */
+function isDate(value) {
+ return toString.call(value) === '[object Date]';
+}
+
+
+/**
+ * @ngdoc function
+ * @name angular.isArray
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * Determines if a reference is an `Array`.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is an `Array`.
+ */
+var isArray = Array.isArray;
+
+/**
+ * @ngdoc function
+ * @name angular.isFunction
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * Determines if a reference is a `Function`.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is a `Function`.
+ */
+function isFunction(value) {return typeof value === 'function';}
+
+
+/**
+ * Determines if a value is a regular expression object.
+ *
+ * @private
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is a `RegExp`.
+ */
+function isRegExp(value) {
+ return toString.call(value) === '[object RegExp]';
+}
+
+
+/**
+ * Checks if `obj` is a window object.
+ *
+ * @private
+ * @param {*} obj Object to check
+ * @returns {boolean} True if `obj` is a window obj.
+ */
+function isWindow(obj) {
+ return obj && obj.window === obj;
+}
+
+
+function isScope(obj) {
+ return obj && obj.$evalAsync && obj.$watch;
+}
+
+
+function isFile(obj) {
+ return toString.call(obj) === '[object File]';
+}
+
+
+function isBlob(obj) {
+ return toString.call(obj) === '[object Blob]';
+}
+
+
+function isBoolean(value) {
+ return typeof value === 'boolean';
+}
+
+
+function isPromiseLike(obj) {
+ return obj && isFunction(obj.then);
+}
+
+
+var trim = function(value) {
+ return isString(value) ? value.trim() : value;
+};
+
+// Copied from:
+// http://docs.closure-library.googlecode.com/git/local_closure_goog_string_string.js.source.html#line1021
+// Prereq: s is a string.
+var escapeForRegexp = function(s) {
+ return s.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g, '\\$1').
+ replace(/\x08/g, '\\x08');
+};
+
+
+/**
+ * @ngdoc function
+ * @name angular.isElement
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * Determines if a reference is a DOM element (or wrapped jQuery element).
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element).
+ */
+function isElement(node) {
+ return !!(node &&
+ (node.nodeName // we are a direct element
+ || (node.prop && node.attr && node.find))); // we have an on and find method part of jQuery API
+}
+
+/**
+ * @param str 'key1,key2,...'
+ * @returns {object} in the form of {key1:true, key2:true, ...}
+ */
+function makeMap(str) {
+ var obj = {}, items = str.split(","), i;
+ for (i = 0; i < items.length; i++)
+ obj[ items[i] ] = true;
+ return obj;
+}
+
+
+function nodeName_(element) {
+ return lowercase(element.nodeName || (element[0] && element[0].nodeName));
+}
+
+function includes(array, obj) {
+ return Array.prototype.indexOf.call(array, obj) != -1;
+}
+
+function arrayRemove(array, value) {
+ var index = array.indexOf(value);
+ if (index >= 0)
+ array.splice(index, 1);
+ return value;
+}
+
+/**
+ * @ngdoc function
+ * @name angular.copy
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * Creates a deep copy of `source`, which should be an object or an array.
+ *
+ * * If no destination is supplied, a copy of the object or array is created.
+ * * If a destination is provided, all of its elements (for array) or properties (for objects)
+ * are deleted and then all elements/properties from the source are copied to it.
+ * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned.
+ * * If `source` is identical to 'destination' an exception will be thrown.
+ *
+ * @param {*} source The source that will be used to make a copy.
+ * Can be any type, including primitives, `null`, and `undefined`.
+ * @param {(Object|Array)=} destination Destination into which the source is copied. If
+ * provided, must be of the same type as `source`.
+ * @returns {*} The copy or updated `destination`, if `destination` was specified.
+ *
+ * @example
+ <example module="copyExample">
+ <file name="index.html">
+ <div ng-controller="ExampleController">
+ <form novalidate class="simple-form">
+ Name: <input type="text" ng-model="user.name" /><br />
+ E-mail: <input type="email" ng-model="user.email" /><br />
+ Gender: <input type="radio" ng-model="user.gender" value="male" />male
+ <input type="radio" ng-model="user.gender" value="female" />female<br />
+ <button ng-click="reset()">RESET</button>
+ <button ng-click="update(user)">SAVE</button>
+ </form>
+ <pre>form = {{user | json}}</pre>
+ <pre>master = {{master | json}}</pre>
+ </div>
+
+ <script>
+ angular.module('copyExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.master= {};
+
+ $scope.update = function(user) {
+ // Example with 1 argument
+ $scope.master= angular.copy(user);
+ };
+
+ $scope.reset = function() {
+ // Example with 2 arguments
+ angular.copy($scope.master, $scope.user);
+ };
+
+ $scope.reset();
+ }]);
+ </script>
+ </file>
+ </example>
+ */
+function copy(source, destination, stackSource, stackDest) {
+ if (isWindow(source) || isScope(source)) {
+ throw ngMinErr('cpws',
+ "Can't copy! Making copies of Window or Scope instances is not supported.");
+ }
+
+ if (!destination) {
+ destination = source;
+ if (source) {
+ if (isArray(source)) {
+ destination = copy(source, [], stackSource, stackDest);
+ } else if (isDate(source)) {
+ destination = new Date(source.getTime());
+ } else if (isRegExp(source)) {
+ destination = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]);
+ destination.lastIndex = source.lastIndex;
+ } else if (isObject(source)) {
+ var emptyObject = Object.create(Object.getPrototypeOf(source));
+ destination = copy(source, emptyObject, stackSource, stackDest);
+ }
+ }
+ } else {
+ if (source === destination) throw ngMinErr('cpi',
+ "Can't copy! Source and destination are identical.");
+
+ stackSource = stackSource || [];
+ stackDest = stackDest || [];
+
+ if (isObject(source)) {
+ var index = stackSource.indexOf(source);
+ if (index !== -1) return stackDest[index];
+
+ stackSource.push(source);
+ stackDest.push(destination);
+ }
+
+ var result;
+ if (isArray(source)) {
+ destination.length = 0;
+ for (var i = 0; i < source.length; i++) {
+ result = copy(source[i], null, stackSource, stackDest);
+ if (isObject(source[i])) {
+ stackSource.push(source[i]);
+ stackDest.push(result);
+ }
+ destination.push(result);
+ }
+ } else {
+ var h = destination.$$hashKey;
+ if (isArray(destination)) {
+ destination.length = 0;
+ } else {
+ forEach(destination, function(value, key) {
+ delete destination[key];
+ });
+ }
+ for (var key in source) {
+ if (source.hasOwnProperty(key)) {
+ result = copy(source[key], null, stackSource, stackDest);
+ if (isObject(source[key])) {
+ stackSource.push(source[key]);
+ stackDest.push(result);
+ }
+ destination[key] = result;
+ }
+ }
+ setHashKey(destination,h);
+ }
+
+ }
+ return destination;
+}
+
+/**
+ * Creates a shallow copy of an object, an array or a primitive.
+ *
+ * Assumes that there are no proto properties for objects.
+ */
+function shallowCopy(src, dst) {
+ if (isArray(src)) {
+ dst = dst || [];
+
+ for (var i = 0, ii = src.length; i < ii; i++) {
+ dst[i] = src[i];
+ }
+ } else if (isObject(src)) {
+ dst = dst || {};
+
+ for (var key in src) {
+ if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) {
+ dst[key] = src[key];
+ }
+ }
+ }
+
+ return dst || src;
+}
+
+
+/**
+ * @ngdoc function
+ * @name angular.equals
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * Determines if two objects or two values are equivalent. Supports value types, regular
+ * expressions, arrays and objects.
+ *
+ * Two objects or values are considered equivalent if at least one of the following is true:
+ *
+ * * Both objects or values pass `===` comparison.
+ * * Both objects or values are of the same type and all of their properties are equal by
+ * comparing them with `angular.equals`.
+ * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal)
+ * * Both values represent the same regular expression (In JavaScript,
+ * /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual
+ * representation matches).
+ *
+ * During a property comparison, properties of `function` type and properties with names
+ * that begin with `$` are ignored.
+ *
+ * Scope and DOMWindow objects are being compared only by identify (`===`).
+ *
+ * @param {*} o1 Object or value to compare.
+ * @param {*} o2 Object or value to compare.
+ * @returns {boolean} True if arguments are equal.
+ */
+function equals(o1, o2) {
+ if (o1 === o2) return true;
+ if (o1 === null || o2 === null) return false;
+ if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN
+ var t1 = typeof o1, t2 = typeof o2, length, key, keySet;
+ if (t1 == t2) {
+ if (t1 == 'object') {
+ if (isArray(o1)) {
+ if (!isArray(o2)) return false;
+ if ((length = o1.length) == o2.length) {
+ for (key = 0; key < length; key++) {
+ if (!equals(o1[key], o2[key])) return false;
+ }
+ return true;
+ }
+ } else if (isDate(o1)) {
+ if (!isDate(o2)) return false;
+ return equals(o1.getTime(), o2.getTime());
+ } else if (isRegExp(o1) && isRegExp(o2)) {
+ return o1.toString() == o2.toString();
+ } else {
+ if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || isArray(o2)) return false;
+ keySet = {};
+ for (key in o1) {
+ if (key.charAt(0) === '$' || isFunction(o1[key])) continue;
+ if (!equals(o1[key], o2[key])) return false;
+ keySet[key] = true;
+ }
+ for (key in o2) {
+ if (!keySet.hasOwnProperty(key) &&
+ key.charAt(0) !== '$' &&
+ o2[key] !== undefined &&
+ !isFunction(o2[key])) return false;
+ }
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+var csp = function() {
+ if (isDefined(csp.isActive_)) return csp.isActive_;
+
+ var active = !!(document.querySelector('[ng-csp]') ||
+ document.querySelector('[data-ng-csp]'));
+
+ if (!active) {
+ try {
+ /* jshint -W031, -W054 */
+ new Function('');
+ /* jshint +W031, +W054 */
+ } catch (e) {
+ active = true;
+ }
+ }
+
+ return (csp.isActive_ = active);
+};
+
+
+
+function concat(array1, array2, index) {
+ return array1.concat(slice.call(array2, index));
+}
+
+function sliceArgs(args, startIndex) {
+ return slice.call(args, startIndex || 0);
+}
+
+
+/* jshint -W101 */
+/**
+ * @ngdoc function
+ * @name angular.bind
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for
+ * `fn`). You can supply optional `args` that are prebound to the function. This feature is also
+ * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as
+ * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application).
+ *
+ * @param {Object} self Context which `fn` should be evaluated in.
+ * @param {function()} fn Function to be bound.
+ * @param {...*} args Optional arguments to be prebound to the `fn` function call.
+ * @returns {function()} Function that wraps the `fn` with all the specified bindings.
+ */
+/* jshint +W101 */
+function bind(self, fn) {
+ var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : [];
+ if (isFunction(fn) && !(fn instanceof RegExp)) {
+ return curryArgs.length
+ ? function() {
+ return arguments.length
+ ? fn.apply(self, concat(curryArgs, arguments, 0))
+ : fn.apply(self, curryArgs);
+ }
+ : function() {
+ return arguments.length
+ ? fn.apply(self, arguments)
+ : fn.call(self);
+ };
+ } else {
+ // in IE, native methods are not functions so they cannot be bound (note: they don't need to be)
+ return fn;
+ }
+}
+
+
+function toJsonReplacer(key, value) {
+ var val = value;
+
+ if (typeof key === 'string' && key.charAt(0) === '$' && key.charAt(1) === '$') {
+ val = undefined;
+ } else if (isWindow(value)) {
+ val = '$WINDOW';
+ } else if (value && document === value) {
+ val = '$DOCUMENT';
+ } else if (isScope(value)) {
+ val = '$SCOPE';
+ }
+
+ return val;
+}
+
+
+/**
+ * @ngdoc function
+ * @name angular.toJson
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * Serializes input into a JSON-formatted string. Properties with leading $$ characters will be
+ * stripped since angular uses this notation internally.
+ *
+ * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON.
+ * @param {boolean=} pretty If set to true, the JSON output will contain newlines and whitespace.
+ * @returns {string|undefined} JSON-ified string representing `obj`.
+ */
+function toJson(obj, pretty) {
+ if (typeof obj === 'undefined') return undefined;
+ return JSON.stringify(obj, toJsonReplacer, pretty ? ' ' : null);
+}
+
+
+/**
+ * @ngdoc function
+ * @name angular.fromJson
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * Deserializes a JSON string.
+ *
+ * @param {string} json JSON string to deserialize.
+ * @returns {Object|Array|string|number} Deserialized thingy.
+ */
+function fromJson(json) {
+ return isString(json)
+ ? JSON.parse(json)
+ : json;
+}
+
+
+/**
+ * @returns {string} Returns the string representation of the element.
+ */
+function startingTag(element) {
+ element = jqLite(element).clone();
+ try {
+ // turns out IE does not let you set .html() on elements which
+ // are not allowed to have children. So we just ignore it.
+ element.empty();
+ } catch (e) {}
+ var elemHtml = jqLite('<div>').append(element).html();
+ try {
+ return element[0].nodeType === NODE_TYPE_TEXT ? lowercase(elemHtml) :
+ elemHtml.
+ match(/^(<[^>]+>)/)[1].
+ replace(/^<([\w\-]+)/, function(match, nodeName) { return '<' + lowercase(nodeName); });
+ } catch (e) {
+ return lowercase(elemHtml);
+ }
+
+}
+
+
+/////////////////////////////////////////////////
+
+/**
+ * Tries to decode the URI component without throwing an exception.
+ *
+ * @private
+ * @param str value potential URI component to check.
+ * @returns {boolean} True if `value` can be decoded
+ * with the decodeURIComponent function.
+ */
+function tryDecodeURIComponent(value) {
+ try {
+ return decodeURIComponent(value);
+ } catch (e) {
+ // Ignore any invalid uri component
+ }
+}
+
+
+/**
+ * Parses an escaped url query string into key-value pairs.
+ * @returns {Object.<string,boolean|Array>}
+ */
+function parseKeyValue(/**string*/keyValue) {
+ var obj = {}, key_value, key;
+ forEach((keyValue || "").split('&'), function(keyValue) {
+ if (keyValue) {
+ key_value = keyValue.replace(/\+/g,'%20').split('=');
+ key = tryDecodeURIComponent(key_value[0]);
+ if (isDefined(key)) {
+ var val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true;
+ if (!hasOwnProperty.call(obj, key)) {
+ obj[key] = val;
+ } else if (isArray(obj[key])) {
+ obj[key].push(val);
+ } else {
+ obj[key] = [obj[key],val];
+ }
+ }
+ }
+ });
+ return obj;
+}
+
+function toKeyValue(obj) {
+ var parts = [];
+ forEach(obj, function(value, key) {
+ if (isArray(value)) {
+ forEach(value, function(arrayValue) {
+ parts.push(encodeUriQuery(key, true) +
+ (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true)));
+ });
+ } else {
+ parts.push(encodeUriQuery(key, true) +
+ (value === true ? '' : '=' + encodeUriQuery(value, true)));
+ }
+ });
+ return parts.length ? parts.join('&') : '';
+}
+
+
+/**
+ * We need our custom method because encodeURIComponent is too aggressive and doesn't follow
+ * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path
+ * segments:
+ * segment = *pchar
+ * pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
+ * pct-encoded = "%" HEXDIG HEXDIG
+ * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
+ * sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
+ * / "*" / "+" / "," / ";" / "="
+ */
+function encodeUriSegment(val) {
+ return encodeUriQuery(val, true).
+ replace(/%26/gi, '&').
+ replace(/%3D/gi, '=').
+ replace(/%2B/gi, '+');
+}
+
+
+/**
+ * This method is intended for encoding *key* or *value* parts of query component. We need a custom
+ * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be
+ * encoded per http://tools.ietf.org/html/rfc3986:
+ * query = *( pchar / "/" / "?" )
+ * pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
+ * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
+ * pct-encoded = "%" HEXDIG HEXDIG
+ * sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
+ * / "*" / "+" / "," / ";" / "="
+ */
+function encodeUriQuery(val, pctEncodeSpaces) {
+ return encodeURIComponent(val).
+ replace(/%40/gi, '@').
+ replace(/%3A/gi, ':').
+ replace(/%24/g, '$').
+ replace(/%2C/gi, ',').
+ replace(/%3B/gi, ';').
+ replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));
+}
+
+var ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-'];
+
+function getNgAttribute(element, ngAttr) {
+ var attr, i, ii = ngAttrPrefixes.length;
+ element = jqLite(element);
+ for (i = 0; i < ii; ++i) {
+ attr = ngAttrPrefixes[i] + ngAttr;
+ if (isString(attr = element.attr(attr))) {
+ return attr;
+ }
+ }
+ return null;
+}
+
+/**
+ * @ngdoc directive
+ * @name ngApp
+ * @module ng
+ *
+ * @element ANY
+ * @param {angular.Module} ngApp an optional application
+ * {@link angular.module module} name to load.
+ * @param {boolean=} ngStrictDi if this attribute is present on the app element, the injector will be
+ * created in "strict-di" mode. This means that the application will fail to invoke functions which
+ * do not use explicit function annotation (and are thus unsuitable for minification), as described
+ * in {@link guide/di the Dependency Injection guide}, and useful debugging info will assist in
+ * tracking down the root of these bugs.
+ *
+ * @description
+ *
+ * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive
+ * designates the **root element** of the application and is typically placed near the root element
+ * of the page - e.g. on the `<body>` or `<html>` tags.
+ *
+ * Only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp`
+ * found in the document will be used to define the root element to auto-bootstrap as an
+ * application. To run multiple applications in an HTML document you must manually bootstrap them using
+ * {@link angular.bootstrap} instead. AngularJS applications cannot be nested within each other.
+ *
+ * You can specify an **AngularJS module** to be used as the root module for the application. This
+ * module will be loaded into the {@link auto.$injector} when the application is bootstrapped and
+ * should contain the application code needed or have dependencies on other modules that will
+ * contain the code. See {@link angular.module} for more information.
+ *
+ * In the example below if the `ngApp` directive were not placed on the `html` element then the
+ * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}`
+ * would not be resolved to `3`.
+ *
+ * `ngApp` is the easiest, and most common, way to bootstrap an application.
+ *
+ <example module="ngAppDemo">
+ <file name="index.html">
+ <div ng-controller="ngAppDemoController">
+ I can add: {{a}} + {{b}} = {{ a+b }}
+ </div>
+ </file>
+ <file name="script.js">
+ angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) {
+ $scope.a = 1;
+ $scope.b = 2;
+ });
+ </file>
+ </example>
+ *
+ * Using `ngStrictDi`, you would see something like this:
+ *
+ <example ng-app-included="true">
+ <file name="index.html">
+ <div ng-app="ngAppStrictDemo" ng-strict-di>
+ <div ng-controller="GoodController1">
+ I can add: {{a}} + {{b}} = {{ a+b }}
+
+ <p>This renders because the controller does not fail to
+ instantiate, by using explicit annotation style (see
+ script.js for details)
+ </p>
+ </div>
+
+ <div ng-controller="GoodController2">
+ Name: <input ng-model="name"><br />
+ Hello, {{name}}!
+
+ <p>This renders because the controller does not fail to
+ instantiate, by using explicit annotation style
+ (see script.js for details)
+ </p>
+ </div>
+
+ <div ng-controller="BadController">
+ I can add: {{a}} + {{b}} = {{ a+b }}
+
+ <p>The controller could not be instantiated, due to relying
+ on automatic function annotations (which are disabled in
+ strict mode). As such, the content of this section is not
+ interpolated, and there should be an error in your web console.
+ </p>
+ </div>
+ </div>
+ </file>
+ <file name="script.js">
+ angular.module('ngAppStrictDemo', [])
+ // BadController will fail to instantiate, due to relying on automatic function annotation,
+ // rather than an explicit annotation
+ .controller('BadController', function($scope) {
+ $scope.a = 1;
+ $scope.b = 2;
+ })
+ // Unlike BadController, GoodController1 and GoodController2 will not fail to be instantiated,
+ // due to using explicit annotations using the array style and $inject property, respectively.
+ .controller('GoodController1', ['$scope', function($scope) {
+ $scope.a = 1;
+ $scope.b = 2;
+ }])
+ .controller('GoodController2', GoodController2);
+ function GoodController2($scope) {
+ $scope.name = "World";
+ }
+ GoodController2.$inject = ['$scope'];
+ </file>
+ <file name="style.css">
+ div[ng-controller] {
+ margin-bottom: 1em;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ border: 1px solid;
+ padding: .5em;
+ }
+ div[ng-controller^=Good] {
+ border-color: #d6e9c6;
+ background-color: #dff0d8;
+ color: #3c763d;
+ }
+ div[ng-controller^=Bad] {
+ border-color: #ebccd1;
+ background-color: #f2dede;
+ color: #a94442;
+ margin-bottom: 0;
+ }
+ </file>
+ </example>
+ */
+function angularInit(element, bootstrap) {
+ var appElement,
+ module,
+ config = {};
+
+ // The element `element` has priority over any other element
+ forEach(ngAttrPrefixes, function(prefix) {
+ var name = prefix + 'app';
+
+ if (!appElement && element.hasAttribute && element.hasAttribute(name)) {
+ appElement = element;
+ module = element.getAttribute(name);
+ }
+ });
+ forEach(ngAttrPrefixes, function(prefix) {
+ var name = prefix + 'app';
+ var candidate;
+
+ if (!appElement && (candidate = element.querySelector('[' + name.replace(':', '\\:') + ']'))) {
+ appElement = candidate;
+ module = candidate.getAttribute(name);
+ }
+ });
+ if (appElement) {
+ config.strictDi = getNgAttribute(appElement, "strict-di") !== null;
+ bootstrap(appElement, module ? [module] : [], config);
+ }
+}
+
+/**
+ * @ngdoc function
+ * @name angular.bootstrap
+ * @module ng
+ * @description
+ * Use this function to manually start up angular application.
+ *
+ * See: {@link guide/bootstrap Bootstrap}
+ *
+ * Note that Protractor based end-to-end tests cannot use this function to bootstrap manually.
+ * They must use {@link ng.directive:ngApp ngApp}.
+ *
+ * Angular will detect if it has been loaded into the browser more than once and only allow the
+ * first loaded script to be bootstrapped and will report a warning to the browser console for
+ * each of the subsequent scripts. This prevents strange results in applications, where otherwise
+ * multiple instances of Angular try to work on the DOM.
+ *
+ * ```html
+ * <!doctype html>
+ * <html>
+ * <body>
+ * <div ng-controller="WelcomeController">
+ * {{greeting}}
+ * </div>
+ *
+ * <script src="angular.js"></script>
+ * <script>
+ * var app = angular.module('demo', [])
+ * .controller('WelcomeController', function($scope) {
+ * $scope.greeting = 'Welcome!';
+ * });
+ * angular.bootstrap(document, ['demo']);
+ * </script>
+ * </body>
+ * </html>
+ * ```
+ *
+ * @param {DOMElement} element DOM element which is the root of angular application.
+ * @param {Array<String|Function|Array>=} modules an array of modules to load into the application.
+ * Each item in the array should be the name of a predefined module or a (DI annotated)
+ * function that will be invoked by the injector as a run block.
+ * See: {@link angular.module modules}
+ * @param {Object=} config an object for defining configuration options for the application. The
+ * following keys are supported:
+ *
+ * * `strictDi` - disable automatic function annotation for the application. This is meant to
+ * assist in finding bugs which break minified code. Defaults to `false`.
+ *
+ * @returns {auto.$injector} Returns the newly created injector for this app.
+ */
+function bootstrap(element, modules, config) {
+ if (!isObject(config)) config = {};
+ var defaultConfig = {
+ strictDi: false
+ };
+ config = extend(defaultConfig, config);
+ var doBootstrap = function() {
+ element = jqLite(element);
+
+ if (element.injector()) {
+ var tag = (element[0] === document) ? 'document' : startingTag(element);
+ //Encode angle brackets to prevent input from being sanitized to empty string #8683
+ throw ngMinErr(
+ 'btstrpd',
+ "App Already Bootstrapped with this Element '{0}'",
+ tag.replace(/</,'&lt;').replace(/>/,'&gt;'));
+ }
+
+ modules = modules || [];
+ modules.unshift(['$provide', function($provide) {
+ $provide.value('$rootElement', element);
+ }]);
+
+ if (config.debugInfoEnabled) {
+ // Pushing so that this overrides `debugInfoEnabled` setting defined in user's `modules`.
+ modules.push(['$compileProvider', function($compileProvider) {
+ $compileProvider.debugInfoEnabled(true);
+ }]);
+ }
+
+ modules.unshift('ng');
+ var injector = createInjector(modules, config.strictDi);
+ injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector',
+ function bootstrapApply(scope, element, compile, injector) {
+ scope.$apply(function() {
+ element.data('$injector', injector);
+ compile(element)(scope);
+ });
+ }]
+ );
+ return injector;
+ };
+
+ var NG_ENABLE_DEBUG_INFO = /^NG_ENABLE_DEBUG_INFO!/;
+ var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/;
+
+ if (window && NG_ENABLE_DEBUG_INFO.test(window.name)) {
+ config.debugInfoEnabled = true;
+ window.name = window.name.replace(NG_ENABLE_DEBUG_INFO, '');
+ }
+
+ if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) {
+ return doBootstrap();
+ }
+
+ window.name = window.name.replace(NG_DEFER_BOOTSTRAP, '');
+ angular.resumeBootstrap = function(extraModules) {
+ forEach(extraModules, function(module) {
+ modules.push(module);
+ });
+ doBootstrap();
+ };
+}
+
+/**
+ * @ngdoc function
+ * @name angular.reloadWithDebugInfo
+ * @module ng
+ * @description
+ * Use this function to reload the current application with debug information turned on.
+ * This takes precedence over a call to `$compileProvider.debugInfoEnabled(false)`.
+ *
+ * See {@link ng.$compileProvider#debugInfoEnabled} for more.
+ */
+function reloadWithDebugInfo() {
+ window.name = 'NG_ENABLE_DEBUG_INFO!' + window.name;
+ window.location.reload();
+}
+
+/**
+ * @name angular.getTestability
+ * @module ng
+ * @description
+ * Get the testability service for the instance of Angular on the given
+ * element.
+ * @param {DOMElement} element DOM element which is the root of angular application.
+ */
+function getTestability(rootElement) {
+ return angular.element(rootElement).injector().get('$$testability');
+}
+
+var SNAKE_CASE_REGEXP = /[A-Z]/g;
+function snake_case(name, separator) {
+ separator = separator || '_';
+ return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) {
+ return (pos ? separator : '') + letter.toLowerCase();
+ });
+}
+
+var bindJQueryFired = false;
+var skipDestroyOnNextJQueryCleanData;
+function bindJQuery() {
+ var originalCleanData;
+
+ if (bindJQueryFired) {
+ return;
+ }
+
+ // bind to jQuery if present;
+ jQuery = window.jQuery;
+ // Use jQuery if it exists with proper functionality, otherwise default to us.
+ // Angular 1.2+ requires jQuery 1.7+ for on()/off() support.
+ // Angular 1.3+ technically requires at least jQuery 2.1+ but it may work with older
+ // versions. It will not work for sure with jQuery <1.7, though.
+ if (jQuery && jQuery.fn.on) {
+ jqLite = jQuery;
+ extend(jQuery.fn, {
+ scope: JQLitePrototype.scope,
+ isolateScope: JQLitePrototype.isolateScope,
+ controller: JQLitePrototype.controller,
+ injector: JQLitePrototype.injector,
+ inheritedData: JQLitePrototype.inheritedData
+ });
+
+ // All nodes removed from the DOM via various jQuery APIs like .remove()
+ // are passed through jQuery.cleanData. Monkey-patch this method to fire
+ // the $destroy event on all removed nodes.
+ originalCleanData = jQuery.cleanData;
+ jQuery.cleanData = function(elems) {
+ var events;
+ if (!skipDestroyOnNextJQueryCleanData) {
+ for (var i = 0, elem; (elem = elems[i]) != null; i++) {
+ events = jQuery._data(elem, "events");
+ if (events && events.$destroy) {
+ jQuery(elem).triggerHandler('$destroy');
+ }
+ }
+ } else {
+ skipDestroyOnNextJQueryCleanData = false;
+ }
+ originalCleanData(elems);
+ };
+ } else {
+ jqLite = JQLite;
+ }
+
+ angular.element = jqLite;
+
+ // Prevent double-proxying.
+ bindJQueryFired = true;
+}
+
+/**
+ * throw error if the argument is falsy.
+ */
+function assertArg(arg, name, reason) {
+ if (!arg) {
+ throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required"));
+ }
+ return arg;
+}
+
+function assertArgFn(arg, name, acceptArrayAnnotation) {
+ if (acceptArrayAnnotation && isArray(arg)) {
+ arg = arg[arg.length - 1];
+ }
+
+ assertArg(isFunction(arg), name, 'not a function, got ' +
+ (arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg));
+ return arg;
+}
+
+/**
+ * throw error if the name given is hasOwnProperty
+ * @param {String} name the name to test
+ * @param {String} context the context in which the name is used, such as module or directive
+ */
+function assertNotHasOwnProperty(name, context) {
+ if (name === 'hasOwnProperty') {
+ throw ngMinErr('badname', "hasOwnProperty is not a valid {0} name", context);
+ }
+}
+
+/**
+ * Return the value accessible from the object by path. Any undefined traversals are ignored
+ * @param {Object} obj starting object
+ * @param {String} path path to traverse
+ * @param {boolean} [bindFnToScope=true]
+ * @returns {Object} value as accessible by path
+ */
+//TODO(misko): this function needs to be removed
+function getter(obj, path, bindFnToScope) {
+ if (!path) return obj;
+ var keys = path.split('.');
+ var key;
+ var lastInstance = obj;
+ var len = keys.length;
+
+ for (var i = 0; i < len; i++) {
+ key = keys[i];
+ if (obj) {
+ obj = (lastInstance = obj)[key];
+ }
+ }
+ if (!bindFnToScope && isFunction(obj)) {
+ return bind(lastInstance, obj);
+ }
+ return obj;
+}
+
+/**
+ * Return the DOM siblings between the first and last node in the given array.
+ * @param {Array} array like object
+ * @returns {jqLite} jqLite collection containing the nodes
+ */
+function getBlockNodes(nodes) {
+ // TODO(perf): just check if all items in `nodes` are siblings and if they are return the original
+ // collection, otherwise update the original collection.
+ var node = nodes[0];
+ var endNode = nodes[nodes.length - 1];
+ var blockNodes = [node];
+
+ do {
+ node = node.nextSibling;
+ if (!node) break;
+ blockNodes.push(node);
+ } while (node !== endNode);
+
+ return jqLite(blockNodes);
+}
+
+
+/**
+ * Creates a new object without a prototype. This object is useful for lookup without having to
+ * guard against prototypically inherited properties via hasOwnProperty.
+ *
+ * Related micro-benchmarks:
+ * - http://jsperf.com/object-create2
+ * - http://jsperf.com/proto-map-lookup/2
+ * - http://jsperf.com/for-in-vs-object-keys2
+ *
+ * @returns {Object}
+ */
+function createMap() {
+ return Object.create(null);
+}
+
+var NODE_TYPE_ELEMENT = 1;
+var NODE_TYPE_TEXT = 3;
+var NODE_TYPE_COMMENT = 8;
+var NODE_TYPE_DOCUMENT = 9;
+var NODE_TYPE_DOCUMENT_FRAGMENT = 11;
+
+/**
+ * @ngdoc type
+ * @name angular.Module
+ * @module ng
+ * @description
+ *
+ * Interface for configuring angular {@link angular.module modules}.
+ */
+
+function setupModuleLoader(window) {
+
+ var $injectorMinErr = minErr('$injector');
+ var ngMinErr = minErr('ng');
+
+ function ensure(obj, name, factory) {
+ return obj[name] || (obj[name] = factory());
+ }
+
+ var angular = ensure(window, 'angular', Object);
+
+ // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap
+ angular.$$minErr = angular.$$minErr || minErr;
+
+ return ensure(angular, 'module', function() {
+ /** @type {Object.<string, angular.Module>} */
+ var modules = {};
+
+ /**
+ * @ngdoc function
+ * @name angular.module
+ * @module ng
+ * @description
+ *
+ * The `angular.module` is a global place for creating, registering and retrieving Angular
+ * modules.
+ * All modules (angular core or 3rd party) that should be available to an application must be
+ * registered using this mechanism.
+ *
+ * When passed two or more arguments, a new module is created. If passed only one argument, an
+ * existing module (the name passed as the first argument to `module`) is retrieved.
+ *
+ *
+ * # Module
+ *
+ * A module is a collection of services, directives, controllers, filters, and configuration information.
+ * `angular.module` is used to configure the {@link auto.$injector $injector}.
+ *
+ * ```js
+ * // Create a new module
+ * var myModule = angular.module('myModule', []);
+ *
+ * // register a new service
+ * myModule.value('appName', 'MyCoolApp');
+ *
+ * // configure existing services inside initialization blocks.
+ * myModule.config(['$locationProvider', function($locationProvider) {
+ * // Configure existing providers
+ * $locationProvider.hashPrefix('!');
+ * }]);
+ * ```
+ *
+ * Then you can create an injector and load your modules like this:
+ *
+ * ```js
+ * var injector = angular.injector(['ng', 'myModule'])
+ * ```
+ *
+ * However it's more likely that you'll just use
+ * {@link ng.directive:ngApp ngApp} or
+ * {@link angular.bootstrap} to simplify this process for you.
+ *
+ * @param {!string} name The name of the module to create or retrieve.
+ * @param {!Array.<string>=} requires If specified then new module is being created. If
+ * unspecified then the module is being retrieved for further configuration.
+ * @param {Function=} configFn Optional configuration function for the module. Same as
+ * {@link angular.Module#config Module#config()}.
+ * @returns {module} new module with the {@link angular.Module} api.
+ */
+ return function module(name, requires, configFn) {
+ var assertNotHasOwnProperty = function(name, context) {
+ if (name === 'hasOwnProperty') {
+ throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context);
+ }
+ };
+
+ assertNotHasOwnProperty(name, 'module');
+ if (requires && modules.hasOwnProperty(name)) {
+ modules[name] = null;
+ }
+ return ensure(modules, name, function() {
+ if (!requires) {
+ throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " +
+ "the module name or forgot to load it. If registering a module ensure that you " +
+ "specify the dependencies as the second argument.", name);
+ }
+
+ /** @type {!Array.<Array.<*>>} */
+ var invokeQueue = [];
+
+ /** @type {!Array.<Function>} */
+ var configBlocks = [];
+
+ /** @type {!Array.<Function>} */
+ var runBlocks = [];
+
+ var config = invokeLater('$injector', 'invoke', 'push', configBlocks);
+
+ /** @type {angular.Module} */
+ var moduleInstance = {
+ // Private state
+ _invokeQueue: invokeQueue,
+ _configBlocks: configBlocks,
+ _runBlocks: runBlocks,
+
+ /**
+ * @ngdoc property
+ * @name angular.Module#requires
+ * @module ng
+ *
+ * @description
+ * Holds the list of modules which the injector will load before the current module is
+ * loaded.
+ */
+ requires: requires,
+
+ /**
+ * @ngdoc property
+ * @name angular.Module#name
+ * @module ng
+ *
+ * @description
+ * Name of the module.
+ */
+ name: name,
+
+
+ /**
+ * @ngdoc method
+ * @name angular.Module#provider
+ * @module ng
+ * @param {string} name service name
+ * @param {Function} providerType Construction function for creating new instance of the
+ * service.
+ * @description
+ * See {@link auto.$provide#provider $provide.provider()}.
+ */
+ provider: invokeLater('$provide', 'provider'),
+
+ /**
+ * @ngdoc method
+ * @name angular.Module#factory
+ * @module ng
+ * @param {string} name service name
+ * @param {Function} providerFunction Function for creating new instance of the service.
+ * @description
+ * See {@link auto.$provide#factory $provide.factory()}.
+ */
+ factory: invokeLater('$provide', 'factory'),
+
+ /**
+ * @ngdoc method
+ * @name angular.Module#service
+ * @module ng
+ * @param {string} name service name
+ * @param {Function} constructor A constructor function that will be instantiated.
+ * @description
+ * See {@link auto.$provide#service $provide.service()}.
+ */
+ service: invokeLater('$provide', 'service'),
+
+ /**
+ * @ngdoc method
+ * @name angular.Module#value
+ * @module ng
+ * @param {string} name service name
+ * @param {*} object Service instance object.
+ * @description
+ * See {@link auto.$provide#value $provide.value()}.
+ */
+ value: invokeLater('$provide', 'value'),
+
+ /**
+ * @ngdoc method
+ * @name angular.Module#constant
+ * @module ng
+ * @param {string} name constant name
+ * @param {*} object Constant value.
+ * @description
+ * Because the constant are fixed, they get applied before other provide methods.
+ * See {@link auto.$provide#constant $provide.constant()}.
+ */
+ constant: invokeLater('$provide', 'constant', 'unshift'),
+
+ /**
+ * @ngdoc method
+ * @name angular.Module#animation
+ * @module ng
+ * @param {string} name animation name
+ * @param {Function} animationFactory Factory function for creating new instance of an
+ * animation.
+ * @description
+ *
+ * **NOTE**: animations take effect only if the **ngAnimate** module is loaded.
+ *
+ *
+ * Defines an animation hook that can be later used with
+ * {@link ngAnimate.$animate $animate} service and directives that use this service.
+ *
+ * ```js
+ * module.animation('.animation-name', function($inject1, $inject2) {
+ * return {
+ * eventName : function(element, done) {
+ * //code to run the animation
+ * //once complete, then run done()
+ * return function cancellationFunction(element) {
+ * //code to cancel the animation
+ * }
+ * }
+ * }
+ * })
+ * ```
+ *
+ * See {@link ng.$animateProvider#register $animateProvider.register()} and
+ * {@link ngAnimate ngAnimate module} for more information.
+ */
+ animation: invokeLater('$animateProvider', 'register'),
+
+ /**
+ * @ngdoc method
+ * @name angular.Module#filter
+ * @module ng
+ * @param {string} name Filter name.
+ * @param {Function} filterFactory Factory function for creating new instance of filter.
+ * @description
+ * See {@link ng.$filterProvider#register $filterProvider.register()}.
+ */
+ filter: invokeLater('$filterProvider', 'register'),
+
+ /**
+ * @ngdoc method
+ * @name angular.Module#controller
+ * @module ng
+ * @param {string|Object} name Controller name, or an object map of controllers where the
+ * keys are the names and the values are the constructors.
+ * @param {Function} constructor Controller constructor function.
+ * @description
+ * See {@link ng.$controllerProvider#register $controllerProvider.register()}.
+ */
+ controller: invokeLater('$controllerProvider', 'register'),
+
+ /**
+ * @ngdoc method
+ * @name angular.Module#directive
+ * @module ng
+ * @param {string|Object} name Directive name, or an object map of directives where the
+ * keys are the names and the values are the factories.
+ * @param {Function} directiveFactory Factory function for creating new instance of
+ * directives.
+ * @description
+ * See {@link ng.$compileProvider#directive $compileProvider.directive()}.
+ */
+ directive: invokeLater('$compileProvider', 'directive'),
+
+ /**
+ * @ngdoc method
+ * @name angular.Module#config
+ * @module ng
+ * @param {Function} configFn Execute this function on module load. Useful for service
+ * configuration.
+ * @description
+ * Use this method to register work which needs to be performed on module loading.
+ * For more about how to configure services, see
+ * {@link providers#provider-recipe Provider Recipe}.
+ */
+ config: config,
+
+ /**
+ * @ngdoc method
+ * @name angular.Module#run
+ * @module ng
+ * @param {Function} initializationFn Execute this function after injector creation.
+ * Useful for application initialization.
+ * @description
+ * Use this method to register work which should be performed when the injector is done
+ * loading all modules.
+ */
+ run: function(block) {
+ runBlocks.push(block);
+ return this;
+ }
+ };
+
+ if (configFn) {
+ config(configFn);
+ }
+
+ return moduleInstance;
+
+ /**
+ * @param {string} provider
+ * @param {string} method
+ * @param {String=} insertMethod
+ * @returns {angular.Module}
+ */
+ function invokeLater(provider, method, insertMethod, queue) {
+ if (!queue) queue = invokeQueue;
+ return function() {
+ queue[insertMethod || 'push']([provider, method, arguments]);
+ return moduleInstance;
+ };
+ }
+ });
+ };
+ });
+
+}
+
+/* global: toDebugString: true */
+
+function serializeObject(obj) {
+ var seen = [];
+
+ return JSON.stringify(obj, function(key, val) {
+ val = toJsonReplacer(key, val);
+ if (isObject(val)) {
+
+ if (seen.indexOf(val) >= 0) return '<<already seen>>';
+
+ seen.push(val);
+ }
+ return val;
+ });
+}
+
+function toDebugString(obj) {
+ if (typeof obj === 'function') {
+ return obj.toString().replace(/ \{[\s\S]*$/, '');
+ } else if (typeof obj === 'undefined') {
+ return 'undefined';
+ } else if (typeof obj !== 'string') {
+ return serializeObject(obj);
+ }
+ return obj;
+}
+
+/* global angularModule: true,
+ version: true,
+
+ $LocaleProvider,
+ $CompileProvider,
+
+ htmlAnchorDirective,
+ inputDirective,
+ inputDirective,
+ formDirective,
+ scriptDirective,
+ selectDirective,
+ styleDirective,
+ optionDirective,
+ ngBindDirective,
+ ngBindHtmlDirective,
+ ngBindTemplateDirective,
+ ngClassDirective,
+ ngClassEvenDirective,
+ ngClassOddDirective,
+ ngCspDirective,
+ ngCloakDirective,
+ ngControllerDirective,
+ ngFormDirective,
+ ngHideDirective,
+ ngIfDirective,
+ ngIncludeDirective,
+ ngIncludeFillContentDirective,
+ ngInitDirective,
+ ngNonBindableDirective,
+ ngPluralizeDirective,
+ ngRepeatDirective,
+ ngShowDirective,
+ ngStyleDirective,
+ ngSwitchDirective,
+ ngSwitchWhenDirective,
+ ngSwitchDefaultDirective,
+ ngOptionsDirective,
+ ngTranscludeDirective,
+ ngModelDirective,
+ ngListDirective,
+ ngChangeDirective,
+ patternDirective,
+ patternDirective,
+ requiredDirective,
+ requiredDirective,
+ minlengthDirective,
+ minlengthDirective,
+ maxlengthDirective,
+ maxlengthDirective,
+ ngValueDirective,
+ ngModelOptionsDirective,
+ ngAttributeAliasDirectives,
+ ngEventDirectives,
+
+ $AnchorScrollProvider,
+ $AnimateProvider,
+ $BrowserProvider,
+ $CacheFactoryProvider,
+ $ControllerProvider,
+ $DocumentProvider,
+ $ExceptionHandlerProvider,
+ $FilterProvider,
+ $InterpolateProvider,
+ $IntervalProvider,
+ $HttpProvider,
+ $HttpBackendProvider,
+ $LocationProvider,
+ $LogProvider,
+ $ParseProvider,
+ $RootScopeProvider,
+ $QProvider,
+ $$QProvider,
+ $$SanitizeUriProvider,
+ $SceProvider,
+ $SceDelegateProvider,
+ $SnifferProvider,
+ $TemplateCacheProvider,
+ $TemplateRequestProvider,
+ $$TestabilityProvider,
+ $TimeoutProvider,
+ $$RAFProvider,
+ $$AsyncCallbackProvider,
+ $WindowProvider
+*/
+
+
+/**
+ * @ngdoc object
+ * @name angular.version
+ * @module ng
+ * @description
+ * An object that contains information about the current AngularJS version. This object has the
+ * following properties:
+ *
+ * - `full` – `{string}` – Full version string, such as "0.9.18".
+ * - `major` – `{number}` – Major version number, such as "0".
+ * - `minor` – `{number}` – Minor version number, such as "9".
+ * - `dot` – `{number}` – Dot version number, such as "18".
+ * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
+ */
+var version = {
+ full: '1.3.5', // all of these placeholder strings will be replaced by grunt's
+ major: 1, // package task
+ minor: 3,
+ dot: 5,
+ codeName: 'cybernetic-mercantilism'
+};
+
+
+function publishExternalAPI(angular) {
+ extend(angular, {
+ 'bootstrap': bootstrap,
+ 'copy': copy,
+ 'extend': extend,
+ 'equals': equals,
+ 'element': jqLite,
+ 'forEach': forEach,
+ 'injector': createInjector,
+ 'noop': noop,
+ 'bind': bind,
+ 'toJson': toJson,
+ 'fromJson': fromJson,
+ 'identity': identity,
+ 'isUndefined': isUndefined,
+ 'isDefined': isDefined,
+ 'isString': isString,
+ 'isFunction': isFunction,
+ 'isObject': isObject,
+ 'isNumber': isNumber,
+ 'isElement': isElement,
+ 'isArray': isArray,
+ 'version': version,
+ 'isDate': isDate,
+ 'lowercase': lowercase,
+ 'uppercase': uppercase,
+ 'callbacks': {counter: 0},
+ 'getTestability': getTestability,
+ '$$minErr': minErr,
+ '$$csp': csp,
+ 'reloadWithDebugInfo': reloadWithDebugInfo
+ });
+
+ angularModule = setupModuleLoader(window);
+ try {
+ angularModule('ngLocale');
+ } catch (e) {
+ angularModule('ngLocale', []).provider('$locale', $LocaleProvider);
+ }
+
+ angularModule('ng', ['ngLocale'], ['$provide',
+ function ngModule($provide) {
+ // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it.
+ $provide.provider({
+ $$sanitizeUri: $$SanitizeUriProvider
+ });
+ $provide.provider('$compile', $CompileProvider).
+ directive({
+ a: htmlAnchorDirective,
+ input: inputDirective,
+ textarea: inputDirective,
+ form: formDirective,
+ script: scriptDirective,
+ select: selectDirective,
+ style: styleDirective,
+ option: optionDirective,
+ ngBind: ngBindDirective,
+ ngBindHtml: ngBindHtmlDirective,
+ ngBindTemplate: ngBindTemplateDirective,
+ ngClass: ngClassDirective,
+ ngClassEven: ngClassEvenDirective,
+ ngClassOdd: ngClassOddDirective,
+ ngCloak: ngCloakDirective,
+ ngController: ngControllerDirective,
+ ngForm: ngFormDirective,
+ ngHide: ngHideDirective,
+ ngIf: ngIfDirective,
+ ngInclude: ngIncludeDirective,
+ ngInit: ngInitDirective,
+ ngNonBindable: ngNonBindableDirective,
+ ngPluralize: ngPluralizeDirective,
+ ngRepeat: ngRepeatDirective,
+ ngShow: ngShowDirective,
+ ngStyle: ngStyleDirective,
+ ngSwitch: ngSwitchDirective,
+ ngSwitchWhen: ngSwitchWhenDirective,
+ ngSwitchDefault: ngSwitchDefaultDirective,
+ ngOptions: ngOptionsDirective,
+ ngTransclude: ngTranscludeDirective,
+ ngModel: ngModelDirective,
+ ngList: ngListDirective,
+ ngChange: ngChangeDirective,
+ pattern: patternDirective,
+ ngPattern: patternDirective,
+ required: requiredDirective,
+ ngRequired: requiredDirective,
+ minlength: minlengthDirective,
+ ngMinlength: minlengthDirective,
+ maxlength: maxlengthDirective,
+ ngMaxlength: maxlengthDirective,
+ ngValue: ngValueDirective,
+ ngModelOptions: ngModelOptionsDirective
+ }).
+ directive({
+ ngInclude: ngIncludeFillContentDirective
+ }).
+ directive(ngAttributeAliasDirectives).
+ directive(ngEventDirectives);
+ $provide.provider({
+ $anchorScroll: $AnchorScrollProvider,
+ $animate: $AnimateProvider,
+ $browser: $BrowserProvider,
+ $cacheFactory: $CacheFactoryProvider,
+ $controller: $ControllerProvider,
+ $document: $DocumentProvider,
+ $exceptionHandler: $ExceptionHandlerProvider,
+ $filter: $FilterProvider,
+ $interpolate: $InterpolateProvider,
+ $interval: $IntervalProvider,
+ $http: $HttpProvider,
+ $httpBackend: $HttpBackendProvider,
+ $location: $LocationProvider,
+ $log: $LogProvider,
+ $parse: $ParseProvider,
+ $rootScope: $RootScopeProvider,
+ $q: $QProvider,
+ $$q: $$QProvider,
+ $sce: $SceProvider,
+ $sceDelegate: $SceDelegateProvider,
+ $sniffer: $SnifferProvider,
+ $templateCache: $TemplateCacheProvider,
+ $templateRequest: $TemplateRequestProvider,
+ $$testability: $$TestabilityProvider,
+ $timeout: $TimeoutProvider,
+ $window: $WindowProvider,
+ $$rAF: $$RAFProvider,
+ $$asyncCallback: $$AsyncCallbackProvider
+ });
+ }
+ ]);
+}
+
+/* global JQLitePrototype: true,
+ addEventListenerFn: true,
+ removeEventListenerFn: true,
+ BOOLEAN_ATTR: true,
+ ALIASED_ATTR: true,
+*/
+
+//////////////////////////////////
+//JQLite
+//////////////////////////////////
+
+/**
+ * @ngdoc function
+ * @name angular.element
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element.
+ *
+ * If jQuery is available, `angular.element` is an alias for the
+ * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element`
+ * delegates to Angular's built-in subset of jQuery, called "jQuery lite" or "jqLite."
+ *
+ * <div class="alert alert-success">jqLite is a tiny, API-compatible subset of jQuery that allows
+ * Angular to manipulate the DOM in a cross-browser compatible way. **jqLite** implements only the most
+ * commonly needed functionality with the goal of having a very small footprint.</div>
+ *
+ * To use jQuery, simply load it before `DOMContentLoaded` event fired.
+ *
+ * <div class="alert">**Note:** all element references in Angular are always wrapped with jQuery or
+ * jqLite; they are never raw DOM references.</div>
+ *
+ * ## Angular's jqLite
+ * jqLite provides only the following jQuery methods:
+ *
+ * - [`addClass()`](http://api.jquery.com/addClass/)
+ * - [`after()`](http://api.jquery.com/after/)
+ * - [`append()`](http://api.jquery.com/append/)
+ * - [`attr()`](http://api.jquery.com/attr/) - Does not support functions as parameters
+ * - [`bind()`](http://api.jquery.com/bind/) - Does not support namespaces, selectors or eventData
+ * - [`children()`](http://api.jquery.com/children/) - Does not support selectors
+ * - [`clone()`](http://api.jquery.com/clone/)
+ * - [`contents()`](http://api.jquery.com/contents/)
+ * - [`css()`](http://api.jquery.com/css/) - Only retrieves inline-styles, does not call `getComputedStyle()`
+ * - [`data()`](http://api.jquery.com/data/)
+ * - [`detach()`](http://api.jquery.com/detach/)
+ * - [`empty()`](http://api.jquery.com/empty/)
+ * - [`eq()`](http://api.jquery.com/eq/)
+ * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name
+ * - [`hasClass()`](http://api.jquery.com/hasClass/)
+ * - [`html()`](http://api.jquery.com/html/)
+ * - [`next()`](http://api.jquery.com/next/) - Does not support selectors
+ * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData
+ * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces or selectors
+ * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors
+ * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors
+ * - [`prepend()`](http://api.jquery.com/prepend/)
+ * - [`prop()`](http://api.jquery.com/prop/)
+ * - [`ready()`](http://api.jquery.com/ready/)
+ * - [`remove()`](http://api.jquery.com/remove/)
+ * - [`removeAttr()`](http://api.jquery.com/removeAttr/)
+ * - [`removeClass()`](http://api.jquery.com/removeClass/)
+ * - [`removeData()`](http://api.jquery.com/removeData/)
+ * - [`replaceWith()`](http://api.jquery.com/replaceWith/)
+ * - [`text()`](http://api.jquery.com/text/)
+ * - [`toggleClass()`](http://api.jquery.com/toggleClass/)
+ * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers.
+ * - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces
+ * - [`val()`](http://api.jquery.com/val/)
+ * - [`wrap()`](http://api.jquery.com/wrap/)
+ *
+ * ## jQuery/jqLite Extras
+ * Angular also provides the following additional methods and events to both jQuery and jqLite:
+ *
+ * ### Events
+ * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event
+ * on all DOM nodes being removed. This can be used to clean up any 3rd party bindings to the DOM
+ * element before it is removed.
+ *
+ * ### Methods
+ * - `controller(name)` - retrieves the controller of the current element or its parent. By default
+ * retrieves controller associated with the `ngController` directive. If `name` is provided as
+ * camelCase directive name, then the controller for this directive will be retrieved (e.g.
+ * `'ngModel'`).
+ * - `injector()` - retrieves the injector of the current element or its parent.
+ * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current
+ * element or its parent. Requires {@link guide/production#disabling-debug-data Debug Data} to
+ * be enabled.
+ * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the
+ * current element. This getter should be used only on elements that contain a directive which starts a new isolate
+ * scope. Calling `scope()` on this element always returns the original non-isolate scope.
+ * Requires {@link guide/production#disabling-debug-data Debug Data} to be enabled.
+ * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top
+ * parent element is reached.
+ *
+ * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery.
+ * @returns {Object} jQuery object.
+ */
+
+JQLite.expando = 'ng339';
+
+var jqCache = JQLite.cache = {},
+ jqId = 1,
+ addEventListenerFn = function(element, type, fn) {
+ element.addEventListener(type, fn, false);
+ },
+ removeEventListenerFn = function(element, type, fn) {
+ element.removeEventListener(type, fn, false);
+ };
+
+/*
+ * !!! This is an undocumented "private" function !!!
+ */
+JQLite._data = function(node) {
+ //jQuery always returns an object on cache miss
+ return this.cache[node[this.expando]] || {};
+};
+
+function jqNextId() { return ++jqId; }
+
+
+var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g;
+var MOZ_HACK_REGEXP = /^moz([A-Z])/;
+var MOUSE_EVENT_MAP= { mouseleave: "mouseout", mouseenter: "mouseover"};
+var jqLiteMinErr = minErr('jqLite');
+
+/**
+ * Converts snake_case to camelCase.
+ * Also there is special case for Moz prefix starting with upper case letter.
+ * @param name Name to normalize
+ */
+function camelCase(name) {
+ return name.
+ replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) {
+ return offset ? letter.toUpperCase() : letter;
+ }).
+ replace(MOZ_HACK_REGEXP, 'Moz$1');
+}
+
+var SINGLE_TAG_REGEXP = /^<(\w+)\s*\/?>(?:<\/\1>|)$/;
+var HTML_REGEXP = /<|&#?\w+;/;
+var TAG_NAME_REGEXP = /<([\w:]+)/;
+var XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi;
+
+var wrapMap = {
+ 'option': [1, '<select multiple="multiple">', '</select>'],
+
+ 'thead': [1, '<table>', '</table>'],
+ 'col': [2, '<table><colgroup>', '</colgroup></table>'],
+ 'tr': [2, '<table><tbody>', '</tbody></table>'],
+ 'td': [3, '<table><tbody><tr>', '</tr></tbody></table>'],
+ '_default': [0, "", ""]
+};
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+
+function jqLiteIsTextNode(html) {
+ return !HTML_REGEXP.test(html);
+}
+
+function jqLiteAcceptsData(node) {
+ // The window object can accept data but has no nodeType
+ // Otherwise we are only interested in elements (1) and documents (9)
+ var nodeType = node.nodeType;
+ return nodeType === NODE_TYPE_ELEMENT || !nodeType || nodeType === NODE_TYPE_DOCUMENT;
+}
+
+function jqLiteBuildFragment(html, context) {
+ var tmp, tag, wrap,
+ fragment = context.createDocumentFragment(),
+ nodes = [], i;
+
+ if (jqLiteIsTextNode(html)) {
+ // Convert non-html into a text node
+ nodes.push(context.createTextNode(html));
+ } else {
+ // Convert html into DOM nodes
+ tmp = tmp || fragment.appendChild(context.createElement("div"));
+ tag = (TAG_NAME_REGEXP.exec(html) || ["", ""])[1].toLowerCase();
+ wrap = wrapMap[tag] || wrapMap._default;
+ tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, "<$1></$2>") + wrap[2];
+
+ // Descend through wrappers to the right content
+ i = wrap[0];
+ while (i--) {
+ tmp = tmp.lastChild;
+ }
+
+ nodes = concat(nodes, tmp.childNodes);
+
+ tmp = fragment.firstChild;
+ tmp.textContent = "";
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+ fragment.innerHTML = ""; // Clear inner HTML
+ forEach(nodes, function(node) {
+ fragment.appendChild(node);
+ });
+
+ return fragment;
+}
+
+function jqLiteParseHTML(html, context) {
+ context = context || document;
+ var parsed;
+
+ if ((parsed = SINGLE_TAG_REGEXP.exec(html))) {
+ return [context.createElement(parsed[1])];
+ }
+
+ if ((parsed = jqLiteBuildFragment(html, context))) {
+ return parsed.childNodes;
+ }
+
+ return [];
+}
+
+/////////////////////////////////////////////
+function JQLite(element) {
+ if (element instanceof JQLite) {
+ return element;
+ }
+
+ var argIsString;
+
+ if (isString(element)) {
+ element = trim(element);
+ argIsString = true;
+ }
+ if (!(this instanceof JQLite)) {
+ if (argIsString && element.charAt(0) != '<') {
+ throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element');
+ }
+ return new JQLite(element);
+ }
+
+ if (argIsString) {
+ jqLiteAddNodes(this, jqLiteParseHTML(element));
+ } else {
+ jqLiteAddNodes(this, element);
+ }
+}
+
+function jqLiteClone(element) {
+ return element.cloneNode(true);
+}
+
+function jqLiteDealoc(element, onlyDescendants) {
+ if (!onlyDescendants) jqLiteRemoveData(element);
+
+ if (element.querySelectorAll) {
+ var descendants = element.querySelectorAll('*');
+ for (var i = 0, l = descendants.length; i < l; i++) {
+ jqLiteRemoveData(descendants[i]);
+ }
+ }
+}
+
+function jqLiteOff(element, type, fn, unsupported) {
+ if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument');
+
+ var expandoStore = jqLiteExpandoStore(element);
+ var events = expandoStore && expandoStore.events;
+ var handle = expandoStore && expandoStore.handle;
+
+ if (!handle) return; //no listeners registered
+
+ if (!type) {
+ for (type in events) {
+ if (type !== '$destroy') {
+ removeEventListenerFn(element, type, handle);
+ }
+ delete events[type];
+ }
+ } else {
+ forEach(type.split(' '), function(type) {
+ if (isDefined(fn)) {
+ var listenerFns = events[type];
+ arrayRemove(listenerFns || [], fn);
+ if (listenerFns && listenerFns.length > 0) {
+ return;
+ }
+ }
+
+ removeEventListenerFn(element, type, handle);
+ delete events[type];
+ });
+ }
+}
+
+function jqLiteRemoveData(element, name) {
+ var expandoId = element.ng339;
+ var expandoStore = expandoId && jqCache[expandoId];
+
+ if (expandoStore) {
+ if (name) {
+ delete expandoStore.data[name];
+ return;
+ }
+
+ if (expandoStore.handle) {
+ if (expandoStore.events.$destroy) {
+ expandoStore.handle({}, '$destroy');
+ }
+ jqLiteOff(element);
+ }
+ delete jqCache[expandoId];
+ element.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it
+ }
+}
+
+
+function jqLiteExpandoStore(element, createIfNecessary) {
+ var expandoId = element.ng339,
+ expandoStore = expandoId && jqCache[expandoId];
+
+ if (createIfNecessary && !expandoStore) {
+ element.ng339 = expandoId = jqNextId();
+ expandoStore = jqCache[expandoId] = {events: {}, data: {}, handle: undefined};
+ }
+
+ return expandoStore;
+}
+
+
+function jqLiteData(element, key, value) {
+ if (jqLiteAcceptsData(element)) {
+
+ var isSimpleSetter = isDefined(value);
+ var isSimpleGetter = !isSimpleSetter && key && !isObject(key);
+ var massGetter = !key;
+ var expandoStore = jqLiteExpandoStore(element, !isSimpleGetter);
+ var data = expandoStore && expandoStore.data;
+
+ if (isSimpleSetter) { // data('key', value)
+ data[key] = value;
+ } else {
+ if (massGetter) { // data()
+ return data;
+ } else {
+ if (isSimpleGetter) { // data('key')
+ // don't force creation of expandoStore if it doesn't exist yet
+ return data && data[key];
+ } else { // mass-setter: data({key1: val1, key2: val2})
+ extend(data, key);
+ }
+ }
+ }
+ }
+}
+
+function jqLiteHasClass(element, selector) {
+ if (!element.getAttribute) return false;
+ return ((" " + (element.getAttribute('class') || '') + " ").replace(/[\n\t]/g, " ").
+ indexOf(" " + selector + " ") > -1);
+}
+
+function jqLiteRemoveClass(element, cssClasses) {
+ if (cssClasses && element.setAttribute) {
+ forEach(cssClasses.split(' '), function(cssClass) {
+ element.setAttribute('class', trim(
+ (" " + (element.getAttribute('class') || '') + " ")
+ .replace(/[\n\t]/g, " ")
+ .replace(" " + trim(cssClass) + " ", " "))
+ );
+ });
+ }
+}
+
+function jqLiteAddClass(element, cssClasses) {
+ if (cssClasses && element.setAttribute) {
+ var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ')
+ .replace(/[\n\t]/g, " ");
+
+ forEach(cssClasses.split(' '), function(cssClass) {
+ cssClass = trim(cssClass);
+ if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) {
+ existingClasses += cssClass + ' ';
+ }
+ });
+
+ element.setAttribute('class', trim(existingClasses));
+ }
+}
+
+
+function jqLiteAddNodes(root, elements) {
+ // THIS CODE IS VERY HOT. Don't make changes without benchmarking.
+
+ if (elements) {
+
+ // if a Node (the most common case)
+ if (elements.nodeType) {
+ root[root.length++] = elements;
+ } else {
+ var length = elements.length;
+
+ // if an Array or NodeList and not a Window
+ if (typeof length === 'number' && elements.window !== elements) {
+ if (length) {
+ for (var i = 0; i < length; i++) {
+ root[root.length++] = elements[i];
+ }
+ }
+ } else {
+ root[root.length++] = elements;
+ }
+ }
+ }
+}
+
+
+function jqLiteController(element, name) {
+ return jqLiteInheritedData(element, '$' + (name || 'ngController') + 'Controller');
+}
+
+function jqLiteInheritedData(element, name, value) {
+ // if element is the document object work with the html element instead
+ // this makes $(document).scope() possible
+ if (element.nodeType == NODE_TYPE_DOCUMENT) {
+ element = element.documentElement;
+ }
+ var names = isArray(name) ? name : [name];
+
+ while (element) {
+ for (var i = 0, ii = names.length; i < ii; i++) {
+ if ((value = jqLite.data(element, names[i])) !== undefined) return value;
+ }
+
+ // If dealing with a document fragment node with a host element, and no parent, use the host
+ // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM
+ // to lookup parent controllers.
+ element = element.parentNode || (element.nodeType === NODE_TYPE_DOCUMENT_FRAGMENT && element.host);
+ }
+}
+
+function jqLiteEmpty(element) {
+ jqLiteDealoc(element, true);
+ while (element.firstChild) {
+ element.removeChild(element.firstChild);
+ }
+}
+
+function jqLiteRemove(element, keepData) {
+ if (!keepData) jqLiteDealoc(element);
+ var parent = element.parentNode;
+ if (parent) parent.removeChild(element);
+}
+
+
+function jqLiteDocumentLoaded(action, win) {
+ win = win || window;
+ if (win.document.readyState === 'complete') {
+ // Force the action to be run async for consistent behaviour
+ // from the action's point of view
+ // i.e. it will definitely not be in a $apply
+ win.setTimeout(action);
+ } else {
+ // No need to unbind this handler as load is only ever called once
+ jqLite(win).on('load', action);
+ }
+}
+
+//////////////////////////////////////////
+// Functions which are declared directly.
+//////////////////////////////////////////
+var JQLitePrototype = JQLite.prototype = {
+ ready: function(fn) {
+ var fired = false;
+
+ function trigger() {
+ if (fired) return;
+ fired = true;
+ fn();
+ }
+
+ // check if document is already loaded
+ if (document.readyState === 'complete') {
+ setTimeout(trigger);
+ } else {
+ this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9
+ // we can not use jqLite since we are not done loading and jQuery could be loaded later.
+ // jshint -W064
+ JQLite(window).on('load', trigger); // fallback to window.onload for others
+ // jshint +W064
+ }
+ },
+ toString: function() {
+ var value = [];
+ forEach(this, function(e) { value.push('' + e);});
+ return '[' + value.join(', ') + ']';
+ },
+
+ eq: function(index) {
+ return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]);
+ },
+
+ length: 0,
+ push: push,
+ sort: [].sort,
+ splice: [].splice
+};
+
+//////////////////////////////////////////
+// Functions iterating getter/setters.
+// these functions return self on setter and
+// value on get.
+//////////////////////////////////////////
+var BOOLEAN_ATTR = {};
+forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) {
+ BOOLEAN_ATTR[lowercase(value)] = value;
+});
+var BOOLEAN_ELEMENTS = {};
+forEach('input,select,option,textarea,button,form,details'.split(','), function(value) {
+ BOOLEAN_ELEMENTS[value] = true;
+});
+var ALIASED_ATTR = {
+ 'ngMinlength': 'minlength',
+ 'ngMaxlength': 'maxlength',
+ 'ngMin': 'min',
+ 'ngMax': 'max',
+ 'ngPattern': 'pattern'
+};
+
+function getBooleanAttrName(element, name) {
+ // check dom last since we will most likely fail on name
+ var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()];
+
+ // booleanAttr is here twice to minimize DOM access
+ return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr;
+}
+
+function getAliasedAttrName(element, name) {
+ var nodeName = element.nodeName;
+ return (nodeName === 'INPUT' || nodeName === 'TEXTAREA') && ALIASED_ATTR[name];
+}
+
+forEach({
+ data: jqLiteData,
+ removeData: jqLiteRemoveData
+}, function(fn, name) {
+ JQLite[name] = fn;
+});
+
+forEach({
+ data: jqLiteData,
+ inheritedData: jqLiteInheritedData,
+
+ scope: function(element) {
+ // Can't use jqLiteData here directly so we stay compatible with jQuery!
+ return jqLite.data(element, '$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']);
+ },
+
+ isolateScope: function(element) {
+ // Can't use jqLiteData here directly so we stay compatible with jQuery!
+ return jqLite.data(element, '$isolateScope') || jqLite.data(element, '$isolateScopeNoTemplate');
+ },
+
+ controller: jqLiteController,
+
+ injector: function(element) {
+ return jqLiteInheritedData(element, '$injector');
+ },
+
+ removeAttr: function(element, name) {
+ element.removeAttribute(name);
+ },
+
+ hasClass: jqLiteHasClass,
+
+ css: function(element, name, value) {
+ name = camelCase(name);
+
+ if (isDefined(value)) {
+ element.style[name] = value;
+ } else {
+ return element.style[name];
+ }
+ },
+
+ attr: function(element, name, value) {
+ var lowercasedName = lowercase(name);
+ if (BOOLEAN_ATTR[lowercasedName]) {
+ if (isDefined(value)) {
+ if (!!value) {
+ element[name] = true;
+ element.setAttribute(name, lowercasedName);
+ } else {
+ element[name] = false;
+ element.removeAttribute(lowercasedName);
+ }
+ } else {
+ return (element[name] ||
+ (element.attributes.getNamedItem(name) || noop).specified)
+ ? lowercasedName
+ : undefined;
+ }
+ } else if (isDefined(value)) {
+ element.setAttribute(name, value);
+ } else if (element.getAttribute) {
+ // the extra argument "2" is to get the right thing for a.href in IE, see jQuery code
+ // some elements (e.g. Document) don't have get attribute, so return undefined
+ var ret = element.getAttribute(name, 2);
+ // normalize non-existing attributes to undefined (as jQuery)
+ return ret === null ? undefined : ret;
+ }
+ },
+
+ prop: function(element, name, value) {
+ if (isDefined(value)) {
+ element[name] = value;
+ } else {
+ return element[name];
+ }
+ },
+
+ text: (function() {
+ getText.$dv = '';
+ return getText;
+
+ function getText(element, value) {
+ if (isUndefined(value)) {
+ var nodeType = element.nodeType;
+ return (nodeType === NODE_TYPE_ELEMENT || nodeType === NODE_TYPE_TEXT) ? element.textContent : '';
+ }
+ element.textContent = value;
+ }
+ })(),
+
+ val: function(element, value) {
+ if (isUndefined(value)) {
+ if (element.multiple && nodeName_(element) === 'select') {
+ var result = [];
+ forEach(element.options, function(option) {
+ if (option.selected) {
+ result.push(option.value || option.text);
+ }
+ });
+ return result.length === 0 ? null : result;
+ }
+ return element.value;
+ }
+ element.value = value;
+ },
+
+ html: function(element, value) {
+ if (isUndefined(value)) {
+ return element.innerHTML;
+ }
+ jqLiteDealoc(element, true);
+ element.innerHTML = value;
+ },
+
+ empty: jqLiteEmpty
+}, function(fn, name) {
+ /**
+ * Properties: writes return selection, reads return first value
+ */
+ JQLite.prototype[name] = function(arg1, arg2) {
+ var i, key;
+ var nodeCount = this.length;
+
+ // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it
+ // in a way that survives minification.
+ // jqLiteEmpty takes no arguments but is a setter.
+ if (fn !== jqLiteEmpty &&
+ (((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2) === undefined)) {
+ if (isObject(arg1)) {
+
+ // we are a write, but the object properties are the key/values
+ for (i = 0; i < nodeCount; i++) {
+ if (fn === jqLiteData) {
+ // data() takes the whole object in jQuery
+ fn(this[i], arg1);
+ } else {
+ for (key in arg1) {
+ fn(this[i], key, arg1[key]);
+ }
+ }
+ }
+ // return self for chaining
+ return this;
+ } else {
+ // we are a read, so read the first child.
+ // TODO: do we still need this?
+ var value = fn.$dv;
+ // Only if we have $dv do we iterate over all, otherwise it is just the first element.
+ var jj = (value === undefined) ? Math.min(nodeCount, 1) : nodeCount;
+ for (var j = 0; j < jj; j++) {
+ var nodeValue = fn(this[j], arg1, arg2);
+ value = value ? value + nodeValue : nodeValue;
+ }
+ return value;
+ }
+ } else {
+ // we are a write, so apply to all children
+ for (i = 0; i < nodeCount; i++) {
+ fn(this[i], arg1, arg2);
+ }
+ // return self for chaining
+ return this;
+ }
+ };
+});
+
+function createEventHandler(element, events) {
+ var eventHandler = function(event, type) {
+ // jQuery specific api
+ event.isDefaultPrevented = function() {
+ return event.defaultPrevented;
+ };
+
+ var eventFns = events[type || event.type];
+ var eventFnsLength = eventFns ? eventFns.length : 0;
+
+ if (!eventFnsLength) return;
+
+ if (isUndefined(event.immediatePropagationStopped)) {
+ var originalStopImmediatePropagation = event.stopImmediatePropagation;
+ event.stopImmediatePropagation = function() {
+ event.immediatePropagationStopped = true;
+
+ if (event.stopPropagation) {
+ event.stopPropagation();
+ }
+
+ if (originalStopImmediatePropagation) {
+ originalStopImmediatePropagation.call(event);
+ }
+ };
+ }
+
+ event.isImmediatePropagationStopped = function() {
+ return event.immediatePropagationStopped === true;
+ };
+
+ // Copy event handlers in case event handlers array is modified during execution.
+ if ((eventFnsLength > 1)) {
+ eventFns = shallowCopy(eventFns);
+ }
+
+ for (var i = 0; i < eventFnsLength; i++) {
+ if (!event.isImmediatePropagationStopped()) {
+ eventFns[i].call(element, event);
+ }
+ }
+ };
+
+ // TODO: this is a hack for angularMocks/clearDataCache that makes it possible to deregister all
+ // events on `element`
+ eventHandler.elem = element;
+ return eventHandler;
+}
+
+//////////////////////////////////////////
+// Functions iterating traversal.
+// These functions chain results into a single
+// selector.
+//////////////////////////////////////////
+forEach({
+ removeData: jqLiteRemoveData,
+
+ on: function jqLiteOn(element, type, fn, unsupported) {
+ if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters');
+
+ // Do not add event handlers to non-elements because they will not be cleaned up.
+ if (!jqLiteAcceptsData(element)) {
+ return;
+ }
+
+ var expandoStore = jqLiteExpandoStore(element, true);
+ var events = expandoStore.events;
+ var handle = expandoStore.handle;
+
+ if (!handle) {
+ handle = expandoStore.handle = createEventHandler(element, events);
+ }
+
+ // http://jsperf.com/string-indexof-vs-split
+ var types = type.indexOf(' ') >= 0 ? type.split(' ') : [type];
+ var i = types.length;
+
+ while (i--) {
+ type = types[i];
+ var eventFns = events[type];
+
+ if (!eventFns) {
+ events[type] = [];
+
+ if (type === 'mouseenter' || type === 'mouseleave') {
+ // Refer to jQuery's implementation of mouseenter & mouseleave
+ // Read about mouseenter and mouseleave:
+ // http://www.quirksmode.org/js/events_mouse.html#link8
+
+ jqLiteOn(element, MOUSE_EVENT_MAP[type], function(event) {
+ var target = this, related = event.relatedTarget;
+ // For mousenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if (!related || (related !== target && !target.contains(related))) {
+ handle(event, type);
+ }
+ });
+
+ } else {
+ if (type !== '$destroy') {
+ addEventListenerFn(element, type, handle);
+ }
+ }
+ eventFns = events[type];
+ }
+ eventFns.push(fn);
+ }
+ },
+
+ off: jqLiteOff,
+
+ one: function(element, type, fn) {
+ element = jqLite(element);
+
+ //add the listener twice so that when it is called
+ //you can remove the original function and still be
+ //able to call element.off(ev, fn) normally
+ element.on(type, function onFn() {
+ element.off(type, fn);
+ element.off(type, onFn);
+ });
+ element.on(type, fn);
+ },
+
+ replaceWith: function(element, replaceNode) {
+ var index, parent = element.parentNode;
+ jqLiteDealoc(element);
+ forEach(new JQLite(replaceNode), function(node) {
+ if (index) {
+ parent.insertBefore(node, index.nextSibling);
+ } else {
+ parent.replaceChild(node, element);
+ }
+ index = node;
+ });
+ },
+
+ children: function(element) {
+ var children = [];
+ forEach(element.childNodes, function(element) {
+ if (element.nodeType === NODE_TYPE_ELEMENT)
+ children.push(element);
+ });
+ return children;
+ },
+
+ contents: function(element) {
+ return element.contentDocument || element.childNodes || [];
+ },
+
+ append: function(element, node) {
+ var nodeType = element.nodeType;
+ if (nodeType !== NODE_TYPE_ELEMENT && nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT) return;
+
+ node = new JQLite(node);
+
+ for (var i = 0, ii = node.length; i < ii; i++) {
+ var child = node[i];
+ element.appendChild(child);
+ }
+ },
+
+ prepend: function(element, node) {
+ if (element.nodeType === NODE_TYPE_ELEMENT) {
+ var index = element.firstChild;
+ forEach(new JQLite(node), function(child) {
+ element.insertBefore(child, index);
+ });
+ }
+ },
+
+ wrap: function(element, wrapNode) {
+ wrapNode = jqLite(wrapNode).eq(0).clone()[0];
+ var parent = element.parentNode;
+ if (parent) {
+ parent.replaceChild(wrapNode, element);
+ }
+ wrapNode.appendChild(element);
+ },
+
+ remove: jqLiteRemove,
+
+ detach: function(element) {
+ jqLiteRemove(element, true);
+ },
+
+ after: function(element, newElement) {
+ var index = element, parent = element.parentNode;
+ newElement = new JQLite(newElement);
+
+ for (var i = 0, ii = newElement.length; i < ii; i++) {
+ var node = newElement[i];
+ parent.insertBefore(node, index.nextSibling);
+ index = node;
+ }
+ },
+
+ addClass: jqLiteAddClass,
+ removeClass: jqLiteRemoveClass,
+
+ toggleClass: function(element, selector, condition) {
+ if (selector) {
+ forEach(selector.split(' '), function(className) {
+ var classCondition = condition;
+ if (isUndefined(classCondition)) {
+ classCondition = !jqLiteHasClass(element, className);
+ }
+ (classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className);
+ });
+ }
+ },
+
+ parent: function(element) {
+ var parent = element.parentNode;
+ return parent && parent.nodeType !== NODE_TYPE_DOCUMENT_FRAGMENT ? parent : null;
+ },
+
+ next: function(element) {
+ return element.nextElementSibling;
+ },
+
+ find: function(element, selector) {
+ if (element.getElementsByTagName) {
+ return element.getElementsByTagName(selector);
+ } else {
+ return [];
+ }
+ },
+
+ clone: jqLiteClone,
+
+ triggerHandler: function(element, event, extraParameters) {
+
+ var dummyEvent, eventFnsCopy, handlerArgs;
+ var eventName = event.type || event;
+ var expandoStore = jqLiteExpandoStore(element);
+ var events = expandoStore && expandoStore.events;
+ var eventFns = events && events[eventName];
+
+ if (eventFns) {
+ // Create a dummy event to pass to the handlers
+ dummyEvent = {
+ preventDefault: function() { this.defaultPrevented = true; },
+ isDefaultPrevented: function() { return this.defaultPrevented === true; },
+ stopImmediatePropagation: function() { this.immediatePropagationStopped = true; },
+ isImmediatePropagationStopped: function() { return this.immediatePropagationStopped === true; },
+ stopPropagation: noop,
+ type: eventName,
+ target: element
+ };
+
+ // If a custom event was provided then extend our dummy event with it
+ if (event.type) {
+ dummyEvent = extend(dummyEvent, event);
+ }
+
+ // Copy event handlers in case event handlers array is modified during execution.
+ eventFnsCopy = shallowCopy(eventFns);
+ handlerArgs = extraParameters ? [dummyEvent].concat(extraParameters) : [dummyEvent];
+
+ forEach(eventFnsCopy, function(fn) {
+ if (!dummyEvent.isImmediatePropagationStopped()) {
+ fn.apply(element, handlerArgs);
+ }
+ });
+ }
+ }
+}, function(fn, name) {
+ /**
+ * chaining functions
+ */
+ JQLite.prototype[name] = function(arg1, arg2, arg3) {
+ var value;
+
+ for (var i = 0, ii = this.length; i < ii; i++) {
+ if (isUndefined(value)) {
+ value = fn(this[i], arg1, arg2, arg3);
+ if (isDefined(value)) {
+ // any function which returns a value needs to be wrapped
+ value = jqLite(value);
+ }
+ } else {
+ jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3));
+ }
+ }
+ return isDefined(value) ? value : this;
+ };
+
+ // bind legacy bind/unbind to on/off
+ JQLite.prototype.bind = JQLite.prototype.on;
+ JQLite.prototype.unbind = JQLite.prototype.off;
+});
+
+/**
+ * Computes a hash of an 'obj'.
+ * Hash of a:
+ * string is string
+ * number is number as string
+ * object is either result of calling $$hashKey function on the object or uniquely generated id,
+ * that is also assigned to the $$hashKey property of the object.
+ *
+ * @param obj
+ * @returns {string} hash string such that the same input will have the same hash string.
+ * The resulting string key is in 'type:hashKey' format.
+ */
+function hashKey(obj, nextUidFn) {
+ var key = obj && obj.$$hashKey;
+
+ if (key) {
+ if (typeof key === 'function') {
+ key = obj.$$hashKey();
+ }
+ return key;
+ }
+
+ var objType = typeof obj;
+ if (objType == 'function' || (objType == 'object' && obj !== null)) {
+ key = obj.$$hashKey = objType + ':' + (nextUidFn || nextUid)();
+ } else {
+ key = objType + ':' + obj;
+ }
+
+ return key;
+}
+
+/**
+ * HashMap which can use objects as keys
+ */
+function HashMap(array, isolatedUid) {
+ if (isolatedUid) {
+ var uid = 0;
+ this.nextUid = function() {
+ return ++uid;
+ };
+ }
+ forEach(array, this.put, this);
+}
+HashMap.prototype = {
+ /**
+ * Store key value pair
+ * @param key key to store can be any type
+ * @param value value to store can be any type
+ */
+ put: function(key, value) {
+ this[hashKey(key, this.nextUid)] = value;
+ },
+
+ /**
+ * @param key
+ * @returns {Object} the value for the key
+ */
+ get: function(key) {
+ return this[hashKey(key, this.nextUid)];
+ },
+
+ /**
+ * Remove the key/value pair
+ * @param key
+ */
+ remove: function(key) {
+ var value = this[key = hashKey(key, this.nextUid)];
+ delete this[key];
+ return value;
+ }
+};
+
+/**
+ * @ngdoc function
+ * @module ng
+ * @name angular.injector
+ * @kind function
+ *
+ * @description
+ * Creates an injector object that can be used for retrieving services as well as for
+ * dependency injection (see {@link guide/di dependency injection}).
+ *
+ * @param {Array.<string|Function>} modules A list of module functions or their aliases. See
+ * {@link angular.module}. The `ng` module must be explicitly added.
+ * @param {boolean=} [strictDi=false] Whether the injector should be in strict mode, which
+ * disallows argument name annotation inference.
+ * @returns {injector} Injector object. See {@link auto.$injector $injector}.
+ *
+ * @example
+ * Typical usage
+ * ```js
+ * // create an injector
+ * var $injector = angular.injector(['ng']);
+ *
+ * // use the injector to kick off your application
+ * // use the type inference to auto inject arguments, or use implicit injection
+ * $injector.invoke(function($rootScope, $compile, $document) {
+ * $compile($document)($rootScope);
+ * $rootScope.$digest();
+ * });
+ * ```
+ *
+ * Sometimes you want to get access to the injector of a currently running Angular app
+ * from outside Angular. Perhaps, you want to inject and compile some markup after the
+ * application has been bootstrapped. You can do this using the extra `injector()` added
+ * to JQuery/jqLite elements. See {@link angular.element}.
+ *
+ * *This is fairly rare but could be the case if a third party library is injecting the
+ * markup.*
+ *
+ * In the following example a new block of HTML containing a `ng-controller`
+ * directive is added to the end of the document body by JQuery. We then compile and link
+ * it into the current AngularJS scope.
+ *
+ * ```js
+ * var $div = $('<div ng-controller="MyCtrl">{{content.label}}</div>');
+ * $(document.body).append($div);
+ *
+ * angular.element(document).injector().invoke(function($compile) {
+ * var scope = angular.element($div).scope();
+ * $compile($div)(scope);
+ * });
+ * ```
+ */
+
+
+/**
+ * @ngdoc module
+ * @name auto
+ * @description
+ *
+ * Implicit module which gets automatically added to each {@link auto.$injector $injector}.
+ */
+
+var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
+var FN_ARG_SPLIT = /,/;
+var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/;
+var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
+var $injectorMinErr = minErr('$injector');
+
+function anonFn(fn) {
+ // For anonymous functions, showing at the very least the function signature can help in
+ // debugging.
+ var fnText = fn.toString().replace(STRIP_COMMENTS, ''),
+ args = fnText.match(FN_ARGS);
+ if (args) {
+ return 'function(' + (args[1] || '').replace(/[\s\r\n]+/, ' ') + ')';
+ }
+ return 'fn';
+}
+
+function annotate(fn, strictDi, name) {
+ var $inject,
+ fnText,
+ argDecl,
+ last;
+
+ if (typeof fn === 'function') {
+ if (!($inject = fn.$inject)) {
+ $inject = [];
+ if (fn.length) {
+ if (strictDi) {
+ if (!isString(name) || !name) {
+ name = fn.name || anonFn(fn);
+ }
+ throw $injectorMinErr('strictdi',
+ '{0} is not using explicit annotation and cannot be invoked in strict mode', name);
+ }
+ fnText = fn.toString().replace(STRIP_COMMENTS, '');
+ argDecl = fnText.match(FN_ARGS);
+ forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) {
+ arg.replace(FN_ARG, function(all, underscore, name) {
+ $inject.push(name);
+ });
+ });
+ }
+ fn.$inject = $inject;
+ }
+ } else if (isArray(fn)) {
+ last = fn.length - 1;
+ assertArgFn(fn[last], 'fn');
+ $inject = fn.slice(0, last);
+ } else {
+ assertArgFn(fn, 'fn', true);
+ }
+ return $inject;
+}
+
+///////////////////////////////////////
+
+/**
+ * @ngdoc service
+ * @name $injector
+ *
+ * @description
+ *
+ * `$injector` is used to retrieve object instances as defined by
+ * {@link auto.$provide provider}, instantiate types, invoke methods,
+ * and load modules.
+ *
+ * The following always holds true:
+ *
+ * ```js
+ * var $injector = angular.injector();
+ * expect($injector.get('$injector')).toBe($injector);
+ * expect($injector.invoke(function($injector) {
+ * return $injector;
+ * })).toBe($injector);
+ * ```
+ *
+ * # Injection Function Annotation
+ *
+ * JavaScript does not have annotations, and annotations are needed for dependency injection. The
+ * following are all valid ways of annotating function with injection arguments and are equivalent.
+ *
+ * ```js
+ * // inferred (only works if code not minified/obfuscated)
+ * $injector.invoke(function(serviceA){});
+ *
+ * // annotated
+ * function explicit(serviceA) {};
+ * explicit.$inject = ['serviceA'];
+ * $injector.invoke(explicit);
+ *
+ * // inline
+ * $injector.invoke(['serviceA', function(serviceA){}]);
+ * ```
+ *
+ * ## Inference
+ *
+ * In JavaScript calling `toString()` on a function returns the function definition. The definition
+ * can then be parsed and the function arguments can be extracted. This method of discovering
+ * annotations is disallowed when the injector is in strict mode.
+ * *NOTE:* This does not work with minification, and obfuscation tools since these tools change the
+ * argument names.
+ *
+ * ## `$inject` Annotation
+ * By adding an `$inject` property onto a function the injection parameters can be specified.
+ *
+ * ## Inline
+ * As an array of injection names, where the last item in the array is the function to call.
+ */
+
+/**
+ * @ngdoc method
+ * @name $injector#get
+ *
+ * @description
+ * Return an instance of the service.
+ *
+ * @param {string} name The name of the instance to retrieve.
+ * @return {*} The instance.
+ */
+
+/**
+ * @ngdoc method
+ * @name $injector#invoke
+ *
+ * @description
+ * Invoke the method and supply the method arguments from the `$injector`.
+ *
+ * @param {!Function} fn The function to invoke. Function parameters are injected according to the
+ * {@link guide/di $inject Annotation} rules.
+ * @param {Object=} self The `this` for the invoked method.
+ * @param {Object=} locals Optional object. If preset then any argument names are read from this
+ * object first, before the `$injector` is consulted.
+ * @returns {*} the value returned by the invoked `fn` function.
+ */
+
+/**
+ * @ngdoc method
+ * @name $injector#has
+ *
+ * @description
+ * Allows the user to query if the particular service exists.
+ *
+ * @param {string} name Name of the service to query.
+ * @returns {boolean} `true` if injector has given service.
+ */
+
+/**
+ * @ngdoc method
+ * @name $injector#instantiate
+ * @description
+ * Create a new instance of JS type. The method takes a constructor function, invokes the new
+ * operator, and supplies all of the arguments to the constructor function as specified by the
+ * constructor annotation.
+ *
+ * @param {Function} Type Annotated constructor function.
+ * @param {Object=} locals Optional object. If preset then any argument names are read from this
+ * object first, before the `$injector` is consulted.
+ * @returns {Object} new instance of `Type`.
+ */
+
+/**
+ * @ngdoc method
+ * @name $injector#annotate
+ *
+ * @description
+ * Returns an array of service names which the function is requesting for injection. This API is
+ * used by the injector to determine which services need to be injected into the function when the
+ * function is invoked. There are three ways in which the function can be annotated with the needed
+ * dependencies.
+ *
+ * # Argument names
+ *
+ * The simplest form is to extract the dependencies from the arguments of the function. This is done
+ * by converting the function into a string using `toString()` method and extracting the argument
+ * names.
+ * ```js
+ * // Given
+ * function MyController($scope, $route) {
+ * // ...
+ * }
+ *
+ * // Then
+ * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
+ * ```
+ *
+ * You can disallow this method by using strict injection mode.
+ *
+ * This method does not work with code minification / obfuscation. For this reason the following
+ * annotation strategies are supported.
+ *
+ * # The `$inject` property
+ *
+ * If a function has an `$inject` property and its value is an array of strings, then the strings
+ * represent names of services to be injected into the function.
+ * ```js
+ * // Given
+ * var MyController = function(obfuscatedScope, obfuscatedRoute) {
+ * // ...
+ * }
+ * // Define function dependencies
+ * MyController['$inject'] = ['$scope', '$route'];
+ *
+ * // Then
+ * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
+ * ```
+ *
+ * # The array notation
+ *
+ * It is often desirable to inline Injected functions and that's when setting the `$inject` property
+ * is very inconvenient. In these situations using the array notation to specify the dependencies in
+ * a way that survives minification is a better choice:
+ *
+ * ```js
+ * // We wish to write this (not minification / obfuscation safe)
+ * injector.invoke(function($compile, $rootScope) {
+ * // ...
+ * });
+ *
+ * // We are forced to write break inlining
+ * var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) {
+ * // ...
+ * };
+ * tmpFn.$inject = ['$compile', '$rootScope'];
+ * injector.invoke(tmpFn);
+ *
+ * // To better support inline function the inline annotation is supported
+ * injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) {
+ * // ...
+ * }]);
+ *
+ * // Therefore
+ * expect(injector.annotate(
+ * ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}])
+ * ).toEqual(['$compile', '$rootScope']);
+ * ```
+ *
+ * @param {Function|Array.<string|Function>} fn Function for which dependent service names need to
+ * be retrieved as described above.
+ *
+ * @param {boolean=} [strictDi=false] Disallow argument name annotation inference.
+ *
+ * @returns {Array.<string>} The names of the services which the function requires.
+ */
+
+
+
+
+/**
+ * @ngdoc service
+ * @name $provide
+ *
+ * @description
+ *
+ * The {@link auto.$provide $provide} service has a number of methods for registering components
+ * with the {@link auto.$injector $injector}. Many of these functions are also exposed on
+ * {@link angular.Module}.
+ *
+ * An Angular **service** is a singleton object created by a **service factory**. These **service
+ * factories** are functions which, in turn, are created by a **service provider**.
+ * The **service providers** are constructor functions. When instantiated they must contain a
+ * property called `$get`, which holds the **service factory** function.
+ *
+ * When you request a service, the {@link auto.$injector $injector} is responsible for finding the
+ * correct **service provider**, instantiating it and then calling its `$get` **service factory**
+ * function to get the instance of the **service**.
+ *
+ * Often services have no configuration options and there is no need to add methods to the service
+ * provider. The provider will be no more than a constructor function with a `$get` property. For
+ * these cases the {@link auto.$provide $provide} service has additional helper methods to register
+ * services without specifying a provider.
+ *
+ * * {@link auto.$provide#provider provider(provider)} - registers a **service provider** with the
+ * {@link auto.$injector $injector}
+ * * {@link auto.$provide#constant constant(obj)} - registers a value/object that can be accessed by
+ * providers and services.
+ * * {@link auto.$provide#value value(obj)} - registers a value/object that can only be accessed by
+ * services, not providers.
+ * * {@link auto.$provide#factory factory(fn)} - registers a service **factory function**, `fn`,
+ * that will be wrapped in a **service provider** object, whose `$get` property will contain the
+ * given factory function.
+ * * {@link auto.$provide#service service(class)} - registers a **constructor function**, `class`
+ * that will be wrapped in a **service provider** object, whose `$get` property will instantiate
+ * a new object using the given constructor function.
+ *
+ * See the individual methods for more information and examples.
+ */
+
+/**
+ * @ngdoc method
+ * @name $provide#provider
+ * @description
+ *
+ * Register a **provider function** with the {@link auto.$injector $injector}. Provider functions
+ * are constructor functions, whose instances are responsible for "providing" a factory for a
+ * service.
+ *
+ * Service provider names start with the name of the service they provide followed by `Provider`.
+ * For example, the {@link ng.$log $log} service has a provider called
+ * {@link ng.$logProvider $logProvider}.
+ *
+ * Service provider objects can have additional methods which allow configuration of the provider
+ * and its service. Importantly, you can configure what kind of service is created by the `$get`
+ * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a
+ * method {@link ng.$logProvider#debugEnabled debugEnabled}
+ * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the
+ * console or not.
+ *
+ * @param {string} name The name of the instance. NOTE: the provider will be available under `name +
+ 'Provider'` key.
+ * @param {(Object|function())} provider If the provider is:
+ *
+ * - `Object`: then it should have a `$get` method. The `$get` method will be invoked using
+ * {@link auto.$injector#invoke $injector.invoke()} when an instance needs to be created.
+ * - `Constructor`: a new instance of the provider will be created using
+ * {@link auto.$injector#instantiate $injector.instantiate()}, then treated as `object`.
+ *
+ * @returns {Object} registered provider instance
+
+ * @example
+ *
+ * The following example shows how to create a simple event tracking service and register it using
+ * {@link auto.$provide#provider $provide.provider()}.
+ *
+ * ```js
+ * // Define the eventTracker provider
+ * function EventTrackerProvider() {
+ * var trackingUrl = '/track';
+ *
+ * // A provider method for configuring where the tracked events should been saved
+ * this.setTrackingUrl = function(url) {
+ * trackingUrl = url;
+ * };
+ *
+ * // The service factory function
+ * this.$get = ['$http', function($http) {
+ * var trackedEvents = {};
+ * return {
+ * // Call this to track an event
+ * event: function(event) {
+ * var count = trackedEvents[event] || 0;
+ * count += 1;
+ * trackedEvents[event] = count;
+ * return count;
+ * },
+ * // Call this to save the tracked events to the trackingUrl
+ * save: function() {
+ * $http.post(trackingUrl, trackedEvents);
+ * }
+ * };
+ * }];
+ * }
+ *
+ * describe('eventTracker', function() {
+ * var postSpy;
+ *
+ * beforeEach(module(function($provide) {
+ * // Register the eventTracker provider
+ * $provide.provider('eventTracker', EventTrackerProvider);
+ * }));
+ *
+ * beforeEach(module(function(eventTrackerProvider) {
+ * // Configure eventTracker provider
+ * eventTrackerProvider.setTrackingUrl('/custom-track');
+ * }));
+ *
+ * it('tracks events', inject(function(eventTracker) {
+ * expect(eventTracker.event('login')).toEqual(1);
+ * expect(eventTracker.event('login')).toEqual(2);
+ * }));
+ *
+ * it('saves to the tracking url', inject(function(eventTracker, $http) {
+ * postSpy = spyOn($http, 'post');
+ * eventTracker.event('login');
+ * eventTracker.save();
+ * expect(postSpy).toHaveBeenCalled();
+ * expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track');
+ * expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track');
+ * expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 });
+ * }));
+ * });
+ * ```
+ */
+
+/**
+ * @ngdoc method
+ * @name $provide#factory
+ * @description
+ *
+ * Register a **service factory**, which will be called to return the service instance.
+ * This is short for registering a service where its provider consists of only a `$get` property,
+ * which is the given service factory function.
+ * You should use {@link auto.$provide#factory $provide.factory(getFn)} if you do not need to
+ * configure your service in a provider.
+ *
+ * @param {string} name The name of the instance.
+ * @param {function()} $getFn The $getFn for the instance creation. Internally this is a short hand
+ * for `$provide.provider(name, {$get: $getFn})`.
+ * @returns {Object} registered provider instance
+ *
+ * @example
+ * Here is an example of registering a service
+ * ```js
+ * $provide.factory('ping', ['$http', function($http) {
+ * return function ping() {
+ * return $http.send('/ping');
+ * };
+ * }]);
+ * ```
+ * You would then inject and use this service like this:
+ * ```js
+ * someModule.controller('Ctrl', ['ping', function(ping) {
+ * ping();
+ * }]);
+ * ```
+ */
+
+
+/**
+ * @ngdoc method
+ * @name $provide#service
+ * @description
+ *
+ * Register a **service constructor**, which will be invoked with `new` to create the service
+ * instance.
+ * This is short for registering a service where its provider's `$get` property is the service
+ * constructor function that will be used to instantiate the service instance.
+ *
+ * You should use {@link auto.$provide#service $provide.service(class)} if you define your service
+ * as a type/class.
+ *
+ * @param {string} name The name of the instance.
+ * @param {Function} constructor A class (constructor function) that will be instantiated.
+ * @returns {Object} registered provider instance
+ *
+ * @example
+ * Here is an example of registering a service using
+ * {@link auto.$provide#service $provide.service(class)}.
+ * ```js
+ * var Ping = function($http) {
+ * this.$http = $http;
+ * };
+ *
+ * Ping.$inject = ['$http'];
+ *
+ * Ping.prototype.send = function() {
+ * return this.$http.get('/ping');
+ * };
+ * $provide.service('ping', Ping);
+ * ```
+ * You would then inject and use this service like this:
+ * ```js
+ * someModule.controller('Ctrl', ['ping', function(ping) {
+ * ping.send();
+ * }]);
+ * ```
+ */
+
+
+/**
+ * @ngdoc method
+ * @name $provide#value
+ * @description
+ *
+ * Register a **value service** with the {@link auto.$injector $injector}, such as a string, a
+ * number, an array, an object or a function. This is short for registering a service where its
+ * provider's `$get` property is a factory function that takes no arguments and returns the **value
+ * service**.
+ *
+ * Value services are similar to constant services, except that they cannot be injected into a
+ * module configuration function (see {@link angular.Module#config}) but they can be overridden by
+ * an Angular
+ * {@link auto.$provide#decorator decorator}.
+ *
+ * @param {string} name The name of the instance.
+ * @param {*} value The value.
+ * @returns {Object} registered provider instance
+ *
+ * @example
+ * Here are some examples of creating value services.
+ * ```js
+ * $provide.value('ADMIN_USER', 'admin');
+ *
+ * $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 });
+ *
+ * $provide.value('halfOf', function(value) {
+ * return value / 2;
+ * });
+ * ```
+ */
+
+
+/**
+ * @ngdoc method
+ * @name $provide#constant
+ * @description
+ *
+ * Register a **constant service**, such as a string, a number, an array, an object or a function,
+ * with the {@link auto.$injector $injector}. Unlike {@link auto.$provide#value value} it can be
+ * injected into a module configuration function (see {@link angular.Module#config}) and it cannot
+ * be overridden by an Angular {@link auto.$provide#decorator decorator}.
+ *
+ * @param {string} name The name of the constant.
+ * @param {*} value The constant value.
+ * @returns {Object} registered instance
+ *
+ * @example
+ * Here a some examples of creating constants:
+ * ```js
+ * $provide.constant('SHARD_HEIGHT', 306);
+ *
+ * $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']);
+ *
+ * $provide.constant('double', function(value) {
+ * return value * 2;
+ * });
+ * ```
+ */
+
+
+/**
+ * @ngdoc method
+ * @name $provide#decorator
+ * @description
+ *
+ * Register a **service decorator** with the {@link auto.$injector $injector}. A service decorator
+ * intercepts the creation of a service, allowing it to override or modify the behaviour of the
+ * service. The object returned by the decorator may be the original service, or a new service
+ * object which replaces or wraps and delegates to the original service.
+ *
+ * @param {string} name The name of the service to decorate.
+ * @param {function()} decorator This function will be invoked when the service needs to be
+ * instantiated and should return the decorated service instance. The function is called using
+ * the {@link auto.$injector#invoke injector.invoke} method and is therefore fully injectable.
+ * Local injection arguments:
+ *
+ * * `$delegate` - The original service instance, which can be monkey patched, configured,
+ * decorated or delegated to.
+ *
+ * @example
+ * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting
+ * calls to {@link ng.$log#error $log.warn()}.
+ * ```js
+ * $provide.decorator('$log', ['$delegate', function($delegate) {
+ * $delegate.warn = $delegate.error;
+ * return $delegate;
+ * }]);
+ * ```
+ */
+
+
+function createInjector(modulesToLoad, strictDi) {
+ strictDi = (strictDi === true);
+ var INSTANTIATING = {},
+ providerSuffix = 'Provider',
+ path = [],
+ loadedModules = new HashMap([], true),
+ providerCache = {
+ $provide: {
+ provider: supportObject(provider),
+ factory: supportObject(factory),
+ service: supportObject(service),
+ value: supportObject(value),
+ constant: supportObject(constant),
+ decorator: decorator
+ }
+ },
+ providerInjector = (providerCache.$injector =
+ createInternalInjector(providerCache, function() {
+ throw $injectorMinErr('unpr', "Unknown provider: {0}", path.join(' <- '));
+ })),
+ instanceCache = {},
+ instanceInjector = (instanceCache.$injector =
+ createInternalInjector(instanceCache, function(servicename) {
+ var provider = providerInjector.get(servicename + providerSuffix);
+ return instanceInjector.invoke(provider.$get, provider, undefined, servicename);
+ }));
+
+
+ forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); });
+
+ return instanceInjector;
+
+ ////////////////////////////////////
+ // $provider
+ ////////////////////////////////////
+
+ function supportObject(delegate) {
+ return function(key, value) {
+ if (isObject(key)) {
+ forEach(key, reverseParams(delegate));
+ } else {
+ return delegate(key, value);
+ }
+ };
+ }
+
+ function provider(name, provider_) {
+ assertNotHasOwnProperty(name, 'service');
+ if (isFunction(provider_) || isArray(provider_)) {
+ provider_ = providerInjector.instantiate(provider_);
+ }
+ if (!provider_.$get) {
+ throw $injectorMinErr('pget', "Provider '{0}' must define $get factory method.", name);
+ }
+ return providerCache[name + providerSuffix] = provider_;
+ }
+
+ function enforceReturnValue(name, factory) {
+ return function enforcedReturnValue() {
+ var result = instanceInjector.invoke(factory, this, undefined, name);
+ if (isUndefined(result)) {
+ throw $injectorMinErr('undef', "Provider '{0}' must return a value from $get factory method.", name);
+ }
+ return result;
+ };
+ }
+
+ function factory(name, factoryFn, enforce) {
+ return provider(name, {
+ $get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn
+ });
+ }
+
+ function service(name, constructor) {
+ return factory(name, ['$injector', function($injector) {
+ return $injector.instantiate(constructor);
+ }]);
+ }
+
+ function value(name, val) { return factory(name, valueFn(val), false); }
+
+ function constant(name, value) {
+ assertNotHasOwnProperty(name, 'constant');
+ providerCache[name] = value;
+ instanceCache[name] = value;
+ }
+
+ function decorator(serviceName, decorFn) {
+ var origProvider = providerInjector.get(serviceName + providerSuffix),
+ orig$get = origProvider.$get;
+
+ origProvider.$get = function() {
+ var origInstance = instanceInjector.invoke(orig$get, origProvider);
+ return instanceInjector.invoke(decorFn, null, {$delegate: origInstance});
+ };
+ }
+
+ ////////////////////////////////////
+ // Module Loading
+ ////////////////////////////////////
+ function loadModules(modulesToLoad) {
+ var runBlocks = [], moduleFn;
+ forEach(modulesToLoad, function(module) {
+ if (loadedModules.get(module)) return;
+ loadedModules.put(module, true);
+
+ function runInvokeQueue(queue) {
+ var i, ii;
+ for (i = 0, ii = queue.length; i < ii; i++) {
+ var invokeArgs = queue[i],
+ provider = providerInjector.get(invokeArgs[0]);
+
+ provider[invokeArgs[1]].apply(provider, invokeArgs[2]);
+ }
+ }
+
+ try {
+ if (isString(module)) {
+ moduleFn = angularModule(module);
+ runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks);
+ runInvokeQueue(moduleFn._invokeQueue);
+ runInvokeQueue(moduleFn._configBlocks);
+ } else if (isFunction(module)) {
+ runBlocks.push(providerInjector.invoke(module));
+ } else if (isArray(module)) {
+ runBlocks.push(providerInjector.invoke(module));
+ } else {
+ assertArgFn(module, 'module');
+ }
+ } catch (e) {
+ if (isArray(module)) {
+ module = module[module.length - 1];
+ }
+ if (e.message && e.stack && e.stack.indexOf(e.message) == -1) {
+ // Safari & FF's stack traces don't contain error.message content
+ // unlike those of Chrome and IE
+ // So if stack doesn't contain message, we create a new string that contains both.
+ // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here.
+ /* jshint -W022 */
+ e = e.message + '\n' + e.stack;
+ }
+ throw $injectorMinErr('modulerr', "Failed to instantiate module {0} due to:\n{1}",
+ module, e.stack || e.message || e);
+ }
+ });
+ return runBlocks;
+ }
+
+ ////////////////////////////////////
+ // internal Injector
+ ////////////////////////////////////
+
+ function createInternalInjector(cache, factory) {
+
+ function getService(serviceName) {
+ if (cache.hasOwnProperty(serviceName)) {
+ if (cache[serviceName] === INSTANTIATING) {
+ throw $injectorMinErr('cdep', 'Circular dependency found: {0}',
+ serviceName + ' <- ' + path.join(' <- '));
+ }
+ return cache[serviceName];
+ } else {
+ try {
+ path.unshift(serviceName);
+ cache[serviceName] = INSTANTIATING;
+ return cache[serviceName] = factory(serviceName);
+ } catch (err) {
+ if (cache[serviceName] === INSTANTIATING) {
+ delete cache[serviceName];
+ }
+ throw err;
+ } finally {
+ path.shift();
+ }
+ }
+ }
+
+ function invoke(fn, self, locals, serviceName) {
+ if (typeof locals === 'string') {
+ serviceName = locals;
+ locals = null;
+ }
+
+ var args = [],
+ $inject = annotate(fn, strictDi, serviceName),
+ length, i,
+ key;
+
+ for (i = 0, length = $inject.length; i < length; i++) {
+ key = $inject[i];
+ if (typeof key !== 'string') {
+ throw $injectorMinErr('itkn',
+ 'Incorrect injection token! Expected service name as string, got {0}', key);
+ }
+ args.push(
+ locals && locals.hasOwnProperty(key)
+ ? locals[key]
+ : getService(key)
+ );
+ }
+ if (isArray(fn)) {
+ fn = fn[length];
+ }
+
+ // http://jsperf.com/angularjs-invoke-apply-vs-switch
+ // #5388
+ return fn.apply(self, args);
+ }
+
+ function instantiate(Type, locals, serviceName) {
+ // Check if Type is annotated and use just the given function at n-1 as parameter
+ // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]);
+ // Object creation: http://jsperf.com/create-constructor/2
+ var instance = Object.create((isArray(Type) ? Type[Type.length - 1] : Type).prototype);
+ var returnedValue = invoke(Type, instance, locals, serviceName);
+
+ return isObject(returnedValue) || isFunction(returnedValue) ? returnedValue : instance;
+ }
+
+ return {
+ invoke: invoke,
+ instantiate: instantiate,
+ get: getService,
+ annotate: annotate,
+ has: function(name) {
+ return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name);
+ }
+ };
+ }
+}
+
+createInjector.$$annotate = annotate;
+
+/**
+ * @ngdoc provider
+ * @name $anchorScrollProvider
+ *
+ * @description
+ * Use `$anchorScrollProvider` to disable automatic scrolling whenever
+ * {@link ng.$location#hash $location.hash()} changes.
+ */
+function $AnchorScrollProvider() {
+
+ var autoScrollingEnabled = true;
+
+ /**
+ * @ngdoc method
+ * @name $anchorScrollProvider#disableAutoScrolling
+ *
+ * @description
+ * By default, {@link ng.$anchorScroll $anchorScroll()} will automatically detect changes to
+ * {@link ng.$location#hash $location.hash()} and scroll to the element matching the new hash.<br />
+ * Use this method to disable automatic scrolling.
+ *
+ * If automatic scrolling is disabled, one must explicitly call
+ * {@link ng.$anchorScroll $anchorScroll()} in order to scroll to the element related to the
+ * current hash.
+ */
+ this.disableAutoScrolling = function() {
+ autoScrollingEnabled = false;
+ };
+
+ /**
+ * @ngdoc service
+ * @name $anchorScroll
+ * @kind function
+ * @requires $window
+ * @requires $location
+ * @requires $rootScope
+ *
+ * @description
+ * When called, it checks the current value of {@link ng.$location#hash $location.hash()} and
+ * scrolls to the related element, according to the rules specified in the
+ * [Html5 spec](http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document).
+ *
+ * It also watches the {@link ng.$location#hash $location.hash()} and automatically scrolls to
+ * match any anchor whenever it changes. This can be disabled by calling
+ * {@link ng.$anchorScrollProvider#disableAutoScrolling $anchorScrollProvider.disableAutoScrolling()}.
+ *
+ * Additionally, you can use its {@link ng.$anchorScroll#yOffset yOffset} property to specify a
+ * vertical scroll-offset (either fixed or dynamic).
+ *
+ * @property {(number|function|jqLite)} yOffset
+ * If set, specifies a vertical scroll-offset. This is often useful when there are fixed
+ * positioned elements at the top of the page, such as navbars, headers etc.
+ *
+ * `yOffset` can be specified in various ways:
+ * - **number**: A fixed number of pixels to be used as offset.<br /><br />
+ * - **function**: A getter function called everytime `$anchorScroll()` is executed. Must return
+ * a number representing the offset (in pixels).<br /><br />
+ * - **jqLite**: A jqLite/jQuery element to be used for specifying the offset. The distance from
+ * the top of the page to the element's bottom will be used as offset.<br />
+ * **Note**: The element will be taken into account only as long as its `position` is set to
+ * `fixed`. This option is useful, when dealing with responsive navbars/headers that adjust
+ * their height and/or positioning according to the viewport's size.
+ *
+ * <br />
+ * <div class="alert alert-warning">
+ * In order for `yOffset` to work properly, scrolling should take place on the document's root and
+ * not some child element.
+ * </div>
+ *
+ * @example
+ <example module="anchorScrollExample">
+ <file name="index.html">
+ <div id="scrollArea" ng-controller="ScrollController">
+ <a ng-click="gotoBottom()">Go to bottom</a>
+ <a id="bottom"></a> You're at the bottom!
+ </div>
+ </file>
+ <file name="script.js">
+ angular.module('anchorScrollExample', [])
+ .controller('ScrollController', ['$scope', '$location', '$anchorScroll',
+ function ($scope, $location, $anchorScroll) {
+ $scope.gotoBottom = function() {
+ // set the location.hash to the id of
+ // the element you wish to scroll to.
+ $location.hash('bottom');
+
+ // call $anchorScroll()
+ $anchorScroll();
+ };
+ }]);
+ </file>
+ <file name="style.css">
+ #scrollArea {
+ height: 280px;
+ overflow: auto;
+ }
+
+ #bottom {
+ display: block;
+ margin-top: 2000px;
+ }
+ </file>
+ </example>
+ *
+ * <hr />
+ * The example below illustrates the use of a vertical scroll-offset (specified as a fixed value).
+ * See {@link ng.$anchorScroll#yOffset $anchorScroll.yOffset} for more details.
+ *
+ * @example
+ <example module="anchorScrollOffsetExample">
+ <file name="index.html">
+ <div class="fixed-header" ng-controller="headerCtrl">
+ <a href="" ng-click="gotoAnchor(x)" ng-repeat="x in [1,2,3,4,5]">
+ Go to anchor {{x}}
+ </a>
+ </div>
+ <div id="anchor{{x}}" class="anchor" ng-repeat="x in [1,2,3,4,5]">
+ Anchor {{x}} of 5
+ </div>
+ </file>
+ <file name="script.js">
+ angular.module('anchorScrollOffsetExample', [])
+ .run(['$anchorScroll', function($anchorScroll) {
+ $anchorScroll.yOffset = 50; // always scroll by 50 extra pixels
+ }])
+ .controller('headerCtrl', ['$anchorScroll', '$location', '$scope',
+ function ($anchorScroll, $location, $scope) {
+ $scope.gotoAnchor = function(x) {
+ var newHash = 'anchor' + x;
+ if ($location.hash() !== newHash) {
+ // set the $location.hash to `newHash` and
+ // $anchorScroll will automatically scroll to it
+ $location.hash('anchor' + x);
+ } else {
+ // call $anchorScroll() explicitly,
+ // since $location.hash hasn't changed
+ $anchorScroll();
+ }
+ };
+ }
+ ]);
+ </file>
+ <file name="style.css">
+ body {
+ padding-top: 50px;
+ }
+
+ .anchor {
+ border: 2px dashed DarkOrchid;
+ padding: 10px 10px 200px 10px;
+ }
+
+ .fixed-header {
+ background-color: rgba(0, 0, 0, 0.2);
+ height: 50px;
+ position: fixed;
+ top: 0; left: 0; right: 0;
+ }
+
+ .fixed-header > a {
+ display: inline-block;
+ margin: 5px 15px;
+ }
+ </file>
+ </example>
+ */
+ this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) {
+ var document = $window.document;
+
+ // Helper function to get first anchor from a NodeList
+ // (using `Array#some()` instead of `angular#forEach()` since it's more performant
+ // and working in all supported browsers.)
+ function getFirstAnchor(list) {
+ var result = null;
+ Array.prototype.some.call(list, function(element) {
+ if (nodeName_(element) === 'a') {
+ result = element;
+ return true;
+ }
+ });
+ return result;
+ }
+
+ function getYOffset() {
+
+ var offset = scroll.yOffset;
+
+ if (isFunction(offset)) {
+ offset = offset();
+ } else if (isElement(offset)) {
+ var elem = offset[0];
+ var style = $window.getComputedStyle(elem);
+ if (style.position !== 'fixed') {
+ offset = 0;
+ } else {
+ offset = elem.getBoundingClientRect().bottom;
+ }
+ } else if (!isNumber(offset)) {
+ offset = 0;
+ }
+
+ return offset;
+ }
+
+ function scrollTo(elem) {
+ if (elem) {
+ elem.scrollIntoView();
+
+ var offset = getYOffset();
+
+ if (offset) {
+ // `offset` is the number of pixels we should scroll UP in order to align `elem` properly.
+ // This is true ONLY if the call to `elem.scrollIntoView()` initially aligns `elem` at the
+ // top of the viewport.
+ //
+ // IF the number of pixels from the top of `elem` to the end of the page's content is less
+ // than the height of the viewport, then `elem.scrollIntoView()` will align the `elem` some
+ // way down the page.
+ //
+ // This is often the case for elements near the bottom of the page.
+ //
+ // In such cases we do not need to scroll the whole `offset` up, just the difference between
+ // the top of the element and the offset, which is enough to align the top of `elem` at the
+ // desired position.
+ var elemTop = elem.getBoundingClientRect().top;
+ $window.scrollBy(0, elemTop - offset);
+ }
+ } else {
+ $window.scrollTo(0, 0);
+ }
+ }
+
+ function scroll() {
+ var hash = $location.hash(), elm;
+
+ // empty hash, scroll to the top of the page
+ if (!hash) scrollTo(null);
+
+ // element with given id
+ else if ((elm = document.getElementById(hash))) scrollTo(elm);
+
+ // first anchor with given name :-D
+ else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) scrollTo(elm);
+
+ // no element and hash == 'top', scroll to the top of the page
+ else if (hash === 'top') scrollTo(null);
+ }
+
+ // does not scroll when user clicks on anchor link that is currently on
+ // (no url change, no $location.hash() change), browser native does scroll
+ if (autoScrollingEnabled) {
+ $rootScope.$watch(function autoScrollWatch() {return $location.hash();},
+ function autoScrollWatchAction(newVal, oldVal) {
+ // skip the initial scroll if $location.hash is empty
+ if (newVal === oldVal && newVal === '') return;
+
+ jqLiteDocumentLoaded(function() {
+ $rootScope.$evalAsync(scroll);
+ });
+ });
+ }
+
+ return scroll;
+ }];
+}
+
+var $animateMinErr = minErr('$animate');
+
+/**
+ * @ngdoc provider
+ * @name $animateProvider
+ *
+ * @description
+ * Default implementation of $animate that doesn't perform any animations, instead just
+ * synchronously performs DOM
+ * updates and calls done() callbacks.
+ *
+ * In order to enable animations the ngAnimate module has to be loaded.
+ *
+ * To see the functional implementation check out src/ngAnimate/animate.js
+ */
+var $AnimateProvider = ['$provide', function($provide) {
+
+
+ this.$$selectors = {};
+
+
+ /**
+ * @ngdoc method
+ * @name $animateProvider#register
+ *
+ * @description
+ * Registers a new injectable animation factory function. The factory function produces the
+ * animation object which contains callback functions for each event that is expected to be
+ * animated.
+ *
+ * * `eventFn`: `function(Element, doneFunction)` The element to animate, the `doneFunction`
+ * must be called once the element animation is complete. If a function is returned then the
+ * animation service will use this function to cancel the animation whenever a cancel event is
+ * triggered.
+ *
+ *
+ * ```js
+ * return {
+ * eventFn : function(element, done) {
+ * //code to run the animation
+ * //once complete, then run done()
+ * return function cancellationFunction() {
+ * //code to cancel the animation
+ * }
+ * }
+ * }
+ * ```
+ *
+ * @param {string} name The name of the animation.
+ * @param {Function} factory The factory function that will be executed to return the animation
+ * object.
+ */
+ this.register = function(name, factory) {
+ var key = name + '-animation';
+ if (name && name.charAt(0) != '.') throw $animateMinErr('notcsel',
+ "Expecting class selector starting with '.' got '{0}'.", name);
+ this.$$selectors[name.substr(1)] = key;
+ $provide.factory(key, factory);
+ };
+
+ /**
+ * @ngdoc method
+ * @name $animateProvider#classNameFilter
+ *
+ * @description
+ * Sets and/or returns the CSS class regular expression that is checked when performing
+ * an animation. Upon bootstrap the classNameFilter value is not set at all and will
+ * therefore enable $animate to attempt to perform an animation on any element.
+ * When setting the classNameFilter value, animations will only be performed on elements
+ * that successfully match the filter expression. This in turn can boost performance
+ * for low-powered devices as well as applications containing a lot of structural operations.
+ * @param {RegExp=} expression The className expression which will be checked against all animations
+ * @return {RegExp} The current CSS className expression value. If null then there is no expression value
+ */
+ this.classNameFilter = function(expression) {
+ if (arguments.length === 1) {
+ this.$$classNameFilter = (expression instanceof RegExp) ? expression : null;
+ }
+ return this.$$classNameFilter;
+ };
+
+ this.$get = ['$$q', '$$asyncCallback', '$rootScope', function($$q, $$asyncCallback, $rootScope) {
+
+ var currentDefer;
+
+ function runAnimationPostDigest(fn) {
+ var cancelFn, defer = $$q.defer();
+ defer.promise.$$cancelFn = function ngAnimateMaybeCancel() {
+ cancelFn && cancelFn();
+ };
+
+ $rootScope.$$postDigest(function ngAnimatePostDigest() {
+ cancelFn = fn(function ngAnimateNotifyComplete() {
+ defer.resolve();
+ });
+ });
+
+ return defer.promise;
+ }
+
+ function resolveElementClasses(element, classes) {
+ var toAdd = [], toRemove = [];
+
+ var hasClasses = createMap();
+ forEach((element.attr('class') || '').split(/\s+/), function(className) {
+ hasClasses[className] = true;
+ });
+
+ forEach(classes, function(status, className) {
+ var hasClass = hasClasses[className];
+
+ // If the most recent class manipulation (via $animate) was to remove the class, and the
+ // element currently has the class, the class is scheduled for removal. Otherwise, if
+ // the most recent class manipulation (via $animate) was to add the class, and the
+ // element does not currently have the class, the class is scheduled to be added.
+ if (status === false && hasClass) {
+ toRemove.push(className);
+ } else if (status === true && !hasClass) {
+ toAdd.push(className);
+ }
+ });
+
+ return (toAdd.length + toRemove.length) > 0 &&
+ [toAdd.length ? toAdd : null, toRemove.length ? toRemove : null];
+ }
+
+ function cachedClassManipulation(cache, classes, op) {
+ for (var i=0, ii = classes.length; i < ii; ++i) {
+ var className = classes[i];
+ cache[className] = op;
+ }
+ }
+
+ function asyncPromise() {
+ // only serve one instance of a promise in order to save CPU cycles
+ if (!currentDefer) {
+ currentDefer = $$q.defer();
+ $$asyncCallback(function() {
+ currentDefer.resolve();
+ currentDefer = null;
+ });
+ }
+ return currentDefer.promise;
+ }
+
+ function applyStyles(element, options) {
+ if (angular.isObject(options)) {
+ var styles = extend(options.from || {}, options.to || {});
+ element.css(styles);
+ }
+ }
+
+ /**
+ *
+ * @ngdoc service
+ * @name $animate
+ * @description The $animate service provides rudimentary DOM manipulation functions to
+ * insert, remove and move elements within the DOM, as well as adding and removing classes.
+ * This service is the core service used by the ngAnimate $animator service which provides
+ * high-level animation hooks for CSS and JavaScript.
+ *
+ * $animate is available in the AngularJS core, however, the ngAnimate module must be included
+ * to enable full out animation support. Otherwise, $animate will only perform simple DOM
+ * manipulation operations.
+ *
+ * To learn more about enabling animation support, click here to visit the {@link ngAnimate
+ * ngAnimate module page} as well as the {@link ngAnimate.$animate ngAnimate $animate service
+ * page}.
+ */
+ return {
+ animate: function(element, from, to) {
+ applyStyles(element, { from: from, to: to });
+ return asyncPromise();
+ },
+
+ /**
+ *
+ * @ngdoc method
+ * @name $animate#enter
+ * @kind function
+ * @description Inserts the element into the DOM either after the `after` element or
+ * as the first child within the `parent` element. When the function is called a promise
+ * is returned that will be resolved at a later time.
+ * @param {DOMElement} element the element which will be inserted into the DOM
+ * @param {DOMElement} parent the parent element which will append the element as
+ * a child (if the after element is not present)
+ * @param {DOMElement} after the sibling element which will append the element
+ * after itself
+ * @param {object=} options an optional collection of styles that will be applied to the element.
+ * @return {Promise} the animation callback promise
+ */
+ enter: function(element, parent, after, options) {
+ applyStyles(element, options);
+ after ? after.after(element)
+ : parent.prepend(element);
+ return asyncPromise();
+ },
+
+ /**
+ *
+ * @ngdoc method
+ * @name $animate#leave
+ * @kind function
+ * @description Removes the element from the DOM. When the function is called a promise
+ * is returned that will be resolved at a later time.
+ * @param {DOMElement} element the element which will be removed from the DOM
+ * @param {object=} options an optional collection of options that will be applied to the element.
+ * @return {Promise} the animation callback promise
+ */
+ leave: function(element, options) {
+ element.remove();
+ return asyncPromise();
+ },
+
+ /**
+ *
+ * @ngdoc method
+ * @name $animate#move
+ * @kind function
+ * @description Moves the position of the provided element within the DOM to be placed
+ * either after the `after` element or inside of the `parent` element. When the function
+ * is called a promise is returned that will be resolved at a later time.
+ *
+ * @param {DOMElement} element the element which will be moved around within the
+ * DOM
+ * @param {DOMElement} parent the parent element where the element will be
+ * inserted into (if the after element is not present)
+ * @param {DOMElement} after the sibling element where the element will be
+ * positioned next to
+ * @param {object=} options an optional collection of options that will be applied to the element.
+ * @return {Promise} the animation callback promise
+ */
+ move: function(element, parent, after, options) {
+ // Do not remove element before insert. Removing will cause data associated with the
+ // element to be dropped. Insert will implicitly do the remove.
+ return this.enter(element, parent, after, options);
+ },
+
+ /**
+ *
+ * @ngdoc method
+ * @name $animate#addClass
+ * @kind function
+ * @description Adds the provided className CSS class value to the provided element.
+ * When the function is called a promise is returned that will be resolved at a later time.
+ * @param {DOMElement} element the element which will have the className value
+ * added to it
+ * @param {string} className the CSS class which will be added to the element
+ * @param {object=} options an optional collection of options that will be applied to the element.
+ * @return {Promise} the animation callback promise
+ */
+ addClass: function(element, className, options) {
+ return this.setClass(element, className, [], options);
+ },
+
+ $$addClassImmediately: function(element, className, options) {
+ element = jqLite(element);
+ className = !isString(className)
+ ? (isArray(className) ? className.join(' ') : '')
+ : className;
+ forEach(element, function(element) {
+ jqLiteAddClass(element, className);
+ });
+ applyStyles(element, options);
+ return asyncPromise();
+ },
+
+ /**
+ *
+ * @ngdoc method
+ * @name $animate#removeClass
+ * @kind function
+ * @description Removes the provided className CSS class value from the provided element.
+ * When the function is called a promise is returned that will be resolved at a later time.
+ * @param {DOMElement} element the element which will have the className value
+ * removed from it
+ * @param {string} className the CSS class which will be removed from the element
+ * @param {object=} options an optional collection of options that will be applied to the element.
+ * @return {Promise} the animation callback promise
+ */
+ removeClass: function(element, className, options) {
+ return this.setClass(element, [], className, options);
+ },
+
+ $$removeClassImmediately: function(element, className, options) {
+ element = jqLite(element);
+ className = !isString(className)
+ ? (isArray(className) ? className.join(' ') : '')
+ : className;
+ forEach(element, function(element) {
+ jqLiteRemoveClass(element, className);
+ });
+ applyStyles(element, options);
+ return asyncPromise();
+ },
+
+ /**
+ *
+ * @ngdoc method
+ * @name $animate#setClass
+ * @kind function
+ * @description Adds and/or removes the given CSS classes to and from the element.
+ * When the function is called a promise is returned that will be resolved at a later time.
+ * @param {DOMElement} element the element which will have its CSS classes changed
+ * removed from it
+ * @param {string} add the CSS classes which will be added to the element
+ * @param {string} remove the CSS class which will be removed from the element
+ * @param {object=} options an optional collection of options that will be applied to the element.
+ * @return {Promise} the animation callback promise
+ */
+ setClass: function(element, add, remove, options) {
+ var self = this;
+ var STORAGE_KEY = '$$animateClasses';
+ var createdCache = false;
+ element = jqLite(element);
+
+ var cache = element.data(STORAGE_KEY);
+ if (!cache) {
+ cache = {
+ classes: {},
+ options: options
+ };
+ createdCache = true;
+ } else if (options && cache.options) {
+ cache.options = angular.extend(cache.options || {}, options);
+ }
+
+ var classes = cache.classes;
+
+ add = isArray(add) ? add : add.split(' ');
+ remove = isArray(remove) ? remove : remove.split(' ');
+ cachedClassManipulation(classes, add, true);
+ cachedClassManipulation(classes, remove, false);
+
+ if (createdCache) {
+ cache.promise = runAnimationPostDigest(function(done) {
+ var cache = element.data(STORAGE_KEY);
+ element.removeData(STORAGE_KEY);
+
+ // in the event that the element is removed before postDigest
+ // is run then the cache will be undefined and there will be
+ // no need anymore to add or remove and of the element classes
+ if (cache) {
+ var classes = resolveElementClasses(element, cache.classes);
+ if (classes) {
+ self.$$setClassImmediately(element, classes[0], classes[1], cache.options);
+ }
+ }
+
+ done();
+ });
+ element.data(STORAGE_KEY, cache);
+ }
+
+ return cache.promise;
+ },
+
+ $$setClassImmediately: function(element, add, remove, options) {
+ add && this.$$addClassImmediately(element, add);
+ remove && this.$$removeClassImmediately(element, remove);
+ applyStyles(element, options);
+ return asyncPromise();
+ },
+
+ enabled: noop,
+ cancel: noop
+ };
+ }];
+}];
+
+function $$AsyncCallbackProvider() {
+ this.$get = ['$$rAF', '$timeout', function($$rAF, $timeout) {
+ return $$rAF.supported
+ ? function(fn) { return $$rAF(fn); }
+ : function(fn) {
+ return $timeout(fn, 0, false);
+ };
+ }];
+}
+
+/* global stripHash: true */
+
+/**
+ * ! This is a private undocumented service !
+ *
+ * @name $browser
+ * @requires $log
+ * @description
+ * This object has two goals:
+ *
+ * - hide all the global state in the browser caused by the window object
+ * - abstract away all the browser specific features and inconsistencies
+ *
+ * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser`
+ * service, which can be used for convenient testing of the application without the interaction with
+ * the real browser apis.
+ */
+/**
+ * @param {object} window The global window object.
+ * @param {object} document jQuery wrapped document.
+ * @param {object} $log window.console or an object with the same interface.
+ * @param {object} $sniffer $sniffer service
+ */
+function Browser(window, document, $log, $sniffer) {
+ var self = this,
+ rawDocument = document[0],
+ location = window.location,
+ history = window.history,
+ setTimeout = window.setTimeout,
+ clearTimeout = window.clearTimeout,
+ pendingDeferIds = {};
+
+ self.isMock = false;
+
+ var outstandingRequestCount = 0;
+ var outstandingRequestCallbacks = [];
+
+ // TODO(vojta): remove this temporary api
+ self.$$completeOutstandingRequest = completeOutstandingRequest;
+ self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; };
+
+ /**
+ * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks`
+ * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed.
+ */
+ function completeOutstandingRequest(fn) {
+ try {
+ fn.apply(null, sliceArgs(arguments, 1));
+ } finally {
+ outstandingRequestCount--;
+ if (outstandingRequestCount === 0) {
+ while (outstandingRequestCallbacks.length) {
+ try {
+ outstandingRequestCallbacks.pop()();
+ } catch (e) {
+ $log.error(e);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * @private
+ * Note: this method is used only by scenario runner
+ * TODO(vojta): prefix this method with $$ ?
+ * @param {function()} callback Function that will be called when no outstanding request
+ */
+ self.notifyWhenNoOutstandingRequests = function(callback) {
+ // force browser to execute all pollFns - this is needed so that cookies and other pollers fire
+ // at some deterministic time in respect to the test runner's actions. Leaving things up to the
+ // regular poller would result in flaky tests.
+ forEach(pollFns, function(pollFn) { pollFn(); });
+
+ if (outstandingRequestCount === 0) {
+ callback();
+ } else {
+ outstandingRequestCallbacks.push(callback);
+ }
+ };
+
+ //////////////////////////////////////////////////////////////
+ // Poll Watcher API
+ //////////////////////////////////////////////////////////////
+ var pollFns = [],
+ pollTimeout;
+
+ /**
+ * @name $browser#addPollFn
+ *
+ * @param {function()} fn Poll function to add
+ *
+ * @description
+ * Adds a function to the list of functions that poller periodically executes,
+ * and starts polling if not started yet.
+ *
+ * @returns {function()} the added function
+ */
+ self.addPollFn = function(fn) {
+ if (isUndefined(pollTimeout)) startPoller(100, setTimeout);
+ pollFns.push(fn);
+ return fn;
+ };
+
+ /**
+ * @param {number} interval How often should browser call poll functions (ms)
+ * @param {function()} setTimeout Reference to a real or fake `setTimeout` function.
+ *
+ * @description
+ * Configures the poller to run in the specified intervals, using the specified
+ * setTimeout fn and kicks it off.
+ */
+ function startPoller(interval, setTimeout) {
+ (function check() {
+ forEach(pollFns, function(pollFn) { pollFn(); });
+ pollTimeout = setTimeout(check, interval);
+ })();
+ }
+
+ //////////////////////////////////////////////////////////////
+ // URL API
+ //////////////////////////////////////////////////////////////
+
+ var cachedState, lastHistoryState,
+ lastBrowserUrl = location.href,
+ baseElement = document.find('base'),
+ reloadLocation = null;
+
+ cacheState();
+ lastHistoryState = cachedState;
+
+ /**
+ * @name $browser#url
+ *
+ * @description
+ * GETTER:
+ * Without any argument, this method just returns current value of location.href.
+ *
+ * SETTER:
+ * With at least one argument, this method sets url to new value.
+ * If html5 history api supported, pushState/replaceState is used, otherwise
+ * location.href/location.replace is used.
+ * Returns its own instance to allow chaining
+ *
+ * NOTE: this api is intended for use only by the $location service. Please use the
+ * {@link ng.$location $location service} to change url.
+ *
+ * @param {string} url New url (when used as setter)
+ * @param {boolean=} replace Should new url replace current history record?
+ * @param {object=} state object to use with pushState/replaceState
+ */
+ self.url = function(url, replace, state) {
+ // In modern browsers `history.state` is `null` by default; treating it separately
+ // from `undefined` would cause `$browser.url('/foo')` to change `history.state`
+ // to undefined via `pushState`. Instead, let's change `undefined` to `null` here.
+ if (isUndefined(state)) {
+ state = null;
+ }
+
+ // Android Browser BFCache causes location, history reference to become stale.
+ if (location !== window.location) location = window.location;
+ if (history !== window.history) history = window.history;
+
+ // setter
+ if (url) {
+ var sameState = lastHistoryState === state;
+
+ // Don't change anything if previous and current URLs and states match. This also prevents
+ // IE<10 from getting into redirect loop when in LocationHashbangInHtml5Url mode.
+ // See https://github.com/angular/angular.js/commit/ffb2701
+ if (lastBrowserUrl === url && (!$sniffer.history || sameState)) {
+ return self;
+ }
+ var sameBase = lastBrowserUrl && stripHash(lastBrowserUrl) === stripHash(url);
+ lastBrowserUrl = url;
+ lastHistoryState = state;
+ // Don't use history API if only the hash changed
+ // due to a bug in IE10/IE11 which leads
+ // to not firing a `hashchange` nor `popstate` event
+ // in some cases (see #9143).
+ if ($sniffer.history && (!sameBase || !sameState)) {
+ history[replace ? 'replaceState' : 'pushState'](state, '', url);
+ cacheState();
+ // Do the assignment again so that those two variables are referentially identical.
+ lastHistoryState = cachedState;
+ } else {
+ if (!sameBase) {
+ reloadLocation = url;
+ }
+ if (replace) {
+ location.replace(url);
+ } else {
+ location.href = url;
+ }
+ }
+ return self;
+ // getter
+ } else {
+ // - reloadLocation is needed as browsers don't allow to read out
+ // the new location.href if a reload happened.
+ // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172
+ return reloadLocation || location.href.replace(/%27/g,"'");
+ }
+ };
+
+ /**
+ * @name $browser#state
+ *
+ * @description
+ * This method is a getter.
+ *
+ * Return history.state or null if history.state is undefined.
+ *
+ * @returns {object} state
+ */
+ self.state = function() {
+ return cachedState;
+ };
+
+ var urlChangeListeners = [],
+ urlChangeInit = false;
+
+ function cacheStateAndFireUrlChange() {
+ cacheState();
+ fireUrlChange();
+ }
+
+ // This variable should be used *only* inside the cacheState function.
+ var lastCachedState = null;
+ function cacheState() {
+ // This should be the only place in $browser where `history.state` is read.
+ cachedState = window.history.state;
+ cachedState = isUndefined(cachedState) ? null : cachedState;
+
+ // Prevent callbacks fo fire twice if both hashchange & popstate were fired.
+ if (equals(cachedState, lastCachedState)) {
+ cachedState = lastCachedState;
+ }
+ lastCachedState = cachedState;
+ }
+
+ function fireUrlChange() {
+ if (lastBrowserUrl === self.url() && lastHistoryState === cachedState) {
+ return;
+ }
+
+ lastBrowserUrl = self.url();
+ lastHistoryState = cachedState;
+ forEach(urlChangeListeners, function(listener) {
+ listener(self.url(), cachedState);
+ });
+ }
+
+ /**
+ * @name $browser#onUrlChange
+ *
+ * @description
+ * Register callback function that will be called, when url changes.
+ *
+ * It's only called when the url is changed from outside of angular:
+ * - user types different url into address bar
+ * - user clicks on history (forward/back) button
+ * - user clicks on a link
+ *
+ * It's not called when url is changed by $browser.url() method
+ *
+ * The listener gets called with new url as parameter.
+ *
+ * NOTE: this api is intended for use only by the $location service. Please use the
+ * {@link ng.$location $location service} to monitor url changes in angular apps.
+ *
+ * @param {function(string)} listener Listener function to be called when url changes.
+ * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous.
+ */
+ self.onUrlChange = function(callback) {
+ // TODO(vojta): refactor to use node's syntax for events
+ if (!urlChangeInit) {
+ // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera)
+ // don't fire popstate when user change the address bar and don't fire hashchange when url
+ // changed by push/replaceState
+
+ // html5 history api - popstate event
+ if ($sniffer.history) jqLite(window).on('popstate', cacheStateAndFireUrlChange);
+ // hashchange event
+ jqLite(window).on('hashchange', cacheStateAndFireUrlChange);
+
+ urlChangeInit = true;
+ }
+
+ urlChangeListeners.push(callback);
+ return callback;
+ };
+
+ /**
+ * Checks whether the url has changed outside of Angular.
+ * Needs to be exported to be able to check for changes that have been done in sync,
+ * as hashchange/popstate events fire in async.
+ */
+ self.$$checkUrlChange = fireUrlChange;
+
+ //////////////////////////////////////////////////////////////
+ // Misc API
+ //////////////////////////////////////////////////////////////
+
+ /**
+ * @name $browser#baseHref
+ *
+ * @description
+ * Returns current <base href>
+ * (always relative - without domain)
+ *
+ * @returns {string} The current base href
+ */
+ self.baseHref = function() {
+ var href = baseElement.attr('href');
+ return href ? href.replace(/^(https?\:)?\/\/[^\/]*/, '') : '';
+ };
+
+ //////////////////////////////////////////////////////////////
+ // Cookies API
+ //////////////////////////////////////////////////////////////
+ var lastCookies = {};
+ var lastCookieString = '';
+ var cookiePath = self.baseHref();
+
+ function safeDecodeURIComponent(str) {
+ try {
+ return decodeURIComponent(str);
+ } catch (e) {
+ return str;
+ }
+ }
+
+ /**
+ * @name $browser#cookies
+ *
+ * @param {string=} name Cookie name
+ * @param {string=} value Cookie value
+ *
+ * @description
+ * The cookies method provides a 'private' low level access to browser cookies.
+ * It is not meant to be used directly, use the $cookie service instead.
+ *
+ * The return values vary depending on the arguments that the method was called with as follows:
+ *
+ * - cookies() -> hash of all cookies, this is NOT a copy of the internal state, so do not modify
+ * it
+ * - cookies(name, value) -> set name to value, if value is undefined delete the cookie
+ * - cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that
+ * way)
+ *
+ * @returns {Object} Hash of all cookies (if called without any parameter)
+ */
+ self.cookies = function(name, value) {
+ var cookieLength, cookieArray, cookie, i, index;
+
+ if (name) {
+ if (value === undefined) {
+ rawDocument.cookie = encodeURIComponent(name) + "=;path=" + cookiePath +
+ ";expires=Thu, 01 Jan 1970 00:00:00 GMT";
+ } else {
+ if (isString(value)) {
+ cookieLength = (rawDocument.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value) +
+ ';path=' + cookiePath).length + 1;
+
+ // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum:
+ // - 300 cookies
+ // - 20 cookies per unique domain
+ // - 4096 bytes per cookie
+ if (cookieLength > 4096) {
+ $log.warn("Cookie '" + name +
+ "' possibly not set or overflowed because it was too large (" +
+ cookieLength + " > 4096 bytes)!");
+ }
+ }
+ }
+ } else {
+ if (rawDocument.cookie !== lastCookieString) {
+ lastCookieString = rawDocument.cookie;
+ cookieArray = lastCookieString.split("; ");
+ lastCookies = {};
+
+ for (i = 0; i < cookieArray.length; i++) {
+ cookie = cookieArray[i];
+ index = cookie.indexOf('=');
+ if (index > 0) { //ignore nameless cookies
+ name = safeDecodeURIComponent(cookie.substring(0, index));
+ // the first value that is seen for a cookie is the most
+ // specific one. values for the same cookie name that
+ // follow are for less specific paths.
+ if (lastCookies[name] === undefined) {
+ lastCookies[name] = safeDecodeURIComponent(cookie.substring(index + 1));
+ }
+ }
+ }
+ }
+ return lastCookies;
+ }
+ };
+
+
+ /**
+ * @name $browser#defer
+ * @param {function()} fn A function, who's execution should be deferred.
+ * @param {number=} [delay=0] of milliseconds to defer the function execution.
+ * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`.
+ *
+ * @description
+ * Executes a fn asynchronously via `setTimeout(fn, delay)`.
+ *
+ * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using
+ * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed
+ * via `$browser.defer.flush()`.
+ *
+ */
+ self.defer = function(fn, delay) {
+ var timeoutId;
+ outstandingRequestCount++;
+ timeoutId = setTimeout(function() {
+ delete pendingDeferIds[timeoutId];
+ completeOutstandingRequest(fn);
+ }, delay || 0);
+ pendingDeferIds[timeoutId] = true;
+ return timeoutId;
+ };
+
+
+ /**
+ * @name $browser#defer.cancel
+ *
+ * @description
+ * Cancels a deferred task identified with `deferId`.
+ *
+ * @param {*} deferId Token returned by the `$browser.defer` function.
+ * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully
+ * canceled.
+ */
+ self.defer.cancel = function(deferId) {
+ if (pendingDeferIds[deferId]) {
+ delete pendingDeferIds[deferId];
+ clearTimeout(deferId);
+ completeOutstandingRequest(noop);
+ return true;
+ }
+ return false;
+ };
+
+}
+
+function $BrowserProvider() {
+ this.$get = ['$window', '$log', '$sniffer', '$document',
+ function($window, $log, $sniffer, $document) {
+ return new Browser($window, $document, $log, $sniffer);
+ }];
+}
+
+/**
+ * @ngdoc service
+ * @name $cacheFactory
+ *
+ * @description
+ * Factory that constructs {@link $cacheFactory.Cache Cache} objects and gives access to
+ * them.
+ *
+ * ```js
+ *
+ * var cache = $cacheFactory('cacheId');
+ * expect($cacheFactory.get('cacheId')).toBe(cache);
+ * expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined();
+ *
+ * cache.put("key", "value");
+ * cache.put("another key", "another value");
+ *
+ * // We've specified no options on creation
+ * expect(cache.info()).toEqual({id: 'cacheId', size: 2});
+ *
+ * ```
+ *
+ *
+ * @param {string} cacheId Name or id of the newly created cache.
+ * @param {object=} options Options object that specifies the cache behavior. Properties:
+ *
+ * - `{number=}` `capacity` — turns the cache into LRU cache.
+ *
+ * @returns {object} Newly created cache object with the following set of methods:
+ *
+ * - `{object}` `info()` — Returns id, size, and options of cache.
+ * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns
+ * it.
+ * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss.
+ * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache.
+ * - `{void}` `removeAll()` — Removes all cached values.
+ * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory.
+ *
+ * @example
+ <example module="cacheExampleApp">
+ <file name="index.html">
+ <div ng-controller="CacheController">
+ <input ng-model="newCacheKey" placeholder="Key">
+ <input ng-model="newCacheValue" placeholder="Value">
+ <button ng-click="put(newCacheKey, newCacheValue)">Cache</button>
+
+ <p ng-if="keys.length">Cached Values</p>
+ <div ng-repeat="key in keys">
+ <span ng-bind="key"></span>
+ <span>: </span>
+ <b ng-bind="cache.get(key)"></b>
+ </div>
+
+ <p>Cache Info</p>
+ <div ng-repeat="(key, value) in cache.info()">
+ <span ng-bind="key"></span>
+ <span>: </span>
+ <b ng-bind="value"></b>
+ </div>
+ </div>
+ </file>
+ <file name="script.js">
+ angular.module('cacheExampleApp', []).
+ controller('CacheController', ['$scope', '$cacheFactory', function($scope, $cacheFactory) {
+ $scope.keys = [];
+ $scope.cache = $cacheFactory('cacheId');
+ $scope.put = function(key, value) {
+ if ($scope.cache.get(key) === undefined) {
+ $scope.keys.push(key);
+ }
+ $scope.cache.put(key, value === undefined ? null : value);
+ };
+ }]);
+ </file>
+ <file name="style.css">
+ p {
+ margin: 10px 0 3px;
+ }
+ </file>
+ </example>
+ */
+function $CacheFactoryProvider() {
+
+ this.$get = function() {
+ var caches = {};
+
+ function cacheFactory(cacheId, options) {
+ if (cacheId in caches) {
+ throw minErr('$cacheFactory')('iid', "CacheId '{0}' is already taken!", cacheId);
+ }
+
+ var size = 0,
+ stats = extend({}, options, {id: cacheId}),
+ data = {},
+ capacity = (options && options.capacity) || Number.MAX_VALUE,
+ lruHash = {},
+ freshEnd = null,
+ staleEnd = null;
+
+ /**
+ * @ngdoc type
+ * @name $cacheFactory.Cache
+ *
+ * @description
+ * A cache object used to store and retrieve data, primarily used by
+ * {@link $http $http} and the {@link ng.directive:script script} directive to cache
+ * templates and other data.
+ *
+ * ```js
+ * angular.module('superCache')
+ * .factory('superCache', ['$cacheFactory', function($cacheFactory) {
+ * return $cacheFactory('super-cache');
+ * }]);
+ * ```
+ *
+ * Example test:
+ *
+ * ```js
+ * it('should behave like a cache', inject(function(superCache) {
+ * superCache.put('key', 'value');
+ * superCache.put('another key', 'another value');
+ *
+ * expect(superCache.info()).toEqual({
+ * id: 'super-cache',
+ * size: 2
+ * });
+ *
+ * superCache.remove('another key');
+ * expect(superCache.get('another key')).toBeUndefined();
+ *
+ * superCache.removeAll();
+ * expect(superCache.info()).toEqual({
+ * id: 'super-cache',
+ * size: 0
+ * });
+ * }));
+ * ```
+ */
+ return caches[cacheId] = {
+
+ /**
+ * @ngdoc method
+ * @name $cacheFactory.Cache#put
+ * @kind function
+ *
+ * @description
+ * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be
+ * retrieved later, and incrementing the size of the cache if the key was not already
+ * present in the cache. If behaving like an LRU cache, it will also remove stale
+ * entries from the set.
+ *
+ * It will not insert undefined values into the cache.
+ *
+ * @param {string} key the key under which the cached data is stored.
+ * @param {*} value the value to store alongside the key. If it is undefined, the key
+ * will not be stored.
+ * @returns {*} the value stored.
+ */
+ put: function(key, value) {
+ if (capacity < Number.MAX_VALUE) {
+ var lruEntry = lruHash[key] || (lruHash[key] = {key: key});
+
+ refresh(lruEntry);
+ }
+
+ if (isUndefined(value)) return;
+ if (!(key in data)) size++;
+ data[key] = value;
+
+ if (size > capacity) {
+ this.remove(staleEnd.key);
+ }
+
+ return value;
+ },
+
+ /**
+ * @ngdoc method
+ * @name $cacheFactory.Cache#get
+ * @kind function
+ *
+ * @description
+ * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object.
+ *
+ * @param {string} key the key of the data to be retrieved
+ * @returns {*} the value stored.
+ */
+ get: function(key) {
+ if (capacity < Number.MAX_VALUE) {
+ var lruEntry = lruHash[key];
+
+ if (!lruEntry) return;
+
+ refresh(lruEntry);
+ }
+
+ return data[key];
+ },
+
+
+ /**
+ * @ngdoc method
+ * @name $cacheFactory.Cache#remove
+ * @kind function
+ *
+ * @description
+ * Removes an entry from the {@link $cacheFactory.Cache Cache} object.
+ *
+ * @param {string} key the key of the entry to be removed
+ */
+ remove: function(key) {
+ if (capacity < Number.MAX_VALUE) {
+ var lruEntry = lruHash[key];
+
+ if (!lruEntry) return;
+
+ if (lruEntry == freshEnd) freshEnd = lruEntry.p;
+ if (lruEntry == staleEnd) staleEnd = lruEntry.n;
+ link(lruEntry.n,lruEntry.p);
+
+ delete lruHash[key];
+ }
+
+ delete data[key];
+ size--;
+ },
+
+
+ /**
+ * @ngdoc method
+ * @name $cacheFactory.Cache#removeAll
+ * @kind function
+ *
+ * @description
+ * Clears the cache object of any entries.
+ */
+ removeAll: function() {
+ data = {};
+ size = 0;
+ lruHash = {};
+ freshEnd = staleEnd = null;
+ },
+
+
+ /**
+ * @ngdoc method
+ * @name $cacheFactory.Cache#destroy
+ * @kind function
+ *
+ * @description
+ * Destroys the {@link $cacheFactory.Cache Cache} object entirely,
+ * removing it from the {@link $cacheFactory $cacheFactory} set.
+ */
+ destroy: function() {
+ data = null;
+ stats = null;
+ lruHash = null;
+ delete caches[cacheId];
+ },
+
+
+ /**
+ * @ngdoc method
+ * @name $cacheFactory.Cache#info
+ * @kind function
+ *
+ * @description
+ * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}.
+ *
+ * @returns {object} an object with the following properties:
+ * <ul>
+ * <li>**id**: the id of the cache instance</li>
+ * <li>**size**: the number of entries kept in the cache instance</li>
+ * <li>**...**: any additional properties from the options object when creating the
+ * cache.</li>
+ * </ul>
+ */
+ info: function() {
+ return extend({}, stats, {size: size});
+ }
+ };
+
+
+ /**
+ * makes the `entry` the freshEnd of the LRU linked list
+ */
+ function refresh(entry) {
+ if (entry != freshEnd) {
+ if (!staleEnd) {
+ staleEnd = entry;
+ } else if (staleEnd == entry) {
+ staleEnd = entry.n;
+ }
+
+ link(entry.n, entry.p);
+ link(entry, freshEnd);
+ freshEnd = entry;
+ freshEnd.n = null;
+ }
+ }
+
+
+ /**
+ * bidirectionally links two entries of the LRU linked list
+ */
+ function link(nextEntry, prevEntry) {
+ if (nextEntry != prevEntry) {
+ if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify
+ if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify
+ }
+ }
+ }
+
+
+ /**
+ * @ngdoc method
+ * @name $cacheFactory#info
+ *
+ * @description
+ * Get information about all the caches that have been created
+ *
+ * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info`
+ */
+ cacheFactory.info = function() {
+ var info = {};
+ forEach(caches, function(cache, cacheId) {
+ info[cacheId] = cache.info();
+ });
+ return info;
+ };
+
+
+ /**
+ * @ngdoc method
+ * @name $cacheFactory#get
+ *
+ * @description
+ * Get access to a cache object by the `cacheId` used when it was created.
+ *
+ * @param {string} cacheId Name or id of a cache to access.
+ * @returns {object} Cache object identified by the cacheId or undefined if no such cache.
+ */
+ cacheFactory.get = function(cacheId) {
+ return caches[cacheId];
+ };
+
+
+ return cacheFactory;
+ };
+}
+
+/**
+ * @ngdoc service
+ * @name $templateCache
+ *
+ * @description
+ * The first time a template is used, it is loaded in the template cache for quick retrieval. You
+ * can load templates directly into the cache in a `script` tag, or by consuming the
+ * `$templateCache` service directly.
+ *
+ * Adding via the `script` tag:
+ *
+ * ```html
+ * <script type="text/ng-template" id="templateId.html">
+ * <p>This is the content of the template</p>
+ * </script>
+ * ```
+ *
+ * **Note:** the `script` tag containing the template does not need to be included in the `head` of
+ * the document, but it must be a descendent of the {@link ng.$rootElement $rootElement} (IE,
+ * element with ng-app attribute), otherwise the template will be ignored.
+ *
+ * Adding via the $templateCache service:
+ *
+ * ```js
+ * var myApp = angular.module('myApp', []);
+ * myApp.run(function($templateCache) {
+ * $templateCache.put('templateId.html', 'This is the content of the template');
+ * });
+ * ```
+ *
+ * To retrieve the template later, simply use it in your HTML:
+ * ```html
+ * <div ng-include=" 'templateId.html' "></div>
+ * ```
+ *
+ * or get it via Javascript:
+ * ```js
+ * $templateCache.get('templateId.html')
+ * ```
+ *
+ * See {@link ng.$cacheFactory $cacheFactory}.
+ *
+ */
+function $TemplateCacheProvider() {
+ this.$get = ['$cacheFactory', function($cacheFactory) {
+ return $cacheFactory('templates');
+ }];
+}
+
+/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE!
+ *
+ * DOM-related variables:
+ *
+ * - "node" - DOM Node
+ * - "element" - DOM Element or Node
+ * - "$node" or "$element" - jqLite-wrapped node or element
+ *
+ *
+ * Compiler related stuff:
+ *
+ * - "linkFn" - linking fn of a single directive
+ * - "nodeLinkFn" - function that aggregates all linking fns for a particular node
+ * - "childLinkFn" - function that aggregates all linking fns for child nodes of a particular node
+ * - "compositeLinkFn" - function that aggregates all linking fns for a compilation root (nodeList)
+ */
+
+
+/**
+ * @ngdoc service
+ * @name $compile
+ * @kind function
+ *
+ * @description
+ * Compiles an HTML string or DOM into a template and produces a template function, which
+ * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together.
+ *
+ * The compilation is a process of walking the DOM tree and matching DOM elements to
+ * {@link ng.$compileProvider#directive directives}.
+ *
+ * <div class="alert alert-warning">
+ * **Note:** This document is an in-depth reference of all directive options.
+ * For a gentle introduction to directives with examples of common use cases,
+ * see the {@link guide/directive directive guide}.
+ * </div>
+ *
+ * ## Comprehensive Directive API
+ *
+ * There are many different options for a directive.
+ *
+ * The difference resides in the return value of the factory function.
+ * You can either return a "Directive Definition Object" (see below) that defines the directive properties,
+ * or just the `postLink` function (all other properties will have the default values).
+ *
+ * <div class="alert alert-success">
+ * **Best Practice:** It's recommended to use the "directive definition object" form.
+ * </div>
+ *
+ * Here's an example directive declared with a Directive Definition Object:
+ *
+ * ```js
+ * var myModule = angular.module(...);
+ *
+ * myModule.directive('directiveName', function factory(injectables) {
+ * var directiveDefinitionObject = {
+ * priority: 0,
+ * template: '<div></div>', // or // function(tElement, tAttrs) { ... },
+ * // or
+ * // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... },
+ * transclude: false,
+ * restrict: 'A',
+ * templateNamespace: 'html',
+ * scope: false,
+ * controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... },
+ * controllerAs: 'stringAlias',
+ * require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'],
+ * compile: function compile(tElement, tAttrs, transclude) {
+ * return {
+ * pre: function preLink(scope, iElement, iAttrs, controller) { ... },
+ * post: function postLink(scope, iElement, iAttrs, controller) { ... }
+ * }
+ * // or
+ * // return function postLink( ... ) { ... }
+ * },
+ * // or
+ * // link: {
+ * // pre: function preLink(scope, iElement, iAttrs, controller) { ... },
+ * // post: function postLink(scope, iElement, iAttrs, controller) { ... }
+ * // }
+ * // or
+ * // link: function postLink( ... ) { ... }
+ * };
+ * return directiveDefinitionObject;
+ * });
+ * ```
+ *
+ * <div class="alert alert-warning">
+ * **Note:** Any unspecified options will use the default value. You can see the default values below.
+ * </div>
+ *
+ * Therefore the above can be simplified as:
+ *
+ * ```js
+ * var myModule = angular.module(...);
+ *
+ * myModule.directive('directiveName', function factory(injectables) {
+ * var directiveDefinitionObject = {
+ * link: function postLink(scope, iElement, iAttrs) { ... }
+ * };
+ * return directiveDefinitionObject;
+ * // or
+ * // return function postLink(scope, iElement, iAttrs) { ... }
+ * });
+ * ```
+ *
+ *
+ *
+ * ### Directive Definition Object
+ *
+ * The directive definition object provides instructions to the {@link ng.$compile
+ * compiler}. The attributes are:
+ *
+ * #### `multiElement`
+ * When this property is set to true, the HTML compiler will collect DOM nodes between
+ * nodes with the attributes `directive-name-start` and `directive-name-end`, and group them
+ * together as the directive elements. It is recomended that this feature be used on directives
+ * which are not strictly behavioural (such as {@link ngClick}), and which
+ * do not manipulate or replace child nodes (such as {@link ngInclude}).
+ *
+ * #### `priority`
+ * When there are multiple directives defined on a single DOM element, sometimes it
+ * is necessary to specify the order in which the directives are applied. The `priority` is used
+ * to sort the directives before their `compile` functions get called. Priority is defined as a
+ * number. Directives with greater numerical `priority` are compiled first. Pre-link functions
+ * are also run in priority order, but post-link functions are run in reverse order. The order
+ * of directives with the same priority is undefined. The default priority is `0`.
+ *
+ * #### `terminal`
+ * If set to true then the current `priority` will be the last set of directives
+ * which will execute (any directives at the current priority will still execute
+ * as the order of execution on same `priority` is undefined). Note that expressions
+ * and other directives used in the directive's template will also be excluded from execution.
+ *
+ * #### `scope`
+ * **If set to `true`,** then a new scope will be created for this directive. If multiple directives on the
+ * same element request a new scope, only one new scope is created. The new scope rule does not
+ * apply for the root of the template since the root of the template always gets a new scope.
+ *
+ * **If set to `{}` (object hash),** then a new "isolate" scope is created. The 'isolate' scope differs from
+ * normal scope in that it does not prototypically inherit from the parent scope. This is useful
+ * when creating reusable components, which should not accidentally read or modify data in the
+ * parent scope.
+ *
+ * The 'isolate' scope takes an object hash which defines a set of local scope properties
+ * derived from the parent scope. These local properties are useful for aliasing values for
+ * templates. Locals definition is a hash of local scope property to its source:
+ *
+ * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is
+ * always a string since DOM attributes are strings. If no `attr` name is specified then the
+ * attribute name is assumed to be the same as the local name.
+ * Given `<widget my-attr="hello {{name}}">` and widget definition
+ * of `scope: { localName:'@myAttr' }`, then widget scope property `localName` will reflect
+ * the interpolated value of `hello {{name}}`. As the `name` attribute changes so will the
+ * `localName` property on the widget scope. The `name` is read from the parent scope (not
+ * component scope).
+ *
+ * * `=` or `=attr` - set up bi-directional binding between a local scope property and the
+ * parent scope property of name defined via the value of the `attr` attribute. If no `attr`
+ * name is specified then the attribute name is assumed to be the same as the local name.
+ * Given `<widget my-attr="parentModel">` and widget definition of
+ * `scope: { localModel:'=myAttr' }`, then widget scope property `localModel` will reflect the
+ * value of `parentModel` on the parent scope. Any changes to `parentModel` will be reflected
+ * in `localModel` and any changes in `localModel` will reflect in `parentModel`. If the parent
+ * scope property doesn't exist, it will throw a NON_ASSIGNABLE_MODEL_EXPRESSION exception. You
+ * can avoid this behavior using `=?` or `=?attr` in order to flag the property as optional. If
+ * you want to shallow watch for changes (i.e. $watchCollection instead of $watch) you can use
+ * `=*` or `=*attr` (`=*?` or `=*?attr` if the property is optional).
+ *
+ * * `&` or `&attr` - provides a way to execute an expression in the context of the parent scope.
+ * If no `attr` name is specified then the attribute name is assumed to be the same as the
+ * local name. Given `<widget my-attr="count = count + value">` and widget definition of
+ * `scope: { localFn:'&myAttr' }`, then isolate scope property `localFn` will point to
+ * a function wrapper for the `count = count + value` expression. Often it's desirable to
+ * pass data from the isolated scope via an expression to the parent scope, this can be
+ * done by passing a map of local variable names and values into the expression wrapper fn.
+ * For example, if the expression is `increment(amount)` then we can specify the amount value
+ * by calling the `localFn` as `localFn({amount: 22})`.
+ *
+ *
+ * #### `bindToController`
+ * When an isolate scope is used for a component (see above), and `controllerAs` is used, `bindToController: true` will
+ * allow a component to have its properties bound to the controller, rather than to scope. When the controller
+ * is instantiated, the initial values of the isolate scope bindings are already available.
+ *
+ * #### `controller`
+ * Controller constructor function. The controller is instantiated before the
+ * pre-linking phase and it is shared with other directives (see
+ * `require` attribute). This allows the directives to communicate with each other and augment
+ * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals:
+ *
+ * * `$scope` - Current scope associated with the element
+ * * `$element` - Current element
+ * * `$attrs` - Current attributes object for the element
+ * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope:
+ * `function([scope], cloneLinkingFn, futureParentElement)`.
+ * * `scope`: optional argument to override the scope.
+ * * `cloneLinkingFn`: optional argument to create clones of the original transcluded content.
+ * * `futureParentElement`:
+ * * defines the parent to which the `cloneLinkingFn` will add the cloned elements.
+ * * default: `$element.parent()` resp. `$element` for `transclude:'element'` resp. `transclude:true`.
+ * * only needed for transcludes that are allowed to contain non html elements (e.g. SVG elements)
+ * and when the `cloneLinkinFn` is passed,
+ * as those elements need to created and cloned in a special way when they are defined outside their
+ * usual containers (e.g. like `<svg>`).
+ * * See also the `directive.templateNamespace` property.
+ *
+ *
+ * #### `require`
+ * Require another directive and inject its controller as the fourth argument to the linking function. The
+ * `require` takes a string name (or array of strings) of the directive(s) to pass in. If an array is used, the
+ * injected argument will be an array in corresponding order. If no such directive can be
+ * found, or if the directive does not have a controller, then an error is raised. The name can be prefixed with:
+ *
+ * * (no prefix) - Locate the required controller on the current element. Throw an error if not found.
+ * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found.
+ * * `^` - Locate the required controller by searching the element and its parents. Throw an error if not found.
+ * * `^^` - Locate the required controller by searching the element's parents. Throw an error if not found.
+ * * `?^` - Attempt to locate the required controller by searching the element and its parents or pass
+ * `null` to the `link` fn if not found.
+ * * `?^^` - Attempt to locate the required controller by searching the element's parents, or pass
+ * `null` to the `link` fn if not found.
+ *
+ *
+ * #### `controllerAs`
+ * Controller alias at the directive scope. An alias for the controller so it
+ * can be referenced at the directive template. The directive needs to define a scope for this
+ * configuration to be used. Useful in the case when directive is used as component.
+ *
+ *
+ * #### `restrict`
+ * String of subset of `EACM` which restricts the directive to a specific directive
+ * declaration style. If omitted, the defaults (elements and attributes) are used.
+ *
+ * * `E` - Element name (default): `<my-directive></my-directive>`
+ * * `A` - Attribute (default): `<div my-directive="exp"></div>`
+ * * `C` - Class: `<div class="my-directive: exp;"></div>`
+ * * `M` - Comment: `<!-- directive: my-directive exp -->`
+ *
+ *
+ * #### `templateNamespace`
+ * String representing the document type used by the markup in the template.
+ * AngularJS needs this information as those elements need to be created and cloned
+ * in a special way when they are defined outside their usual containers like `<svg>` and `<math>`.
+ *
+ * * `html` - All root nodes in the template are HTML. Root nodes may also be
+ * top-level elements such as `<svg>` or `<math>`.
+ * * `svg` - The root nodes in the template are SVG elements (excluding `<math>`).
+ * * `math` - The root nodes in the template are MathML elements (excluding `<svg>`).
+ *
+ * If no `templateNamespace` is specified, then the namespace is considered to be `html`.
+ *
+ * #### `template`
+ * HTML markup that may:
+ * * Replace the contents of the directive's element (default).
+ * * Replace the directive's element itself (if `replace` is true - DEPRECATED).
+ * * Wrap the contents of the directive's element (if `transclude` is true).
+ *
+ * Value may be:
+ *
+ * * A string. For example `<div red-on-hover>{{delete_str}}</div>`.
+ * * A function which takes two arguments `tElement` and `tAttrs` (described in the `compile`
+ * function api below) and returns a string value.
+ *
+ *
+ * #### `templateUrl`
+ * This is similar to `template` but the template is loaded from the specified URL, asynchronously.
+ *
+ * Because template loading is asynchronous the compiler will suspend compilation of directives on that element
+ * for later when the template has been resolved. In the meantime it will continue to compile and link
+ * sibling and parent elements as though this element had not contained any directives.
+ *
+ * The compiler does not suspend the entire compilation to wait for templates to be loaded because this
+ * would result in the whole app "stalling" until all templates are loaded asynchronously - even in the
+ * case when only one deeply nested directive has `templateUrl`.
+ *
+ * Template loading is asynchronous even if the template has been preloaded into the {@link $templateCache}
+ *
+ * You can specify `templateUrl` as a string representing the URL or as a function which takes two
+ * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns
+ * a string value representing the url. In either case, the template URL is passed through {@link
+ * $sce#getTrustedResourceUrl $sce.getTrustedResourceUrl}.
+ *
+ *
+ * #### `replace` ([*DEPRECATED*!], will be removed in next major release - i.e. v2.0)
+ * specify what the template should replace. Defaults to `false`.
+ *
+ * * `true` - the template will replace the directive's element.
+ * * `false` - the template will replace the contents of the directive's element.
+ *
+ * The replacement process migrates all of the attributes / classes from the old element to the new
+ * one. See the {@link guide/directive#template-expanding-directive
+ * Directives Guide} for an example.
+ *
+ * There are very few scenarios where element replacement is required for the application function,
+ * the main one being reusable custom components that are used within SVG contexts
+ * (because SVG doesn't work with custom elements in the DOM tree).
+ *
+ * #### `transclude`
+ * Extract the contents of the element where the directive appears and make it available to the directive.
+ * The contents are compiled and provided to the directive as a **transclusion function**. See the
+ * {@link $compile#transclusion Transclusion} section below.
+ *
+ * There are two kinds of transclusion depending upon whether you want to transclude just the contents of the
+ * directive's element or the entire element:
+ *
+ * * `true` - transclude the content (i.e. the child nodes) of the directive's element.
+ * * `'element'` - transclude the whole of the directive's element including any directives on this
+ * element that defined at a lower priority than this directive. When used, the `template`
+ * property is ignored.
+ *
+ *
+ * #### `compile`
+ *
+ * ```js
+ * function compile(tElement, tAttrs, transclude) { ... }
+ * ```
+ *
+ * The compile function deals with transforming the template DOM. Since most directives do not do
+ * template transformation, it is not used often. The compile function takes the following arguments:
+ *
+ * * `tElement` - template element - The element where the directive has been declared. It is
+ * safe to do template transformation on the element and child elements only.
+ *
+ * * `tAttrs` - template attributes - Normalized list of attributes declared on this element shared
+ * between all directive compile functions.
+ *
+ * * `transclude` - [*DEPRECATED*!] A transclude linking function: `function(scope, cloneLinkingFn)`
+ *
+ * <div class="alert alert-warning">
+ * **Note:** The template instance and the link instance may be different objects if the template has
+ * been cloned. For this reason it is **not** safe to do anything other than DOM transformations that
+ * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration
+ * should be done in a linking function rather than in a compile function.
+ * </div>
+
+ * <div class="alert alert-warning">
+ * **Note:** The compile function cannot handle directives that recursively use themselves in their
+ * own templates or compile functions. Compiling these directives results in an infinite loop and a
+ * stack overflow errors.
+ *
+ * This can be avoided by manually using $compile in the postLink function to imperatively compile
+ * a directive's template instead of relying on automatic template compilation via `template` or
+ * `templateUrl` declaration or manual compilation inside the compile function.
+ * </div>
+ *
+ * <div class="alert alert-error">
+ * **Note:** The `transclude` function that is passed to the compile function is deprecated, as it
+ * e.g. does not know about the right outer scope. Please use the transclude function that is passed
+ * to the link function instead.
+ * </div>
+
+ * A compile function can have a return value which can be either a function or an object.
+ *
+ * * returning a (post-link) function - is equivalent to registering the linking function via the
+ * `link` property of the config object when the compile function is empty.
+ *
+ * * returning an object with function(s) registered via `pre` and `post` properties - allows you to
+ * control when a linking function should be called during the linking phase. See info about
+ * pre-linking and post-linking functions below.
+ *
+ *
+ * #### `link`
+ * This property is used only if the `compile` property is not defined.
+ *
+ * ```js
+ * function link(scope, iElement, iAttrs, controller, transcludeFn) { ... }
+ * ```
+ *
+ * The link function is responsible for registering DOM listeners as well as updating the DOM. It is
+ * executed after the template has been cloned. This is where most of the directive logic will be
+ * put.
+ *
+ * * `scope` - {@link ng.$rootScope.Scope Scope} - The scope to be used by the
+ * directive for registering {@link ng.$rootScope.Scope#$watch watches}.
+ *
+ * * `iElement` - instance element - The element where the directive is to be used. It is safe to
+ * manipulate the children of the element only in `postLink` function since the children have
+ * already been linked.
+ *
+ * * `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared
+ * between all directive linking functions.
+ *
+ * * `controller` - a controller instance - A controller instance if at least one directive on the
+ * element defines a controller. The controller is shared among all the directives, which allows
+ * the directives to use the controllers as a communication channel.
+ *
+ * * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope.
+ * This is the same as the `$transclude`
+ * parameter of directive controllers, see there for details.
+ * `function([scope], cloneLinkingFn, futureParentElement)`.
+ *
+ * #### Pre-linking function
+ *
+ * Executed before the child elements are linked. Not safe to do DOM transformation since the
+ * compiler linking function will fail to locate the correct elements for linking.
+ *
+ * #### Post-linking function
+ *
+ * Executed after the child elements are linked.
+ *
+ * Note that child elements that contain `templateUrl` directives will not have been compiled
+ * and linked since they are waiting for their template to load asynchronously and their own
+ * compilation and linking has been suspended until that occurs.
+ *
+ * It is safe to do DOM transformation in the post-linking function on elements that are not waiting
+ * for their async templates to be resolved.
+ *
+ *
+ * ### Transclusion
+ *
+ * Transclusion is the process of extracting a collection of DOM element from one part of the DOM and
+ * copying them to another part of the DOM, while maintaining their connection to the original AngularJS
+ * scope from where they were taken.
+ *
+ * Transclusion is used (often with {@link ngTransclude}) to insert the
+ * original contents of a directive's element into a specified place in the template of the directive.
+ * The benefit of transclusion, over simply moving the DOM elements manually, is that the transcluded
+ * content has access to the properties on the scope from which it was taken, even if the directive
+ * has isolated scope.
+ * See the {@link guide/directive#creating-a-directive-that-wraps-other-elements Directives Guide}.
+ *
+ * This makes it possible for the widget to have private state for its template, while the transcluded
+ * content has access to its originating scope.
+ *
+ * <div class="alert alert-warning">
+ * **Note:** When testing an element transclude directive you must not place the directive at the root of the
+ * DOM fragment that is being compiled. See {@link guide/unit-testing#testing-transclusion-directives
+ * Testing Transclusion Directives}.
+ * </div>
+ *
+ * #### Transclusion Functions
+ *
+ * When a directive requests transclusion, the compiler extracts its contents and provides a **transclusion
+ * function** to the directive's `link` function and `controller`. This transclusion function is a special
+ * **linking function** that will return the compiled contents linked to a new transclusion scope.
+ *
+ * <div class="alert alert-info">
+ * If you are just using {@link ngTransclude} then you don't need to worry about this function, since
+ * ngTransclude will deal with it for us.
+ * </div>
+ *
+ * If you want to manually control the insertion and removal of the transcluded content in your directive
+ * then you must use this transclude function. When you call a transclude function it returns a a jqLite/JQuery
+ * object that contains the compiled DOM, which is linked to the correct transclusion scope.
+ *
+ * When you call a transclusion function you can pass in a **clone attach function**. This function accepts
+ * two parameters, `function(clone, scope) { ... }`, where the `clone` is a fresh compiled copy of your transcluded
+ * content and the `scope` is the newly created transclusion scope, to which the clone is bound.
+ *
+ * <div class="alert alert-info">
+ * **Best Practice**: Always provide a `cloneFn` (clone attach function) when you call a translude function
+ * since you then get a fresh clone of the original DOM and also have access to the new transclusion scope.
+ * </div>
+ *
+ * It is normal practice to attach your transcluded content (`clone`) to the DOM inside your **clone
+ * attach function**:
+ *
+ * ```js
+ * var transcludedContent, transclusionScope;
+ *
+ * $transclude(function(clone, scope) {
+ * element.append(clone);
+ * transcludedContent = clone;
+ * transclusionScope = scope;
+ * });
+ * ```
+ *
+ * Later, if you want to remove the transcluded content from your DOM then you should also destroy the
+ * associated transclusion scope:
+ *
+ * ```js
+ * transcludedContent.remove();
+ * transclusionScope.$destroy();
+ * ```
+ *
+ * <div class="alert alert-info">
+ * **Best Practice**: if you intend to add and remove transcluded content manually in your directive
+ * (by calling the transclude function to get the DOM and and calling `element.remove()` to remove it),
+ * then you are also responsible for calling `$destroy` on the transclusion scope.
+ * </div>
+ *
+ * The built-in DOM manipulation directives, such as {@link ngIf}, {@link ngSwitch} and {@link ngRepeat}
+ * automatically destroy their transluded clones as necessary so you do not need to worry about this if
+ * you are simply using {@link ngTransclude} to inject the transclusion into your directive.
+ *
+ *
+ * #### Transclusion Scopes
+ *
+ * When you call a transclude function it returns a DOM fragment that is pre-bound to a **transclusion
+ * scope**. This scope is special, in that it is a child of the directive's scope (and so gets destroyed
+ * when the directive's scope gets destroyed) but it inherits the properties of the scope from which it
+ * was taken.
+ *
+ * For example consider a directive that uses transclusion and isolated scope. The DOM hierarchy might look
+ * like this:
+ *
+ * ```html
+ * <div ng-app>
+ * <div isolate>
+ * <div transclusion>
+ * </div>
+ * </div>
+ * </div>
+ * ```
+ *
+ * The `$parent` scope hierarchy will look like this:
+ *
+ * ```
+ * - $rootScope
+ * - isolate
+ * - transclusion
+ * ```
+ *
+ * but the scopes will inherit prototypically from different scopes to their `$parent`.
+ *
+ * ```
+ * - $rootScope
+ * - transclusion
+ * - isolate
+ * ```
+ *
+ *
+ * ### Attributes
+ *
+ * The {@link ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the
+ * `link()` or `compile()` functions. It has a variety of uses.
+ *
+ * accessing *Normalized attribute names:*
+ * Directives like 'ngBind' can be expressed in many ways: 'ng:bind', `data-ng-bind`, or 'x-ng-bind'.
+ * the attributes object allows for normalized access to
+ * the attributes.
+ *
+ * * *Directive inter-communication:* All directives share the same instance of the attributes
+ * object which allows the directives to use the attributes object as inter directive
+ * communication.
+ *
+ * * *Supports interpolation:* Interpolation attributes are assigned to the attribute object
+ * allowing other directives to read the interpolated value.
+ *
+ * * *Observing interpolated attributes:* Use `$observe` to observe the value changes of attributes
+ * that contain interpolation (e.g. `src="{{bar}}"`). Not only is this very efficient but it's also
+ * the only way to easily get the actual value because during the linking phase the interpolation
+ * hasn't been evaluated yet and so the value is at this time set to `undefined`.
+ *
+ * ```js
+ * function linkingFn(scope, elm, attrs, ctrl) {
+ * // get the attribute value
+ * console.log(attrs.ngModel);
+ *
+ * // change the attribute
+ * attrs.$set('ngModel', 'new value');
+ *
+ * // observe changes to interpolated attribute
+ * attrs.$observe('ngModel', function(value) {
+ * console.log('ngModel has changed value to ' + value);
+ * });
+ * }
+ * ```
+ *
+ * ## Example
+ *
+ * <div class="alert alert-warning">
+ * **Note**: Typically directives are registered with `module.directive`. The example below is
+ * to illustrate how `$compile` works.
+ * </div>
+ *
+ <example module="compileExample">
+ <file name="index.html">
+ <script>
+ angular.module('compileExample', [], function($compileProvider) {
+ // configure new 'compile' directive by passing a directive
+ // factory function. The factory function injects the '$compile'
+ $compileProvider.directive('compile', function($compile) {
+ // directive factory creates a link function
+ return function(scope, element, attrs) {
+ scope.$watch(
+ function(scope) {
+ // watch the 'compile' expression for changes
+ return scope.$eval(attrs.compile);
+ },
+ function(value) {
+ // when the 'compile' expression changes
+ // assign it into the current DOM
+ element.html(value);
+
+ // compile the new DOM and link it to the current
+ // scope.
+ // NOTE: we only compile .childNodes so that
+ // we don't get into infinite loop compiling ourselves
+ $compile(element.contents())(scope);
+ }
+ );
+ };
+ });
+ })
+ .controller('GreeterController', ['$scope', function($scope) {
+ $scope.name = 'Angular';
+ $scope.html = 'Hello {{name}}';
+ }]);
+ </script>
+ <div ng-controller="GreeterController">
+ <input ng-model="name"> <br>
+ <textarea ng-model="html"></textarea> <br>
+ <div compile="html"></div>
+ </div>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should auto compile', function() {
+ var textarea = $('textarea');
+ var output = $('div[compile]');
+ // The initial state reads 'Hello Angular'.
+ expect(output.getText()).toBe('Hello Angular');
+ textarea.clear();
+ textarea.sendKeys('{{name}}!');
+ expect(output.getText()).toBe('Angular!');
+ });
+ </file>
+ </example>
+
+ *
+ *
+ * @param {string|DOMElement} element Element or HTML string to compile into a template function.
+ * @param {function(angular.Scope, cloneAttachFn=)} transclude function available to directives - DEPRECATED.
+ *
+ * <div class="alert alert-error">
+ * **Note:** Passing a `transclude` function to the $compile function is deprecated, as it
+ * e.g. will not use the right outer scope. Please pass the transclude function as a
+ * `parentBoundTranscludeFn` to the link function instead.
+ * </div>
+ *
+ * @param {number} maxPriority only apply directives lower than given priority (Only effects the
+ * root element(s), not their children)
+ * @returns {function(scope, cloneAttachFn=, options=)} a link function which is used to bind template
+ * (a DOM element/tree) to a scope. Where:
+ *
+ * * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to.
+ * * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the
+ * `template` and call the `cloneAttachFn` function allowing the caller to attach the
+ * cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is
+ * called as: <br> `cloneAttachFn(clonedElement, scope)` where:
+ *
+ * * `clonedElement` - is a clone of the original `element` passed into the compiler.
+ * * `scope` - is the current scope with which the linking function is working with.
+ *
+ * * `options` - An optional object hash with linking options. If `options` is provided, then the following
+ * keys may be used to control linking behavior:
+ *
+ * * `parentBoundTranscludeFn` - the transclude function made available to
+ * directives; if given, it will be passed through to the link functions of
+ * directives found in `element` during compilation.
+ * * `transcludeControllers` - an object hash with keys that map controller names
+ * to controller instances; if given, it will make the controllers
+ * available to directives.
+ * * `futureParentElement` - defines the parent to which the `cloneAttachFn` will add
+ * the cloned elements; only needed for transcludes that are allowed to contain non html
+ * elements (e.g. SVG elements). See also the directive.controller property.
+ *
+ * Calling the linking function returns the element of the template. It is either the original
+ * element passed in, or the clone of the element if the `cloneAttachFn` is provided.
+ *
+ * After linking the view is not updated until after a call to $digest which typically is done by
+ * Angular automatically.
+ *
+ * If you need access to the bound view, there are two ways to do it:
+ *
+ * - If you are not asking the linking function to clone the template, create the DOM element(s)
+ * before you send them to the compiler and keep this reference around.
+ * ```js
+ * var element = $compile('<p>{{total}}</p>')(scope);
+ * ```
+ *
+ * - if on the other hand, you need the element to be cloned, the view reference from the original
+ * example would not point to the clone, but rather to the original template that was cloned. In
+ * this case, you can access the clone via the cloneAttachFn:
+ * ```js
+ * var templateElement = angular.element('<p>{{total}}</p>'),
+ * scope = ....;
+ *
+ * var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) {
+ * //attach the clone to DOM document at the right place
+ * });
+ *
+ * //now we have reference to the cloned DOM via `clonedElement`
+ * ```
+ *
+ *
+ * For information on how the compiler works, see the
+ * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide.
+ */
+
+var $compileMinErr = minErr('$compile');
+
+/**
+ * @ngdoc provider
+ * @name $compileProvider
+ *
+ * @description
+ */
+$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider'];
+function $CompileProvider($provide, $$sanitizeUriProvider) {
+ var hasDirectives = {},
+ Suffix = 'Directive',
+ COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\w\-]+)\s+(.*)$/,
+ CLASS_DIRECTIVE_REGEXP = /(([\w\-]+)(?:\:([^;]+))?;?)/,
+ ALL_OR_NOTHING_ATTRS = makeMap('ngSrc,ngSrcset,src,srcset'),
+ REQUIRE_PREFIX_REGEXP = /^(?:(\^\^?)?(\?)?(\^\^?)?)?/;
+
+ // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes
+ // The assumption is that future DOM event attribute names will begin with
+ // 'on' and be composed of only English letters.
+ var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/;
+
+ function parseIsolateBindings(scope, directiveName) {
+ var LOCAL_REGEXP = /^\s*([@&]|=(\*?))(\??)\s*(\w*)\s*$/;
+
+ var bindings = {};
+
+ forEach(scope, function(definition, scopeName) {
+ var match = definition.match(LOCAL_REGEXP);
+
+ if (!match) {
+ throw $compileMinErr('iscp',
+ "Invalid isolate scope definition for directive '{0}'." +
+ " Definition: {... {1}: '{2}' ...}",
+ directiveName, scopeName, definition);
+ }
+
+ bindings[scopeName] = {
+ mode: match[1][0],
+ collection: match[2] === '*',
+ optional: match[3] === '?',
+ attrName: match[4] || scopeName
+ };
+ });
+
+ return bindings;
+ }
+
+ /**
+ * @ngdoc method
+ * @name $compileProvider#directive
+ * @kind function
+ *
+ * @description
+ * Register a new directive with the compiler.
+ *
+ * @param {string|Object} name Name of the directive in camel-case (i.e. <code>ngBind</code> which
+ * will match as <code>ng-bind</code>), or an object map of directives where the keys are the
+ * names and the values are the factories.
+ * @param {Function|Array} directiveFactory An injectable directive factory function. See
+ * {@link guide/directive} for more info.
+ * @returns {ng.$compileProvider} Self for chaining.
+ */
+ this.directive = function registerDirective(name, directiveFactory) {
+ assertNotHasOwnProperty(name, 'directive');
+ if (isString(name)) {
+ assertArg(directiveFactory, 'directiveFactory');
+ if (!hasDirectives.hasOwnProperty(name)) {
+ hasDirectives[name] = [];
+ $provide.factory(name + Suffix, ['$injector', '$exceptionHandler',
+ function($injector, $exceptionHandler) {
+ var directives = [];
+ forEach(hasDirectives[name], function(directiveFactory, index) {
+ try {
+ var directive = $injector.invoke(directiveFactory);
+ if (isFunction(directive)) {
+ directive = { compile: valueFn(directive) };
+ } else if (!directive.compile && directive.link) {
+ directive.compile = valueFn(directive.link);
+ }
+ directive.priority = directive.priority || 0;
+ directive.index = index;
+ directive.name = directive.name || name;
+ directive.require = directive.require || (directive.controller && directive.name);
+ directive.restrict = directive.restrict || 'EA';
+ if (isObject(directive.scope)) {
+ directive.$$isolateBindings = parseIsolateBindings(directive.scope, directive.name);
+ }
+ directives.push(directive);
+ } catch (e) {
+ $exceptionHandler(e);
+ }
+ });
+ return directives;
+ }]);
+ }
+ hasDirectives[name].push(directiveFactory);
+ } else {
+ forEach(name, reverseParams(registerDirective));
+ }
+ return this;
+ };
+
+
+ /**
+ * @ngdoc method
+ * @name $compileProvider#aHrefSanitizationWhitelist
+ * @kind function
+ *
+ * @description
+ * Retrieves or overrides the default regular expression that is used for whitelisting of safe
+ * urls during a[href] sanitization.
+ *
+ * The sanitization is a security measure aimed at preventing XSS attacks via html links.
+ *
+ * Any url about to be assigned to a[href] via data-binding is first normalized and turned into
+ * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`
+ * regular expression. If a match is found, the original url is written into the dom. Otherwise,
+ * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.
+ *
+ * @param {RegExp=} regexp New regexp to whitelist urls with.
+ * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for
+ * chaining otherwise.
+ */
+ this.aHrefSanitizationWhitelist = function(regexp) {
+ if (isDefined(regexp)) {
+ $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp);
+ return this;
+ } else {
+ return $$sanitizeUriProvider.aHrefSanitizationWhitelist();
+ }
+ };
+
+
+ /**
+ * @ngdoc method
+ * @name $compileProvider#imgSrcSanitizationWhitelist
+ * @kind function
+ *
+ * @description
+ * Retrieves or overrides the default regular expression that is used for whitelisting of safe
+ * urls during img[src] sanitization.
+ *
+ * The sanitization is a security measure aimed at prevent XSS attacks via html links.
+ *
+ * Any url about to be assigned to img[src] via data-binding is first normalized and turned into
+ * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist`
+ * regular expression. If a match is found, the original url is written into the dom. Otherwise,
+ * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.
+ *
+ * @param {RegExp=} regexp New regexp to whitelist urls with.
+ * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for
+ * chaining otherwise.
+ */
+ this.imgSrcSanitizationWhitelist = function(regexp) {
+ if (isDefined(regexp)) {
+ $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp);
+ return this;
+ } else {
+ return $$sanitizeUriProvider.imgSrcSanitizationWhitelist();
+ }
+ };
+
+ /**
+ * @ngdoc method
+ * @name $compileProvider#debugInfoEnabled
+ *
+ * @param {boolean=} enabled update the debugInfoEnabled state if provided, otherwise just return the
+ * current debugInfoEnabled state
+ * @returns {*} current value if used as getter or itself (chaining) if used as setter
+ *
+ * @kind function
+ *
+ * @description
+ * Call this method to enable/disable various debug runtime information in the compiler such as adding
+ * binding information and a reference to the current scope on to DOM elements.
+ * If enabled, the compiler will add the following to DOM elements that have been bound to the scope
+ * * `ng-binding` CSS class
+ * * `$binding` data property containing an array of the binding expressions
+ *
+ * You may want to disable this in production for a significant performance boost. See
+ * {@link guide/production#disabling-debug-data Disabling Debug Data} for more.
+ *
+ * The default value is true.
+ */
+ var debugInfoEnabled = true;
+ this.debugInfoEnabled = function(enabled) {
+ if (isDefined(enabled)) {
+ debugInfoEnabled = enabled;
+ return this;
+ }
+ return debugInfoEnabled;
+ };
+
+ this.$get = [
+ '$injector', '$interpolate', '$exceptionHandler', '$templateRequest', '$parse',
+ '$controller', '$rootScope', '$document', '$sce', '$animate', '$$sanitizeUri',
+ function($injector, $interpolate, $exceptionHandler, $templateRequest, $parse,
+ $controller, $rootScope, $document, $sce, $animate, $$sanitizeUri) {
+
+ var Attributes = function(element, attributesToCopy) {
+ if (attributesToCopy) {
+ var keys = Object.keys(attributesToCopy);
+ var i, l, key;
+
+ for (i = 0, l = keys.length; i < l; i++) {
+ key = keys[i];
+ this[key] = attributesToCopy[key];
+ }
+ } else {
+ this.$attr = {};
+ }
+
+ this.$$element = element;
+ };
+
+ Attributes.prototype = {
+ $normalize: directiveNormalize,
+
+
+ /**
+ * @ngdoc method
+ * @name $compile.directive.Attributes#$addClass
+ * @kind function
+ *
+ * @description
+ * Adds the CSS class value specified by the classVal parameter to the element. If animations
+ * are enabled then an animation will be triggered for the class addition.
+ *
+ * @param {string} classVal The className value that will be added to the element
+ */
+ $addClass: function(classVal) {
+ if (classVal && classVal.length > 0) {
+ $animate.addClass(this.$$element, classVal);
+ }
+ },
+
+ /**
+ * @ngdoc method
+ * @name $compile.directive.Attributes#$removeClass
+ * @kind function
+ *
+ * @description
+ * Removes the CSS class value specified by the classVal parameter from the element. If
+ * animations are enabled then an animation will be triggered for the class removal.
+ *
+ * @param {string} classVal The className value that will be removed from the element
+ */
+ $removeClass: function(classVal) {
+ if (classVal && classVal.length > 0) {
+ $animate.removeClass(this.$$element, classVal);
+ }
+ },
+
+ /**
+ * @ngdoc method
+ * @name $compile.directive.Attributes#$updateClass
+ * @kind function
+ *
+ * @description
+ * Adds and removes the appropriate CSS class values to the element based on the difference
+ * between the new and old CSS class values (specified as newClasses and oldClasses).
+ *
+ * @param {string} newClasses The current CSS className value
+ * @param {string} oldClasses The former CSS className value
+ */
+ $updateClass: function(newClasses, oldClasses) {
+ var toAdd = tokenDifference(newClasses, oldClasses);
+ if (toAdd && toAdd.length) {
+ $animate.addClass(this.$$element, toAdd);
+ }
+
+ var toRemove = tokenDifference(oldClasses, newClasses);
+ if (toRemove && toRemove.length) {
+ $animate.removeClass(this.$$element, toRemove);
+ }
+ },
+
+ /**
+ * Set a normalized attribute on the element in a way such that all directives
+ * can share the attribute. This function properly handles boolean attributes.
+ * @param {string} key Normalized key. (ie ngAttribute)
+ * @param {string|boolean} value The value to set. If `null` attribute will be deleted.
+ * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute.
+ * Defaults to true.
+ * @param {string=} attrName Optional none normalized name. Defaults to key.
+ */
+ $set: function(key, value, writeAttr, attrName) {
+ // TODO: decide whether or not to throw an error if "class"
+ //is set through this function since it may cause $updateClass to
+ //become unstable.
+
+ var node = this.$$element[0],
+ booleanKey = getBooleanAttrName(node, key),
+ aliasedKey = getAliasedAttrName(node, key),
+ observer = key,
+ nodeName;
+
+ if (booleanKey) {
+ this.$$element.prop(key, value);
+ attrName = booleanKey;
+ } else if (aliasedKey) {
+ this[aliasedKey] = value;
+ observer = aliasedKey;
+ }
+
+ this[key] = value;
+
+ // translate normalized key to actual key
+ if (attrName) {
+ this.$attr[key] = attrName;
+ } else {
+ attrName = this.$attr[key];
+ if (!attrName) {
+ this.$attr[key] = attrName = snake_case(key, '-');
+ }
+ }
+
+ nodeName = nodeName_(this.$$element);
+
+ if ((nodeName === 'a' && key === 'href') ||
+ (nodeName === 'img' && key === 'src')) {
+ // sanitize a[href] and img[src] values
+ this[key] = value = $$sanitizeUri(value, key === 'src');
+ } else if (nodeName === 'img' && key === 'srcset') {
+ // sanitize img[srcset] values
+ var result = "";
+
+ // first check if there are spaces because it's not the same pattern
+ var trimmedSrcset = trim(value);
+ // ( 999x ,| 999w ,| ,|, )
+ var srcPattern = /(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/;
+ var pattern = /\s/.test(trimmedSrcset) ? srcPattern : /(,)/;
+
+ // split srcset into tuple of uri and descriptor except for the last item
+ var rawUris = trimmedSrcset.split(pattern);
+
+ // for each tuples
+ var nbrUrisWith2parts = Math.floor(rawUris.length / 2);
+ for (var i = 0; i < nbrUrisWith2parts; i++) {
+ var innerIdx = i * 2;
+ // sanitize the uri
+ result += $$sanitizeUri(trim(rawUris[innerIdx]), true);
+ // add the descriptor
+ result += (" " + trim(rawUris[innerIdx + 1]));
+ }
+
+ // split the last item into uri and descriptor
+ var lastTuple = trim(rawUris[i * 2]).split(/\s/);
+
+ // sanitize the last uri
+ result += $$sanitizeUri(trim(lastTuple[0]), true);
+
+ // and add the last descriptor if any
+ if (lastTuple.length === 2) {
+ result += (" " + trim(lastTuple[1]));
+ }
+ this[key] = value = result;
+ }
+
+ if (writeAttr !== false) {
+ if (value === null || value === undefined) {
+ this.$$element.removeAttr(attrName);
+ } else {
+ this.$$element.attr(attrName, value);
+ }
+ }
+
+ // fire observers
+ var $$observers = this.$$observers;
+ $$observers && forEach($$observers[observer], function(fn) {
+ try {
+ fn(value);
+ } catch (e) {
+ $exceptionHandler(e);
+ }
+ });
+ },
+
+
+ /**
+ * @ngdoc method
+ * @name $compile.directive.Attributes#$observe
+ * @kind function
+ *
+ * @description
+ * Observes an interpolated attribute.
+ *
+ * The observer function will be invoked once during the next `$digest` following
+ * compilation. The observer is then invoked whenever the interpolated value
+ * changes.
+ *
+ * @param {string} key Normalized key. (ie ngAttribute) .
+ * @param {function(interpolatedValue)} fn Function that will be called whenever
+ the interpolated value of the attribute changes.
+ * See the {@link guide/directive#text-and-attribute-bindings Directives} guide for more info.
+ * @returns {function()} Returns a deregistration function for this observer.
+ */
+ $observe: function(key, fn) {
+ var attrs = this,
+ $$observers = (attrs.$$observers || (attrs.$$observers = createMap())),
+ listeners = ($$observers[key] || ($$observers[key] = []));
+
+ listeners.push(fn);
+ $rootScope.$evalAsync(function() {
+ if (!listeners.$$inter && attrs.hasOwnProperty(key)) {
+ // no one registered attribute interpolation function, so lets call it manually
+ fn(attrs[key]);
+ }
+ });
+
+ return function() {
+ arrayRemove(listeners, fn);
+ };
+ }
+ };
+
+
+ function safeAddClass($element, className) {
+ try {
+ $element.addClass(className);
+ } catch (e) {
+ // ignore, since it means that we are trying to set class on
+ // SVG element, where class name is read-only.
+ }
+ }
+
+
+ var startSymbol = $interpolate.startSymbol(),
+ endSymbol = $interpolate.endSymbol(),
+ denormalizeTemplate = (startSymbol == '{{' || endSymbol == '}}')
+ ? identity
+ : function denormalizeTemplate(template) {
+ return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol);
+ },
+ NG_ATTR_BINDING = /^ngAttr[A-Z]/;
+
+ compile.$$addBindingInfo = debugInfoEnabled ? function $$addBindingInfo($element, binding) {
+ var bindings = $element.data('$binding') || [];
+
+ if (isArray(binding)) {
+ bindings = bindings.concat(binding);
+ } else {
+ bindings.push(binding);
+ }
+
+ $element.data('$binding', bindings);
+ } : noop;
+
+ compile.$$addBindingClass = debugInfoEnabled ? function $$addBindingClass($element) {
+ safeAddClass($element, 'ng-binding');
+ } : noop;
+
+ compile.$$addScopeInfo = debugInfoEnabled ? function $$addScopeInfo($element, scope, isolated, noTemplate) {
+ var dataName = isolated ? (noTemplate ? '$isolateScopeNoTemplate' : '$isolateScope') : '$scope';
+ $element.data(dataName, scope);
+ } : noop;
+
+ compile.$$addScopeClass = debugInfoEnabled ? function $$addScopeClass($element, isolated) {
+ safeAddClass($element, isolated ? 'ng-isolate-scope' : 'ng-scope');
+ } : noop;
+
+ return compile;
+
+ //================================
+
+ function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective,
+ previousCompileContext) {
+ if (!($compileNodes instanceof jqLite)) {
+ // jquery always rewraps, whereas we need to preserve the original selector so that we can
+ // modify it.
+ $compileNodes = jqLite($compileNodes);
+ }
+ // We can not compile top level text elements since text nodes can be merged and we will
+ // not be able to attach scope data to them, so we will wrap them in <span>
+ forEach($compileNodes, function(node, index) {
+ if (node.nodeType == NODE_TYPE_TEXT && node.nodeValue.match(/\S+/) /* non-empty */ ) {
+ $compileNodes[index] = jqLite(node).wrap('<span></span>').parent()[0];
+ }
+ });
+ var compositeLinkFn =
+ compileNodes($compileNodes, transcludeFn, $compileNodes,
+ maxPriority, ignoreDirective, previousCompileContext);
+ compile.$$addScopeClass($compileNodes);
+ var namespace = null;
+ return function publicLinkFn(scope, cloneConnectFn, options) {
+ assertArg(scope, 'scope');
+
+ options = options || {};
+ var parentBoundTranscludeFn = options.parentBoundTranscludeFn,
+ transcludeControllers = options.transcludeControllers,
+ futureParentElement = options.futureParentElement;
+
+ // When `parentBoundTranscludeFn` is passed, it is a
+ // `controllersBoundTransclude` function (it was previously passed
+ // as `transclude` to directive.link) so we must unwrap it to get
+ // its `boundTranscludeFn`
+ if (parentBoundTranscludeFn && parentBoundTranscludeFn.$$boundTransclude) {
+ parentBoundTranscludeFn = parentBoundTranscludeFn.$$boundTransclude;
+ }
+
+ if (!namespace) {
+ namespace = detectNamespaceForChildElements(futureParentElement);
+ }
+ var $linkNode;
+ if (namespace !== 'html') {
+ // When using a directive with replace:true and templateUrl the $compileNodes
+ // (or a child element inside of them)
+ // might change, so we need to recreate the namespace adapted compileNodes
+ // for call to the link function.
+ // Note: This will already clone the nodes...
+ $linkNode = jqLite(
+ wrapTemplate(namespace, jqLite('<div>').append($compileNodes).html())
+ );
+ } else if (cloneConnectFn) {
+ // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart
+ // and sometimes changes the structure of the DOM.
+ $linkNode = JQLitePrototype.clone.call($compileNodes);
+ } else {
+ $linkNode = $compileNodes;
+ }
+
+ if (transcludeControllers) {
+ for (var controllerName in transcludeControllers) {
+ $linkNode.data('$' + controllerName + 'Controller', transcludeControllers[controllerName].instance);
+ }
+ }
+
+ compile.$$addScopeInfo($linkNode, scope);
+
+ if (cloneConnectFn) cloneConnectFn($linkNode, scope);
+ if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode, parentBoundTranscludeFn);
+ return $linkNode;
+ };
+ }
+
+ function detectNamespaceForChildElements(parentElement) {
+ // TODO: Make this detect MathML as well...
+ var node = parentElement && parentElement[0];
+ if (!node) {
+ return 'html';
+ } else {
+ return nodeName_(node) !== 'foreignobject' && node.toString().match(/SVG/) ? 'svg' : 'html';
+ }
+ }
+
+ /**
+ * Compile function matches each node in nodeList against the directives. Once all directives
+ * for a particular node are collected their compile functions are executed. The compile
+ * functions return values - the linking functions - are combined into a composite linking
+ * function, which is the a linking function for the node.
+ *
+ * @param {NodeList} nodeList an array of nodes or NodeList to compile
+ * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the
+ * scope argument is auto-generated to the new child of the transcluded parent scope.
+ * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then
+ * the rootElement must be set the jqLite collection of the compile root. This is
+ * needed so that the jqLite collection items can be replaced with widgets.
+ * @param {number=} maxPriority Max directive priority.
+ * @returns {Function} A composite linking function of all of the matched directives or null.
+ */
+ function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective,
+ previousCompileContext) {
+ var linkFns = [],
+ attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound, nodeLinkFnFound;
+
+ for (var i = 0; i < nodeList.length; i++) {
+ attrs = new Attributes();
+
+ // we must always refer to nodeList[i] since the nodes can be replaced underneath us.
+ directives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined,
+ ignoreDirective);
+
+ nodeLinkFn = (directives.length)
+ ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement,
+ null, [], [], previousCompileContext)
+ : null;
+
+ if (nodeLinkFn && nodeLinkFn.scope) {
+ compile.$$addScopeClass(attrs.$$element);
+ }
+
+ childLinkFn = (nodeLinkFn && nodeLinkFn.terminal ||
+ !(childNodes = nodeList[i].childNodes) ||
+ !childNodes.length)
+ ? null
+ : compileNodes(childNodes,
+ nodeLinkFn ? (
+ (nodeLinkFn.transcludeOnThisElement || !nodeLinkFn.templateOnThisElement)
+ && nodeLinkFn.transclude) : transcludeFn);
+
+ if (nodeLinkFn || childLinkFn) {
+ linkFns.push(i, nodeLinkFn, childLinkFn);
+ linkFnFound = true;
+ nodeLinkFnFound = nodeLinkFnFound || nodeLinkFn;
+ }
+
+ //use the previous context only for the first element in the virtual group
+ previousCompileContext = null;
+ }
+
+ // return a linking function if we have found anything, null otherwise
+ return linkFnFound ? compositeLinkFn : null;
+
+ function compositeLinkFn(scope, nodeList, $rootElement, parentBoundTranscludeFn) {
+ var nodeLinkFn, childLinkFn, node, childScope, i, ii, idx, childBoundTranscludeFn;
+ var stableNodeList;
+
+
+ if (nodeLinkFnFound) {
+ // copy nodeList so that if a nodeLinkFn removes or adds an element at this DOM level our
+ // offsets don't get screwed up
+ var nodeListLength = nodeList.length;
+ stableNodeList = new Array(nodeListLength);
+
+ // create a sparse array by only copying the elements which have a linkFn
+ for (i = 0; i < linkFns.length; i+=3) {
+ idx = linkFns[i];
+ stableNodeList[idx] = nodeList[idx];
+ }
+ } else {
+ stableNodeList = nodeList;
+ }
+
+ for (i = 0, ii = linkFns.length; i < ii;) {
+ node = stableNodeList[linkFns[i++]];
+ nodeLinkFn = linkFns[i++];
+ childLinkFn = linkFns[i++];
+
+ if (nodeLinkFn) {
+ if (nodeLinkFn.scope) {
+ childScope = scope.$new();
+ compile.$$addScopeInfo(jqLite(node), childScope);
+ } else {
+ childScope = scope;
+ }
+
+ if (nodeLinkFn.transcludeOnThisElement) {
+ childBoundTranscludeFn = createBoundTranscludeFn(
+ scope, nodeLinkFn.transclude, parentBoundTranscludeFn,
+ nodeLinkFn.elementTranscludeOnThisElement);
+
+ } else if (!nodeLinkFn.templateOnThisElement && parentBoundTranscludeFn) {
+ childBoundTranscludeFn = parentBoundTranscludeFn;
+
+ } else if (!parentBoundTranscludeFn && transcludeFn) {
+ childBoundTranscludeFn = createBoundTranscludeFn(scope, transcludeFn);
+
+ } else {
+ childBoundTranscludeFn = null;
+ }
+
+ nodeLinkFn(childLinkFn, childScope, node, $rootElement, childBoundTranscludeFn);
+
+ } else if (childLinkFn) {
+ childLinkFn(scope, node.childNodes, undefined, parentBoundTranscludeFn);
+ }
+ }
+ }
+ }
+
+ function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn, elementTransclusion) {
+
+ var boundTranscludeFn = function(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) {
+
+ if (!transcludedScope) {
+ transcludedScope = scope.$new(false, containingScope);
+ transcludedScope.$$transcluded = true;
+ }
+
+ return transcludeFn(transcludedScope, cloneFn, {
+ parentBoundTranscludeFn: previousBoundTranscludeFn,
+ transcludeControllers: controllers,
+ futureParentElement: futureParentElement
+ });
+ };
+
+ return boundTranscludeFn;
+ }
+
+ /**
+ * Looks for directives on the given node and adds them to the directive collection which is
+ * sorted.
+ *
+ * @param node Node to search.
+ * @param directives An array to which the directives are added to. This array is sorted before
+ * the function returns.
+ * @param attrs The shared attrs object which is used to populate the normalized attributes.
+ * @param {number=} maxPriority Max directive priority.
+ */
+ function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) {
+ var nodeType = node.nodeType,
+ attrsMap = attrs.$attr,
+ match,
+ className;
+
+ switch (nodeType) {
+ case NODE_TYPE_ELEMENT: /* Element */
+ // use the node name: <directive>
+ addDirective(directives,
+ directiveNormalize(nodeName_(node)), 'E', maxPriority, ignoreDirective);
+
+ // iterate over the attributes
+ for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes,
+ j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {
+ var attrStartName = false;
+ var attrEndName = false;
+
+ attr = nAttrs[j];
+ name = attr.name;
+ value = trim(attr.value);
+
+ // support ngAttr attribute binding
+ ngAttrName = directiveNormalize(name);
+ if (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) {
+ name = snake_case(ngAttrName.substr(6), '-');
+ }
+
+ var directiveNName = ngAttrName.replace(/(Start|End)$/, '');
+ if (directiveIsMultiElement(directiveNName)) {
+ if (ngAttrName === directiveNName + 'Start') {
+ attrStartName = name;
+ attrEndName = name.substr(0, name.length - 5) + 'end';
+ name = name.substr(0, name.length - 6);
+ }
+ }
+
+ nName = directiveNormalize(name.toLowerCase());
+ attrsMap[nName] = name;
+ if (isNgAttr || !attrs.hasOwnProperty(nName)) {
+ attrs[nName] = value;
+ if (getBooleanAttrName(node, nName)) {
+ attrs[nName] = true; // presence means true
+ }
+ }
+ addAttrInterpolateDirective(node, directives, value, nName, isNgAttr);
+ addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName,
+ attrEndName);
+ }
+
+ // use class as directive
+ className = node.className;
+ if (isString(className) && className !== '') {
+ while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) {
+ nName = directiveNormalize(match[2]);
+ if (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) {
+ attrs[nName] = trim(match[3]);
+ }
+ className = className.substr(match.index + match[0].length);
+ }
+ }
+ break;
+ case NODE_TYPE_TEXT: /* Text Node */
+ addTextInterpolateDirective(directives, node.nodeValue);
+ break;
+ case NODE_TYPE_COMMENT: /* Comment */
+ try {
+ match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue);
+ if (match) {
+ nName = directiveNormalize(match[1]);
+ if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) {
+ attrs[nName] = trim(match[2]);
+ }
+ }
+ } catch (e) {
+ // turns out that under some circumstances IE9 throws errors when one attempts to read
+ // comment's node value.
+ // Just ignore it and continue. (Can't seem to reproduce in test case.)
+ }
+ break;
+ }
+
+ directives.sort(byPriority);
+ return directives;
+ }
+
+ /**
+ * Given a node with an directive-start it collects all of the siblings until it finds
+ * directive-end.
+ * @param node
+ * @param attrStart
+ * @param attrEnd
+ * @returns {*}
+ */
+ function groupScan(node, attrStart, attrEnd) {
+ var nodes = [];
+ var depth = 0;
+ if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) {
+ do {
+ if (!node) {
+ throw $compileMinErr('uterdir',
+ "Unterminated attribute, found '{0}' but no matching '{1}' found.",
+ attrStart, attrEnd);
+ }
+ if (node.nodeType == NODE_TYPE_ELEMENT) {
+ if (node.hasAttribute(attrStart)) depth++;
+ if (node.hasAttribute(attrEnd)) depth--;
+ }
+ nodes.push(node);
+ node = node.nextSibling;
+ } while (depth > 0);
+ } else {
+ nodes.push(node);
+ }
+
+ return jqLite(nodes);
+ }
+
+ /**
+ * Wrapper for linking function which converts normal linking function into a grouped
+ * linking function.
+ * @param linkFn
+ * @param attrStart
+ * @param attrEnd
+ * @returns {Function}
+ */
+ function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) {
+ return function(scope, element, attrs, controllers, transcludeFn) {
+ element = groupScan(element[0], attrStart, attrEnd);
+ return linkFn(scope, element, attrs, controllers, transcludeFn);
+ };
+ }
+
+ /**
+ * Once the directives have been collected, their compile functions are executed. This method
+ * is responsible for inlining directive templates as well as terminating the application
+ * of the directives if the terminal directive has been reached.
+ *
+ * @param {Array} directives Array of collected directives to execute their compile function.
+ * this needs to be pre-sorted by priority order.
+ * @param {Node} compileNode The raw DOM node to apply the compile functions to
+ * @param {Object} templateAttrs The shared attribute function
+ * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the
+ * scope argument is auto-generated to the new
+ * child of the transcluded parent scope.
+ * @param {JQLite} jqCollection If we are working on the root of the compile tree then this
+ * argument has the root jqLite array so that we can replace nodes
+ * on it.
+ * @param {Object=} originalReplaceDirective An optional directive that will be ignored when
+ * compiling the transclusion.
+ * @param {Array.<Function>} preLinkFns
+ * @param {Array.<Function>} postLinkFns
+ * @param {Object} previousCompileContext Context used for previous compilation of the current
+ * node
+ * @returns {Function} linkFn
+ */
+ function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn,
+ jqCollection, originalReplaceDirective, preLinkFns, postLinkFns,
+ previousCompileContext) {
+ previousCompileContext = previousCompileContext || {};
+
+ var terminalPriority = -Number.MAX_VALUE,
+ newScopeDirective,
+ controllerDirectives = previousCompileContext.controllerDirectives,
+ controllers,
+ newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective,
+ templateDirective = previousCompileContext.templateDirective,
+ nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective,
+ hasTranscludeDirective = false,
+ hasTemplate = false,
+ hasElementTranscludeDirective = previousCompileContext.hasElementTranscludeDirective,
+ $compileNode = templateAttrs.$$element = jqLite(compileNode),
+ directive,
+ directiveName,
+ $template,
+ replaceDirective = originalReplaceDirective,
+ childTranscludeFn = transcludeFn,
+ linkFn,
+ directiveValue;
+
+ // executes all directives on the current element
+ for (var i = 0, ii = directives.length; i < ii; i++) {
+ directive = directives[i];
+ var attrStart = directive.$$start;
+ var attrEnd = directive.$$end;
+
+ // collect multiblock sections
+ if (attrStart) {
+ $compileNode = groupScan(compileNode, attrStart, attrEnd);
+ }
+ $template = undefined;
+
+ if (terminalPriority > directive.priority) {
+ break; // prevent further processing of directives
+ }
+
+ if (directiveValue = directive.scope) {
+
+ // skip the check for directives with async templates, we'll check the derived sync
+ // directive when the template arrives
+ if (!directive.templateUrl) {
+ if (isObject(directiveValue)) {
+ // This directive is trying to add an isolated scope.
+ // Check that there is no scope of any kind already
+ assertNoDuplicate('new/isolated scope', newIsolateScopeDirective || newScopeDirective,
+ directive, $compileNode);
+ newIsolateScopeDirective = directive;
+ } else {
+ // This directive is trying to add a child scope.
+ // Check that there is no isolated scope already
+ assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive,
+ $compileNode);
+ }
+ }
+
+ newScopeDirective = newScopeDirective || directive;
+ }
+
+ directiveName = directive.name;
+
+ if (!directive.templateUrl && directive.controller) {
+ directiveValue = directive.controller;
+ controllerDirectives = controllerDirectives || {};
+ assertNoDuplicate("'" + directiveName + "' controller",
+ controllerDirectives[directiveName], directive, $compileNode);
+ controllerDirectives[directiveName] = directive;
+ }
+
+ if (directiveValue = directive.transclude) {
+ hasTranscludeDirective = true;
+
+ // Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion.
+ // This option should only be used by directives that know how to safely handle element transclusion,
+ // where the transcluded nodes are added or replaced after linking.
+ if (!directive.$$tlb) {
+ assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode);
+ nonTlbTranscludeDirective = directive;
+ }
+
+ if (directiveValue == 'element') {
+ hasElementTranscludeDirective = true;
+ terminalPriority = directive.priority;
+ $template = $compileNode;
+ $compileNode = templateAttrs.$$element =
+ jqLite(document.createComment(' ' + directiveName + ': ' +
+ templateAttrs[directiveName] + ' '));
+ compileNode = $compileNode[0];
+ replaceWith(jqCollection, sliceArgs($template), compileNode);
+
+ childTranscludeFn = compile($template, transcludeFn, terminalPriority,
+ replaceDirective && replaceDirective.name, {
+ // Don't pass in:
+ // - controllerDirectives - otherwise we'll create duplicates controllers
+ // - newIsolateScopeDirective or templateDirective - combining templates with
+ // element transclusion doesn't make sense.
+ //
+ // We need only nonTlbTranscludeDirective so that we prevent putting transclusion
+ // on the same element more than once.
+ nonTlbTranscludeDirective: nonTlbTranscludeDirective
+ });
+ } else {
+ $template = jqLite(jqLiteClone(compileNode)).contents();
+ $compileNode.empty(); // clear contents
+ childTranscludeFn = compile($template, transcludeFn);
+ }
+ }
+
+ if (directive.template) {
+ hasTemplate = true;
+ assertNoDuplicate('template', templateDirective, directive, $compileNode);
+ templateDirective = directive;
+
+ directiveValue = (isFunction(directive.template))
+ ? directive.template($compileNode, templateAttrs)
+ : directive.template;
+
+ directiveValue = denormalizeTemplate(directiveValue);
+
+ if (directive.replace) {
+ replaceDirective = directive;
+ if (jqLiteIsTextNode(directiveValue)) {
+ $template = [];
+ } else {
+ $template = removeComments(wrapTemplate(directive.templateNamespace, trim(directiveValue)));
+ }
+ compileNode = $template[0];
+
+ if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) {
+ throw $compileMinErr('tplrt',
+ "Template for directive '{0}' must have exactly one root element. {1}",
+ directiveName, '');
+ }
+
+ replaceWith(jqCollection, $compileNode, compileNode);
+
+ var newTemplateAttrs = {$attr: {}};
+
+ // combine directives from the original node and from the template:
+ // - take the array of directives for this element
+ // - split it into two parts, those that already applied (processed) and those that weren't (unprocessed)
+ // - collect directives from the template and sort them by priority
+ // - combine directives as: processed + template + unprocessed
+ var templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs);
+ var unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1));
+
+ if (newIsolateScopeDirective) {
+ markDirectivesAsIsolate(templateDirectives);
+ }
+ directives = directives.concat(templateDirectives).concat(unprocessedDirectives);
+ mergeTemplateAttributes(templateAttrs, newTemplateAttrs);
+
+ ii = directives.length;
+ } else {
+ $compileNode.html(directiveValue);
+ }
+ }
+
+ if (directive.templateUrl) {
+ hasTemplate = true;
+ assertNoDuplicate('template', templateDirective, directive, $compileNode);
+ templateDirective = directive;
+
+ if (directive.replace) {
+ replaceDirective = directive;
+ }
+
+ nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode,
+ templateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, {
+ controllerDirectives: controllerDirectives,
+ newIsolateScopeDirective: newIsolateScopeDirective,
+ templateDirective: templateDirective,
+ nonTlbTranscludeDirective: nonTlbTranscludeDirective
+ });
+ ii = directives.length;
+ } else if (directive.compile) {
+ try {
+ linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn);
+ if (isFunction(linkFn)) {
+ addLinkFns(null, linkFn, attrStart, attrEnd);
+ } else if (linkFn) {
+ addLinkFns(linkFn.pre, linkFn.post, attrStart, attrEnd);
+ }
+ } catch (e) {
+ $exceptionHandler(e, startingTag($compileNode));
+ }
+ }
+
+ if (directive.terminal) {
+ nodeLinkFn.terminal = true;
+ terminalPriority = Math.max(terminalPriority, directive.priority);
+ }
+
+ }
+
+ nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true;
+ nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective;
+ nodeLinkFn.elementTranscludeOnThisElement = hasElementTranscludeDirective;
+ nodeLinkFn.templateOnThisElement = hasTemplate;
+ nodeLinkFn.transclude = childTranscludeFn;
+
+ previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective;
+
+ // might be normal or delayed nodeLinkFn depending on if templateUrl is present
+ return nodeLinkFn;
+
+ ////////////////////
+
+ function addLinkFns(pre, post, attrStart, attrEnd) {
+ if (pre) {
+ if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd);
+ pre.require = directive.require;
+ pre.directiveName = directiveName;
+ if (newIsolateScopeDirective === directive || directive.$$isolateScope) {
+ pre = cloneAndAnnotateFn(pre, {isolateScope: true});
+ }
+ preLinkFns.push(pre);
+ }
+ if (post) {
+ if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd);
+ post.require = directive.require;
+ post.directiveName = directiveName;
+ if (newIsolateScopeDirective === directive || directive.$$isolateScope) {
+ post = cloneAndAnnotateFn(post, {isolateScope: true});
+ }
+ postLinkFns.push(post);
+ }
+ }
+
+
+ function getControllers(directiveName, require, $element, elementControllers) {
+ var value, retrievalMethod = 'data', optional = false;
+ var $searchElement = $element;
+ var match;
+ if (isString(require)) {
+ match = require.match(REQUIRE_PREFIX_REGEXP);
+ require = require.substring(match[0].length);
+
+ if (match[3]) {
+ if (match[1]) match[3] = null;
+ else match[1] = match[3];
+ }
+ if (match[1] === '^') {
+ retrievalMethod = 'inheritedData';
+ } else if (match[1] === '^^') {
+ retrievalMethod = 'inheritedData';
+ $searchElement = $element.parent();
+ }
+ if (match[2] === '?') {
+ optional = true;
+ }
+
+ value = null;
+
+ if (elementControllers && retrievalMethod === 'data') {
+ if (value = elementControllers[require]) {
+ value = value.instance;
+ }
+ }
+ value = value || $searchElement[retrievalMethod]('$' + require + 'Controller');
+
+ if (!value && !optional) {
+ throw $compileMinErr('ctreq',
+ "Controller '{0}', required by directive '{1}', can't be found!",
+ require, directiveName);
+ }
+ return value || null;
+ } else if (isArray(require)) {
+ value = [];
+ forEach(require, function(require) {
+ value.push(getControllers(directiveName, require, $element, elementControllers));
+ });
+ }
+ return value;
+ }
+
+
+ function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) {
+ var i, ii, linkFn, controller, isolateScope, elementControllers, transcludeFn, $element,
+ attrs;
+
+ if (compileNode === linkNode) {
+ attrs = templateAttrs;
+ $element = templateAttrs.$$element;
+ } else {
+ $element = jqLite(linkNode);
+ attrs = new Attributes($element, templateAttrs);
+ }
+
+ if (newIsolateScopeDirective) {
+ isolateScope = scope.$new(true);
+ }
+
+ if (boundTranscludeFn) {
+ // track `boundTranscludeFn` so it can be unwrapped if `transcludeFn`
+ // is later passed as `parentBoundTranscludeFn` to `publicLinkFn`
+ transcludeFn = controllersBoundTransclude;
+ transcludeFn.$$boundTransclude = boundTranscludeFn;
+ }
+
+ if (controllerDirectives) {
+ // TODO: merge `controllers` and `elementControllers` into single object.
+ controllers = {};
+ elementControllers = {};
+ forEach(controllerDirectives, function(directive) {
+ var locals = {
+ $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope,
+ $element: $element,
+ $attrs: attrs,
+ $transclude: transcludeFn
+ }, controllerInstance;
+
+ controller = directive.controller;
+ if (controller == '@') {
+ controller = attrs[directive.name];
+ }
+
+ controllerInstance = $controller(controller, locals, true, directive.controllerAs);
+
+ // For directives with element transclusion the element is a comment,
+ // but jQuery .data doesn't support attaching data to comment nodes as it's hard to
+ // clean up (http://bugs.jquery.com/ticket/8335).
+ // Instead, we save the controllers for the element in a local hash and attach to .data
+ // later, once we have the actual element.
+ elementControllers[directive.name] = controllerInstance;
+ if (!hasElementTranscludeDirective) {
+ $element.data('$' + directive.name + 'Controller', controllerInstance.instance);
+ }
+
+ controllers[directive.name] = controllerInstance;
+ });
+ }
+
+ if (newIsolateScopeDirective) {
+ compile.$$addScopeInfo($element, isolateScope, true, !(templateDirective && (templateDirective === newIsolateScopeDirective ||
+ templateDirective === newIsolateScopeDirective.$$originalDirective)));
+ compile.$$addScopeClass($element, true);
+
+ var isolateScopeController = controllers && controllers[newIsolateScopeDirective.name];
+ var isolateBindingContext = isolateScope;
+ if (isolateScopeController && isolateScopeController.identifier &&
+ newIsolateScopeDirective.bindToController === true) {
+ isolateBindingContext = isolateScopeController.instance;
+ }
+
+ forEach(isolateScope.$$isolateBindings = newIsolateScopeDirective.$$isolateBindings, function(definition, scopeName) {
+ var attrName = definition.attrName,
+ optional = definition.optional,
+ mode = definition.mode, // @, =, or &
+ lastValue,
+ parentGet, parentSet, compare;
+
+ switch (mode) {
+
+ case '@':
+ attrs.$observe(attrName, function(value) {
+ isolateBindingContext[scopeName] = value;
+ });
+ attrs.$$observers[attrName].$$scope = scope;
+ if (attrs[attrName]) {
+ // If the attribute has been provided then we trigger an interpolation to ensure
+ // the value is there for use in the link fn
+ isolateBindingContext[scopeName] = $interpolate(attrs[attrName])(scope);
+ }
+ break;
+
+ case '=':
+ if (optional && !attrs[attrName]) {
+ return;
+ }
+ parentGet = $parse(attrs[attrName]);
+ if (parentGet.literal) {
+ compare = equals;
+ } else {
+ compare = function(a, b) { return a === b || (a !== a && b !== b); };
+ }
+ parentSet = parentGet.assign || function() {
+ // reset the change, or we will throw this exception on every $digest
+ lastValue = isolateBindingContext[scopeName] = parentGet(scope);
+ throw $compileMinErr('nonassign',
+ "Expression '{0}' used with directive '{1}' is non-assignable!",
+ attrs[attrName], newIsolateScopeDirective.name);
+ };
+ lastValue = isolateBindingContext[scopeName] = parentGet(scope);
+ var parentValueWatch = function parentValueWatch(parentValue) {
+ if (!compare(parentValue, isolateBindingContext[scopeName])) {
+ // we are out of sync and need to copy
+ if (!compare(parentValue, lastValue)) {
+ // parent changed and it has precedence
+ isolateBindingContext[scopeName] = parentValue;
+ } else {
+ // if the parent can be assigned then do so
+ parentSet(scope, parentValue = isolateBindingContext[scopeName]);
+ }
+ }
+ return lastValue = parentValue;
+ };
+ parentValueWatch.$stateful = true;
+ var unwatch;
+ if (definition.collection) {
+ unwatch = scope.$watchCollection(attrs[attrName], parentValueWatch);
+ } else {
+ unwatch = scope.$watch($parse(attrs[attrName], parentValueWatch), null, parentGet.literal);
+ }
+ isolateScope.$on('$destroy', unwatch);
+ break;
+
+ case '&':
+ parentGet = $parse(attrs[attrName]);
+ isolateBindingContext[scopeName] = function(locals) {
+ return parentGet(scope, locals);
+ };
+ break;
+ }
+ });
+ }
+ if (controllers) {
+ forEach(controllers, function(controller) {
+ controller();
+ });
+ controllers = null;
+ }
+
+ // PRELINKING
+ for (i = 0, ii = preLinkFns.length; i < ii; i++) {
+ linkFn = preLinkFns[i];
+ invokeLinkFn(linkFn,
+ linkFn.isolateScope ? isolateScope : scope,
+ $element,
+ attrs,
+ linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers),
+ transcludeFn
+ );
+ }
+
+ // RECURSION
+ // We only pass the isolate scope, if the isolate directive has a template,
+ // otherwise the child elements do not belong to the isolate directive.
+ var scopeToChild = scope;
+ if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) {
+ scopeToChild = isolateScope;
+ }
+ childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn);
+
+ // POSTLINKING
+ for (i = postLinkFns.length - 1; i >= 0; i--) {
+ linkFn = postLinkFns[i];
+ invokeLinkFn(linkFn,
+ linkFn.isolateScope ? isolateScope : scope,
+ $element,
+ attrs,
+ linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers),
+ transcludeFn
+ );
+ }
+
+ // This is the function that is injected as `$transclude`.
+ // Note: all arguments are optional!
+ function controllersBoundTransclude(scope, cloneAttachFn, futureParentElement) {
+ var transcludeControllers;
+
+ // No scope passed in:
+ if (!isScope(scope)) {
+ futureParentElement = cloneAttachFn;
+ cloneAttachFn = scope;
+ scope = undefined;
+ }
+
+ if (hasElementTranscludeDirective) {
+ transcludeControllers = elementControllers;
+ }
+ if (!futureParentElement) {
+ futureParentElement = hasElementTranscludeDirective ? $element.parent() : $element;
+ }
+ return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers, futureParentElement, scopeToChild);
+ }
+ }
+ }
+
+ function markDirectivesAsIsolate(directives) {
+ // mark all directives as needing isolate scope.
+ for (var j = 0, jj = directives.length; j < jj; j++) {
+ directives[j] = inherit(directives[j], {$$isolateScope: true});
+ }
+ }
+
+ /**
+ * looks up the directive and decorates it with exception handling and proper parameters. We
+ * call this the boundDirective.
+ *
+ * @param {string} name name of the directive to look up.
+ * @param {string} location The directive must be found in specific format.
+ * String containing any of theses characters:
+ *
+ * * `E`: element name
+ * * `A': attribute
+ * * `C`: class
+ * * `M`: comment
+ * @returns {boolean} true if directive was added.
+ */
+ function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName,
+ endAttrName) {
+ if (name === ignoreDirective) return null;
+ var match = null;
+ if (hasDirectives.hasOwnProperty(name)) {
+ for (var directive, directives = $injector.get(name + Suffix),
+ i = 0, ii = directives.length; i < ii; i++) {
+ try {
+ directive = directives[i];
+ if ((maxPriority === undefined || maxPriority > directive.priority) &&
+ directive.restrict.indexOf(location) != -1) {
+ if (startAttrName) {
+ directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName});
+ }
+ tDirectives.push(directive);
+ match = directive;
+ }
+ } catch (e) { $exceptionHandler(e); }
+ }
+ }
+ return match;
+ }
+
+
+ /**
+ * looks up the directive and returns true if it is a multi-element directive,
+ * and therefore requires DOM nodes between -start and -end markers to be grouped
+ * together.
+ *
+ * @param {string} name name of the directive to look up.
+ * @returns true if directive was registered as multi-element.
+ */
+ function directiveIsMultiElement(name) {
+ if (hasDirectives.hasOwnProperty(name)) {
+ for (var directive, directives = $injector.get(name + Suffix),
+ i = 0, ii = directives.length; i < ii; i++) {
+ directive = directives[i];
+ if (directive.multiElement) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * When the element is replaced with HTML template then the new attributes
+ * on the template need to be merged with the existing attributes in the DOM.
+ * The desired effect is to have both of the attributes present.
+ *
+ * @param {object} dst destination attributes (original DOM)
+ * @param {object} src source attributes (from the directive template)
+ */
+ function mergeTemplateAttributes(dst, src) {
+ var srcAttr = src.$attr,
+ dstAttr = dst.$attr,
+ $element = dst.$$element;
+
+ // reapply the old attributes to the new element
+ forEach(dst, function(value, key) {
+ if (key.charAt(0) != '$') {
+ if (src[key] && src[key] !== value) {
+ value += (key === 'style' ? ';' : ' ') + src[key];
+ }
+ dst.$set(key, value, true, srcAttr[key]);
+ }
+ });
+
+ // copy the new attributes on the old attrs object
+ forEach(src, function(value, key) {
+ if (key == 'class') {
+ safeAddClass($element, value);
+ dst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value;
+ } else if (key == 'style') {
+ $element.attr('style', $element.attr('style') + ';' + value);
+ dst['style'] = (dst['style'] ? dst['style'] + ';' : '') + value;
+ // `dst` will never contain hasOwnProperty as DOM parser won't let it.
+ // You will get an "InvalidCharacterError: DOM Exception 5" error if you
+ // have an attribute like "has-own-property" or "data-has-own-property", etc.
+ } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) {
+ dst[key] = value;
+ dstAttr[key] = srcAttr[key];
+ }
+ });
+ }
+
+
+ function compileTemplateUrl(directives, $compileNode, tAttrs,
+ $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) {
+ var linkQueue = [],
+ afterTemplateNodeLinkFn,
+ afterTemplateChildLinkFn,
+ beforeTemplateCompileNode = $compileNode[0],
+ origAsyncDirective = directives.shift(),
+ // The fact that we have to copy and patch the directive seems wrong!
+ derivedSyncDirective = extend({}, origAsyncDirective, {
+ templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective
+ }),
+ templateUrl = (isFunction(origAsyncDirective.templateUrl))
+ ? origAsyncDirective.templateUrl($compileNode, tAttrs)
+ : origAsyncDirective.templateUrl,
+ templateNamespace = origAsyncDirective.templateNamespace;
+
+ $compileNode.empty();
+
+ $templateRequest($sce.getTrustedResourceUrl(templateUrl))
+ .then(function(content) {
+ var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn;
+
+ content = denormalizeTemplate(content);
+
+ if (origAsyncDirective.replace) {
+ if (jqLiteIsTextNode(content)) {
+ $template = [];
+ } else {
+ $template = removeComments(wrapTemplate(templateNamespace, trim(content)));
+ }
+ compileNode = $template[0];
+
+ if ($template.length != 1 || compileNode.nodeType !== NODE_TYPE_ELEMENT) {
+ throw $compileMinErr('tplrt',
+ "Template for directive '{0}' must have exactly one root element. {1}",
+ origAsyncDirective.name, templateUrl);
+ }
+
+ tempTemplateAttrs = {$attr: {}};
+ replaceWith($rootElement, $compileNode, compileNode);
+ var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs);
+
+ if (isObject(origAsyncDirective.scope)) {
+ markDirectivesAsIsolate(templateDirectives);
+ }
+ directives = templateDirectives.concat(directives);
+ mergeTemplateAttributes(tAttrs, tempTemplateAttrs);
+ } else {
+ compileNode = beforeTemplateCompileNode;
+ $compileNode.html(content);
+ }
+
+ directives.unshift(derivedSyncDirective);
+
+ afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs,
+ childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns,
+ previousCompileContext);
+ forEach($rootElement, function(node, i) {
+ if (node == compileNode) {
+ $rootElement[i] = $compileNode[0];
+ }
+ });
+ afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn);
+
+ while (linkQueue.length) {
+ var scope = linkQueue.shift(),
+ beforeTemplateLinkNode = linkQueue.shift(),
+ linkRootElement = linkQueue.shift(),
+ boundTranscludeFn = linkQueue.shift(),
+ linkNode = $compileNode[0];
+
+ if (scope.$$destroyed) continue;
+
+ if (beforeTemplateLinkNode !== beforeTemplateCompileNode) {
+ var oldClasses = beforeTemplateLinkNode.className;
+
+ if (!(previousCompileContext.hasElementTranscludeDirective &&
+ origAsyncDirective.replace)) {
+ // it was cloned therefore we have to clone as well.
+ linkNode = jqLiteClone(compileNode);
+ }
+ replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode);
+
+ // Copy in CSS classes from original node
+ safeAddClass(jqLite(linkNode), oldClasses);
+ }
+ if (afterTemplateNodeLinkFn.transcludeOnThisElement) {
+ childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn);
+ } else {
+ childBoundTranscludeFn = boundTranscludeFn;
+ }
+ afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement,
+ childBoundTranscludeFn);
+ }
+ linkQueue = null;
+ });
+
+ return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) {
+ var childBoundTranscludeFn = boundTranscludeFn;
+ if (scope.$$destroyed) return;
+ if (linkQueue) {
+ linkQueue.push(scope,
+ node,
+ rootElement,
+ childBoundTranscludeFn);
+ } else {
+ if (afterTemplateNodeLinkFn.transcludeOnThisElement) {
+ childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn);
+ }
+ afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn);
+ }
+ };
+ }
+
+
+ /**
+ * Sorting function for bound directives.
+ */
+ function byPriority(a, b) {
+ var diff = b.priority - a.priority;
+ if (diff !== 0) return diff;
+ if (a.name !== b.name) return (a.name < b.name) ? -1 : 1;
+ return a.index - b.index;
+ }
+
+
+ function assertNoDuplicate(what, previousDirective, directive, element) {
+ if (previousDirective) {
+ throw $compileMinErr('multidir', 'Multiple directives [{0}, {1}] asking for {2} on: {3}',
+ previousDirective.name, directive.name, what, startingTag(element));
+ }
+ }
+
+
+ function addTextInterpolateDirective(directives, text) {
+ var interpolateFn = $interpolate(text, true);
+ if (interpolateFn) {
+ directives.push({
+ priority: 0,
+ compile: function textInterpolateCompileFn(templateNode) {
+ var templateNodeParent = templateNode.parent(),
+ hasCompileParent = !!templateNodeParent.length;
+
+ // When transcluding a template that has bindings in the root
+ // we don't have a parent and thus need to add the class during linking fn.
+ if (hasCompileParent) compile.$$addBindingClass(templateNodeParent);
+
+ return function textInterpolateLinkFn(scope, node) {
+ var parent = node.parent();
+ if (!hasCompileParent) compile.$$addBindingClass(parent);
+ compile.$$addBindingInfo(parent, interpolateFn.expressions);
+ scope.$watch(interpolateFn, function interpolateFnWatchAction(value) {
+ node[0].nodeValue = value;
+ });
+ };
+ }
+ });
+ }
+ }
+
+
+ function wrapTemplate(type, template) {
+ type = lowercase(type || 'html');
+ switch (type) {
+ case 'svg':
+ case 'math':
+ var wrapper = document.createElement('div');
+ wrapper.innerHTML = '<' + type + '>' + template + '</' + type + '>';
+ return wrapper.childNodes[0].childNodes;
+ default:
+ return template;
+ }
+ }
+
+
+ function getTrustedContext(node, attrNormalizedName) {
+ if (attrNormalizedName == "srcdoc") {
+ return $sce.HTML;
+ }
+ var tag = nodeName_(node);
+ // maction[xlink:href] can source SVG. It's not limited to <maction>.
+ if (attrNormalizedName == "xlinkHref" ||
+ (tag == "form" && attrNormalizedName == "action") ||
+ (tag != "img" && (attrNormalizedName == "src" ||
+ attrNormalizedName == "ngSrc"))) {
+ return $sce.RESOURCE_URL;
+ }
+ }
+
+
+ function addAttrInterpolateDirective(node, directives, value, name, allOrNothing) {
+ var interpolateFn = $interpolate(value, true);
+
+ // no interpolation found -> ignore
+ if (!interpolateFn) return;
+
+
+ if (name === "multiple" && nodeName_(node) === "select") {
+ throw $compileMinErr("selmulti",
+ "Binding to the 'multiple' attribute is not supported. Element: {0}",
+ startingTag(node));
+ }
+
+ directives.push({
+ priority: 100,
+ compile: function() {
+ return {
+ pre: function attrInterpolatePreLinkFn(scope, element, attr) {
+ var $$observers = (attr.$$observers || (attr.$$observers = {}));
+
+ if (EVENT_HANDLER_ATTR_REGEXP.test(name)) {
+ throw $compileMinErr('nodomevents',
+ "Interpolations for HTML DOM event attributes are disallowed. Please use the " +
+ "ng- versions (such as ng-click instead of onclick) instead.");
+ }
+
+ // If the attribute was removed, then we are done
+ if (!attr[name]) {
+ return;
+ }
+
+ // we need to interpolate again, in case the attribute value has been updated
+ // (e.g. by another directive's compile function)
+ interpolateFn = $interpolate(attr[name], true, getTrustedContext(node, name),
+ ALL_OR_NOTHING_ATTRS[name] || allOrNothing);
+
+ // if attribute was updated so that there is no interpolation going on we don't want to
+ // register any observers
+ if (!interpolateFn) return;
+
+ // initialize attr object so that it's ready in case we need the value for isolate
+ // scope initialization, otherwise the value would not be available from isolate
+ // directive's linking fn during linking phase
+ attr[name] = interpolateFn(scope);
+
+ ($$observers[name] || ($$observers[name] = [])).$$inter = true;
+ (attr.$$observers && attr.$$observers[name].$$scope || scope).
+ $watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) {
+ //special case for class attribute addition + removal
+ //so that class changes can tap into the animation
+ //hooks provided by the $animate service. Be sure to
+ //skip animations when the first digest occurs (when
+ //both the new and the old values are the same) since
+ //the CSS classes are the non-interpolated values
+ if (name === 'class' && newValue != oldValue) {
+ attr.$updateClass(newValue, oldValue);
+ } else {
+ attr.$set(name, newValue);
+ }
+ });
+ }
+ };
+ }
+ });
+ }
+
+
+ /**
+ * This is a special jqLite.replaceWith, which can replace items which
+ * have no parents, provided that the containing jqLite collection is provided.
+ *
+ * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes
+ * in the root of the tree.
+ * @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep
+ * the shell, but replace its DOM node reference.
+ * @param {Node} newNode The new DOM node.
+ */
+ function replaceWith($rootElement, elementsToRemove, newNode) {
+ var firstElementToRemove = elementsToRemove[0],
+ removeCount = elementsToRemove.length,
+ parent = firstElementToRemove.parentNode,
+ i, ii;
+
+ if ($rootElement) {
+ for (i = 0, ii = $rootElement.length; i < ii; i++) {
+ if ($rootElement[i] == firstElementToRemove) {
+ $rootElement[i++] = newNode;
+ for (var j = i, j2 = j + removeCount - 1,
+ jj = $rootElement.length;
+ j < jj; j++, j2++) {
+ if (j2 < jj) {
+ $rootElement[j] = $rootElement[j2];
+ } else {
+ delete $rootElement[j];
+ }
+ }
+ $rootElement.length -= removeCount - 1;
+
+ // If the replaced element is also the jQuery .context then replace it
+ // .context is a deprecated jQuery api, so we should set it only when jQuery set it
+ // http://api.jquery.com/context/
+ if ($rootElement.context === firstElementToRemove) {
+ $rootElement.context = newNode;
+ }
+ break;
+ }
+ }
+ }
+
+ if (parent) {
+ parent.replaceChild(newNode, firstElementToRemove);
+ }
+
+ // TODO(perf): what's this document fragment for? is it needed? can we at least reuse it?
+ var fragment = document.createDocumentFragment();
+ fragment.appendChild(firstElementToRemove);
+
+ // Copy over user data (that includes Angular's $scope etc.). Don't copy private
+ // data here because there's no public interface in jQuery to do that and copying over
+ // event listeners (which is the main use of private data) wouldn't work anyway.
+ jqLite(newNode).data(jqLite(firstElementToRemove).data());
+
+ // Remove data of the replaced element. We cannot just call .remove()
+ // on the element it since that would deallocate scope that is needed
+ // for the new node. Instead, remove the data "manually".
+ if (!jQuery) {
+ delete jqLite.cache[firstElementToRemove[jqLite.expando]];
+ } else {
+ // jQuery 2.x doesn't expose the data storage. Use jQuery.cleanData to clean up after
+ // the replaced element. The cleanData version monkey-patched by Angular would cause
+ // the scope to be trashed and we do need the very same scope to work with the new
+ // element. However, we cannot just cache the non-patched version and use it here as
+ // that would break if another library patches the method after Angular does (one
+ // example is jQuery UI). Instead, set a flag indicating scope destroying should be
+ // skipped this one time.
+ skipDestroyOnNextJQueryCleanData = true;
+ jQuery.cleanData([firstElementToRemove]);
+ }
+
+ for (var k = 1, kk = elementsToRemove.length; k < kk; k++) {
+ var element = elementsToRemove[k];
+ jqLite(element).remove(); // must do this way to clean up expando
+ fragment.appendChild(element);
+ delete elementsToRemove[k];
+ }
+
+ elementsToRemove[0] = newNode;
+ elementsToRemove.length = 1;
+ }
+
+
+ function cloneAndAnnotateFn(fn, annotation) {
+ return extend(function() { return fn.apply(null, arguments); }, fn, annotation);
+ }
+
+
+ function invokeLinkFn(linkFn, scope, $element, attrs, controllers, transcludeFn) {
+ try {
+ linkFn(scope, $element, attrs, controllers, transcludeFn);
+ } catch (e) {
+ $exceptionHandler(e, startingTag($element));
+ }
+ }
+ }];
+}
+
+var PREFIX_REGEXP = /^((?:x|data)[\:\-_])/i;
+/**
+ * Converts all accepted directives format into proper directive name.
+ * All of these will become 'myDirective':
+ * my:Directive
+ * my-directive
+ * x-my-directive
+ * data-my:directive
+ *
+ * Also there is special case for Moz prefix starting with upper case letter.
+ * @param name Name to normalize
+ */
+function directiveNormalize(name) {
+ return camelCase(name.replace(PREFIX_REGEXP, ''));
+}
+
+/**
+ * @ngdoc type
+ * @name $compile.directive.Attributes
+ *
+ * @description
+ * A shared object between directive compile / linking functions which contains normalized DOM
+ * element attributes. The values reflect current binding state `{{ }}`. The normalization is
+ * needed since all of these are treated as equivalent in Angular:
+ *
+ * ```
+ * <span ng:bind="a" ng-bind="a" data-ng-bind="a" x-ng-bind="a">
+ * ```
+ */
+
+/**
+ * @ngdoc property
+ * @name $compile.directive.Attributes#$attr
+ *
+ * @description
+ * A map of DOM element attribute names to the normalized name. This is
+ * needed to do reverse lookup from normalized name back to actual name.
+ */
+
+
+/**
+ * @ngdoc method
+ * @name $compile.directive.Attributes#$set
+ * @kind function
+ *
+ * @description
+ * Set DOM element attribute value.
+ *
+ *
+ * @param {string} name Normalized element attribute name of the property to modify. The name is
+ * reverse-translated using the {@link ng.$compile.directive.Attributes#$attr $attr}
+ * property to the original name.
+ * @param {string} value Value to set the attribute to. The value can be an interpolated string.
+ */
+
+
+
+/**
+ * Closure compiler type information
+ */
+
+function nodesetLinkingFn(
+ /* angular.Scope */ scope,
+ /* NodeList */ nodeList,
+ /* Element */ rootElement,
+ /* function(Function) */ boundTranscludeFn
+) {}
+
+function directiveLinkingFn(
+ /* nodesetLinkingFn */ nodesetLinkingFn,
+ /* angular.Scope */ scope,
+ /* Node */ node,
+ /* Element */ rootElement,
+ /* function(Function) */ boundTranscludeFn
+) {}
+
+function tokenDifference(str1, str2) {
+ var values = '',
+ tokens1 = str1.split(/\s+/),
+ tokens2 = str2.split(/\s+/);
+
+ outer:
+ for (var i = 0; i < tokens1.length; i++) {
+ var token = tokens1[i];
+ for (var j = 0; j < tokens2.length; j++) {
+ if (token == tokens2[j]) continue outer;
+ }
+ values += (values.length > 0 ? ' ' : '') + token;
+ }
+ return values;
+}
+
+function removeComments(jqNodes) {
+ jqNodes = jqLite(jqNodes);
+ var i = jqNodes.length;
+
+ if (i <= 1) {
+ return jqNodes;
+ }
+
+ while (i--) {
+ var node = jqNodes[i];
+ if (node.nodeType === NODE_TYPE_COMMENT) {
+ splice.call(jqNodes, i, 1);
+ }
+ }
+ return jqNodes;
+}
+
+/**
+ * @ngdoc provider
+ * @name $controllerProvider
+ * @description
+ * The {@link ng.$controller $controller service} is used by Angular to create new
+ * controllers.
+ *
+ * This provider allows controller registration via the
+ * {@link ng.$controllerProvider#register register} method.
+ */
+function $ControllerProvider() {
+ var controllers = {},
+ globals = false,
+ CNTRL_REG = /^(\S+)(\s+as\s+(\w+))?$/;
+
+
+ /**
+ * @ngdoc method
+ * @name $controllerProvider#register
+ * @param {string|Object} name Controller name, or an object map of controllers where the keys are
+ * the names and the values are the constructors.
+ * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI
+ * annotations in the array notation).
+ */
+ this.register = function(name, constructor) {
+ assertNotHasOwnProperty(name, 'controller');
+ if (isObject(name)) {
+ extend(controllers, name);
+ } else {
+ controllers[name] = constructor;
+ }
+ };
+
+ /**
+ * @ngdoc method
+ * @name $controllerProvider#allowGlobals
+ * @description If called, allows `$controller` to find controller constructors on `window`
+ */
+ this.allowGlobals = function() {
+ globals = true;
+ };
+
+
+ this.$get = ['$injector', '$window', function($injector, $window) {
+
+ /**
+ * @ngdoc service
+ * @name $controller
+ * @requires $injector
+ *
+ * @param {Function|string} constructor If called with a function then it's considered to be the
+ * controller constructor function. Otherwise it's considered to be a string which is used
+ * to retrieve the controller constructor using the following steps:
+ *
+ * * check if a controller with given name is registered via `$controllerProvider`
+ * * check if evaluating the string on the current scope returns a constructor
+ * * if $controllerProvider#allowGlobals, check `window[constructor]` on the global
+ * `window` object (not recommended)
+ *
+ * The string can use the `controller as property` syntax, where the controller instance is published
+ * as the specified property on the `scope`; the `scope` must be injected into `locals` param for this
+ * to work correctly.
+ *
+ * @param {Object} locals Injection locals for Controller.
+ * @return {Object} Instance of given controller.
+ *
+ * @description
+ * `$controller` service is responsible for instantiating controllers.
+ *
+ * It's just a simple call to {@link auto.$injector $injector}, but extracted into
+ * a service, so that one can override this service with [BC version](https://gist.github.com/1649788).
+ */
+ return function(expression, locals, later, ident) {
+ // PRIVATE API:
+ // param `later` --- indicates that the controller's constructor is invoked at a later time.
+ // If true, $controller will allocate the object with the correct
+ // prototype chain, but will not invoke the controller until a returned
+ // callback is invoked.
+ // param `ident` --- An optional label which overrides the label parsed from the controller
+ // expression, if any.
+ var instance, match, constructor, identifier;
+ later = later === true;
+ if (ident && isString(ident)) {
+ identifier = ident;
+ }
+
+ if (isString(expression)) {
+ match = expression.match(CNTRL_REG),
+ constructor = match[1],
+ identifier = identifier || match[3];
+ expression = controllers.hasOwnProperty(constructor)
+ ? controllers[constructor]
+ : getter(locals.$scope, constructor, true) ||
+ (globals ? getter($window, constructor, true) : undefined);
+
+ assertArgFn(expression, constructor, true);
+ }
+
+ if (later) {
+ // Instantiate controller later:
+ // This machinery is used to create an instance of the object before calling the
+ // controller's constructor itself.
+ //
+ // This allows properties to be added to the controller before the constructor is
+ // invoked. Primarily, this is used for isolate scope bindings in $compile.
+ //
+ // This feature is not intended for use by applications, and is thus not documented
+ // publicly.
+ // Object creation: http://jsperf.com/create-constructor/2
+ var controllerPrototype = (isArray(expression) ?
+ expression[expression.length - 1] : expression).prototype;
+ instance = Object.create(controllerPrototype);
+
+ if (identifier) {
+ addIdentifier(locals, identifier, instance, constructor || expression.name);
+ }
+
+ return extend(function() {
+ $injector.invoke(expression, instance, locals, constructor);
+ return instance;
+ }, {
+ instance: instance,
+ identifier: identifier
+ });
+ }
+
+ instance = $injector.instantiate(expression, locals, constructor);
+
+ if (identifier) {
+ addIdentifier(locals, identifier, instance, constructor || expression.name);
+ }
+
+ return instance;
+ };
+
+ function addIdentifier(locals, identifier, instance, name) {
+ if (!(locals && isObject(locals.$scope))) {
+ throw minErr('$controller')('noscp',
+ "Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.",
+ name, identifier);
+ }
+
+ locals.$scope[identifier] = instance;
+ }
+ }];
+}
+
+/**
+ * @ngdoc service
+ * @name $document
+ * @requires $window
+ *
+ * @description
+ * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object.
+ *
+ * @example
+ <example module="documentExample">
+ <file name="index.html">
+ <div ng-controller="ExampleController">
+ <p>$document title: <b ng-bind="title"></b></p>
+ <p>window.document title: <b ng-bind="windowTitle"></b></p>
+ </div>
+ </file>
+ <file name="script.js">
+ angular.module('documentExample', [])
+ .controller('ExampleController', ['$scope', '$document', function($scope, $document) {
+ $scope.title = $document[0].title;
+ $scope.windowTitle = angular.element(window.document)[0].title;
+ }]);
+ </file>
+ </example>
+ */
+function $DocumentProvider() {
+ this.$get = ['$window', function(window) {
+ return jqLite(window.document);
+ }];
+}
+
+/**
+ * @ngdoc service
+ * @name $exceptionHandler
+ * @requires ng.$log
+ *
+ * @description
+ * Any uncaught exception in angular expressions is delegated to this service.
+ * The default implementation simply delegates to `$log.error` which logs it into
+ * the browser console.
+ *
+ * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by
+ * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing.
+ *
+ * ## Example:
+ *
+ * ```js
+ * angular.module('exceptionOverride', []).factory('$exceptionHandler', function() {
+ * return function(exception, cause) {
+ * exception.message += ' (caused by "' + cause + '")';
+ * throw exception;
+ * };
+ * });
+ * ```
+ *
+ * This example will override the normal action of `$exceptionHandler`, to make angular
+ * exceptions fail hard when they happen, instead of just logging to the console.
+ *
+ * <hr />
+ * Note, that code executed in event-listeners (even those registered using jqLite's `on`/`bind`
+ * methods) does not delegate exceptions to the {@link ng.$exceptionHandler $exceptionHandler}
+ * (unless executed during a digest).
+ *
+ * If you wish, you can manually delegate exceptions, e.g.
+ * `try { ... } catch(e) { $exceptionHandler(e); }`
+ *
+ * @param {Error} exception Exception associated with the error.
+ * @param {string=} cause optional information about the context in which
+ * the error was thrown.
+ *
+ */
+function $ExceptionHandlerProvider() {
+ this.$get = ['$log', function($log) {
+ return function(exception, cause) {
+ $log.error.apply($log, arguments);
+ };
+ }];
+}
+
+var APPLICATION_JSON = 'application/json';
+var CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': APPLICATION_JSON + ';charset=utf-8'};
+var JSON_START = /^\s*(\[|\{[^\{])/;
+var JSON_END = /[\}\]]\s*$/;
+var JSON_PROTECTION_PREFIX = /^\)\]\}',?\n/;
+
+function defaultHttpResponseTransform(data, headers) {
+ if (isString(data)) {
+ // strip json vulnerability protection prefix
+ data = data.replace(JSON_PROTECTION_PREFIX, '');
+ var contentType = headers('Content-Type');
+ if ((contentType && contentType.indexOf(APPLICATION_JSON) === 0 && data.trim()) ||
+ (JSON_START.test(data) && JSON_END.test(data))) {
+ data = fromJson(data);
+ }
+ }
+ return data;
+}
+
+/**
+ * Parse headers into key value object
+ *
+ * @param {string} headers Raw headers as a string
+ * @returns {Object} Parsed headers as key value object
+ */
+function parseHeaders(headers) {
+ var parsed = createMap(), key, val, i;
+
+ if (!headers) return parsed;
+
+ forEach(headers.split('\n'), function(line) {
+ i = line.indexOf(':');
+ key = lowercase(trim(line.substr(0, i)));
+ val = trim(line.substr(i + 1));
+
+ if (key) {
+ parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
+ }
+ });
+
+ return parsed;
+}
+
+
+/**
+ * Returns a function that provides access to parsed headers.
+ *
+ * Headers are lazy parsed when first requested.
+ * @see parseHeaders
+ *
+ * @param {(string|Object)} headers Headers to provide access to.
+ * @returns {function(string=)} Returns a getter function which if called with:
+ *
+ * - if called with single an argument returns a single header value or null
+ * - if called with no arguments returns an object containing all headers.
+ */
+function headersGetter(headers) {
+ var headersObj = isObject(headers) ? headers : undefined;
+
+ return function(name) {
+ if (!headersObj) headersObj = parseHeaders(headers);
+
+ if (name) {
+ var value = headersObj[lowercase(name)];
+ if (value === void 0) {
+ value = null;
+ }
+ return value;
+ }
+
+ return headersObj;
+ };
+}
+
+
+/**
+ * Chain all given functions
+ *
+ * This function is used for both request and response transforming
+ *
+ * @param {*} data Data to transform.
+ * @param {function(string=)} headers Http headers getter fn.
+ * @param {(Function|Array.<Function>)} fns Function or an array of functions.
+ * @returns {*} Transformed data.
+ */
+function transformData(data, headers, fns) {
+ if (isFunction(fns))
+ return fns(data, headers);
+
+ forEach(fns, function(fn) {
+ data = fn(data, headers);
+ });
+
+ return data;
+}
+
+
+function isSuccess(status) {
+ return 200 <= status && status < 300;
+}
+
+
+/**
+ * @ngdoc provider
+ * @name $httpProvider
+ * @description
+ * Use `$httpProvider` to change the default behavior of the {@link ng.$http $http} service.
+ * */
+function $HttpProvider() {
+ /**
+ * @ngdoc property
+ * @name $httpProvider#defaults
+ * @description
+ *
+ * Object containing default values for all {@link ng.$http $http} requests.
+ *
+ * - **`defaults.cache`** - {Object} - an object built with {@link ng.$cacheFactory `$cacheFactory`}
+ * that will provide the cache for all requests who set their `cache` property to `true`.
+ * If you set the `default.cache = false` then only requests that specify their own custom
+ * cache object will be cached. See {@link $http#caching $http Caching} for more information.
+ *
+ * - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token.
+ * Defaults value is `'XSRF-TOKEN'`.
+ *
+ * - **`defaults.xsrfHeaderName`** - {string} - Name of HTTP header to populate with the
+ * XSRF token. Defaults value is `'X-XSRF-TOKEN'`.
+ *
+ * - **`defaults.headers`** - {Object} - Default headers for all $http requests.
+ * Refer to {@link ng.$http#setting-http-headers $http} for documentation on
+ * setting default headers.
+ * - **`defaults.headers.common`**
+ * - **`defaults.headers.post`**
+ * - **`defaults.headers.put`**
+ * - **`defaults.headers.patch`**
+ *
+ **/
+ var defaults = this.defaults = {
+ // transform incoming response data
+ transformResponse: [defaultHttpResponseTransform],
+
+ // transform outgoing request data
+ transformRequest: [function(d) {
+ return isObject(d) && !isFile(d) && !isBlob(d) ? toJson(d) : d;
+ }],
+
+ // default headers
+ headers: {
+ common: {
+ 'Accept': 'application/json, text/plain, */*'
+ },
+ post: shallowCopy(CONTENT_TYPE_APPLICATION_JSON),
+ put: shallowCopy(CONTENT_TYPE_APPLICATION_JSON),
+ patch: shallowCopy(CONTENT_TYPE_APPLICATION_JSON)
+ },
+
+ xsrfCookieName: 'XSRF-TOKEN',
+ xsrfHeaderName: 'X-XSRF-TOKEN'
+ };
+
+ var useApplyAsync = false;
+ /**
+ * @ngdoc method
+ * @name $httpProvider#useApplyAsync
+ * @description
+ *
+ * Configure $http service to combine processing of multiple http responses received at around
+ * the same time via {@link ng.$rootScope.Scope#$applyAsync $rootScope.$applyAsync}. This can result in
+ * significant performance improvement for bigger applications that make many HTTP requests
+ * concurrently (common during application bootstrap).
+ *
+ * Defaults to false. If no value is specifed, returns the current configured value.
+ *
+ * @param {boolean=} value If true, when requests are loaded, they will schedule a deferred
+ * "apply" on the next tick, giving time for subsequent requests in a roughly ~10ms window
+ * to load and share the same digest cycle.
+ *
+ * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining.
+ * otherwise, returns the current configured value.
+ **/
+ this.useApplyAsync = function(value) {
+ if (isDefined(value)) {
+ useApplyAsync = !!value;
+ return this;
+ }
+ return useApplyAsync;
+ };
+
+ /**
+ * @ngdoc property
+ * @name $httpProvider#interceptors
+ * @description
+ *
+ * Array containing service factories for all synchronous or asynchronous {@link ng.$http $http}
+ * pre-processing of request or postprocessing of responses.
+ *
+ * These service factories are ordered by request, i.e. they are applied in the same order as the
+ * array, on request, but reverse order, on response.
+ *
+ * {@link ng.$http#interceptors Interceptors detailed info}
+ **/
+ var interceptorFactories = this.interceptors = [];
+
+ this.$get = ['$httpBackend', '$browser', '$cacheFactory', '$rootScope', '$q', '$injector',
+ function($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector) {
+
+ var defaultCache = $cacheFactory('$http');
+
+ /**
+ * Interceptors stored in reverse order. Inner interceptors before outer interceptors.
+ * The reversal is needed so that we can build up the interception chain around the
+ * server request.
+ */
+ var reversedInterceptors = [];
+
+ forEach(interceptorFactories, function(interceptorFactory) {
+ reversedInterceptors.unshift(isString(interceptorFactory)
+ ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory));
+ });
+
+ /**
+ * @ngdoc service
+ * @kind function
+ * @name $http
+ * @requires ng.$httpBackend
+ * @requires $cacheFactory
+ * @requires $rootScope
+ * @requires $q
+ * @requires $injector
+ *
+ * @description
+ * The `$http` service is a core Angular service that facilitates communication with the remote
+ * HTTP servers via the browser's [XMLHttpRequest](https://developer.mozilla.org/en/xmlhttprequest)
+ * object or via [JSONP](http://en.wikipedia.org/wiki/JSONP).
+ *
+ * For unit testing applications that use `$http` service, see
+ * {@link ngMock.$httpBackend $httpBackend mock}.
+ *
+ * For a higher level of abstraction, please check out the {@link ngResource.$resource
+ * $resource} service.
+ *
+ * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by
+ * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage
+ * it is important to familiarize yourself with these APIs and the guarantees they provide.
+ *
+ *
+ * ## General usage
+ * The `$http` service is a function which takes a single argument — a configuration object —
+ * that is used to generate an HTTP request and returns a {@link ng.$q promise}
+ * with two $http specific methods: `success` and `error`.
+ *
+ * ```js
+ * // Simple GET request example :
+ * $http.get('/someUrl').
+ * success(function(data, status, headers, config) {
+ * // this callback will be called asynchronously
+ * // when the response is available
+ * }).
+ * error(function(data, status, headers, config) {
+ * // called asynchronously if an error occurs
+ * // or server returns response with an error status.
+ * });
+ * ```
+ *
+ * ```js
+ * // Simple POST request example (passing data) :
+ * $http.post('/someUrl', {msg:'hello word!'}).
+ * success(function(data, status, headers, config) {
+ * // this callback will be called asynchronously
+ * // when the response is available
+ * }).
+ * error(function(data, status, headers, config) {
+ * // called asynchronously if an error occurs
+ * // or server returns response with an error status.
+ * });
+ * ```
+ *
+ *
+ * Since the returned value of calling the $http function is a `promise`, you can also use
+ * the `then` method to register callbacks, and these callbacks will receive a single argument –
+ * an object representing the response. See the API signature and type info below for more
+ * details.
+ *
+ * A response status code between 200 and 299 is considered a success status and
+ * will result in the success callback being called. Note that if the response is a redirect,
+ * XMLHttpRequest will transparently follow it, meaning that the error callback will not be
+ * called for such responses.
+ *
+ * ## Writing Unit Tests that use $http
+ * When unit testing (using {@link ngMock ngMock}), it is necessary to call
+ * {@link ngMock.$httpBackend#flush $httpBackend.flush()} to flush each pending
+ * request using trained responses.
+ *
+ * ```
+ * $httpBackend.expectGET(...);
+ * $http.get(...);
+ * $httpBackend.flush();
+ * ```
+ *
+ * ## Shortcut methods
+ *
+ * Shortcut methods are also available. All shortcut methods require passing in the URL, and
+ * request data must be passed in for POST/PUT requests.
+ *
+ * ```js
+ * $http.get('/someUrl').success(successCallback);
+ * $http.post('/someUrl', data).success(successCallback);
+ * ```
+ *
+ * Complete list of shortcut methods:
+ *
+ * - {@link ng.$http#get $http.get}
+ * - {@link ng.$http#head $http.head}
+ * - {@link ng.$http#post $http.post}
+ * - {@link ng.$http#put $http.put}
+ * - {@link ng.$http#delete $http.delete}
+ * - {@link ng.$http#jsonp $http.jsonp}
+ * - {@link ng.$http#patch $http.patch}
+ *
+ *
+ * ## Setting HTTP Headers
+ *
+ * The $http service will automatically add certain HTTP headers to all requests. These defaults
+ * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration
+ * object, which currently contains this default configuration:
+ *
+ * - `$httpProvider.defaults.headers.common` (headers that are common for all requests):
+ * - `Accept: application/json, text/plain, * / *`
+ * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests)
+ * - `Content-Type: application/json`
+ * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests)
+ * - `Content-Type: application/json`
+ *
+ * To add or overwrite these defaults, simply add or remove a property from these configuration
+ * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object
+ * with the lowercased HTTP method name as the key, e.g.
+ * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }.
+ *
+ * The defaults can also be set at runtime via the `$http.defaults` object in the same
+ * fashion. For example:
+ *
+ * ```
+ * module.run(function($http) {
+ * $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w'
+ * });
+ * ```
+ *
+ * In addition, you can supply a `headers` property in the config object passed when
+ * calling `$http(config)`, which overrides the defaults without changing them globally.
+ *
+ * To explicitly remove a header automatically added via $httpProvider.defaults.headers on a per request basis,
+ * Use the `headers` property, setting the desired header to `undefined`. For example:
+ *
+ * ```js
+ * var req = {
+ * method: 'POST',
+ * url: 'http://example.com',
+ * headers: {
+ * 'Content-Type': undefined
+ * },
+ * data: { test: 'test' },
+ * }
+ *
+ * $http(req).success(function(){...}).error(function(){...});
+ * ```
+ *
+ * ## Transforming Requests and Responses
+ *
+ * Both requests and responses can be transformed using transformation functions: `transformRequest`
+ * and `transformResponse`. These properties can be a single function that returns
+ * the transformed value (`{function(data, headersGetter)`) or an array of such transformation functions,
+ * which allows you to `push` or `unshift` a new transformation function into the transformation chain.
+ *
+ * ### Default Transformations
+ *
+ * The `$httpProvider` provider and `$http` service expose `defaults.transformRequest` and
+ * `defaults.transformResponse` properties. If a request does not provide its own transformations
+ * then these will be applied.
+ *
+ * You can augment or replace the default transformations by modifying these properties by adding to or
+ * replacing the array.
+ *
+ * Angular provides the following default transformations:
+ *
+ * Request transformations (`$httpProvider.defaults.transformRequest` and `$http.defaults.transformRequest`):
+ *
+ * - If the `data` property of the request configuration object contains an object, serialize it
+ * into JSON format.
+ *
+ * Response transformations (`$httpProvider.defaults.transformResponse` and `$http.defaults.transformResponse`):
+ *
+ * - If XSRF prefix is detected, strip it (see Security Considerations section below).
+ * - If JSON response is detected, deserialize it using a JSON parser.
+ *
+ *
+ * ### Overriding the Default Transformations Per Request
+ *
+ * If you wish override the request/response transformations only for a single request then provide
+ * `transformRequest` and/or `transformResponse` properties on the configuration object passed
+ * into `$http`.
+ *
+ * Note that if you provide these properties on the config object the default transformations will be
+ * overwritten. If you wish to augment the default transformations then you must include them in your
+ * local transformation array.
+ *
+ * The following code demonstrates adding a new response transformation to be run after the default response
+ * transformations have been run.
+ *
+ * ```js
+ * function appendTransform(defaults, transform) {
+ *
+ * // We can't guarantee that the default transformation is an array
+ * defaults = angular.isArray(defaults) ? defaults : [defaults];
+ *
+ * // Append the new transformation to the defaults
+ * return defaults.concat(transform);
+ * }
+ *
+ * $http({
+ * url: '...',
+ * method: 'GET',
+ * transformResponse: appendTransform($http.defaults.transformResponse, function(value) {
+ * return doTransform(value);
+ * })
+ * });
+ * ```
+ *
+ *
+ * ## Caching
+ *
+ * To enable caching, set the request configuration `cache` property to `true` (to use default
+ * cache) or to a custom cache object (built with {@link ng.$cacheFactory `$cacheFactory`}).
+ * When the cache is enabled, `$http` stores the response from the server in the specified
+ * cache. The next time the same request is made, the response is served from the cache without
+ * sending a request to the server.
+ *
+ * Note that even if the response is served from cache, delivery of the data is asynchronous in
+ * the same way that real requests are.
+ *
+ * If there are multiple GET requests for the same URL that should be cached using the same
+ * cache, but the cache is not populated yet, only one request to the server will be made and
+ * the remaining requests will be fulfilled using the response from the first request.
+ *
+ * You can change the default cache to a new object (built with
+ * {@link ng.$cacheFactory `$cacheFactory`}) by updating the
+ * {@link ng.$http#defaults `$http.defaults.cache`} property. All requests who set
+ * their `cache` property to `true` will now use this cache object.
+ *
+ * If you set the default cache to `false` then only requests that specify their own custom
+ * cache object will be cached.
+ *
+ * ## Interceptors
+ *
+ * Before you start creating interceptors, be sure to understand the
+ * {@link ng.$q $q and deferred/promise APIs}.
+ *
+ * For purposes of global error handling, authentication, or any kind of synchronous or
+ * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be
+ * able to intercept requests before they are handed to the server and
+ * responses before they are handed over to the application code that
+ * initiated these requests. The interceptors leverage the {@link ng.$q
+ * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing.
+ *
+ * The interceptors are service factories that are registered with the `$httpProvider` by
+ * adding them to the `$httpProvider.interceptors` array. The factory is called and
+ * injected with dependencies (if specified) and returns the interceptor.
+ *
+ * There are two kinds of interceptors (and two kinds of rejection interceptors):
+ *
+ * * `request`: interceptors get called with a http `config` object. The function is free to
+ * modify the `config` object or create a new one. The function needs to return the `config`
+ * object directly, or a promise containing the `config` or a new `config` object.
+ * * `requestError`: interceptor gets called when a previous interceptor threw an error or
+ * resolved with a rejection.
+ * * `response`: interceptors get called with http `response` object. The function is free to
+ * modify the `response` object or create a new one. The function needs to return the `response`
+ * object directly, or as a promise containing the `response` or a new `response` object.
+ * * `responseError`: interceptor gets called when a previous interceptor threw an error or
+ * resolved with a rejection.
+ *
+ *
+ * ```js
+ * // register the interceptor as a service
+ * $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
+ * return {
+ * // optional method
+ * 'request': function(config) {
+ * // do something on success
+ * return config;
+ * },
+ *
+ * // optional method
+ * 'requestError': function(rejection) {
+ * // do something on error
+ * if (canRecover(rejection)) {
+ * return responseOrNewPromise
+ * }
+ * return $q.reject(rejection);
+ * },
+ *
+ *
+ *
+ * // optional method
+ * 'response': function(response) {
+ * // do something on success
+ * return response;
+ * },
+ *
+ * // optional method
+ * 'responseError': function(rejection) {
+ * // do something on error
+ * if (canRecover(rejection)) {
+ * return responseOrNewPromise
+ * }
+ * return $q.reject(rejection);
+ * }
+ * };
+ * });
+ *
+ * $httpProvider.interceptors.push('myHttpInterceptor');
+ *
+ *
+ * // alternatively, register the interceptor via an anonymous factory
+ * $httpProvider.interceptors.push(function($q, dependency1, dependency2) {
+ * return {
+ * 'request': function(config) {
+ * // same as above
+ * },
+ *
+ * 'response': function(response) {
+ * // same as above
+ * }
+ * };
+ * });
+ * ```
+ *
+ * ## Security Considerations
+ *
+ * When designing web applications, consider security threats from:
+ *
+ * - [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)
+ * - [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery)
+ *
+ * Both server and the client must cooperate in order to eliminate these threats. Angular comes
+ * pre-configured with strategies that address these issues, but for this to work backend server
+ * cooperation is required.
+ *
+ * ### JSON Vulnerability Protection
+ *
+ * A [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)
+ * allows third party website to turn your JSON resource URL into
+ * [JSONP](http://en.wikipedia.org/wiki/JSONP) request under some conditions. To
+ * counter this your server can prefix all JSON requests with following string `")]}',\n"`.
+ * Angular will automatically strip the prefix before processing it as JSON.
+ *
+ * For example if your server needs to return:
+ * ```js
+ * ['one','two']
+ * ```
+ *
+ * which is vulnerable to attack, your server can return:
+ * ```js
+ * )]}',
+ * ['one','two']
+ * ```
+ *
+ * Angular will strip the prefix, before processing the JSON.
+ *
+ *
+ * ### Cross Site Request Forgery (XSRF) Protection
+ *
+ * [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) is a technique by which
+ * an unauthorized site can gain your user's private data. Angular provides a mechanism
+ * to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie
+ * (by default, `XSRF-TOKEN`) and sets it as an HTTP header (`X-XSRF-TOKEN`). Since only
+ * JavaScript that runs on your domain could read the cookie, your server can be assured that
+ * the XHR came from JavaScript running on your domain. The header will not be set for
+ * cross-domain requests.
+ *
+ * To take advantage of this, your server needs to set a token in a JavaScript readable session
+ * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the
+ * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure
+ * that only JavaScript running on your domain could have sent the request. The token must be
+ * unique for each user and must be verifiable by the server (to prevent the JavaScript from
+ * making up its own tokens). We recommend that the token is a digest of your site's
+ * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography&#41;)
+ * for added security.
+ *
+ * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName
+ * properties of either $httpProvider.defaults at config-time, $http.defaults at run-time,
+ * or the per-request config object.
+ *
+ *
+ * @param {object} config Object describing the request to be made and how it should be
+ * processed. The object has following properties:
+ *
+ * - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc)
+ * - **url** – `{string}` – Absolute or relative URL of the resource that is being requested.
+ * - **params** – `{Object.<string|Object>}` – Map of strings or objects which will be turned
+ * to `?key1=value1&key2=value2` after the url. If the value is not a string, it will be
+ * JSONified.
+ * - **data** – `{string|Object}` – Data to be sent as the request message data.
+ * - **headers** – `{Object}` – Map of strings or functions which return strings representing
+ * HTTP headers to send to the server. If the return value of a function is null, the
+ * header will not be sent.
+ * - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token.
+ * - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token.
+ * - **transformRequest** –
+ * `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
+ * transform function or an array of such functions. The transform function takes the http
+ * request body and headers and returns its transformed (typically serialized) version.
+ * See {@link ng.$http#overriding-the-default-transformations-per-request
+ * Overriding the Default Transformations}
+ * - **transformResponse** –
+ * `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
+ * transform function or an array of such functions. The transform function takes the http
+ * response body and headers and returns its transformed (typically deserialized) version.
+ * See {@link ng.$http#overriding-the-default-transformations-per-request
+ * Overriding the Default Transformations}
+ * - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the
+ * GET request, otherwise if a cache instance built with
+ * {@link ng.$cacheFactory $cacheFactory}, this cache will be used for
+ * caching.
+ * - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise}
+ * that should abort the request when resolved.
+ * - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the
+ * XHR object. See [requests with credentials](https://developer.mozilla.org/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials)
+ * for more information.
+ * - **responseType** - `{string}` - see
+ * [requestType](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType).
+ *
+ * @returns {HttpPromise} Returns a {@link ng.$q promise} object with the
+ * standard `then` method and two http specific methods: `success` and `error`. The `then`
+ * method takes two arguments a success and an error callback which will be called with a
+ * response object. The `success` and `error` methods take a single argument - a function that
+ * will be called when the request succeeds or fails respectively. The arguments passed into
+ * these functions are destructured representation of the response object passed into the
+ * `then` method. The response object has these properties:
+ *
+ * - **data** – `{string|Object}` – The response body transformed with the transform
+ * functions.
+ * - **status** – `{number}` – HTTP status code of the response.
+ * - **headers** – `{function([headerName])}` – Header getter function.
+ * - **config** – `{Object}` – The configuration object that was used to generate the request.
+ * - **statusText** – `{string}` – HTTP status text of the response.
+ *
+ * @property {Array.<Object>} pendingRequests Array of config objects for currently pending
+ * requests. This is primarily meant to be used for debugging purposes.
+ *
+ *
+ * @example
+<example module="httpExample">
+<file name="index.html">
+ <div ng-controller="FetchController">
+ <select ng-model="method">
+ <option>GET</option>
+ <option>JSONP</option>
+ </select>
+ <input type="text" ng-model="url" size="80"/>
+ <button id="fetchbtn" ng-click="fetch()">fetch</button><br>
+ <button id="samplegetbtn" ng-click="updateModel('GET', 'http-hello.html')">Sample GET</button>
+ <button id="samplejsonpbtn"
+ ng-click="updateModel('JSONP',
+ 'https://angularjs.org/greet.php?callback=JSON_CALLBACK&name=Super%20Hero')">
+ Sample JSONP
+ </button>
+ <button id="invalidjsonpbtn"
+ ng-click="updateModel('JSONP', 'https://angularjs.org/doesntexist&callback=JSON_CALLBACK')">
+ Invalid JSONP
+ </button>
+ <pre>http status code: {{status}}</pre>
+ <pre>http response data: {{data}}</pre>
+ </div>
+</file>
+<file name="script.js">
+ angular.module('httpExample', [])
+ .controller('FetchController', ['$scope', '$http', '$templateCache',
+ function($scope, $http, $templateCache) {
+ $scope.method = 'GET';
+ $scope.url = 'http-hello.html';
+
+ $scope.fetch = function() {
+ $scope.code = null;
+ $scope.response = null;
+
+ $http({method: $scope.method, url: $scope.url, cache: $templateCache}).
+ success(function(data, status) {
+ $scope.status = status;
+ $scope.data = data;
+ }).
+ error(function(data, status) {
+ $scope.data = data || "Request failed";
+ $scope.status = status;
+ });
+ };
+
+ $scope.updateModel = function(method, url) {
+ $scope.method = method;
+ $scope.url = url;
+ };
+ }]);
+</file>
+<file name="http-hello.html">
+ Hello, $http!
+</file>
+<file name="protractor.js" type="protractor">
+ var status = element(by.binding('status'));
+ var data = element(by.binding('data'));
+ var fetchBtn = element(by.id('fetchbtn'));
+ var sampleGetBtn = element(by.id('samplegetbtn'));
+ var sampleJsonpBtn = element(by.id('samplejsonpbtn'));
+ var invalidJsonpBtn = element(by.id('invalidjsonpbtn'));
+
+ it('should make an xhr GET request', function() {
+ sampleGetBtn.click();
+ fetchBtn.click();
+ expect(status.getText()).toMatch('200');
+ expect(data.getText()).toMatch(/Hello, \$http!/);
+ });
+
+// Commented out due to flakes. See https://github.com/angular/angular.js/issues/9185
+// it('should make a JSONP request to angularjs.org', function() {
+// sampleJsonpBtn.click();
+// fetchBtn.click();
+// expect(status.getText()).toMatch('200');
+// expect(data.getText()).toMatch(/Super Hero!/);
+// });
+
+ it('should make JSONP request to invalid URL and invoke the error handler',
+ function() {
+ invalidJsonpBtn.click();
+ fetchBtn.click();
+ expect(status.getText()).toMatch('0');
+ expect(data.getText()).toMatch('Request failed');
+ });
+</file>
+</example>
+ */
+ function $http(requestConfig) {
+ var config = {
+ method: 'get',
+ transformRequest: defaults.transformRequest,
+ transformResponse: defaults.transformResponse
+ };
+ var headers = mergeHeaders(requestConfig);
+
+ if (!angular.isObject(requestConfig)) {
+ throw minErr('$http')('badreq', 'Http request configuration must be an object. Received: {0}', requestConfig);
+ }
+
+ extend(config, requestConfig);
+ config.headers = headers;
+ config.method = uppercase(config.method);
+
+ var serverRequest = function(config) {
+ headers = config.headers;
+ var reqData = transformData(config.data, headersGetter(headers), config.transformRequest);
+
+ // strip content-type if data is undefined
+ if (isUndefined(reqData)) {
+ forEach(headers, function(value, header) {
+ if (lowercase(header) === 'content-type') {
+ delete headers[header];
+ }
+ });
+ }
+
+ if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) {
+ config.withCredentials = defaults.withCredentials;
+ }
+
+ // send request
+ return sendReq(config, reqData, headers).then(transformResponse, transformResponse);
+ };
+
+ var chain = [serverRequest, undefined];
+ var promise = $q.when(config);
+
+ // apply interceptors
+ forEach(reversedInterceptors, function(interceptor) {
+ if (interceptor.request || interceptor.requestError) {
+ chain.unshift(interceptor.request, interceptor.requestError);
+ }
+ if (interceptor.response || interceptor.responseError) {
+ chain.push(interceptor.response, interceptor.responseError);
+ }
+ });
+
+ while (chain.length) {
+ var thenFn = chain.shift();
+ var rejectFn = chain.shift();
+
+ promise = promise.then(thenFn, rejectFn);
+ }
+
+ promise.success = function(fn) {
+ promise.then(function(response) {
+ fn(response.data, response.status, response.headers, config);
+ });
+ return promise;
+ };
+
+ promise.error = function(fn) {
+ promise.then(null, function(response) {
+ fn(response.data, response.status, response.headers, config);
+ });
+ return promise;
+ };
+
+ return promise;
+
+ function transformResponse(response) {
+ // make a copy since the response must be cacheable
+ var resp = extend({}, response);
+ if (!response.data) {
+ resp.data = response.data;
+ } else {
+ resp.data = transformData(response.data, response.headers, config.transformResponse);
+ }
+ return (isSuccess(response.status))
+ ? resp
+ : $q.reject(resp);
+ }
+
+ function mergeHeaders(config) {
+ var defHeaders = defaults.headers,
+ reqHeaders = extend({}, config.headers),
+ defHeaderName, lowercaseDefHeaderName, reqHeaderName;
+
+ defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]);
+
+ // using for-in instead of forEach to avoid unecessary iteration after header has been found
+ defaultHeadersIteration:
+ for (defHeaderName in defHeaders) {
+ lowercaseDefHeaderName = lowercase(defHeaderName);
+
+ for (reqHeaderName in reqHeaders) {
+ if (lowercase(reqHeaderName) === lowercaseDefHeaderName) {
+ continue defaultHeadersIteration;
+ }
+ }
+
+ reqHeaders[defHeaderName] = defHeaders[defHeaderName];
+ }
+
+ // execute if header value is a function for merged headers
+ execHeaders(reqHeaders);
+ return reqHeaders;
+
+ function execHeaders(headers) {
+ var headerContent;
+
+ forEach(headers, function(headerFn, header) {
+ if (isFunction(headerFn)) {
+ headerContent = headerFn();
+ if (headerContent != null) {
+ headers[header] = headerContent;
+ } else {
+ delete headers[header];
+ }
+ }
+ });
+ }
+ }
+ }
+
+ $http.pendingRequests = [];
+
+ /**
+ * @ngdoc method
+ * @name $http#get
+ *
+ * @description
+ * Shortcut method to perform `GET` request.
+ *
+ * @param {string} url Relative or absolute URL specifying the destination of the request
+ * @param {Object=} config Optional configuration object
+ * @returns {HttpPromise} Future object
+ */
+
+ /**
+ * @ngdoc method
+ * @name $http#delete
+ *
+ * @description
+ * Shortcut method to perform `DELETE` request.
+ *
+ * @param {string} url Relative or absolute URL specifying the destination of the request
+ * @param {Object=} config Optional configuration object
+ * @returns {HttpPromise} Future object
+ */
+
+ /**
+ * @ngdoc method
+ * @name $http#head
+ *
+ * @description
+ * Shortcut method to perform `HEAD` request.
+ *
+ * @param {string} url Relative or absolute URL specifying the destination of the request
+ * @param {Object=} config Optional configuration object
+ * @returns {HttpPromise} Future object
+ */
+
+ /**
+ * @ngdoc method
+ * @name $http#jsonp
+ *
+ * @description
+ * Shortcut method to perform `JSONP` request.
+ *
+ * @param {string} url Relative or absolute URL specifying the destination of the request.
+ * The name of the callback should be the string `JSON_CALLBACK`.
+ * @param {Object=} config Optional configuration object
+ * @returns {HttpPromise} Future object
+ */
+ createShortMethods('get', 'delete', 'head', 'jsonp');
+
+ /**
+ * @ngdoc method
+ * @name $http#post
+ *
+ * @description
+ * Shortcut method to perform `POST` request.
+ *
+ * @param {string} url Relative or absolute URL specifying the destination of the request
+ * @param {*} data Request content
+ * @param {Object=} config Optional configuration object
+ * @returns {HttpPromise} Future object
+ */
+
+ /**
+ * @ngdoc method
+ * @name $http#put
+ *
+ * @description
+ * Shortcut method to perform `PUT` request.
+ *
+ * @param {string} url Relative or absolute URL specifying the destination of the request
+ * @param {*} data Request content
+ * @param {Object=} config Optional configuration object
+ * @returns {HttpPromise} Future object
+ */
+
+ /**
+ * @ngdoc method
+ * @name $http#patch
+ *
+ * @description
+ * Shortcut method to perform `PATCH` request.
+ *
+ * @param {string} url Relative or absolute URL specifying the destination of the request
+ * @param {*} data Request content
+ * @param {Object=} config Optional configuration object
+ * @returns {HttpPromise} Future object
+ */
+ createShortMethodsWithData('post', 'put', 'patch');
+
+ /**
+ * @ngdoc property
+ * @name $http#defaults
+ *
+ * @description
+ * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of
+ * default headers, withCredentials as well as request and response transformations.
+ *
+ * See "Setting HTTP Headers" and "Transforming Requests and Responses" sections above.
+ */
+ $http.defaults = defaults;
+
+
+ return $http;
+
+
+ function createShortMethods(names) {
+ forEach(arguments, function(name) {
+ $http[name] = function(url, config) {
+ return $http(extend(config || {}, {
+ method: name,
+ url: url
+ }));
+ };
+ });
+ }
+
+
+ function createShortMethodsWithData(name) {
+ forEach(arguments, function(name) {
+ $http[name] = function(url, data, config) {
+ return $http(extend(config || {}, {
+ method: name,
+ url: url,
+ data: data
+ }));
+ };
+ });
+ }
+
+
+ /**
+ * Makes the request.
+ *
+ * !!! ACCESSES CLOSURE VARS:
+ * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests
+ */
+ function sendReq(config, reqData, reqHeaders) {
+ var deferred = $q.defer(),
+ promise = deferred.promise,
+ cache,
+ cachedResp,
+ url = buildUrl(config.url, config.params);
+
+ $http.pendingRequests.push(config);
+ promise.then(removePendingReq, removePendingReq);
+
+
+ if ((config.cache || defaults.cache) && config.cache !== false &&
+ (config.method === 'GET' || config.method === 'JSONP')) {
+ cache = isObject(config.cache) ? config.cache
+ : isObject(defaults.cache) ? defaults.cache
+ : defaultCache;
+ }
+
+ if (cache) {
+ cachedResp = cache.get(url);
+ if (isDefined(cachedResp)) {
+ if (isPromiseLike(cachedResp)) {
+ // cached request has already been sent, but there is no response yet
+ cachedResp.then(removePendingReq, removePendingReq);
+ return cachedResp;
+ } else {
+ // serving from cache
+ if (isArray(cachedResp)) {
+ resolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3]);
+ } else {
+ resolvePromise(cachedResp, 200, {}, 'OK');
+ }
+ }
+ } else {
+ // put the promise for the non-transformed response into cache as a placeholder
+ cache.put(url, promise);
+ }
+ }
+
+
+ // if we won't have the response in cache, set the xsrf headers and
+ // send the request to the backend
+ if (isUndefined(cachedResp)) {
+ var xsrfValue = urlIsSameOrigin(config.url)
+ ? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName]
+ : undefined;
+ if (xsrfValue) {
+ reqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue;
+ }
+
+ $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout,
+ config.withCredentials, config.responseType);
+ }
+
+ return promise;
+
+
+ /**
+ * Callback registered to $httpBackend():
+ * - caches the response if desired
+ * - resolves the raw $http promise
+ * - calls $apply
+ */
+ function done(status, response, headersString, statusText) {
+ if (cache) {
+ if (isSuccess(status)) {
+ cache.put(url, [status, response, parseHeaders(headersString), statusText]);
+ } else {
+ // remove promise from the cache
+ cache.remove(url);
+ }
+ }
+
+ function resolveHttpPromise() {
+ resolvePromise(response, status, headersString, statusText);
+ }
+
+ if (useApplyAsync) {
+ $rootScope.$applyAsync(resolveHttpPromise);
+ } else {
+ resolveHttpPromise();
+ if (!$rootScope.$$phase) $rootScope.$apply();
+ }
+ }
+
+
+ /**
+ * Resolves the raw $http promise.
+ */
+ function resolvePromise(response, status, headers, statusText) {
+ // normalize internal statuses to 0
+ status = Math.max(status, 0);
+
+ (isSuccess(status) ? deferred.resolve : deferred.reject)({
+ data: response,
+ status: status,
+ headers: headersGetter(headers),
+ config: config,
+ statusText: statusText
+ });
+ }
+
+
+ function removePendingReq() {
+ var idx = $http.pendingRequests.indexOf(config);
+ if (idx !== -1) $http.pendingRequests.splice(idx, 1);
+ }
+ }
+
+
+ function buildUrl(url, params) {
+ if (!params) return url;
+ var parts = [];
+ forEachSorted(params, function(value, key) {
+ if (value === null || isUndefined(value)) return;
+ if (!isArray(value)) value = [value];
+
+ forEach(value, function(v) {
+ if (isObject(v)) {
+ if (isDate(v)) {
+ v = v.toISOString();
+ } else {
+ v = toJson(v);
+ }
+ }
+ parts.push(encodeUriQuery(key) + '=' +
+ encodeUriQuery(v));
+ });
+ });
+ if (parts.length > 0) {
+ url += ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&');
+ }
+ return url;
+ }
+ }];
+}
+
+function createXhr() {
+ return new window.XMLHttpRequest();
+}
+
+/**
+ * @ngdoc service
+ * @name $httpBackend
+ * @requires $window
+ * @requires $document
+ *
+ * @description
+ * HTTP backend used by the {@link ng.$http service} that delegates to
+ * XMLHttpRequest object or JSONP and deals with browser incompatibilities.
+ *
+ * You should never need to use this service directly, instead use the higher-level abstractions:
+ * {@link ng.$http $http} or {@link ngResource.$resource $resource}.
+ *
+ * During testing this implementation is swapped with {@link ngMock.$httpBackend mock
+ * $httpBackend} which can be trained with responses.
+ */
+function $HttpBackendProvider() {
+ this.$get = ['$browser', '$window', '$document', function($browser, $window, $document) {
+ return createHttpBackend($browser, createXhr, $browser.defer, $window.angular.callbacks, $document[0]);
+ }];
+}
+
+function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) {
+ // TODO(vojta): fix the signature
+ return function(method, url, post, callback, headers, timeout, withCredentials, responseType) {
+ $browser.$$incOutstandingRequestCount();
+ url = url || $browser.url();
+
+ if (lowercase(method) == 'jsonp') {
+ var callbackId = '_' + (callbacks.counter++).toString(36);
+ callbacks[callbackId] = function(data) {
+ callbacks[callbackId].data = data;
+ callbacks[callbackId].called = true;
+ };
+
+ var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId),
+ callbackId, function(status, text) {
+ completeRequest(callback, status, callbacks[callbackId].data, "", text);
+ callbacks[callbackId] = noop;
+ });
+ } else {
+
+ var xhr = createXhr();
+
+ xhr.open(method, url, true);
+ forEach(headers, function(value, key) {
+ if (isDefined(value)) {
+ xhr.setRequestHeader(key, value);
+ }
+ });
+
+ xhr.onload = function requestLoaded() {
+ var statusText = xhr.statusText || '';
+
+ // responseText is the old-school way of retrieving response (supported by IE8 & 9)
+ // response/responseType properties were introduced in XHR Level2 spec (supported by IE10)
+ var response = ('response' in xhr) ? xhr.response : xhr.responseText;
+
+ // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)
+ var status = xhr.status === 1223 ? 204 : xhr.status;
+
+ // fix status code when it is 0 (0 status is undocumented).
+ // Occurs when accessing file resources or on Android 4.1 stock browser
+ // while retrieving files from application cache.
+ if (status === 0) {
+ status = response ? 200 : urlResolve(url).protocol == 'file' ? 404 : 0;
+ }
+
+ completeRequest(callback,
+ status,
+ response,
+ xhr.getAllResponseHeaders(),
+ statusText);
+ };
+
+ var requestError = function() {
+ // The response is always empty
+ // See https://xhr.spec.whatwg.org/#request-error-steps and https://fetch.spec.whatwg.org/#concept-network-error
+ completeRequest(callback, -1, null, null, '');
+ };
+
+ xhr.onerror = requestError;
+ xhr.onabort = requestError;
+
+ if (withCredentials) {
+ xhr.withCredentials = true;
+ }
+
+ if (responseType) {
+ try {
+ xhr.responseType = responseType;
+ } catch (e) {
+ // WebKit added support for the json responseType value on 09/03/2013
+ // https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are
+ // known to throw when setting the value "json" as the response type. Other older
+ // browsers implementing the responseType
+ //
+ // The json response type can be ignored if not supported, because JSON payloads are
+ // parsed on the client-side regardless.
+ if (responseType !== 'json') {
+ throw e;
+ }
+ }
+ }
+
+ xhr.send(post || null);
+ }
+
+ if (timeout > 0) {
+ var timeoutId = $browserDefer(timeoutRequest, timeout);
+ } else if (isPromiseLike(timeout)) {
+ timeout.then(timeoutRequest);
+ }
+
+
+ function timeoutRequest() {
+ jsonpDone && jsonpDone();
+ xhr && xhr.abort();
+ }
+
+ function completeRequest(callback, status, response, headersString, statusText) {
+ // cancel timeout and subsequent timeout promise resolution
+ if (timeoutId !== undefined) {
+ $browserDefer.cancel(timeoutId);
+ }
+ jsonpDone = xhr = null;
+
+ callback(status, response, headersString, statusText);
+ $browser.$$completeOutstandingRequest(noop);
+ }
+ };
+
+ function jsonpReq(url, callbackId, done) {
+ // we can't use jQuery/jqLite here because jQuery does crazy shit with script elements, e.g.:
+ // - fetches local scripts via XHR and evals them
+ // - adds and immediately removes script elements from the document
+ var script = rawDocument.createElement('script'), callback = null;
+ script.type = "text/javascript";
+ script.src = url;
+ script.async = true;
+
+ callback = function(event) {
+ removeEventListenerFn(script, "load", callback);
+ removeEventListenerFn(script, "error", callback);
+ rawDocument.body.removeChild(script);
+ script = null;
+ var status = -1;
+ var text = "unknown";
+
+ if (event) {
+ if (event.type === "load" && !callbacks[callbackId].called) {
+ event = { type: "error" };
+ }
+ text = event.type;
+ status = event.type === "error" ? 404 : 200;
+ }
+
+ if (done) {
+ done(status, text);
+ }
+ };
+
+ addEventListenerFn(script, "load", callback);
+ addEventListenerFn(script, "error", callback);
+ rawDocument.body.appendChild(script);
+ return callback;
+ }
+}
+
+var $interpolateMinErr = minErr('$interpolate');
+
+/**
+ * @ngdoc provider
+ * @name $interpolateProvider
+ *
+ * @description
+ *
+ * Used for configuring the interpolation markup. Defaults to `{{` and `}}`.
+ *
+ * @example
+<example module="customInterpolationApp">
+<file name="index.html">
+<script>
+ var customInterpolationApp = angular.module('customInterpolationApp', []);
+
+ customInterpolationApp.config(function($interpolateProvider) {
+ $interpolateProvider.startSymbol('//');
+ $interpolateProvider.endSymbol('//');
+ });
+
+
+ customInterpolationApp.controller('DemoController', function() {
+ this.label = "This binding is brought you by // interpolation symbols.";
+ });
+</script>
+<div ng-app="App" ng-controller="DemoController as demo">
+ //demo.label//
+</div>
+</file>
+<file name="protractor.js" type="protractor">
+ it('should interpolate binding with custom symbols', function() {
+ expect(element(by.binding('demo.label')).getText()).toBe('This binding is brought you by // interpolation symbols.');
+ });
+</file>
+</example>
+ */
+function $InterpolateProvider() {
+ var startSymbol = '{{';
+ var endSymbol = '}}';
+
+ /**
+ * @ngdoc method
+ * @name $interpolateProvider#startSymbol
+ * @description
+ * Symbol to denote start of expression in the interpolated string. Defaults to `{{`.
+ *
+ * @param {string=} value new value to set the starting symbol to.
+ * @returns {string|self} Returns the symbol when used as getter and self if used as setter.
+ */
+ this.startSymbol = function(value) {
+ if (value) {
+ startSymbol = value;
+ return this;
+ } else {
+ return startSymbol;
+ }
+ };
+
+ /**
+ * @ngdoc method
+ * @name $interpolateProvider#endSymbol
+ * @description
+ * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.
+ *
+ * @param {string=} value new value to set the ending symbol to.
+ * @returns {string|self} Returns the symbol when used as getter and self if used as setter.
+ */
+ this.endSymbol = function(value) {
+ if (value) {
+ endSymbol = value;
+ return this;
+ } else {
+ return endSymbol;
+ }
+ };
+
+
+ this.$get = ['$parse', '$exceptionHandler', '$sce', function($parse, $exceptionHandler, $sce) {
+ var startSymbolLength = startSymbol.length,
+ endSymbolLength = endSymbol.length,
+ escapedStartRegexp = new RegExp(startSymbol.replace(/./g, escape), 'g'),
+ escapedEndRegexp = new RegExp(endSymbol.replace(/./g, escape), 'g');
+
+ function escape(ch) {
+ return '\\\\\\' + ch;
+ }
+
+ /**
+ * @ngdoc service
+ * @name $interpolate
+ * @kind function
+ *
+ * @requires $parse
+ * @requires $sce
+ *
+ * @description
+ *
+ * Compiles a string with markup into an interpolation function. This service is used by the
+ * HTML {@link ng.$compile $compile} service for data binding. See
+ * {@link ng.$interpolateProvider $interpolateProvider} for configuring the
+ * interpolation markup.
+ *
+ *
+ * ```js
+ * var $interpolate = ...; // injected
+ * var exp = $interpolate('Hello {{name | uppercase}}!');
+ * expect(exp({name:'Angular'}).toEqual('Hello ANGULAR!');
+ * ```
+ *
+ * `$interpolate` takes an optional fourth argument, `allOrNothing`. If `allOrNothing` is
+ * `true`, the interpolation function will return `undefined` unless all embedded expressions
+ * evaluate to a value other than `undefined`.
+ *
+ * ```js
+ * var $interpolate = ...; // injected
+ * var context = {greeting: 'Hello', name: undefined };
+ *
+ * // default "forgiving" mode
+ * var exp = $interpolate('{{greeting}} {{name}}!');
+ * expect(exp(context)).toEqual('Hello !');
+ *
+ * // "allOrNothing" mode
+ * exp = $interpolate('{{greeting}} {{name}}!', false, null, true);
+ * expect(exp(context)).toBeUndefined();
+ * context.name = 'Angular';
+ * expect(exp(context)).toEqual('Hello Angular!');
+ * ```
+ *
+ * `allOrNothing` is useful for interpolating URLs. `ngSrc` and `ngSrcset` use this behavior.
+ *
+ * ####Escaped Interpolation
+ * $interpolate provides a mechanism for escaping interpolation markers. Start and end markers
+ * can be escaped by preceding each of their characters with a REVERSE SOLIDUS U+005C (backslash).
+ * It will be rendered as a regular start/end marker, and will not be interpreted as an expression
+ * or binding.
+ *
+ * This enables web-servers to prevent script injection attacks and defacing attacks, to some
+ * degree, while also enabling code examples to work without relying on the
+ * {@link ng.directive:ngNonBindable ngNonBindable} directive.
+ *
+ * **For security purposes, it is strongly encouraged that web servers escape user-supplied data,
+ * replacing angle brackets (&lt;, &gt;) with &amp;lt; and &amp;gt; respectively, and replacing all
+ * interpolation start/end markers with their escaped counterparts.**
+ *
+ * Escaped interpolation markers are only replaced with the actual interpolation markers in rendered
+ * output when the $interpolate service processes the text. So, for HTML elements interpolated
+ * by {@link ng.$compile $compile}, or otherwise interpolated with the `mustHaveExpression` parameter
+ * set to `true`, the interpolated text must contain an unescaped interpolation expression. As such,
+ * this is typically useful only when user-data is used in rendering a template from the server, or
+ * when otherwise untrusted data is used by a directive.
+ *
+ * <example>
+ * <file name="index.html">
+ * <div ng-init="username='A user'">
+ * <p ng-init="apptitle='Escaping demo'">{{apptitle}}: \{\{ username = "defaced value"; \}\}
+ * </p>
+ * <p><strong>{{username}}</strong> attempts to inject code which will deface the
+ * application, but fails to accomplish their task, because the server has correctly
+ * escaped the interpolation start/end markers with REVERSE SOLIDUS U+005C (backslash)
+ * characters.</p>
+ * <p>Instead, the result of the attempted script injection is visible, and can be removed
+ * from the database by an administrator.</p>
+ * </div>
+ * </file>
+ * </example>
+ *
+ * @param {string} text The text with markup to interpolate.
+ * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have
+ * embedded expression in order to return an interpolation function. Strings with no
+ * embedded expression will return null for the interpolation function.
+ * @param {string=} trustedContext when provided, the returned function passes the interpolated
+ * result through {@link ng.$sce#getTrusted $sce.getTrusted(interpolatedResult,
+ * trustedContext)} before returning it. Refer to the {@link ng.$sce $sce} service that
+ * provides Strict Contextual Escaping for details.
+ * @param {boolean=} allOrNothing if `true`, then the returned function returns undefined
+ * unless all embedded expressions evaluate to a value other than `undefined`.
+ * @returns {function(context)} an interpolation function which is used to compute the
+ * interpolated string. The function has these parameters:
+ *
+ * - `context`: evaluation context for all expressions embedded in the interpolated text
+ */
+ function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) {
+ allOrNothing = !!allOrNothing;
+ var startIndex,
+ endIndex,
+ index = 0,
+ expressions = [],
+ parseFns = [],
+ textLength = text.length,
+ exp,
+ concat = [],
+ expressionPositions = [];
+
+ while (index < textLength) {
+ if (((startIndex = text.indexOf(startSymbol, index)) != -1) &&
+ ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1)) {
+ if (index !== startIndex) {
+ concat.push(unescapeText(text.substring(index, startIndex)));
+ }
+ exp = text.substring(startIndex + startSymbolLength, endIndex);
+ expressions.push(exp);
+ parseFns.push($parse(exp, parseStringifyInterceptor));
+ index = endIndex + endSymbolLength;
+ expressionPositions.push(concat.length);
+ concat.push('');
+ } else {
+ // we did not find an interpolation, so we have to add the remainder to the separators array
+ if (index !== textLength) {
+ concat.push(unescapeText(text.substring(index)));
+ }
+ break;
+ }
+ }
+
+ // Concatenating expressions makes it hard to reason about whether some combination of
+ // concatenated values are unsafe to use and could easily lead to XSS. By requiring that a
+ // single expression be used for iframe[src], object[src], etc., we ensure that the value
+ // that's used is assigned or constructed by some JS code somewhere that is more testable or
+ // make it obvious that you bound the value to some user controlled value. This helps reduce
+ // the load when auditing for XSS issues.
+ if (trustedContext && concat.length > 1) {
+ throw $interpolateMinErr('noconcat',
+ "Error while interpolating: {0}\nStrict Contextual Escaping disallows " +
+ "interpolations that concatenate multiple expressions when a trusted value is " +
+ "required. See http://docs.angularjs.org/api/ng.$sce", text);
+ }
+
+ if (!mustHaveExpression || expressions.length) {
+ var compute = function(values) {
+ for (var i = 0, ii = expressions.length; i < ii; i++) {
+ if (allOrNothing && isUndefined(values[i])) return;
+ concat[expressionPositions[i]] = values[i];
+ }
+ return concat.join('');
+ };
+
+ var getValue = function(value) {
+ return trustedContext ?
+ $sce.getTrusted(trustedContext, value) :
+ $sce.valueOf(value);
+ };
+
+ var stringify = function(value) {
+ if (value == null) { // null || undefined
+ return '';
+ }
+ switch (typeof value) {
+ case 'string':
+ break;
+ case 'number':
+ value = '' + value;
+ break;
+ default:
+ value = toJson(value);
+ }
+
+ return value;
+ };
+
+ return extend(function interpolationFn(context) {
+ var i = 0;
+ var ii = expressions.length;
+ var values = new Array(ii);
+
+ try {
+ for (; i < ii; i++) {
+ values[i] = parseFns[i](context);
+ }
+
+ return compute(values);
+ } catch (err) {
+ var newErr = $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text,
+ err.toString());
+ $exceptionHandler(newErr);
+ }
+
+ }, {
+ // all of these properties are undocumented for now
+ exp: text, //just for compatibility with regular watchers created via $watch
+ expressions: expressions,
+ $$watchDelegate: function(scope, listener, objectEquality) {
+ var lastValue;
+ return scope.$watchGroup(parseFns, function interpolateFnWatcher(values, oldValues) {
+ var currValue = compute(values);
+ if (isFunction(listener)) {
+ listener.call(this, currValue, values !== oldValues ? lastValue : currValue, scope);
+ }
+ lastValue = currValue;
+ }, objectEquality);
+ }
+ });
+ }
+
+ function unescapeText(text) {
+ return text.replace(escapedStartRegexp, startSymbol).
+ replace(escapedEndRegexp, endSymbol);
+ }
+
+ function parseStringifyInterceptor(value) {
+ try {
+ value = getValue(value);
+ return allOrNothing && !isDefined(value) ? value : stringify(value);
+ } catch (err) {
+ var newErr = $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text,
+ err.toString());
+ $exceptionHandler(newErr);
+ }
+ }
+ }
+
+
+ /**
+ * @ngdoc method
+ * @name $interpolate#startSymbol
+ * @description
+ * Symbol to denote the start of expression in the interpolated string. Defaults to `{{`.
+ *
+ * Use {@link ng.$interpolateProvider#startSymbol `$interpolateProvider.startSymbol`} to change
+ * the symbol.
+ *
+ * @returns {string} start symbol.
+ */
+ $interpolate.startSymbol = function() {
+ return startSymbol;
+ };
+
+
+ /**
+ * @ngdoc method
+ * @name $interpolate#endSymbol
+ * @description
+ * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.
+ *
+ * Use {@link ng.$interpolateProvider#endSymbol `$interpolateProvider.endSymbol`} to change
+ * the symbol.
+ *
+ * @returns {string} end symbol.
+ */
+ $interpolate.endSymbol = function() {
+ return endSymbol;
+ };
+
+ return $interpolate;
+ }];
+}
+
+function $IntervalProvider() {
+ this.$get = ['$rootScope', '$window', '$q', '$$q',
+ function($rootScope, $window, $q, $$q) {
+ var intervals = {};
+
+
+ /**
+ * @ngdoc service
+ * @name $interval
+ *
+ * @description
+ * Angular's wrapper for `window.setInterval`. The `fn` function is executed every `delay`
+ * milliseconds.
+ *
+ * The return value of registering an interval function is a promise. This promise will be
+ * notified upon each tick of the interval, and will be resolved after `count` iterations, or
+ * run indefinitely if `count` is not defined. The value of the notification will be the
+ * number of iterations that have run.
+ * To cancel an interval, call `$interval.cancel(promise)`.
+ *
+ * In tests you can use {@link ngMock.$interval#flush `$interval.flush(millis)`} to
+ * move forward by `millis` milliseconds and trigger any functions scheduled to run in that
+ * time.
+ *
+ * <div class="alert alert-warning">
+ * **Note**: Intervals created by this service must be explicitly destroyed when you are finished
+ * with them. In particular they are not automatically destroyed when a controller's scope or a
+ * directive's element are destroyed.
+ * You should take this into consideration and make sure to always cancel the interval at the
+ * appropriate moment. See the example below for more details on how and when to do this.
+ * </div>
+ *
+ * @param {function()} fn A function that should be called repeatedly.
+ * @param {number} delay Number of milliseconds between each function call.
+ * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat
+ * indefinitely.
+ * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise
+ * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.
+ * @returns {promise} A promise which will be notified on each iteration.
+ *
+ * @example
+ * <example module="intervalExample">
+ * <file name="index.html">
+ * <script>
+ * angular.module('intervalExample', [])
+ * .controller('ExampleController', ['$scope', '$interval',
+ * function($scope, $interval) {
+ * $scope.format = 'M/d/yy h:mm:ss a';
+ * $scope.blood_1 = 100;
+ * $scope.blood_2 = 120;
+ *
+ * var stop;
+ * $scope.fight = function() {
+ * // Don't start a new fight if we are already fighting
+ * if ( angular.isDefined(stop) ) return;
+ *
+ * stop = $interval(function() {
+ * if ($scope.blood_1 > 0 && $scope.blood_2 > 0) {
+ * $scope.blood_1 = $scope.blood_1 - 3;
+ * $scope.blood_2 = $scope.blood_2 - 4;
+ * } else {
+ * $scope.stopFight();
+ * }
+ * }, 100);
+ * };
+ *
+ * $scope.stopFight = function() {
+ * if (angular.isDefined(stop)) {
+ * $interval.cancel(stop);
+ * stop = undefined;
+ * }
+ * };
+ *
+ * $scope.resetFight = function() {
+ * $scope.blood_1 = 100;
+ * $scope.blood_2 = 120;
+ * };
+ *
+ * $scope.$on('$destroy', function() {
+ * // Make sure that the interval is destroyed too
+ * $scope.stopFight();
+ * });
+ * }])
+ * // Register the 'myCurrentTime' directive factory method.
+ * // We inject $interval and dateFilter service since the factory method is DI.
+ * .directive('myCurrentTime', ['$interval', 'dateFilter',
+ * function($interval, dateFilter) {
+ * // return the directive link function. (compile function not needed)
+ * return function(scope, element, attrs) {
+ * var format, // date format
+ * stopTime; // so that we can cancel the time updates
+ *
+ * // used to update the UI
+ * function updateTime() {
+ * element.text(dateFilter(new Date(), format));
+ * }
+ *
+ * // watch the expression, and update the UI on change.
+ * scope.$watch(attrs.myCurrentTime, function(value) {
+ * format = value;
+ * updateTime();
+ * });
+ *
+ * stopTime = $interval(updateTime, 1000);
+ *
+ * // listen on DOM destroy (removal) event, and cancel the next UI update
+ * // to prevent updating time after the DOM element was removed.
+ * element.on('$destroy', function() {
+ * $interval.cancel(stopTime);
+ * });
+ * }
+ * }]);
+ * </script>
+ *
+ * <div>
+ * <div ng-controller="ExampleController">
+ * Date format: <input ng-model="format"> <hr/>
+ * Current time is: <span my-current-time="format"></span>
+ * <hr/>
+ * Blood 1 : <font color='red'>{{blood_1}}</font>
+ * Blood 2 : <font color='red'>{{blood_2}}</font>
+ * <button type="button" data-ng-click="fight()">Fight</button>
+ * <button type="button" data-ng-click="stopFight()">StopFight</button>
+ * <button type="button" data-ng-click="resetFight()">resetFight</button>
+ * </div>
+ * </div>
+ *
+ * </file>
+ * </example>
+ */
+ function interval(fn, delay, count, invokeApply) {
+ var setInterval = $window.setInterval,
+ clearInterval = $window.clearInterval,
+ iteration = 0,
+ skipApply = (isDefined(invokeApply) && !invokeApply),
+ deferred = (skipApply ? $$q : $q).defer(),
+ promise = deferred.promise;
+
+ count = isDefined(count) ? count : 0;
+
+ promise.then(null, null, fn);
+
+ promise.$$intervalId = setInterval(function tick() {
+ deferred.notify(iteration++);
+
+ if (count > 0 && iteration >= count) {
+ deferred.resolve(iteration);
+ clearInterval(promise.$$intervalId);
+ delete intervals[promise.$$intervalId];
+ }
+
+ if (!skipApply) $rootScope.$apply();
+
+ }, delay);
+
+ intervals[promise.$$intervalId] = deferred;
+
+ return promise;
+ }
+
+
+ /**
+ * @ngdoc method
+ * @name $interval#cancel
+ *
+ * @description
+ * Cancels a task associated with the `promise`.
+ *
+ * @param {promise} promise returned by the `$interval` function.
+ * @returns {boolean} Returns `true` if the task was successfully canceled.
+ */
+ interval.cancel = function(promise) {
+ if (promise && promise.$$intervalId in intervals) {
+ intervals[promise.$$intervalId].reject('canceled');
+ $window.clearInterval(promise.$$intervalId);
+ delete intervals[promise.$$intervalId];
+ return true;
+ }
+ return false;
+ };
+
+ return interval;
+ }];
+}
+
+/**
+ * @ngdoc service
+ * @name $locale
+ *
+ * @description
+ * $locale service provides localization rules for various Angular components. As of right now the
+ * only public api is:
+ *
+ * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`)
+ */
+function $LocaleProvider() {
+ this.$get = function() {
+ return {
+ id: 'en-us',
+
+ NUMBER_FORMATS: {
+ DECIMAL_SEP: '.',
+ GROUP_SEP: ',',
+ PATTERNS: [
+ { // Decimal Pattern
+ minInt: 1,
+ minFrac: 0,
+ maxFrac: 3,
+ posPre: '',
+ posSuf: '',
+ negPre: '-',
+ negSuf: '',
+ gSize: 3,
+ lgSize: 3
+ },{ //Currency Pattern
+ minInt: 1,
+ minFrac: 2,
+ maxFrac: 2,
+ posPre: '\u00A4',
+ posSuf: '',
+ negPre: '(\u00A4',
+ negSuf: ')',
+ gSize: 3,
+ lgSize: 3
+ }
+ ],
+ CURRENCY_SYM: '$'
+ },
+
+ DATETIME_FORMATS: {
+ MONTH:
+ 'January,February,March,April,May,June,July,August,September,October,November,December'
+ .split(','),
+ SHORTMONTH: 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','),
+ DAY: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','),
+ SHORTDAY: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','),
+ AMPMS: ['AM','PM'],
+ medium: 'MMM d, y h:mm:ss a',
+ 'short': 'M/d/yy h:mm a',
+ fullDate: 'EEEE, MMMM d, y',
+ longDate: 'MMMM d, y',
+ mediumDate: 'MMM d, y',
+ shortDate: 'M/d/yy',
+ mediumTime: 'h:mm:ss a',
+ shortTime: 'h:mm a'
+ },
+
+ pluralCat: function(num) {
+ if (num === 1) {
+ return 'one';
+ }
+ return 'other';
+ }
+ };
+ };
+}
+
+var PATH_MATCH = /^([^\?#]*)(\?([^#]*))?(#(.*))?$/,
+ DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21};
+var $locationMinErr = minErr('$location');
+
+
+/**
+ * Encode path using encodeUriSegment, ignoring forward slashes
+ *
+ * @param {string} path Path to encode
+ * @returns {string}
+ */
+function encodePath(path) {
+ var segments = path.split('/'),
+ i = segments.length;
+
+ while (i--) {
+ segments[i] = encodeUriSegment(segments[i]);
+ }
+
+ return segments.join('/');
+}
+
+function parseAbsoluteUrl(absoluteUrl, locationObj) {
+ var parsedUrl = urlResolve(absoluteUrl);
+
+ locationObj.$$protocol = parsedUrl.protocol;
+ locationObj.$$host = parsedUrl.hostname;
+ locationObj.$$port = int(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null;
+}
+
+
+function parseAppUrl(relativeUrl, locationObj) {
+ var prefixed = (relativeUrl.charAt(0) !== '/');
+ if (prefixed) {
+ relativeUrl = '/' + relativeUrl;
+ }
+ var match = urlResolve(relativeUrl);
+ locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ?
+ match.pathname.substring(1) : match.pathname);
+ locationObj.$$search = parseKeyValue(match.search);
+ locationObj.$$hash = decodeURIComponent(match.hash);
+
+ // make sure path starts with '/';
+ if (locationObj.$$path && locationObj.$$path.charAt(0) != '/') {
+ locationObj.$$path = '/' + locationObj.$$path;
+ }
+}
+
+
+/**
+ *
+ * @param {string} begin
+ * @param {string} whole
+ * @returns {string} returns text from whole after begin or undefined if it does not begin with
+ * expected string.
+ */
+function beginsWith(begin, whole) {
+ if (whole.indexOf(begin) === 0) {
+ return whole.substr(begin.length);
+ }
+}
+
+
+function stripHash(url) {
+ var index = url.indexOf('#');
+ return index == -1 ? url : url.substr(0, index);
+}
+
+
+function stripFile(url) {
+ return url.substr(0, stripHash(url).lastIndexOf('/') + 1);
+}
+
+/* return the server only (scheme://host:port) */
+function serverBase(url) {
+ return url.substring(0, url.indexOf('/', url.indexOf('//') + 2));
+}
+
+
+/**
+ * LocationHtml5Url represents an url
+ * This object is exposed as $location service when HTML5 mode is enabled and supported
+ *
+ * @constructor
+ * @param {string} appBase application base URL
+ * @param {string} basePrefix url path prefix
+ */
+function LocationHtml5Url(appBase, basePrefix) {
+ this.$$html5 = true;
+ basePrefix = basePrefix || '';
+ var appBaseNoFile = stripFile(appBase);
+ parseAbsoluteUrl(appBase, this);
+
+
+ /**
+ * Parse given html5 (regular) url string into properties
+ * @param {string} url HTML5 url
+ * @private
+ */
+ this.$$parse = function(url) {
+ var pathUrl = beginsWith(appBaseNoFile, url);
+ if (!isString(pathUrl)) {
+ throw $locationMinErr('ipthprfx', 'Invalid url "{0}", missing path prefix "{1}".', url,
+ appBaseNoFile);
+ }
+
+ parseAppUrl(pathUrl, this);
+
+ if (!this.$$path) {
+ this.$$path = '/';
+ }
+
+ this.$$compose();
+ };
+
+ /**
+ * Compose url and update `absUrl` property
+ * @private
+ */
+ this.$$compose = function() {
+ var search = toKeyValue(this.$$search),
+ hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';
+
+ this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;
+ this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/'
+ };
+
+ this.$$parseLinkUrl = function(url, relHref) {
+ if (relHref && relHref[0] === '#') {
+ // special case for links to hash fragments:
+ // keep the old url and only replace the hash fragment
+ this.hash(relHref.slice(1));
+ return true;
+ }
+ var appUrl, prevAppUrl;
+ var rewrittenUrl;
+
+ if ((appUrl = beginsWith(appBase, url)) !== undefined) {
+ prevAppUrl = appUrl;
+ if ((appUrl = beginsWith(basePrefix, appUrl)) !== undefined) {
+ rewrittenUrl = appBaseNoFile + (beginsWith('/', appUrl) || appUrl);
+ } else {
+ rewrittenUrl = appBase + prevAppUrl;
+ }
+ } else if ((appUrl = beginsWith(appBaseNoFile, url)) !== undefined) {
+ rewrittenUrl = appBaseNoFile + appUrl;
+ } else if (appBaseNoFile == url + '/') {
+ rewrittenUrl = appBaseNoFile;
+ }
+ if (rewrittenUrl) {
+ this.$$parse(rewrittenUrl);
+ }
+ return !!rewrittenUrl;
+ };
+}
+
+
+/**
+ * LocationHashbangUrl represents url
+ * This object is exposed as $location service when developer doesn't opt into html5 mode.
+ * It also serves as the base class for html5 mode fallback on legacy browsers.
+ *
+ * @constructor
+ * @param {string} appBase application base URL
+ * @param {string} hashPrefix hashbang prefix
+ */
+function LocationHashbangUrl(appBase, hashPrefix) {
+ var appBaseNoFile = stripFile(appBase);
+
+ parseAbsoluteUrl(appBase, this);
+
+
+ /**
+ * Parse given hashbang url into properties
+ * @param {string} url Hashbang url
+ * @private
+ */
+ this.$$parse = function(url) {
+ var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url);
+ var withoutHashUrl = withoutBaseUrl.charAt(0) == '#'
+ ? beginsWith(hashPrefix, withoutBaseUrl)
+ : (this.$$html5)
+ ? withoutBaseUrl
+ : '';
+
+ if (!isString(withoutHashUrl)) {
+ throw $locationMinErr('ihshprfx', 'Invalid url "{0}", missing hash prefix "{1}".', url,
+ hashPrefix);
+ }
+ parseAppUrl(withoutHashUrl, this);
+
+ this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase);
+
+ this.$$compose();
+
+ /*
+ * In Windows, on an anchor node on documents loaded from
+ * the filesystem, the browser will return a pathname
+ * prefixed with the drive name ('/C:/path') when a
+ * pathname without a drive is set:
+ * * a.setAttribute('href', '/foo')
+ * * a.pathname === '/C:/foo' //true
+ *
+ * Inside of Angular, we're always using pathnames that
+ * do not include drive names for routing.
+ */
+ function removeWindowsDriveName(path, url, base) {
+ /*
+ Matches paths for file protocol on windows,
+ such as /C:/foo/bar, and captures only /foo/bar.
+ */
+ var windowsFilePathExp = /^\/[A-Z]:(\/.*)/;
+
+ var firstPathSegmentMatch;
+
+ //Get the relative path from the input URL.
+ if (url.indexOf(base) === 0) {
+ url = url.replace(base, '');
+ }
+
+ // The input URL intentionally contains a first path segment that ends with a colon.
+ if (windowsFilePathExp.exec(url)) {
+ return path;
+ }
+
+ firstPathSegmentMatch = windowsFilePathExp.exec(path);
+ return firstPathSegmentMatch ? firstPathSegmentMatch[1] : path;
+ }
+ };
+
+ /**
+ * Compose hashbang url and update `absUrl` property
+ * @private
+ */
+ this.$$compose = function() {
+ var search = toKeyValue(this.$$search),
+ hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';
+
+ this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;
+ this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : '');
+ };
+
+ this.$$parseLinkUrl = function(url, relHref) {
+ if (stripHash(appBase) == stripHash(url)) {
+ this.$$parse(url);
+ return true;
+ }
+ return false;
+ };
+}
+
+
+/**
+ * LocationHashbangUrl represents url
+ * This object is exposed as $location service when html5 history api is enabled but the browser
+ * does not support it.
+ *
+ * @constructor
+ * @param {string} appBase application base URL
+ * @param {string} hashPrefix hashbang prefix
+ */
+function LocationHashbangInHtml5Url(appBase, hashPrefix) {
+ this.$$html5 = true;
+ LocationHashbangUrl.apply(this, arguments);
+
+ var appBaseNoFile = stripFile(appBase);
+
+ this.$$parseLinkUrl = function(url, relHref) {
+ if (relHref && relHref[0] === '#') {
+ // special case for links to hash fragments:
+ // keep the old url and only replace the hash fragment
+ this.hash(relHref.slice(1));
+ return true;
+ }
+
+ var rewrittenUrl;
+ var appUrl;
+
+ if (appBase == stripHash(url)) {
+ rewrittenUrl = url;
+ } else if ((appUrl = beginsWith(appBaseNoFile, url))) {
+ rewrittenUrl = appBase + hashPrefix + appUrl;
+ } else if (appBaseNoFile === url + '/') {
+ rewrittenUrl = appBaseNoFile;
+ }
+ if (rewrittenUrl) {
+ this.$$parse(rewrittenUrl);
+ }
+ return !!rewrittenUrl;
+ };
+
+ this.$$compose = function() {
+ var search = toKeyValue(this.$$search),
+ hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';
+
+ this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;
+ // include hashPrefix in $$absUrl when $$url is empty so IE8 & 9 do not reload page because of removal of '#'
+ this.$$absUrl = appBase + hashPrefix + this.$$url;
+ };
+
+}
+
+
+var locationPrototype = {
+
+ /**
+ * Are we in html5 mode?
+ * @private
+ */
+ $$html5: false,
+
+ /**
+ * Has any change been replacing?
+ * @private
+ */
+ $$replace: false,
+
+ /**
+ * @ngdoc method
+ * @name $location#absUrl
+ *
+ * @description
+ * This method is getter only.
+ *
+ * Return full url representation with all segments encoded according to rules specified in
+ * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt).
+ *
+ *
+ * ```js
+ * // given url http://example.com/#/some/path?foo=bar&baz=xoxo
+ * var absUrl = $location.absUrl();
+ * // => "http://example.com/#/some/path?foo=bar&baz=xoxo"
+ * ```
+ *
+ * @return {string} full url
+ */
+ absUrl: locationGetter('$$absUrl'),
+
+ /**
+ * @ngdoc method
+ * @name $location#url
+ *
+ * @description
+ * This method is getter / setter.
+ *
+ * Return url (e.g. `/path?a=b#hash`) when called without any parameter.
+ *
+ * Change path, search and hash, when called with parameter and return `$location`.
+ *
+ *
+ * ```js
+ * // given url http://example.com/#/some/path?foo=bar&baz=xoxo
+ * var url = $location.url();
+ * // => "/some/path?foo=bar&baz=xoxo"
+ * ```
+ *
+ * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`)
+ * @return {string} url
+ */
+ url: function(url) {
+ if (isUndefined(url))
+ return this.$$url;
+
+ var match = PATH_MATCH.exec(url);
+ if (match[1] || url === '') this.path(decodeURIComponent(match[1]));
+ if (match[2] || match[1] || url === '') this.search(match[3] || '');
+ this.hash(match[5] || '');
+
+ return this;
+ },
+
+ /**
+ * @ngdoc method
+ * @name $location#protocol
+ *
+ * @description
+ * This method is getter only.
+ *
+ * Return protocol of current url.
+ *
+ *
+ * ```js
+ * // given url http://example.com/#/some/path?foo=bar&baz=xoxo
+ * var protocol = $location.protocol();
+ * // => "http"
+ * ```
+ *
+ * @return {string} protocol of current url
+ */
+ protocol: locationGetter('$$protocol'),
+
+ /**
+ * @ngdoc method
+ * @name $location#host
+ *
+ * @description
+ * This method is getter only.
+ *
+ * Return host of current url.
+ *
+ *
+ * ```js
+ * // given url http://example.com/#/some/path?foo=bar&baz=xoxo
+ * var host = $location.host();
+ * // => "example.com"
+ * ```
+ *
+ * @return {string} host of current url.
+ */
+ host: locationGetter('$$host'),
+
+ /**
+ * @ngdoc method
+ * @name $location#port
+ *
+ * @description
+ * This method is getter only.
+ *
+ * Return port of current url.
+ *
+ *
+ * ```js
+ * // given url http://example.com/#/some/path?foo=bar&baz=xoxo
+ * var port = $location.port();
+ * // => 80
+ * ```
+ *
+ * @return {Number} port
+ */
+ port: locationGetter('$$port'),
+
+ /**
+ * @ngdoc method
+ * @name $location#path
+ *
+ * @description
+ * This method is getter / setter.
+ *
+ * Return path of current url when called without any parameter.
+ *
+ * Change path when called with parameter and return `$location`.
+ *
+ * Note: Path should always begin with forward slash (/), this method will add the forward slash
+ * if it is missing.
+ *
+ *
+ * ```js
+ * // given url http://example.com/#/some/path?foo=bar&baz=xoxo
+ * var path = $location.path();
+ * // => "/some/path"
+ * ```
+ *
+ * @param {(string|number)=} path New path
+ * @return {string} path
+ */
+ path: locationGetterSetter('$$path', function(path) {
+ path = path !== null ? path.toString() : '';
+ return path.charAt(0) == '/' ? path : '/' + path;
+ }),
+
+ /**
+ * @ngdoc method
+ * @name $location#search
+ *
+ * @description
+ * This method is getter / setter.
+ *
+ * Return search part (as object) of current url when called without any parameter.
+ *
+ * Change search part when called with parameter and return `$location`.
+ *
+ *
+ * ```js
+ * // given url http://example.com/#/some/path?foo=bar&baz=xoxo
+ * var searchObject = $location.search();
+ * // => {foo: 'bar', baz: 'xoxo'}
+ *
+ * // set foo to 'yipee'
+ * $location.search('foo', 'yipee');
+ * // $location.search() => {foo: 'yipee', baz: 'xoxo'}
+ * ```
+ *
+ * @param {string|Object.<string>|Object.<Array.<string>>} search New search params - string or
+ * hash object.
+ *
+ * When called with a single argument the method acts as a setter, setting the `search` component
+ * of `$location` to the specified value.
+ *
+ * If the argument is a hash object containing an array of values, these values will be encoded
+ * as duplicate search parameters in the url.
+ *
+ * @param {(string|Number|Array<string>|boolean)=} paramValue If `search` is a string or number, then `paramValue`
+ * will override only a single search property.
+ *
+ * If `paramValue` is an array, it will override the property of the `search` component of
+ * `$location` specified via the first argument.
+ *
+ * If `paramValue` is `null`, the property specified via the first argument will be deleted.
+ *
+ * If `paramValue` is `true`, the property specified via the first argument will be added with no
+ * value nor trailing equal sign.
+ *
+ * @return {Object} If called with no arguments returns the parsed `search` object. If called with
+ * one or more arguments returns `$location` object itself.
+ */
+ search: function(search, paramValue) {
+ switch (arguments.length) {
+ case 0:
+ return this.$$search;
+ case 1:
+ if (isString(search) || isNumber(search)) {
+ search = search.toString();
+ this.$$search = parseKeyValue(search);
+ } else if (isObject(search)) {
+ search = copy(search, {});
+ // remove object undefined or null properties
+ forEach(search, function(value, key) {
+ if (value == null) delete search[key];
+ });
+
+ this.$$search = search;
+ } else {
+ throw $locationMinErr('isrcharg',
+ 'The first argument of the `$location#search()` call must be a string or an object.');
+ }
+ break;
+ default:
+ if (isUndefined(paramValue) || paramValue === null) {
+ delete this.$$search[search];
+ } else {
+ this.$$search[search] = paramValue;
+ }
+ }
+
+ this.$$compose();
+ return this;
+ },
+
+ /**
+ * @ngdoc method
+ * @name $location#hash
+ *
+ * @description
+ * This method is getter / setter.
+ *
+ * Return hash fragment when called without any parameter.
+ *
+ * Change hash fragment when called with parameter and return `$location`.
+ *
+ *
+ * ```js
+ * // given url http://example.com/some/path?foo=bar&baz=xoxo#hashValue
+ * var hash = $location.hash();
+ * // => "hashValue"
+ * ```
+ *
+ * @param {(string|number)=} hash New hash fragment
+ * @return {string} hash
+ */
+ hash: locationGetterSetter('$$hash', function(hash) {
+ return hash !== null ? hash.toString() : '';
+ }),
+
+ /**
+ * @ngdoc method
+ * @name $location#replace
+ *
+ * @description
+ * If called, all changes to $location during current `$digest` will be replacing current history
+ * record, instead of adding new one.
+ */
+ replace: function() {
+ this.$$replace = true;
+ return this;
+ }
+};
+
+forEach([LocationHashbangInHtml5Url, LocationHashbangUrl, LocationHtml5Url], function(Location) {
+ Location.prototype = Object.create(locationPrototype);
+
+ /**
+ * @ngdoc method
+ * @name $location#state
+ *
+ * @description
+ * This method is getter / setter.
+ *
+ * Return the history state object when called without any parameter.
+ *
+ * Change the history state object when called with one parameter and return `$location`.
+ * The state object is later passed to `pushState` or `replaceState`.
+ *
+ * NOTE: This method is supported only in HTML5 mode and only in browsers supporting
+ * the HTML5 History API (i.e. methods `pushState` and `replaceState`). If you need to support
+ * older browsers (like IE9 or Android < 4.0), don't use this method.
+ *
+ * @param {object=} state State object for pushState or replaceState
+ * @return {object} state
+ */
+ Location.prototype.state = function(state) {
+ if (!arguments.length)
+ return this.$$state;
+
+ if (Location !== LocationHtml5Url || !this.$$html5) {
+ throw $locationMinErr('nostate', 'History API state support is available only ' +
+ 'in HTML5 mode and only in browsers supporting HTML5 History API');
+ }
+ // The user might modify `stateObject` after invoking `$location.state(stateObject)`
+ // but we're changing the $$state reference to $browser.state() during the $digest
+ // so the modification window is narrow.
+ this.$$state = isUndefined(state) ? null : state;
+
+ return this;
+ };
+});
+
+
+function locationGetter(property) {
+ return function() {
+ return this[property];
+ };
+}
+
+
+function locationGetterSetter(property, preprocess) {
+ return function(value) {
+ if (isUndefined(value))
+ return this[property];
+
+ this[property] = preprocess(value);
+ this.$$compose();
+
+ return this;
+ };
+}
+
+
+/**
+ * @ngdoc service
+ * @name $location
+ *
+ * @requires $rootElement
+ *
+ * @description
+ * The $location service parses the URL in the browser address bar (based on the
+ * [window.location](https://developer.mozilla.org/en/window.location)) and makes the URL
+ * available to your application. Changes to the URL in the address bar are reflected into
+ * $location service and changes to $location are reflected into the browser address bar.
+ *
+ * **The $location service:**
+ *
+ * - Exposes the current URL in the browser address bar, so you can
+ * - Watch and observe the URL.
+ * - Change the URL.
+ * - Synchronizes the URL with the browser when the user
+ * - Changes the address bar.
+ * - Clicks the back or forward button (or clicks a History link).
+ * - Clicks on a link.
+ * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash).
+ *
+ * For more information see {@link guide/$location Developer Guide: Using $location}
+ */
+
+/**
+ * @ngdoc provider
+ * @name $locationProvider
+ * @description
+ * Use the `$locationProvider` to configure how the application deep linking paths are stored.
+ */
+function $LocationProvider() {
+ var hashPrefix = '',
+ html5Mode = {
+ enabled: false,
+ requireBase: true,
+ rewriteLinks: true
+ };
+
+ /**
+ * @ngdoc method
+ * @name $locationProvider#hashPrefix
+ * @description
+ * @param {string=} prefix Prefix for hash part (containing path and search)
+ * @returns {*} current value if used as getter or itself (chaining) if used as setter
+ */
+ this.hashPrefix = function(prefix) {
+ if (isDefined(prefix)) {
+ hashPrefix = prefix;
+ return this;
+ } else {
+ return hashPrefix;
+ }
+ };
+
+ /**
+ * @ngdoc method
+ * @name $locationProvider#html5Mode
+ * @description
+ * @param {(boolean|Object)=} mode If boolean, sets `html5Mode.enabled` to value.
+ * If object, sets `enabled`, `requireBase` and `rewriteLinks` to respective values. Supported
+ * properties:
+ * - **enabled** – `{boolean}` – (default: false) If true, will rely on `history.pushState` to
+ * change urls where supported. Will fall back to hash-prefixed paths in browsers that do not
+ * support `pushState`.
+ * - **requireBase** - `{boolean}` - (default: `true`) When html5Mode is enabled, specifies
+ * whether or not a <base> tag is required to be present. If `enabled` and `requireBase` are
+ * true, and a base tag is not present, an error will be thrown when `$location` is injected.
+ * See the {@link guide/$location $location guide for more information}
+ * - **rewriteLinks** - `{boolean}` - (default: `true`) When html5Mode is enabled,
+ * enables/disables url rewriting for relative links.
+ *
+ * @returns {Object} html5Mode object if used as getter or itself (chaining) if used as setter
+ */
+ this.html5Mode = function(mode) {
+ if (isBoolean(mode)) {
+ html5Mode.enabled = mode;
+ return this;
+ } else if (isObject(mode)) {
+
+ if (isBoolean(mode.enabled)) {
+ html5Mode.enabled = mode.enabled;
+ }
+
+ if (isBoolean(mode.requireBase)) {
+ html5Mode.requireBase = mode.requireBase;
+ }
+
+ if (isBoolean(mode.rewriteLinks)) {
+ html5Mode.rewriteLinks = mode.rewriteLinks;
+ }
+
+ return this;
+ } else {
+ return html5Mode;
+ }
+ };
+
+ /**
+ * @ngdoc event
+ * @name $location#$locationChangeStart
+ * @eventType broadcast on root scope
+ * @description
+ * Broadcasted before a URL will change.
+ *
+ * This change can be prevented by calling
+ * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more
+ * details about event object. Upon successful change
+ * {@link ng.$location#$locationChangeSuccess $locationChangeSuccess} is fired.
+ *
+ * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when
+ * the browser supports the HTML5 History API.
+ *
+ * @param {Object} angularEvent Synthetic event object.
+ * @param {string} newUrl New URL
+ * @param {string=} oldUrl URL that was before it was changed.
+ * @param {string=} newState New history state object
+ * @param {string=} oldState History state object that was before it was changed.
+ */
+
+ /**
+ * @ngdoc event
+ * @name $location#$locationChangeSuccess
+ * @eventType broadcast on root scope
+ * @description
+ * Broadcasted after a URL was changed.
+ *
+ * The `newState` and `oldState` parameters may be defined only in HTML5 mode and when
+ * the browser supports the HTML5 History API.
+ *
+ * @param {Object} angularEvent Synthetic event object.
+ * @param {string} newUrl New URL
+ * @param {string=} oldUrl URL that was before it was changed.
+ * @param {string=} newState New history state object
+ * @param {string=} oldState History state object that was before it was changed.
+ */
+
+ this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement',
+ function($rootScope, $browser, $sniffer, $rootElement) {
+ var $location,
+ LocationMode,
+ baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to ''
+ initialUrl = $browser.url(),
+ appBase;
+
+ if (html5Mode.enabled) {
+ if (!baseHref && html5Mode.requireBase) {
+ throw $locationMinErr('nobase',
+ "$location in HTML5 mode requires a <base> tag to be present!");
+ }
+ appBase = serverBase(initialUrl) + (baseHref || '/');
+ LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url;
+ } else {
+ appBase = stripHash(initialUrl);
+ LocationMode = LocationHashbangUrl;
+ }
+ $location = new LocationMode(appBase, '#' + hashPrefix);
+ $location.$$parseLinkUrl(initialUrl, initialUrl);
+
+ $location.$$state = $browser.state();
+
+ var IGNORE_URI_REGEXP = /^\s*(javascript|mailto):/i;
+
+ function setBrowserUrlWithFallback(url, replace, state) {
+ var oldUrl = $location.url();
+ var oldState = $location.$$state;
+ try {
+ $browser.url(url, replace, state);
+
+ // Make sure $location.state() returns referentially identical (not just deeply equal)
+ // state object; this makes possible quick checking if the state changed in the digest
+ // loop. Checking deep equality would be too expensive.
+ $location.$$state = $browser.state();
+ } catch (e) {
+ // Restore old values if pushState fails
+ $location.url(oldUrl);
+ $location.$$state = oldState;
+
+ throw e;
+ }
+ }
+
+ $rootElement.on('click', function(event) {
+ // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser)
+ // currently we open nice url link and redirect then
+
+ if (!html5Mode.rewriteLinks || event.ctrlKey || event.metaKey || event.which == 2) return;
+
+ var elm = jqLite(event.target);
+
+ // traverse the DOM up to find first A tag
+ while (nodeName_(elm[0]) !== 'a') {
+ // ignore rewriting if no A tag (reached root element, or no parent - removed from document)
+ if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return;
+ }
+
+ var absHref = elm.prop('href');
+ // get the actual href attribute - see
+ // http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx
+ var relHref = elm.attr('href') || elm.attr('xlink:href');
+
+ if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') {
+ // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during
+ // an animation.
+ absHref = urlResolve(absHref.animVal).href;
+ }
+
+ // Ignore when url is started with javascript: or mailto:
+ if (IGNORE_URI_REGEXP.test(absHref)) return;
+
+ if (absHref && !elm.attr('target') && !event.isDefaultPrevented()) {
+ if ($location.$$parseLinkUrl(absHref, relHref)) {
+ // We do a preventDefault for all urls that are part of the angular application,
+ // in html5mode and also without, so that we are able to abort navigation without
+ // getting double entries in the location history.
+ event.preventDefault();
+ // update location manually
+ if ($location.absUrl() != $browser.url()) {
+ $rootScope.$apply();
+ // hack to work around FF6 bug 684208 when scenario runner clicks on links
+ window.angular['ff-684208-preventDefault'] = true;
+ }
+ }
+ }
+ });
+
+
+ // rewrite hashbang url <> html5 url
+ if ($location.absUrl() != initialUrl) {
+ $browser.url($location.absUrl(), true);
+ }
+
+ var initializing = true;
+
+ // update $location when $browser url changes
+ $browser.onUrlChange(function(newUrl, newState) {
+ $rootScope.$evalAsync(function() {
+ var oldUrl = $location.absUrl();
+ var oldState = $location.$$state;
+ var defaultPrevented;
+
+ $location.$$parse(newUrl);
+ $location.$$state = newState;
+
+ defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
+ newState, oldState).defaultPrevented;
+
+ // if the location was changed by a `$locationChangeStart` handler then stop
+ // processing this location change
+ if ($location.absUrl() !== newUrl) return;
+
+ if (defaultPrevented) {
+ $location.$$parse(oldUrl);
+ $location.$$state = oldState;
+ setBrowserUrlWithFallback(oldUrl, false, oldState);
+ } else {
+ initializing = false;
+ afterLocationChange(oldUrl, oldState);
+ }
+ });
+ if (!$rootScope.$$phase) $rootScope.$digest();
+ });
+
+ // update browser
+ $rootScope.$watch(function $locationWatch() {
+ var oldUrl = $browser.url();
+ var oldState = $browser.state();
+ var currentReplace = $location.$$replace;
+ var urlOrStateChanged = oldUrl !== $location.absUrl() ||
+ ($location.$$html5 && $sniffer.history && oldState !== $location.$$state);
+
+ if (initializing || urlOrStateChanged) {
+ initializing = false;
+
+ $rootScope.$evalAsync(function() {
+ var newUrl = $location.absUrl();
+ var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
+ $location.$$state, oldState).defaultPrevented;
+
+ // if the location was changed by a `$locationChangeStart` handler then stop
+ // processing this location change
+ if ($location.absUrl() !== newUrl) return;
+
+ if (defaultPrevented) {
+ $location.$$parse(oldUrl);
+ $location.$$state = oldState;
+ } else {
+ if (urlOrStateChanged) {
+ setBrowserUrlWithFallback(newUrl, currentReplace,
+ oldState === $location.$$state ? null : $location.$$state);
+ }
+ afterLocationChange(oldUrl, oldState);
+ }
+ });
+ }
+
+ $location.$$replace = false;
+
+ // we don't need to return anything because $evalAsync will make the digest loop dirty when
+ // there is a change
+ });
+
+ return $location;
+
+ function afterLocationChange(oldUrl, oldState) {
+ $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl,
+ $location.$$state, oldState);
+ }
+}];
+}
+
+/**
+ * @ngdoc service
+ * @name $log
+ * @requires $window
+ *
+ * @description
+ * Simple service for logging. Default implementation safely writes the message
+ * into the browser's console (if present).
+ *
+ * The main purpose of this service is to simplify debugging and troubleshooting.
+ *
+ * The default is to log `debug` messages. You can use
+ * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this.
+ *
+ * @example
+ <example module="logExample">
+ <file name="script.js">
+ angular.module('logExample', [])
+ .controller('LogController', ['$scope', '$log', function($scope, $log) {
+ $scope.$log = $log;
+ $scope.message = 'Hello World!';
+ }]);
+ </file>
+ <file name="index.html">
+ <div ng-controller="LogController">
+ <p>Reload this page with open console, enter text and hit the log button...</p>
+ Message:
+ <input type="text" ng-model="message"/>
+ <button ng-click="$log.log(message)">log</button>
+ <button ng-click="$log.warn(message)">warn</button>
+ <button ng-click="$log.info(message)">info</button>
+ <button ng-click="$log.error(message)">error</button>
+ </div>
+ </file>
+ </example>
+ */
+
+/**
+ * @ngdoc provider
+ * @name $logProvider
+ * @description
+ * Use the `$logProvider` to configure how the application logs messages
+ */
+function $LogProvider() {
+ var debug = true,
+ self = this;
+
+ /**
+ * @ngdoc method
+ * @name $logProvider#debugEnabled
+ * @description
+ * @param {boolean=} flag enable or disable debug level messages
+ * @returns {*} current value if used as getter or itself (chaining) if used as setter
+ */
+ this.debugEnabled = function(flag) {
+ if (isDefined(flag)) {
+ debug = flag;
+ return this;
+ } else {
+ return debug;
+ }
+ };
+
+ this.$get = ['$window', function($window) {
+ return {
+ /**
+ * @ngdoc method
+ * @name $log#log
+ *
+ * @description
+ * Write a log message
+ */
+ log: consoleLog('log'),
+
+ /**
+ * @ngdoc method
+ * @name $log#info
+ *
+ * @description
+ * Write an information message
+ */
+ info: consoleLog('info'),
+
+ /**
+ * @ngdoc method
+ * @name $log#warn
+ *
+ * @description
+ * Write a warning message
+ */
+ warn: consoleLog('warn'),
+
+ /**
+ * @ngdoc method
+ * @name $log#error
+ *
+ * @description
+ * Write an error message
+ */
+ error: consoleLog('error'),
+
+ /**
+ * @ngdoc method
+ * @name $log#debug
+ *
+ * @description
+ * Write a debug message
+ */
+ debug: (function() {
+ var fn = consoleLog('debug');
+
+ return function() {
+ if (debug) {
+ fn.apply(self, arguments);
+ }
+ };
+ }())
+ };
+
+ function formatError(arg) {
+ if (arg instanceof Error) {
+ if (arg.stack) {
+ arg = (arg.message && arg.stack.indexOf(arg.message) === -1)
+ ? 'Error: ' + arg.message + '\n' + arg.stack
+ : arg.stack;
+ } else if (arg.sourceURL) {
+ arg = arg.message + '\n' + arg.sourceURL + ':' + arg.line;
+ }
+ }
+ return arg;
+ }
+
+ function consoleLog(type) {
+ var console = $window.console || {},
+ logFn = console[type] || console.log || noop,
+ hasApply = false;
+
+ // Note: reading logFn.apply throws an error in IE11 in IE8 document mode.
+ // The reason behind this is that console.log has type "object" in IE8...
+ try {
+ hasApply = !!logFn.apply;
+ } catch (e) {}
+
+ if (hasApply) {
+ return function() {
+ var args = [];
+ forEach(arguments, function(arg) {
+ args.push(formatError(arg));
+ });
+ return logFn.apply(console, args);
+ };
+ }
+
+ // we are IE which either doesn't have window.console => this is noop and we do nothing,
+ // or we are IE where console.log doesn't have apply so we log at least first 2 args
+ return function(arg1, arg2) {
+ logFn(arg1, arg2 == null ? '' : arg2);
+ };
+ }
+ }];
+}
+
+var $parseMinErr = minErr('$parse');
+
+// Sandboxing Angular Expressions
+// ------------------------------
+// Angular expressions are generally considered safe because these expressions only have direct
+// access to `$scope` and locals. However, one can obtain the ability to execute arbitrary JS code by
+// obtaining a reference to native JS functions such as the Function constructor.
+//
+// As an example, consider the following Angular expression:
+//
+// {}.toString.constructor('alert("evil JS code")')
+//
+// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits
+// against the expression language, but not to prevent exploits that were enabled by exposing
+// sensitive JavaScript or browser APIs on Scope. Exposing such objects on a Scope is never a good
+// practice and therefore we are not even trying to protect against interaction with an object
+// explicitly exposed in this way.
+//
+// In general, it is not possible to access a Window object from an angular expression unless a
+// window or some DOM object that has a reference to window is published onto a Scope.
+// Similarly we prevent invocations of function known to be dangerous, as well as assignments to
+// native objects.
+//
+// See https://docs.angularjs.org/guide/security
+
+
+function ensureSafeMemberName(name, fullExpression) {
+ if (name === "__defineGetter__" || name === "__defineSetter__"
+ || name === "__lookupGetter__" || name === "__lookupSetter__"
+ || name === "__proto__") {
+ throw $parseMinErr('isecfld',
+ 'Attempting to access a disallowed field in Angular expressions! '
+ + 'Expression: {0}', fullExpression);
+ }
+ return name;
+}
+
+function ensureSafeObject(obj, fullExpression) {
+ // nifty check if obj is Function that is fast and works across iframes and other contexts
+ if (obj) {
+ if (obj.constructor === obj) {
+ throw $parseMinErr('isecfn',
+ 'Referencing Function in Angular expressions is disallowed! Expression: {0}',
+ fullExpression);
+ } else if (// isWindow(obj)
+ obj.window === obj) {
+ throw $parseMinErr('isecwindow',
+ 'Referencing the Window in Angular expressions is disallowed! Expression: {0}',
+ fullExpression);
+ } else if (// isElement(obj)
+ obj.children && (obj.nodeName || (obj.prop && obj.attr && obj.find))) {
+ throw $parseMinErr('isecdom',
+ 'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}',
+ fullExpression);
+ } else if (// block Object so that we can't get hold of dangerous Object.* methods
+ obj === Object) {
+ throw $parseMinErr('isecobj',
+ 'Referencing Object in Angular expressions is disallowed! Expression: {0}',
+ fullExpression);
+ }
+ }
+ return obj;
+}
+
+var CALL = Function.prototype.call;
+var APPLY = Function.prototype.apply;
+var BIND = Function.prototype.bind;
+
+function ensureSafeFunction(obj, fullExpression) {
+ if (obj) {
+ if (obj.constructor === obj) {
+ throw $parseMinErr('isecfn',
+ 'Referencing Function in Angular expressions is disallowed! Expression: {0}',
+ fullExpression);
+ } else if (obj === CALL || obj === APPLY || obj === BIND) {
+ throw $parseMinErr('isecff',
+ 'Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}',
+ fullExpression);
+ }
+ }
+}
+
+//Keyword constants
+var CONSTANTS = createMap();
+forEach({
+ 'null': function() { return null; },
+ 'true': function() { return true; },
+ 'false': function() { return false; },
+ 'undefined': function() {}
+}, function(constantGetter, name) {
+ constantGetter.constant = constantGetter.literal = constantGetter.sharedGetter = true;
+ CONSTANTS[name] = constantGetter;
+});
+
+//Not quite a constant, but can be lex/parsed the same
+CONSTANTS['this'] = function(self) { return self; };
+CONSTANTS['this'].sharedGetter = true;
+
+
+//Operators - will be wrapped by binaryFn/unaryFn/assignment/filter
+var OPERATORS = extend(createMap(), {
+ '+':function(self, locals, a, b) {
+ a=a(self, locals); b=b(self, locals);
+ if (isDefined(a)) {
+ if (isDefined(b)) {
+ return a + b;
+ }
+ return a;
+ }
+ return isDefined(b) ? b : undefined;},
+ '-':function(self, locals, a, b) {
+ a=a(self, locals); b=b(self, locals);
+ return (isDefined(a) ? a : 0) - (isDefined(b) ? b : 0);
+ },
+ '*':function(self, locals, a, b) {return a(self, locals) * b(self, locals);},
+ '/':function(self, locals, a, b) {return a(self, locals) / b(self, locals);},
+ '%':function(self, locals, a, b) {return a(self, locals) % b(self, locals);},
+ '===':function(self, locals, a, b) {return a(self, locals) === b(self, locals);},
+ '!==':function(self, locals, a, b) {return a(self, locals) !== b(self, locals);},
+ '==':function(self, locals, a, b) {return a(self, locals) == b(self, locals);},
+ '!=':function(self, locals, a, b) {return a(self, locals) != b(self, locals);},
+ '<':function(self, locals, a, b) {return a(self, locals) < b(self, locals);},
+ '>':function(self, locals, a, b) {return a(self, locals) > b(self, locals);},
+ '<=':function(self, locals, a, b) {return a(self, locals) <= b(self, locals);},
+ '>=':function(self, locals, a, b) {return a(self, locals) >= b(self, locals);},
+ '&&':function(self, locals, a, b) {return a(self, locals) && b(self, locals);},
+ '||':function(self, locals, a, b) {return a(self, locals) || b(self, locals);},
+ '!':function(self, locals, a) {return !a(self, locals);},
+
+ //Tokenized as operators but parsed as assignment/filters
+ '=':true,
+ '|':true
+});
+var ESCAPE = {"n":"\n", "f":"\f", "r":"\r", "t":"\t", "v":"\v", "'":"'", '"':'"'};
+
+
+/////////////////////////////////////////
+
+
+/**
+ * @constructor
+ */
+var Lexer = function(options) {
+ this.options = options;
+};
+
+Lexer.prototype = {
+ constructor: Lexer,
+
+ lex: function(text) {
+ this.text = text;
+ this.index = 0;
+ this.tokens = [];
+
+ while (this.index < this.text.length) {
+ var ch = this.text.charAt(this.index);
+ if (ch === '"' || ch === "'") {
+ this.readString(ch);
+ } else if (this.isNumber(ch) || ch === '.' && this.isNumber(this.peek())) {
+ this.readNumber();
+ } else if (this.isIdent(ch)) {
+ this.readIdent();
+ } else if (this.is(ch, '(){}[].,;:?')) {
+ this.tokens.push({index: this.index, text: ch});
+ this.index++;
+ } else if (this.isWhitespace(ch)) {
+ this.index++;
+ } else {
+ var ch2 = ch + this.peek();
+ var ch3 = ch2 + this.peek(2);
+ var op1 = OPERATORS[ch];
+ var op2 = OPERATORS[ch2];
+ var op3 = OPERATORS[ch3];
+ if (op1 || op2 || op3) {
+ var token = op3 ? ch3 : (op2 ? ch2 : ch);
+ this.tokens.push({index: this.index, text: token, operator: true});
+ this.index += token.length;
+ } else {
+ this.throwError('Unexpected next character ', this.index, this.index + 1);
+ }
+ }
+ }
+ return this.tokens;
+ },
+
+ is: function(ch, chars) {
+ return chars.indexOf(ch) !== -1;
+ },
+
+ peek: function(i) {
+ var num = i || 1;
+ return (this.index + num < this.text.length) ? this.text.charAt(this.index + num) : false;
+ },
+
+ isNumber: function(ch) {
+ return ('0' <= ch && ch <= '9') && typeof ch === "string";
+ },
+
+ isWhitespace: function(ch) {
+ // IE treats non-breaking space as \u00A0
+ return (ch === ' ' || ch === '\r' || ch === '\t' ||
+ ch === '\n' || ch === '\v' || ch === '\u00A0');
+ },
+
+ isIdent: function(ch) {
+ return ('a' <= ch && ch <= 'z' ||
+ 'A' <= ch && ch <= 'Z' ||
+ '_' === ch || ch === '$');
+ },
+
+ isExpOperator: function(ch) {
+ return (ch === '-' || ch === '+' || this.isNumber(ch));
+ },
+
+ throwError: function(error, start, end) {
+ end = end || this.index;
+ var colStr = (isDefined(start)
+ ? 's ' + start + '-' + this.index + ' [' + this.text.substring(start, end) + ']'
+ : ' ' + end);
+ throw $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].',
+ error, colStr, this.text);
+ },
+
+ readNumber: function() {
+ var number = '';
+ var start = this.index;
+ while (this.index < this.text.length) {
+ var ch = lowercase(this.text.charAt(this.index));
+ if (ch == '.' || this.isNumber(ch)) {
+ number += ch;
+ } else {
+ var peekCh = this.peek();
+ if (ch == 'e' && this.isExpOperator(peekCh)) {
+ number += ch;
+ } else if (this.isExpOperator(ch) &&
+ peekCh && this.isNumber(peekCh) &&
+ number.charAt(number.length - 1) == 'e') {
+ number += ch;
+ } else if (this.isExpOperator(ch) &&
+ (!peekCh || !this.isNumber(peekCh)) &&
+ number.charAt(number.length - 1) == 'e') {
+ this.throwError('Invalid exponent');
+ } else {
+ break;
+ }
+ }
+ this.index++;
+ }
+ this.tokens.push({
+ index: start,
+ text: number,
+ constant: true,
+ value: Number(number)
+ });
+ },
+
+ readIdent: function() {
+ var start = this.index;
+ while (this.index < this.text.length) {
+ var ch = this.text.charAt(this.index);
+ if (!(this.isIdent(ch) || this.isNumber(ch))) {
+ break;
+ }
+ this.index++;
+ }
+ this.tokens.push({
+ index: start,
+ text: this.text.slice(start, this.index),
+ identifier: true
+ });
+ },
+
+ readString: function(quote) {
+ var start = this.index;
+ this.index++;
+ var string = '';
+ var rawString = quote;
+ var escape = false;
+ while (this.index < this.text.length) {
+ var ch = this.text.charAt(this.index);
+ rawString += ch;
+ if (escape) {
+ if (ch === 'u') {
+ var hex = this.text.substring(this.index + 1, this.index + 5);
+ if (!hex.match(/[\da-f]{4}/i))
+ this.throwError('Invalid unicode escape [\\u' + hex + ']');
+ this.index += 4;
+ string += String.fromCharCode(parseInt(hex, 16));
+ } else {
+ var rep = ESCAPE[ch];
+ string = string + (rep || ch);
+ }
+ escape = false;
+ } else if (ch === '\\') {
+ escape = true;
+ } else if (ch === quote) {
+ this.index++;
+ this.tokens.push({
+ index: start,
+ text: rawString,
+ constant: true,
+ value: string
+ });
+ return;
+ } else {
+ string += ch;
+ }
+ this.index++;
+ }
+ this.throwError('Unterminated quote', start);
+ }
+};
+
+
+function isConstant(exp) {
+ return exp.constant;
+}
+
+/**
+ * @constructor
+ */
+var Parser = function(lexer, $filter, options) {
+ this.lexer = lexer;
+ this.$filter = $filter;
+ this.options = options;
+};
+
+Parser.ZERO = extend(function() {
+ return 0;
+}, {
+ sharedGetter: true,
+ constant: true
+});
+
+Parser.prototype = {
+ constructor: Parser,
+
+ parse: function(text) {
+ this.text = text;
+ this.tokens = this.lexer.lex(text);
+
+ var value = this.statements();
+
+ if (this.tokens.length !== 0) {
+ this.throwError('is an unexpected token', this.tokens[0]);
+ }
+
+ value.literal = !!value.literal;
+ value.constant = !!value.constant;
+
+ return value;
+ },
+
+ primary: function() {
+ var primary;
+ if (this.expect('(')) {
+ primary = this.filterChain();
+ this.consume(')');
+ } else if (this.expect('[')) {
+ primary = this.arrayDeclaration();
+ } else if (this.expect('{')) {
+ primary = this.object();
+ } else if (this.peek().identifier) {
+ primary = this.identifier();
+ } else if (this.peek().constant) {
+ primary = this.constant();
+ } else {
+ this.throwError('not a primary expression', this.peek());
+ }
+
+ var next, context;
+ while ((next = this.expect('(', '[', '.'))) {
+ if (next.text === '(') {
+ primary = this.functionCall(primary, context);
+ context = null;
+ } else if (next.text === '[') {
+ context = primary;
+ primary = this.objectIndex(primary);
+ } else if (next.text === '.') {
+ context = primary;
+ primary = this.fieldAccess(primary);
+ } else {
+ this.throwError('IMPOSSIBLE');
+ }
+ }
+ return primary;
+ },
+
+ throwError: function(msg, token) {
+ throw $parseMinErr('syntax',
+ 'Syntax Error: Token \'{0}\' {1} at column {2} of the expression [{3}] starting at [{4}].',
+ token.text, msg, (token.index + 1), this.text, this.text.substring(token.index));
+ },
+
+ peekToken: function() {
+ if (this.tokens.length === 0)
+ throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text);
+ return this.tokens[0];
+ },
+
+ peek: function(e1, e2, e3, e4) {
+ return this.peekAhead(0, e1, e2, e3, e4);
+ },
+ peekAhead: function(i, e1, e2, e3, e4) {
+ if (this.tokens.length > i) {
+ var token = this.tokens[i];
+ var t = token.text;
+ if (t === e1 || t === e2 || t === e3 || t === e4 ||
+ (!e1 && !e2 && !e3 && !e4)) {
+ return token;
+ }
+ }
+ return false;
+ },
+
+ expect: function(e1, e2, e3, e4) {
+ var token = this.peek(e1, e2, e3, e4);
+ if (token) {
+ this.tokens.shift();
+ return token;
+ }
+ return false;
+ },
+
+ consume: function(e1) {
+ if (this.tokens.length === 0) {
+ throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text);
+ }
+
+ var token = this.expect(e1);
+ if (!token) {
+ this.throwError('is unexpected, expecting [' + e1 + ']', this.peek());
+ }
+ return token;
+ },
+
+ unaryFn: function(op, right) {
+ var fn = OPERATORS[op];
+ return extend(function $parseUnaryFn(self, locals) {
+ return fn(self, locals, right);
+ }, {
+ constant:right.constant,
+ inputs: [right]
+ });
+ },
+
+ binaryFn: function(left, op, right, isBranching) {
+ var fn = OPERATORS[op];
+ return extend(function $parseBinaryFn(self, locals) {
+ return fn(self, locals, left, right);
+ }, {
+ constant: left.constant && right.constant,
+ inputs: !isBranching && [left, right]
+ });
+ },
+
+ identifier: function() {
+ var id = this.consume().text;
+
+ //Continue reading each `.identifier` unless it is a method invocation
+ while (this.peek('.') && this.peekAhead(1).identifier && !this.peekAhead(2, '(')) {
+ id += this.consume().text + this.consume().text;
+ }
+
+ return CONSTANTS[id] || getterFn(id, this.options, this.text);
+ },
+
+ constant: function() {
+ var value = this.consume().value;
+
+ return extend(function $parseConstant() {
+ return value;
+ }, {
+ constant: true,
+ literal: true
+ });
+ },
+
+ statements: function() {
+ var statements = [];
+ while (true) {
+ if (this.tokens.length > 0 && !this.peek('}', ')', ';', ']'))
+ statements.push(this.filterChain());
+ if (!this.expect(';')) {
+ // optimize for the common case where there is only one statement.
+ // TODO(size): maybe we should not support multiple statements?
+ return (statements.length === 1)
+ ? statements[0]
+ : function $parseStatements(self, locals) {
+ var value;
+ for (var i = 0, ii = statements.length; i < ii; i++) {
+ value = statements[i](self, locals);
+ }
+ return value;
+ };
+ }
+ }
+ },
+
+ filterChain: function() {
+ var left = this.expression();
+ var token;
+ while ((token = this.expect('|'))) {
+ left = this.filter(left);
+ }
+ return left;
+ },
+
+ filter: function(inputFn) {
+ var fn = this.$filter(this.consume().text);
+ var argsFn;
+ var args;
+
+ if (this.peek(':')) {
+ argsFn = [];
+ args = []; // we can safely reuse the array
+ while (this.expect(':')) {
+ argsFn.push(this.expression());
+ }
+ }
+
+ var inputs = [inputFn].concat(argsFn || []);
+
+ return extend(function $parseFilter(self, locals) {
+ var input = inputFn(self, locals);
+ if (args) {
+ args[0] = input;
+
+ var i = argsFn.length;
+ while (i--) {
+ args[i + 1] = argsFn[i](self, locals);
+ }
+
+ return fn.apply(undefined, args);
+ }
+
+ return fn(input);
+ }, {
+ constant: !fn.$stateful && inputs.every(isConstant),
+ inputs: !fn.$stateful && inputs
+ });
+ },
+
+ expression: function() {
+ return this.assignment();
+ },
+
+ assignment: function() {
+ var left = this.ternary();
+ var right;
+ var token;
+ if ((token = this.expect('='))) {
+ if (!left.assign) {
+ this.throwError('implies assignment but [' +
+ this.text.substring(0, token.index) + '] can not be assigned to', token);
+ }
+ right = this.ternary();
+ return extend(function $parseAssignment(scope, locals) {
+ return left.assign(scope, right(scope, locals), locals);
+ }, {
+ inputs: [left, right]
+ });
+ }
+ return left;
+ },
+
+ ternary: function() {
+ var left = this.logicalOR();
+ var middle;
+ var token;
+ if ((token = this.expect('?'))) {
+ middle = this.assignment();
+ if (this.consume(':')) {
+ var right = this.assignment();
+
+ return extend(function $parseTernary(self, locals) {
+ return left(self, locals) ? middle(self, locals) : right(self, locals);
+ }, {
+ constant: left.constant && middle.constant && right.constant
+ });
+ }
+ }
+
+ return left;
+ },
+
+ logicalOR: function() {
+ var left = this.logicalAND();
+ var token;
+ while ((token = this.expect('||'))) {
+ left = this.binaryFn(left, token.text, this.logicalAND(), true);
+ }
+ return left;
+ },
+
+ logicalAND: function() {
+ var left = this.equality();
+ var token;
+ if ((token = this.expect('&&'))) {
+ left = this.binaryFn(left, token.text, this.logicalAND(), true);
+ }
+ return left;
+ },
+
+ equality: function() {
+ var left = this.relational();
+ var token;
+ if ((token = this.expect('==','!=','===','!=='))) {
+ left = this.binaryFn(left, token.text, this.equality());
+ }
+ return left;
+ },
+
+ relational: function() {
+ var left = this.additive();
+ var token;
+ if ((token = this.expect('<', '>', '<=', '>='))) {
+ left = this.binaryFn(left, token.text, this.relational());
+ }
+ return left;
+ },
+
+ additive: function() {
+ var left = this.multiplicative();
+ var token;
+ while ((token = this.expect('+','-'))) {
+ left = this.binaryFn(left, token.text, this.multiplicative());
+ }
+ return left;
+ },
+
+ multiplicative: function() {
+ var left = this.unary();
+ var token;
+ while ((token = this.expect('*','/','%'))) {
+ left = this.binaryFn(left, token.text, this.unary());
+ }
+ return left;
+ },
+
+ unary: function() {
+ var token;
+ if (this.expect('+')) {
+ return this.primary();
+ } else if ((token = this.expect('-'))) {
+ return this.binaryFn(Parser.ZERO, token.text, this.unary());
+ } else if ((token = this.expect('!'))) {
+ return this.unaryFn(token.text, this.unary());
+ } else {
+ return this.primary();
+ }
+ },
+
+ fieldAccess: function(object) {
+ var expression = this.text;
+ var field = this.consume().text;
+ var getter = getterFn(field, this.options, expression);
+
+ return extend(function $parseFieldAccess(scope, locals, self) {
+ return getter(self || object(scope, locals));
+ }, {
+ assign: function(scope, value, locals) {
+ var o = object(scope, locals);
+ if (!o) object.assign(scope, o = {});
+ return setter(o, field, value, expression);
+ }
+ });
+ },
+
+ objectIndex: function(obj) {
+ var expression = this.text;
+
+ var indexFn = this.expression();
+ this.consume(']');
+
+ return extend(function $parseObjectIndex(self, locals) {
+ var o = obj(self, locals),
+ i = indexFn(self, locals),
+ v;
+
+ ensureSafeMemberName(i, expression);
+ if (!o) return undefined;
+ v = ensureSafeObject(o[i], expression);
+ return v;
+ }, {
+ assign: function(self, value, locals) {
+ var key = ensureSafeMemberName(indexFn(self, locals), expression);
+ // prevent overwriting of Function.constructor which would break ensureSafeObject check
+ var o = ensureSafeObject(obj(self, locals), expression);
+ if (!o) obj.assign(self, o = {});
+ return o[key] = value;
+ }
+ });
+ },
+
+ functionCall: function(fnGetter, contextGetter) {
+ var argsFn = [];
+ if (this.peekToken().text !== ')') {
+ do {
+ argsFn.push(this.expression());
+ } while (this.expect(','));
+ }
+ this.consume(')');
+
+ var expressionText = this.text;
+ // we can safely reuse the array across invocations
+ var args = argsFn.length ? [] : null;
+
+ return function $parseFunctionCall(scope, locals) {
+ var context = contextGetter ? contextGetter(scope, locals) : scope;
+ var fn = fnGetter(scope, locals, context) || noop;
+
+ if (args) {
+ var i = argsFn.length;
+ while (i--) {
+ args[i] = ensureSafeObject(argsFn[i](scope, locals), expressionText);
+ }
+ }
+
+ ensureSafeObject(context, expressionText);
+ ensureSafeFunction(fn, expressionText);
+
+ // IE doesn't have apply for some native functions
+ var v = fn.apply
+ ? fn.apply(context, args)
+ : fn(args[0], args[1], args[2], args[3], args[4]);
+
+ return ensureSafeObject(v, expressionText);
+ };
+ },
+
+ // This is used with json array declaration
+ arrayDeclaration: function() {
+ var elementFns = [];
+ if (this.peekToken().text !== ']') {
+ do {
+ if (this.peek(']')) {
+ // Support trailing commas per ES5.1.
+ break;
+ }
+ elementFns.push(this.expression());
+ } while (this.expect(','));
+ }
+ this.consume(']');
+
+ return extend(function $parseArrayLiteral(self, locals) {
+ var array = [];
+ for (var i = 0, ii = elementFns.length; i < ii; i++) {
+ array.push(elementFns[i](self, locals));
+ }
+ return array;
+ }, {
+ literal: true,
+ constant: elementFns.every(isConstant),
+ inputs: elementFns
+ });
+ },
+
+ object: function() {
+ var keys = [], valueFns = [];
+ if (this.peekToken().text !== '}') {
+ do {
+ if (this.peek('}')) {
+ // Support trailing commas per ES5.1.
+ break;
+ }
+ var token = this.consume();
+ if (token.constant) {
+ keys.push(token.value);
+ } else if (token.identifier) {
+ keys.push(token.text);
+ } else {
+ this.throwError("invalid key", token);
+ }
+ this.consume(':');
+ valueFns.push(this.expression());
+ } while (this.expect(','));
+ }
+ this.consume('}');
+
+ return extend(function $parseObjectLiteral(self, locals) {
+ var object = {};
+ for (var i = 0, ii = valueFns.length; i < ii; i++) {
+ object[keys[i]] = valueFns[i](self, locals);
+ }
+ return object;
+ }, {
+ literal: true,
+ constant: valueFns.every(isConstant),
+ inputs: valueFns
+ });
+ }
+};
+
+
+//////////////////////////////////////////////////
+// Parser helper functions
+//////////////////////////////////////////////////
+
+function setter(obj, path, setValue, fullExp) {
+ ensureSafeObject(obj, fullExp);
+
+ var element = path.split('.'), key;
+ for (var i = 0; element.length > 1; i++) {
+ key = ensureSafeMemberName(element.shift(), fullExp);
+ var propertyObj = ensureSafeObject(obj[key], fullExp);
+ if (!propertyObj) {
+ propertyObj = {};
+ obj[key] = propertyObj;
+ }
+ obj = propertyObj;
+ }
+ key = ensureSafeMemberName(element.shift(), fullExp);
+ ensureSafeObject(obj[key], fullExp);
+ obj[key] = setValue;
+ return setValue;
+}
+
+var getterFnCacheDefault = createMap();
+var getterFnCacheExpensive = createMap();
+
+function isPossiblyDangerousMemberName(name) {
+ return name == 'constructor';
+}
+
+/**
+ * Implementation of the "Black Hole" variant from:
+ * - http://jsperf.com/angularjs-parse-getter/4
+ * - http://jsperf.com/path-evaluation-simplified/7
+ */
+function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, expensiveChecks) {
+ ensureSafeMemberName(key0, fullExp);
+ ensureSafeMemberName(key1, fullExp);
+ ensureSafeMemberName(key2, fullExp);
+ ensureSafeMemberName(key3, fullExp);
+ ensureSafeMemberName(key4, fullExp);
+ var eso = function(o) {
+ return ensureSafeObject(o, fullExp);
+ };
+ var eso0 = (expensiveChecks || isPossiblyDangerousMemberName(key0)) ? eso : identity;
+ var eso1 = (expensiveChecks || isPossiblyDangerousMemberName(key1)) ? eso : identity;
+ var eso2 = (expensiveChecks || isPossiblyDangerousMemberName(key2)) ? eso : identity;
+ var eso3 = (expensiveChecks || isPossiblyDangerousMemberName(key3)) ? eso : identity;
+ var eso4 = (expensiveChecks || isPossiblyDangerousMemberName(key4)) ? eso : identity;
+
+ return function cspSafeGetter(scope, locals) {
+ var pathVal = (locals && locals.hasOwnProperty(key0)) ? locals : scope;
+
+ if (pathVal == null) return pathVal;
+ pathVal = eso0(pathVal[key0]);
+
+ if (!key1) return pathVal;
+ if (pathVal == null) return undefined;
+ pathVal = eso1(pathVal[key1]);
+
+ if (!key2) return pathVal;
+ if (pathVal == null) return undefined;
+ pathVal = eso2(pathVal[key2]);
+
+ if (!key3) return pathVal;
+ if (pathVal == null) return undefined;
+ pathVal = eso3(pathVal[key3]);
+
+ if (!key4) return pathVal;
+ if (pathVal == null) return undefined;
+ pathVal = eso4(pathVal[key4]);
+
+ return pathVal;
+ };
+}
+
+function getterFnWithEnsureSafeObject(fn, fullExpression) {
+ return function(s, l) {
+ return fn(s, l, ensureSafeObject, fullExpression);
+ };
+}
+
+function getterFn(path, options, fullExp) {
+ var expensiveChecks = options.expensiveChecks;
+ var getterFnCache = (expensiveChecks ? getterFnCacheExpensive : getterFnCacheDefault);
+ var fn = getterFnCache[path];
+ if (fn) return fn;
+
+
+ var pathKeys = path.split('.'),
+ pathKeysLength = pathKeys.length;
+
+ // http://jsperf.com/angularjs-parse-getter/6
+ if (options.csp) {
+ if (pathKeysLength < 6) {
+ fn = cspSafeGetterFn(pathKeys[0], pathKeys[1], pathKeys[2], pathKeys[3], pathKeys[4], fullExp, expensiveChecks);
+ } else {
+ fn = function cspSafeGetter(scope, locals) {
+ var i = 0, val;
+ do {
+ val = cspSafeGetterFn(pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++],
+ pathKeys[i++], fullExp, expensiveChecks)(scope, locals);
+
+ locals = undefined; // clear after first iteration
+ scope = val;
+ } while (i < pathKeysLength);
+ return val;
+ };
+ }
+ } else {
+ var code = '';
+ if (expensiveChecks) {
+ code += 's = eso(s, fe);\nl = eso(l, fe);\n';
+ }
+ var needsEnsureSafeObject = expensiveChecks;
+ forEach(pathKeys, function(key, index) {
+ ensureSafeMemberName(key, fullExp);
+ var lookupJs = (index
+ // we simply dereference 's' on any .dot notation
+ ? 's'
+ // but if we are first then we check locals first, and if so read it first
+ : '((l&&l.hasOwnProperty("' + key + '"))?l:s)') + '.' + key;
+ if (expensiveChecks || isPossiblyDangerousMemberName(key)) {
+ lookupJs = 'eso(' + lookupJs + ', fe)';
+ needsEnsureSafeObject = true;
+ }
+ code += 'if(s == null) return undefined;\n' +
+ 's=' + lookupJs + ';\n';
+ });
+ code += 'return s;';
+
+ /* jshint -W054 */
+ var evaledFnGetter = new Function('s', 'l', 'eso', 'fe', code); // s=scope, l=locals, eso=ensureSafeObject
+ /* jshint +W054 */
+ evaledFnGetter.toString = valueFn(code);
+ if (needsEnsureSafeObject) {
+ evaledFnGetter = getterFnWithEnsureSafeObject(evaledFnGetter, fullExp);
+ }
+ fn = evaledFnGetter;
+ }
+
+ fn.sharedGetter = true;
+ fn.assign = function(self, value) {
+ return setter(self, path, value, path);
+ };
+ getterFnCache[path] = fn;
+ return fn;
+}
+
+var objectValueOf = Object.prototype.valueOf;
+
+function getValueOf(value) {
+ return isFunction(value.valueOf) ? value.valueOf() : objectValueOf.call(value);
+}
+
+///////////////////////////////////
+
+/**
+ * @ngdoc service
+ * @name $parse
+ * @kind function
+ *
+ * @description
+ *
+ * Converts Angular {@link guide/expression expression} into a function.
+ *
+ * ```js
+ * var getter = $parse('user.name');
+ * var setter = getter.assign;
+ * var context = {user:{name:'angular'}};
+ * var locals = {user:{name:'local'}};
+ *
+ * expect(getter(context)).toEqual('angular');
+ * setter(context, 'newValue');
+ * expect(context.user.name).toEqual('newValue');
+ * expect(getter(context, locals)).toEqual('local');
+ * ```
+ *
+ *
+ * @param {string} expression String expression to compile.
+ * @returns {function(context, locals)} a function which represents the compiled expression:
+ *
+ * * `context` – `{object}` – an object against which any expressions embedded in the strings
+ * are evaluated against (typically a scope object).
+ * * `locals` – `{object=}` – local variables context object, useful for overriding values in
+ * `context`.
+ *
+ * The returned function also has the following properties:
+ * * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript
+ * literal.
+ * * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript
+ * constant literals.
+ * * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be
+ * set to a function to change its value on the given context.
+ *
+ */
+
+
+/**
+ * @ngdoc provider
+ * @name $parseProvider
+ *
+ * @description
+ * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse}
+ * service.
+ */
+function $ParseProvider() {
+ var cacheDefault = createMap();
+ var cacheExpensive = createMap();
+
+
+
+ this.$get = ['$filter', '$sniffer', function($filter, $sniffer) {
+ var $parseOptions = {
+ csp: $sniffer.csp,
+ expensiveChecks: false
+ },
+ $parseOptionsExpensive = {
+ csp: $sniffer.csp,
+ expensiveChecks: true
+ };
+
+ function wrapSharedExpression(exp) {
+ var wrapped = exp;
+
+ if (exp.sharedGetter) {
+ wrapped = function $parseWrapper(self, locals) {
+ return exp(self, locals);
+ };
+ wrapped.literal = exp.literal;
+ wrapped.constant = exp.constant;
+ wrapped.assign = exp.assign;
+ }
+
+ return wrapped;
+ }
+
+ return function $parse(exp, interceptorFn, expensiveChecks) {
+ var parsedExpression, oneTime, cacheKey;
+
+ switch (typeof exp) {
+ case 'string':
+ cacheKey = exp = exp.trim();
+
+ var cache = (expensiveChecks ? cacheExpensive : cacheDefault);
+ parsedExpression = cache[cacheKey];
+
+ if (!parsedExpression) {
+ if (exp.charAt(0) === ':' && exp.charAt(1) === ':') {
+ oneTime = true;
+ exp = exp.substring(2);
+ }
+
+ var parseOptions = expensiveChecks ? $parseOptionsExpensive : $parseOptions;
+ var lexer = new Lexer(parseOptions);
+ var parser = new Parser(lexer, $filter, parseOptions);
+ parsedExpression = parser.parse(exp);
+
+ if (parsedExpression.constant) {
+ parsedExpression.$$watchDelegate = constantWatchDelegate;
+ } else if (oneTime) {
+ //oneTime is not part of the exp passed to the Parser so we may have to
+ //wrap the parsedExpression before adding a $$watchDelegate
+ parsedExpression = wrapSharedExpression(parsedExpression);
+ parsedExpression.$$watchDelegate = parsedExpression.literal ?
+ oneTimeLiteralWatchDelegate : oneTimeWatchDelegate;
+ } else if (parsedExpression.inputs) {
+ parsedExpression.$$watchDelegate = inputsWatchDelegate;
+ }
+
+ cache[cacheKey] = parsedExpression;
+ }
+ return addInterceptor(parsedExpression, interceptorFn);
+
+ case 'function':
+ return addInterceptor(exp, interceptorFn);
+
+ default:
+ return addInterceptor(noop, interceptorFn);
+ }
+ };
+
+ function collectExpressionInputs(inputs, list) {
+ for (var i = 0, ii = inputs.length; i < ii; i++) {
+ var input = inputs[i];
+ if (!input.constant) {
+ if (input.inputs) {
+ collectExpressionInputs(input.inputs, list);
+ } else if (list.indexOf(input) === -1) { // TODO(perf) can we do better?
+ list.push(input);
+ }
+ }
+ }
+
+ return list;
+ }
+
+ function expressionInputDirtyCheck(newValue, oldValueOfValue) {
+
+ if (newValue == null || oldValueOfValue == null) { // null/undefined
+ return newValue === oldValueOfValue;
+ }
+
+ if (typeof newValue === 'object') {
+
+ // attempt to convert the value to a primitive type
+ // TODO(docs): add a note to docs that by implementing valueOf even objects and arrays can
+ // be cheaply dirty-checked
+ newValue = getValueOf(newValue);
+
+ if (typeof newValue === 'object') {
+ // objects/arrays are not supported - deep-watching them would be too expensive
+ return false;
+ }
+
+ // fall-through to the primitive equality check
+ }
+
+ //Primitive or NaN
+ return newValue === oldValueOfValue || (newValue !== newValue && oldValueOfValue !== oldValueOfValue);
+ }
+
+ function inputsWatchDelegate(scope, listener, objectEquality, parsedExpression) {
+ var inputExpressions = parsedExpression.$$inputs ||
+ (parsedExpression.$$inputs = collectExpressionInputs(parsedExpression.inputs, []));
+
+ var lastResult;
+
+ if (inputExpressions.length === 1) {
+ var oldInputValue = expressionInputDirtyCheck; // init to something unique so that equals check fails
+ inputExpressions = inputExpressions[0];
+ return scope.$watch(function expressionInputWatch(scope) {
+ var newInputValue = inputExpressions(scope);
+ if (!expressionInputDirtyCheck(newInputValue, oldInputValue)) {
+ lastResult = parsedExpression(scope);
+ oldInputValue = newInputValue && getValueOf(newInputValue);
+ }
+ return lastResult;
+ }, listener, objectEquality);
+ }
+
+ var oldInputValueOfValues = [];
+ for (var i = 0, ii = inputExpressions.length; i < ii; i++) {
+ oldInputValueOfValues[i] = expressionInputDirtyCheck; // init to something unique so that equals check fails
+ }
+
+ return scope.$watch(function expressionInputsWatch(scope) {
+ var changed = false;
+
+ for (var i = 0, ii = inputExpressions.length; i < ii; i++) {
+ var newInputValue = inputExpressions[i](scope);
+ if (changed || (changed = !expressionInputDirtyCheck(newInputValue, oldInputValueOfValues[i]))) {
+ oldInputValueOfValues[i] = newInputValue && getValueOf(newInputValue);
+ }
+ }
+
+ if (changed) {
+ lastResult = parsedExpression(scope);
+ }
+
+ return lastResult;
+ }, listener, objectEquality);
+ }
+
+ function oneTimeWatchDelegate(scope, listener, objectEquality, parsedExpression) {
+ var unwatch, lastValue;
+ return unwatch = scope.$watch(function oneTimeWatch(scope) {
+ return parsedExpression(scope);
+ }, function oneTimeListener(value, old, scope) {
+ lastValue = value;
+ if (isFunction(listener)) {
+ listener.apply(this, arguments);
+ }
+ if (isDefined(value)) {
+ scope.$$postDigest(function() {
+ if (isDefined(lastValue)) {
+ unwatch();
+ }
+ });
+ }
+ }, objectEquality);
+ }
+
+ function oneTimeLiteralWatchDelegate(scope, listener, objectEquality, parsedExpression) {
+ var unwatch, lastValue;
+ return unwatch = scope.$watch(function oneTimeWatch(scope) {
+ return parsedExpression(scope);
+ }, function oneTimeListener(value, old, scope) {
+ lastValue = value;
+ if (isFunction(listener)) {
+ listener.call(this, value, old, scope);
+ }
+ if (isAllDefined(value)) {
+ scope.$$postDigest(function() {
+ if (isAllDefined(lastValue)) unwatch();
+ });
+ }
+ }, objectEquality);
+
+ function isAllDefined(value) {
+ var allDefined = true;
+ forEach(value, function(val) {
+ if (!isDefined(val)) allDefined = false;
+ });
+ return allDefined;
+ }
+ }
+
+ function constantWatchDelegate(scope, listener, objectEquality, parsedExpression) {
+ var unwatch;
+ return unwatch = scope.$watch(function constantWatch(scope) {
+ return parsedExpression(scope);
+ }, function constantListener(value, old, scope) {
+ if (isFunction(listener)) {
+ listener.apply(this, arguments);
+ }
+ unwatch();
+ }, objectEquality);
+ }
+
+ function addInterceptor(parsedExpression, interceptorFn) {
+ if (!interceptorFn) return parsedExpression;
+ var watchDelegate = parsedExpression.$$watchDelegate;
+
+ var regularWatch =
+ watchDelegate !== oneTimeLiteralWatchDelegate &&
+ watchDelegate !== oneTimeWatchDelegate;
+
+ var fn = regularWatch ? function regularInterceptedExpression(scope, locals) {
+ var value = parsedExpression(scope, locals);
+ return interceptorFn(value, scope, locals);
+ } : function oneTimeInterceptedExpression(scope, locals) {
+ var value = parsedExpression(scope, locals);
+ var result = interceptorFn(value, scope, locals);
+ // we only return the interceptor's result if the
+ // initial value is defined (for bind-once)
+ return isDefined(value) ? result : value;
+ };
+
+ // Propagate $$watchDelegates other then inputsWatchDelegate
+ if (parsedExpression.$$watchDelegate &&
+ parsedExpression.$$watchDelegate !== inputsWatchDelegate) {
+ fn.$$watchDelegate = parsedExpression.$$watchDelegate;
+ } else if (!interceptorFn.$stateful) {
+ // If there is an interceptor, but no watchDelegate then treat the interceptor like
+ // we treat filters - it is assumed to be a pure function unless flagged with $stateful
+ fn.$$watchDelegate = inputsWatchDelegate;
+ fn.inputs = [parsedExpression];
+ }
+
+ return fn;
+ }
+ }];
+}
+
+/**
+ * @ngdoc service
+ * @name $q
+ * @requires $rootScope
+ *
+ * @description
+ * A service that helps you run functions asynchronously, and use their return values (or exceptions)
+ * when they are done processing.
+ *
+ * This is an implementation of promises/deferred objects inspired by
+ * [Kris Kowal's Q](https://github.com/kriskowal/q).
+ *
+ * $q can be used in two fashions --- one which is more similar to Kris Kowal's Q or jQuery's Deferred
+ * implementations, and the other which resembles ES6 promises to some degree.
+ *
+ * # $q constructor
+ *
+ * The streamlined ES6 style promise is essentially just using $q as a constructor which takes a `resolver`
+ * function as the first argument. This is similar to the native Promise implementation from ES6 Harmony,
+ * see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).
+ *
+ * While the constructor-style use is supported, not all of the supporting methods from ES6 Harmony promises are
+ * available yet.
+ *
+ * It can be used like so:
+ *
+ * ```js
+ * // for the purpose of this example let's assume that variables `$q` and `okToGreet`
+ * // are available in the current lexical scope (they could have been injected or passed in).
+ *
+ * function asyncGreet(name) {
+ * // perform some asynchronous operation, resolve or reject the promise when appropriate.
+ * return $q(function(resolve, reject) {
+ * setTimeout(function() {
+ * if (okToGreet(name)) {
+ * resolve('Hello, ' + name + '!');
+ * } else {
+ * reject('Greeting ' + name + ' is not allowed.');
+ * }
+ * }, 1000);
+ * });
+ * }
+ *
+ * var promise = asyncGreet('Robin Hood');
+ * promise.then(function(greeting) {
+ * alert('Success: ' + greeting);
+ * }, function(reason) {
+ * alert('Failed: ' + reason);
+ * });
+ * ```
+ *
+ * Note: progress/notify callbacks are not currently supported via the ES6-style interface.
+ *
+ * However, the more traditional CommonJS-style usage is still available, and documented below.
+ *
+ * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an
+ * interface for interacting with an object that represents the result of an action that is
+ * performed asynchronously, and may or may not be finished at any given point in time.
+ *
+ * From the perspective of dealing with error handling, deferred and promise APIs are to
+ * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming.
+ *
+ * ```js
+ * // for the purpose of this example let's assume that variables `$q` and `okToGreet`
+ * // are available in the current lexical scope (they could have been injected or passed in).
+ *
+ * function asyncGreet(name) {
+ * var deferred = $q.defer();
+ *
+ * setTimeout(function() {
+ * deferred.notify('About to greet ' + name + '.');
+ *
+ * if (okToGreet(name)) {
+ * deferred.resolve('Hello, ' + name + '!');
+ * } else {
+ * deferred.reject('Greeting ' + name + ' is not allowed.');
+ * }
+ * }, 1000);
+ *
+ * return deferred.promise;
+ * }
+ *
+ * var promise = asyncGreet('Robin Hood');
+ * promise.then(function(greeting) {
+ * alert('Success: ' + greeting);
+ * }, function(reason) {
+ * alert('Failed: ' + reason);
+ * }, function(update) {
+ * alert('Got notification: ' + update);
+ * });
+ * ```
+ *
+ * At first it might not be obvious why this extra complexity is worth the trouble. The payoff
+ * comes in the way of guarantees that promise and deferred APIs make, see
+ * https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md.
+ *
+ * Additionally the promise api allows for composition that is very hard to do with the
+ * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach.
+ * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the
+ * section on serial or parallel joining of promises.
+ *
+ * # The Deferred API
+ *
+ * A new instance of deferred is constructed by calling `$q.defer()`.
+ *
+ * The purpose of the deferred object is to expose the associated Promise instance as well as APIs
+ * that can be used for signaling the successful or unsuccessful completion, as well as the status
+ * of the task.
+ *
+ * **Methods**
+ *
+ * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection
+ * constructed via `$q.reject`, the promise will be rejected instead.
+ * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to
+ * resolving it with a rejection constructed via `$q.reject`.
+ * - `notify(value)` - provides updates on the status of the promise's execution. This may be called
+ * multiple times before the promise is either resolved or rejected.
+ *
+ * **Properties**
+ *
+ * - promise – `{Promise}` – promise object associated with this deferred.
+ *
+ *
+ * # The Promise API
+ *
+ * A new promise instance is created when a deferred instance is created and can be retrieved by
+ * calling `deferred.promise`.
+ *
+ * The purpose of the promise object is to allow for interested parties to get access to the result
+ * of the deferred task when it completes.
+ *
+ * **Methods**
+ *
+ * - `then(successCallback, errorCallback, notifyCallback)` – regardless of when the promise was or
+ * will be resolved or rejected, `then` calls one of the success or error callbacks asynchronously
+ * as soon as the result is available. The callbacks are called with a single argument: the result
+ * or rejection reason. Additionally, the notify callback may be called zero or more times to
+ * provide a progress indication, before the promise is resolved or rejected.
+ *
+ * This method *returns a new promise* which is resolved or rejected via the return value of the
+ * `successCallback`, `errorCallback`. It also notifies via the return value of the
+ * `notifyCallback` method. The promise cannot be resolved or rejected from the notifyCallback
+ * method.
+ *
+ * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)`
+ *
+ * - `finally(callback, notifyCallback)` – allows you to observe either the fulfillment or rejection of a promise,
+ * but to do so without modifying the final value. This is useful to release resources or do some
+ * clean-up that needs to be done whether the promise was rejected or resolved. See the [full
+ * specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for
+ * more information.
+ *
+ * # Chaining promises
+ *
+ * Because calling the `then` method of a promise returns a new derived promise, it is easily
+ * possible to create a chain of promises:
+ *
+ * ```js
+ * promiseB = promiseA.then(function(result) {
+ * return result + 1;
+ * });
+ *
+ * // promiseB will be resolved immediately after promiseA is resolved and its value
+ * // will be the result of promiseA incremented by 1
+ * ```
+ *
+ * It is possible to create chains of any length and since a promise can be resolved with another
+ * promise (which will defer its resolution further), it is possible to pause/defer resolution of
+ * the promises at any point in the chain. This makes it possible to implement powerful APIs like
+ * $http's response interceptors.
+ *
+ *
+ * # Differences between Kris Kowal's Q and $q
+ *
+ * There are two main differences:
+ *
+ * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation
+ * mechanism in angular, which means faster propagation of resolution or rejection into your
+ * models and avoiding unnecessary browser repaints, which would result in flickering UI.
+ * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains
+ * all the important functionality needed for common async tasks.
+ *
+ * # Testing
+ *
+ * ```js
+ * it('should simulate promise', inject(function($q, $rootScope) {
+ * var deferred = $q.defer();
+ * var promise = deferred.promise;
+ * var resolvedValue;
+ *
+ * promise.then(function(value) { resolvedValue = value; });
+ * expect(resolvedValue).toBeUndefined();
+ *
+ * // Simulate resolving of promise
+ * deferred.resolve(123);
+ * // Note that the 'then' function does not get called synchronously.
+ * // This is because we want the promise API to always be async, whether or not
+ * // it got called synchronously or asynchronously.
+ * expect(resolvedValue).toBeUndefined();
+ *
+ * // Propagate promise resolution to 'then' functions using $apply().
+ * $rootScope.$apply();
+ * expect(resolvedValue).toEqual(123);
+ * }));
+ * ```
+ *
+ * @param {function(function, function)} resolver Function which is responsible for resolving or
+ * rejecting the newly created promise. The first parameter is a function which resolves the
+ * promise, the second parameter is a function which rejects the promise.
+ *
+ * @returns {Promise} The newly created promise.
+ */
+function $QProvider() {
+
+ this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) {
+ return qFactory(function(callback) {
+ $rootScope.$evalAsync(callback);
+ }, $exceptionHandler);
+ }];
+}
+
+function $$QProvider() {
+ this.$get = ['$browser', '$exceptionHandler', function($browser, $exceptionHandler) {
+ return qFactory(function(callback) {
+ $browser.defer(callback);
+ }, $exceptionHandler);
+ }];
+}
+
+/**
+ * Constructs a promise manager.
+ *
+ * @param {function(function)} nextTick Function for executing functions in the next turn.
+ * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for
+ * debugging purposes.
+ * @returns {object} Promise manager.
+ */
+function qFactory(nextTick, exceptionHandler) {
+ var $qMinErr = minErr('$q', TypeError);
+ function callOnce(self, resolveFn, rejectFn) {
+ var called = false;
+ function wrap(fn) {
+ return function(value) {
+ if (called) return;
+ called = true;
+ fn.call(self, value);
+ };
+ }
+
+ return [wrap(resolveFn), wrap(rejectFn)];
+ }
+
+ /**
+ * @ngdoc method
+ * @name ng.$q#defer
+ * @kind function
+ *
+ * @description
+ * Creates a `Deferred` object which represents a task which will finish in the future.
+ *
+ * @returns {Deferred} Returns a new instance of deferred.
+ */
+ var defer = function() {
+ return new Deferred();
+ };
+
+ function Promise() {
+ this.$$state = { status: 0 };
+ }
+
+ Promise.prototype = {
+ then: function(onFulfilled, onRejected, progressBack) {
+ var result = new Deferred();
+
+ this.$$state.pending = this.$$state.pending || [];
+ this.$$state.pending.push([result, onFulfilled, onRejected, progressBack]);
+ if (this.$$state.status > 0) scheduleProcessQueue(this.$$state);
+
+ return result.promise;
+ },
+
+ "catch": function(callback) {
+ return this.then(null, callback);
+ },
+
+ "finally": function(callback, progressBack) {
+ return this.then(function(value) {
+ return handleCallback(value, true, callback);
+ }, function(error) {
+ return handleCallback(error, false, callback);
+ }, progressBack);
+ }
+ };
+
+ //Faster, more basic than angular.bind http://jsperf.com/angular-bind-vs-custom-vs-native
+ function simpleBind(context, fn) {
+ return function(value) {
+ fn.call(context, value);
+ };
+ }
+
+ function processQueue(state) {
+ var fn, promise, pending;
+
+ pending = state.pending;
+ state.processScheduled = false;
+ state.pending = undefined;
+ for (var i = 0, ii = pending.length; i < ii; ++i) {
+ promise = pending[i][0];
+ fn = pending[i][state.status];
+ try {
+ if (isFunction(fn)) {
+ promise.resolve(fn(state.value));
+ } else if (state.status === 1) {
+ promise.resolve(state.value);
+ } else {
+ promise.reject(state.value);
+ }
+ } catch (e) {
+ promise.reject(e);
+ exceptionHandler(e);
+ }
+ }
+ }
+
+ function scheduleProcessQueue(state) {
+ if (state.processScheduled || !state.pending) return;
+ state.processScheduled = true;
+ nextTick(function() { processQueue(state); });
+ }
+
+ function Deferred() {
+ this.promise = new Promise();
+ //Necessary to support unbound execution :/
+ this.resolve = simpleBind(this, this.resolve);
+ this.reject = simpleBind(this, this.reject);
+ this.notify = simpleBind(this, this.notify);
+ }
+
+ Deferred.prototype = {
+ resolve: function(val) {
+ if (this.promise.$$state.status) return;
+ if (val === this.promise) {
+ this.$$reject($qMinErr(
+ 'qcycle',
+ "Expected promise to be resolved with value other than itself '{0}'",
+ val));
+ }
+ else {
+ this.$$resolve(val);
+ }
+
+ },
+
+ $$resolve: function(val) {
+ var then, fns;
+
+ fns = callOnce(this, this.$$resolve, this.$$reject);
+ try {
+ if ((isObject(val) || isFunction(val))) then = val && val.then;
+ if (isFunction(then)) {
+ this.promise.$$state.status = -1;
+ then.call(val, fns[0], fns[1], this.notify);
+ } else {
+ this.promise.$$state.value = val;
+ this.promise.$$state.status = 1;
+ scheduleProcessQueue(this.promise.$$state);
+ }
+ } catch (e) {
+ fns[1](e);
+ exceptionHandler(e);
+ }
+ },
+
+ reject: function(reason) {
+ if (this.promise.$$state.status) return;
+ this.$$reject(reason);
+ },
+
+ $$reject: function(reason) {
+ this.promise.$$state.value = reason;
+ this.promise.$$state.status = 2;
+ scheduleProcessQueue(this.promise.$$state);
+ },
+
+ notify: function(progress) {
+ var callbacks = this.promise.$$state.pending;
+
+ if ((this.promise.$$state.status <= 0) && callbacks && callbacks.length) {
+ nextTick(function() {
+ var callback, result;
+ for (var i = 0, ii = callbacks.length; i < ii; i++) {
+ result = callbacks[i][0];
+ callback = callbacks[i][3];
+ try {
+ result.notify(isFunction(callback) ? callback(progress) : progress);
+ } catch (e) {
+ exceptionHandler(e);
+ }
+ }
+ });
+ }
+ }
+ };
+
+ /**
+ * @ngdoc method
+ * @name $q#reject
+ * @kind function
+ *
+ * @description
+ * Creates a promise that is resolved as rejected with the specified `reason`. This api should be
+ * used to forward rejection in a chain of promises. If you are dealing with the last promise in
+ * a promise chain, you don't need to worry about it.
+ *
+ * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of
+ * `reject` as the `throw` keyword in JavaScript. This also means that if you "catch" an error via
+ * a promise error callback and you want to forward the error to the promise derived from the
+ * current promise, you have to "rethrow" the error by returning a rejection constructed via
+ * `reject`.
+ *
+ * ```js
+ * promiseB = promiseA.then(function(result) {
+ * // success: do something and resolve promiseB
+ * // with the old or a new result
+ * return result;
+ * }, function(reason) {
+ * // error: handle the error if possible and
+ * // resolve promiseB with newPromiseOrValue,
+ * // otherwise forward the rejection to promiseB
+ * if (canHandle(reason)) {
+ * // handle the error and recover
+ * return newPromiseOrValue;
+ * }
+ * return $q.reject(reason);
+ * });
+ * ```
+ *
+ * @param {*} reason Constant, message, exception or an object representing the rejection reason.
+ * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`.
+ */
+ var reject = function(reason) {
+ var result = new Deferred();
+ result.reject(reason);
+ return result.promise;
+ };
+
+ var makePromise = function makePromise(value, resolved) {
+ var result = new Deferred();
+ if (resolved) {
+ result.resolve(value);
+ } else {
+ result.reject(value);
+ }
+ return result.promise;
+ };
+
+ var handleCallback = function handleCallback(value, isResolved, callback) {
+ var callbackOutput = null;
+ try {
+ if (isFunction(callback)) callbackOutput = callback();
+ } catch (e) {
+ return makePromise(e, false);
+ }
+ if (isPromiseLike(callbackOutput)) {
+ return callbackOutput.then(function() {
+ return makePromise(value, isResolved);
+ }, function(error) {
+ return makePromise(error, false);
+ });
+ } else {
+ return makePromise(value, isResolved);
+ }
+ };
+
+ /**
+ * @ngdoc method
+ * @name $q#when
+ * @kind function
+ *
+ * @description
+ * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise.
+ * This is useful when you are dealing with an object that might or might not be a promise, or if
+ * the promise comes from a source that can't be trusted.
+ *
+ * @param {*} value Value or a promise
+ * @returns {Promise} Returns a promise of the passed value or promise
+ */
+
+
+ var when = function(value, callback, errback, progressBack) {
+ var result = new Deferred();
+ result.resolve(value);
+ return result.promise.then(callback, errback, progressBack);
+ };
+
+ /**
+ * @ngdoc method
+ * @name $q#all
+ * @kind function
+ *
+ * @description
+ * Combines multiple promises into a single promise that is resolved when all of the input
+ * promises are resolved.
+ *
+ * @param {Array.<Promise>|Object.<Promise>} promises An array or hash of promises.
+ * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values,
+ * each value corresponding to the promise at the same index/key in the `promises` array/hash.
+ * If any of the promises is resolved with a rejection, this resulting promise will be rejected
+ * with the same rejection value.
+ */
+
+ function all(promises) {
+ var deferred = new Deferred(),
+ counter = 0,
+ results = isArray(promises) ? [] : {};
+
+ forEach(promises, function(promise, key) {
+ counter++;
+ when(promise).then(function(value) {
+ if (results.hasOwnProperty(key)) return;
+ results[key] = value;
+ if (!(--counter)) deferred.resolve(results);
+ }, function(reason) {
+ if (results.hasOwnProperty(key)) return;
+ deferred.reject(reason);
+ });
+ });
+
+ if (counter === 0) {
+ deferred.resolve(results);
+ }
+
+ return deferred.promise;
+ }
+
+ var $Q = function Q(resolver) {
+ if (!isFunction(resolver)) {
+ throw $qMinErr('norslvr', "Expected resolverFn, got '{0}'", resolver);
+ }
+
+ if (!(this instanceof Q)) {
+ // More useful when $Q is the Promise itself.
+ return new Q(resolver);
+ }
+
+ var deferred = new Deferred();
+
+ function resolveFn(value) {
+ deferred.resolve(value);
+ }
+
+ function rejectFn(reason) {
+ deferred.reject(reason);
+ }
+
+ resolver(resolveFn, rejectFn);
+
+ return deferred.promise;
+ };
+
+ $Q.defer = defer;
+ $Q.reject = reject;
+ $Q.when = when;
+ $Q.all = all;
+
+ return $Q;
+}
+
+function $$RAFProvider() { //rAF
+ this.$get = ['$window', '$timeout', function($window, $timeout) {
+ var requestAnimationFrame = $window.requestAnimationFrame ||
+ $window.webkitRequestAnimationFrame ||
+ $window.mozRequestAnimationFrame;
+
+ var cancelAnimationFrame = $window.cancelAnimationFrame ||
+ $window.webkitCancelAnimationFrame ||
+ $window.mozCancelAnimationFrame ||
+ $window.webkitCancelRequestAnimationFrame;
+
+ var rafSupported = !!requestAnimationFrame;
+ var raf = rafSupported
+ ? function(fn) {
+ var id = requestAnimationFrame(fn);
+ return function() {
+ cancelAnimationFrame(id);
+ };
+ }
+ : function(fn) {
+ var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666
+ return function() {
+ $timeout.cancel(timer);
+ };
+ };
+
+ raf.supported = rafSupported;
+
+ return raf;
+ }];
+}
+
+/**
+ * DESIGN NOTES
+ *
+ * The design decisions behind the scope are heavily favored for speed and memory consumption.
+ *
+ * The typical use of scope is to watch the expressions, which most of the time return the same
+ * value as last time so we optimize the operation.
+ *
+ * Closures construction is expensive in terms of speed as well as memory:
+ * - No closures, instead use prototypical inheritance for API
+ * - Internal state needs to be stored on scope directly, which means that private state is
+ * exposed as $$____ properties
+ *
+ * Loop operations are optimized by using while(count--) { ... }
+ * - this means that in order to keep the same order of execution as addition we have to add
+ * items to the array at the beginning (unshift) instead of at the end (push)
+ *
+ * Child scopes are created and removed often
+ * - Using an array would be slow since inserts in middle are expensive so we use linked list
+ *
+ * There are few watches then a lot of observers. This is why you don't want the observer to be
+ * implemented in the same way as watch. Watch requires return of initialization function which
+ * are expensive to construct.
+ */
+
+
+/**
+ * @ngdoc provider
+ * @name $rootScopeProvider
+ * @description
+ *
+ * Provider for the $rootScope service.
+ */
+
+/**
+ * @ngdoc method
+ * @name $rootScopeProvider#digestTtl
+ * @description
+ *
+ * Sets the number of `$digest` iterations the scope should attempt to execute before giving up and
+ * assuming that the model is unstable.
+ *
+ * The current default is 10 iterations.
+ *
+ * In complex applications it's possible that the dependencies between `$watch`s will result in
+ * several digest iterations. However if an application needs more than the default 10 digest
+ * iterations for its model to stabilize then you should investigate what is causing the model to
+ * continuously change during the digest.
+ *
+ * Increasing the TTL could have performance implications, so you should not change it without
+ * proper justification.
+ *
+ * @param {number} limit The number of digest iterations.
+ */
+
+
+/**
+ * @ngdoc service
+ * @name $rootScope
+ * @description
+ *
+ * Every application has a single root {@link ng.$rootScope.Scope scope}.
+ * All other scopes are descendant scopes of the root scope. Scopes provide separation
+ * between the model and the view, via a mechanism for watching the model for changes.
+ * They also provide an event emission/broadcast and subscription facility. See the
+ * {@link guide/scope developer guide on scopes}.
+ */
+function $RootScopeProvider() {
+ var TTL = 10;
+ var $rootScopeMinErr = minErr('$rootScope');
+ var lastDirtyWatch = null;
+ var applyAsyncId = null;
+
+ this.digestTtl = function(value) {
+ if (arguments.length) {
+ TTL = value;
+ }
+ return TTL;
+ };
+
+ this.$get = ['$injector', '$exceptionHandler', '$parse', '$browser',
+ function($injector, $exceptionHandler, $parse, $browser) {
+
+ /**
+ * @ngdoc type
+ * @name $rootScope.Scope
+ *
+ * @description
+ * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the
+ * {@link auto.$injector $injector}. Child scopes are created using the
+ * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when
+ * compiled HTML template is executed.)
+ *
+ * Here is a simple scope snippet to show how you can interact with the scope.
+ * ```html
+ * <file src="./test/ng/rootScopeSpec.js" tag="docs1" />
+ * ```
+ *
+ * # Inheritance
+ * A scope can inherit from a parent scope, as in this example:
+ * ```js
+ var parent = $rootScope;
+ var child = parent.$new();
+
+ parent.salutation = "Hello";
+ child.name = "World";
+ expect(child.salutation).toEqual('Hello');
+
+ child.salutation = "Welcome";
+ expect(child.salutation).toEqual('Welcome');
+ expect(parent.salutation).toEqual('Hello');
+ * ```
+ *
+ * When interacting with `Scope` in tests, additional helper methods are available on the
+ * instances of `Scope` type. See {@link ngMock.$rootScope.Scope ngMock Scope} for additional
+ * details.
+ *
+ *
+ * @param {Object.<string, function()>=} providers Map of service factory which need to be
+ * provided for the current scope. Defaults to {@link ng}.
+ * @param {Object.<string, *>=} instanceCache Provides pre-instantiated services which should
+ * append/override services provided by `providers`. This is handy
+ * when unit-testing and having the need to override a default
+ * service.
+ * @returns {Object} Newly created scope.
+ *
+ */
+ function Scope() {
+ this.$id = nextUid();
+ this.$$phase = this.$parent = this.$$watchers =
+ this.$$nextSibling = this.$$prevSibling =
+ this.$$childHead = this.$$childTail = null;
+ this.$root = this;
+ this.$$destroyed = false;
+ this.$$listeners = {};
+ this.$$listenerCount = {};
+ this.$$isolateBindings = null;
+ }
+
+ /**
+ * @ngdoc property
+ * @name $rootScope.Scope#$id
+ *
+ * @description
+ * Unique scope ID (monotonically increasing) useful for debugging.
+ */
+
+ /**
+ * @ngdoc property
+ * @name $rootScope.Scope#$parent
+ *
+ * @description
+ * Reference to the parent scope.
+ */
+
+ /**
+ * @ngdoc property
+ * @name $rootScope.Scope#$root
+ *
+ * @description
+ * Reference to the root scope.
+ */
+
+ Scope.prototype = {
+ constructor: Scope,
+ /**
+ * @ngdoc method
+ * @name $rootScope.Scope#$new
+ * @kind function
+ *
+ * @description
+ * Creates a new child {@link ng.$rootScope.Scope scope}.
+ *
+ * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} event.
+ * The scope can be removed from the scope hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}.
+ *
+ * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is
+ * desired for the scope and its child scopes to be permanently detached from the parent and
+ * thus stop participating in model change detection and listener notification by invoking.
+ *
+ * @param {boolean} isolate If true, then the scope does not prototypically inherit from the
+ * parent scope. The scope is isolated, as it can not see parent scope properties.
+ * When creating widgets, it is useful for the widget to not accidentally read parent
+ * state.
+ *
+ * @param {Scope} [parent=this] The {@link ng.$rootScope.Scope `Scope`} that will be the `$parent`
+ * of the newly created scope. Defaults to `this` scope if not provided.
+ * This is used when creating a transclude scope to correctly place it
+ * in the scope hierarchy while maintaining the correct prototypical
+ * inheritance.
+ *
+ * @returns {Object} The newly created child scope.
+ *
+ */
+ $new: function(isolate, parent) {
+ var child;
+
+ parent = parent || this;
+
+ if (isolate) {
+ child = new Scope();
+ child.$root = this.$root;
+ } else {
+ // Only create a child scope class if somebody asks for one,
+ // but cache it to allow the VM to optimize lookups.
+ if (!this.$$ChildScope) {
+ this.$$ChildScope = function ChildScope() {
+ this.$$watchers = this.$$nextSibling =
+ this.$$childHead = this.$$childTail = null;
+ this.$$listeners = {};
+ this.$$listenerCount = {};
+ this.$id = nextUid();
+ this.$$ChildScope = null;
+ };
+ this.$$ChildScope.prototype = this;
+ }
+ child = new this.$$ChildScope();
+ }
+ child.$parent = parent;
+ child.$$prevSibling = parent.$$childTail;
+ if (parent.$$childHead) {
+ parent.$$childTail.$$nextSibling = child;
+ parent.$$childTail = child;
+ } else {
+ parent.$$childHead = parent.$$childTail = child;
+ }
+
+ // When the new scope is not isolated or we inherit from `this`, and
+ // the parent scope is destroyed, the property `$$destroyed` is inherited
+ // prototypically. In all other cases, this property needs to be set
+ // when the parent scope is destroyed.
+ // The listener needs to be added after the parent is set
+ if (isolate || parent != this) child.$on('$destroy', destroyChild);
+
+ return child;
+
+ function destroyChild() {
+ child.$$destroyed = true;
+ }
+ },
+
+ /**
+ * @ngdoc method
+ * @name $rootScope.Scope#$watch
+ * @kind function
+ *
+ * @description
+ * Registers a `listener` callback to be executed whenever the `watchExpression` changes.
+ *
+ * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest
+ * $digest()} and should return the value that will be watched. (Since
+ * {@link ng.$rootScope.Scope#$digest $digest()} reruns when it detects changes the
+ * `watchExpression` can execute multiple times per
+ * {@link ng.$rootScope.Scope#$digest $digest()} and should be idempotent.)
+ * - The `listener` is called only when the value from the current `watchExpression` and the
+ * previous call to `watchExpression` are not equal (with the exception of the initial run,
+ * see below). Inequality is determined according to reference inequality,
+ * [strict comparison](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators)
+ * via the `!==` Javascript operator, unless `objectEquality == true`
+ * (see next point)
+ * - When `objectEquality == true`, inequality of the `watchExpression` is determined
+ * according to the {@link angular.equals} function. To save the value of the object for
+ * later comparison, the {@link angular.copy} function is used. This therefore means that
+ * watching complex objects will have adverse memory and performance implications.
+ * - The watch `listener` may change the model, which may trigger other `listener`s to fire.
+ * This is achieved by rerunning the watchers until no changes are detected. The rerun
+ * iteration limit is 10 to prevent an infinite loop deadlock.
+ *
+ *
+ * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called,
+ * you can register a `watchExpression` function with no `listener`. (Since `watchExpression`
+ * can execute multiple times per {@link ng.$rootScope.Scope#$digest $digest} cycle when a
+ * change is detected, be prepared for multiple calls to your listener.)
+ *
+ * After a watcher is registered with the scope, the `listener` fn is called asynchronously
+ * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the
+ * watcher. In rare cases, this is undesirable because the listener is called when the result
+ * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you
+ * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the
+ * listener was called due to initialization.
+ *
+ *
+ *
+ * # Example
+ * ```js
+ // let's assume that scope was dependency injected as the $rootScope
+ var scope = $rootScope;
+ scope.name = 'misko';
+ scope.counter = 0;
+
+ expect(scope.counter).toEqual(0);
+ scope.$watch('name', function(newValue, oldValue) {
+ scope.counter = scope.counter + 1;
+ });
+ expect(scope.counter).toEqual(0);
+
+ scope.$digest();
+ // the listener is always called during the first $digest loop after it was registered
+ expect(scope.counter).toEqual(1);
+
+ scope.$digest();
+ // but now it will not be called unless the value changes
+ expect(scope.counter).toEqual(1);
+
+ scope.name = 'adam';
+ scope.$digest();
+ expect(scope.counter).toEqual(2);
+
+
+
+ // Using a function as a watchExpression
+ var food;
+ scope.foodCounter = 0;
+ expect(scope.foodCounter).toEqual(0);
+ scope.$watch(
+ // This function returns the value being watched. It is called for each turn of the $digest loop
+ function() { return food; },
+ // This is the change listener, called when the value returned from the above function changes
+ function(newValue, oldValue) {
+ if ( newValue !== oldValue ) {
+ // Only increment the counter if the value changed
+ scope.foodCounter = scope.foodCounter + 1;
+ }
+ }
+ );
+ // No digest has been run so the counter will be zero
+ expect(scope.foodCounter).toEqual(0);
+
+ // Run the digest but since food has not changed count will still be zero
+ scope.$digest();
+ expect(scope.foodCounter).toEqual(0);
+
+ // Update food and run digest. Now the counter will increment
+ food = 'cheeseburger';
+ scope.$digest();
+ expect(scope.foodCounter).toEqual(1);
+
+ * ```
+ *
+ *
+ *
+ * @param {(function()|string)} watchExpression Expression that is evaluated on each
+ * {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers
+ * a call to the `listener`.
+ *
+ * - `string`: Evaluated as {@link guide/expression expression}
+ * - `function(scope)`: called with current `scope` as a parameter.
+ * @param {function(newVal, oldVal, scope)} listener Callback called whenever the value
+ * of `watchExpression` changes.
+ *
+ * - `newVal` contains the current value of the `watchExpression`
+ * - `oldVal` contains the previous value of the `watchExpression`
+ * - `scope` refers to the current scope
+ * @param {boolean=} objectEquality Compare for object equality using {@link angular.equals} instead of
+ * comparing for reference equality.
+ * @returns {function()} Returns a deregistration function for this listener.
+ */
+ $watch: function(watchExp, listener, objectEquality) {
+ var get = $parse(watchExp);
+
+ if (get.$$watchDelegate) {
+ return get.$$watchDelegate(this, listener, objectEquality, get);
+ }
+ var scope = this,
+ array = scope.$$watchers,
+ watcher = {
+ fn: listener,
+ last: initWatchVal,
+ get: get,
+ exp: watchExp,
+ eq: !!objectEquality
+ };
+
+ lastDirtyWatch = null;
+
+ if (!isFunction(listener)) {
+ watcher.fn = noop;
+ }
+
+ if (!array) {
+ array = scope.$$watchers = [];
+ }
+ // we use unshift since we use a while loop in $digest for speed.
+ // the while loop reads in reverse order.
+ array.unshift(watcher);
+
+ return function deregisterWatch() {
+ arrayRemove(array, watcher);
+ lastDirtyWatch = null;
+ };
+ },
+
+ /**
+ * @ngdoc method
+ * @name $rootScope.Scope#$watchGroup
+ * @kind function
+ *
+ * @description
+ * A variant of {@link ng.$rootScope.Scope#$watch $watch()} where it watches an array of `watchExpressions`.
+ * If any one expression in the collection changes the `listener` is executed.
+ *
+ * - The items in the `watchExpressions` array are observed via standard $watch operation and are examined on every
+ * call to $digest() to see if any items changes.
+ * - The `listener` is called whenever any expression in the `watchExpressions` array changes.
+ *
+ * @param {Array.<string|Function(scope)>} watchExpressions Array of expressions that will be individually
+ * watched using {@link ng.$rootScope.Scope#$watch $watch()}
+ *
+ * @param {function(newValues, oldValues, scope)} listener Callback called whenever the return value of any
+ * expression in `watchExpressions` changes
+ * The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching
+ * those of `watchExpression`
+ * and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching
+ * those of `watchExpression`
+ * The `scope` refers to the current scope.
+ * @returns {function()} Returns a de-registration function for all listeners.
+ */
+ $watchGroup: function(watchExpressions, listener) {
+ var oldValues = new Array(watchExpressions.length);
+ var newValues = new Array(watchExpressions.length);
+ var deregisterFns = [];
+ var self = this;
+ var changeReactionScheduled = false;
+ var firstRun = true;
+
+ if (!watchExpressions.length) {
+ // No expressions means we call the listener ASAP
+ var shouldCall = true;
+ self.$evalAsync(function() {
+ if (shouldCall) listener(newValues, newValues, self);
+ });
+ return function deregisterWatchGroup() {
+ shouldCall = false;
+ };
+ }
+
+ if (watchExpressions.length === 1) {
+ // Special case size of one
+ return this.$watch(watchExpressions[0], function watchGroupAction(value, oldValue, scope) {
+ newValues[0] = value;
+ oldValues[0] = oldValue;
+ listener(newValues, (value === oldValue) ? newValues : oldValues, scope);
+ });
+ }
+
+ forEach(watchExpressions, function(expr, i) {
+ var unwatchFn = self.$watch(expr, function watchGroupSubAction(value, oldValue) {
+ newValues[i] = value;
+ oldValues[i] = oldValue;
+ if (!changeReactionScheduled) {
+ changeReactionScheduled = true;
+ self.$evalAsync(watchGroupAction);
+ }
+ });
+ deregisterFns.push(unwatchFn);
+ });
+
+ function watchGroupAction() {
+ changeReactionScheduled = false;
+
+ if (firstRun) {
+ firstRun = false;
+ listener(newValues, newValues, self);
+ } else {
+ listener(newValues, oldValues, self);
+ }
+ }
+
+ return function deregisterWatchGroup() {
+ while (deregisterFns.length) {
+ deregisterFns.shift()();
+ }
+ };
+ },
+
+
+ /**
+ * @ngdoc method
+ * @name $rootScope.Scope#$watchCollection
+ * @kind function
+ *
+ * @description
+ * Shallow watches the properties of an object and fires whenever any of the properties change
+ * (for arrays, this implies watching the array items; for object maps, this implies watching
+ * the properties). If a change is detected, the `listener` callback is fired.
+ *
+ * - The `obj` collection is observed via standard $watch operation and is examined on every
+ * call to $digest() to see if any items have been added, removed, or moved.
+ * - The `listener` is called whenever anything within the `obj` has changed. Examples include
+ * adding, removing, and moving items belonging to an object or array.
+ *
+ *
+ * # Example
+ * ```js
+ $scope.names = ['igor', 'matias', 'misko', 'james'];
+ $scope.dataCount = 4;
+
+ $scope.$watchCollection('names', function(newNames, oldNames) {
+ $scope.dataCount = newNames.length;
+ });
+
+ expect($scope.dataCount).toEqual(4);
+ $scope.$digest();
+
+ //still at 4 ... no changes
+ expect($scope.dataCount).toEqual(4);
+
+ $scope.names.pop();
+ $scope.$digest();
+
+ //now there's been a change
+ expect($scope.dataCount).toEqual(3);
+ * ```
+ *
+ *
+ * @param {string|function(scope)} obj Evaluated as {@link guide/expression expression}. The
+ * expression value should evaluate to an object or an array which is observed on each
+ * {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the
+ * collection will trigger a call to the `listener`.
+ *
+ * @param {function(newCollection, oldCollection, scope)} listener a callback function called
+ * when a change is detected.
+ * - The `newCollection` object is the newly modified data obtained from the `obj` expression
+ * - The `oldCollection` object is a copy of the former collection data.
+ * Due to performance considerations, the`oldCollection` value is computed only if the
+ * `listener` function declares two or more arguments.
+ * - The `scope` argument refers to the current scope.
+ *
+ * @returns {function()} Returns a de-registration function for this listener. When the
+ * de-registration function is executed, the internal watch operation is terminated.
+ */
+ $watchCollection: function(obj, listener) {
+ $watchCollectionInterceptor.$stateful = true;
+
+ var self = this;
+ // the current value, updated on each dirty-check run
+ var newValue;
+ // a shallow copy of the newValue from the last dirty-check run,
+ // updated to match newValue during dirty-check run
+ var oldValue;
+ // a shallow copy of the newValue from when the last change happened
+ var veryOldValue;
+ // only track veryOldValue if the listener is asking for it
+ var trackVeryOldValue = (listener.length > 1);
+ var changeDetected = 0;
+ var changeDetector = $parse(obj, $watchCollectionInterceptor);
+ var internalArray = [];
+ var internalObject = {};
+ var initRun = true;
+ var oldLength = 0;
+
+ function $watchCollectionInterceptor(_value) {
+ newValue = _value;
+ var newLength, key, bothNaN, newItem, oldItem;
+
+ // If the new value is undefined, then return undefined as the watch may be a one-time watch
+ if (isUndefined(newValue)) return;
+
+ if (!isObject(newValue)) { // if primitive
+ if (oldValue !== newValue) {
+ oldValue = newValue;
+ changeDetected++;
+ }
+ } else if (isArrayLike(newValue)) {
+ if (oldValue !== internalArray) {
+ // we are transitioning from something which was not an array into array.
+ oldValue = internalArray;
+ oldLength = oldValue.length = 0;
+ changeDetected++;
+ }
+
+ newLength = newValue.length;
+
+ if (oldLength !== newLength) {
+ // if lengths do not match we need to trigger change notification
+ changeDetected++;
+ oldValue.length = oldLength = newLength;
+ }
+ // copy the items to oldValue and look for changes.
+ for (var i = 0; i < newLength; i++) {
+ oldItem = oldValue[i];
+ newItem = newValue[i];
+
+ bothNaN = (oldItem !== oldItem) && (newItem !== newItem);
+ if (!bothNaN && (oldItem !== newItem)) {
+ changeDetected++;
+ oldValue[i] = newItem;
+ }
+ }
+ } else {
+ if (oldValue !== internalObject) {
+ // we are transitioning from something which was not an object into object.
+ oldValue = internalObject = {};
+ oldLength = 0;
+ changeDetected++;
+ }
+ // copy the items to oldValue and look for changes.
+ newLength = 0;
+ for (key in newValue) {
+ if (newValue.hasOwnProperty(key)) {
+ newLength++;
+ newItem = newValue[key];
+ oldItem = oldValue[key];
+
+ if (key in oldValue) {
+ bothNaN = (oldItem !== oldItem) && (newItem !== newItem);
+ if (!bothNaN && (oldItem !== newItem)) {
+ changeDetected++;
+ oldValue[key] = newItem;
+ }
+ } else {
+ oldLength++;
+ oldValue[key] = newItem;
+ changeDetected++;
+ }
+ }
+ }
+ if (oldLength > newLength) {
+ // we used to have more keys, need to find them and destroy them.
+ changeDetected++;
+ for (key in oldValue) {
+ if (!newValue.hasOwnProperty(key)) {
+ oldLength--;
+ delete oldValue[key];
+ }
+ }
+ }
+ }
+ return changeDetected;
+ }
+
+ function $watchCollectionAction() {
+ if (initRun) {
+ initRun = false;
+ listener(newValue, newValue, self);
+ } else {
+ listener(newValue, veryOldValue, self);
+ }
+
+ // make a copy for the next time a collection is changed
+ if (trackVeryOldValue) {
+ if (!isObject(newValue)) {
+ //primitive
+ veryOldValue = newValue;
+ } else if (isArrayLike(newValue)) {
+ veryOldValue = new Array(newValue.length);
+ for (var i = 0; i < newValue.length; i++) {
+ veryOldValue[i] = newValue[i];
+ }
+ } else { // if object
+ veryOldValue = {};
+ for (var key in newValue) {
+ if (hasOwnProperty.call(newValue, key)) {
+ veryOldValue[key] = newValue[key];
+ }
+ }
+ }
+ }
+ }
+
+ return this.$watch(changeDetector, $watchCollectionAction);
+ },
+
+ /**
+ * @ngdoc method
+ * @name $rootScope.Scope#$digest
+ * @kind function
+ *
+ * @description
+ * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and
+ * its children. Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change
+ * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers}
+ * until no more listeners are firing. This means that it is possible to get into an infinite
+ * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of
+ * iterations exceeds 10.
+ *
+ * Usually, you don't call `$digest()` directly in
+ * {@link ng.directive:ngController controllers} or in
+ * {@link ng.$compileProvider#directive directives}.
+ * Instead, you should call {@link ng.$rootScope.Scope#$apply $apply()} (typically from within
+ * a {@link ng.$compileProvider#directive directive}), which will force a `$digest()`.
+ *
+ * If you want to be notified whenever `$digest()` is called,
+ * you can register a `watchExpression` function with
+ * {@link ng.$rootScope.Scope#$watch $watch()} with no `listener`.
+ *
+ * In unit tests, you may need to call `$digest()` to simulate the scope life cycle.
+ *
+ * # Example
+ * ```js
+ var scope = ...;
+ scope.name = 'misko';
+ scope.counter = 0;
+
+ expect(scope.counter).toEqual(0);
+ scope.$watch('name', function(newValue, oldValue) {
+ scope.counter = scope.counter + 1;
+ });
+ expect(scope.counter).toEqual(0);
+
+ scope.$digest();
+ // the listener is always called during the first $digest loop after it was registered
+ expect(scope.counter).toEqual(1);
+
+ scope.$digest();
+ // but now it will not be called unless the value changes
+ expect(scope.counter).toEqual(1);
+
+ scope.name = 'adam';
+ scope.$digest();
+ expect(scope.counter).toEqual(2);
+ * ```
+ *
+ */
+ $digest: function() {
+ var watch, value, last,
+ watchers,
+ length,
+ dirty, ttl = TTL,
+ next, current, target = this,
+ watchLog = [],
+ logIdx, logMsg, asyncTask;
+
+ beginPhase('$digest');
+ // Check for changes to browser url that happened in sync before the call to $digest
+ $browser.$$checkUrlChange();
+
+ if (this === $rootScope && applyAsyncId !== null) {
+ // If this is the root scope, and $applyAsync has scheduled a deferred $apply(), then
+ // cancel the scheduled $apply and flush the queue of expressions to be evaluated.
+ $browser.defer.cancel(applyAsyncId);
+ flushApplyAsync();
+ }
+
+ lastDirtyWatch = null;
+
+ do { // "while dirty" loop
+ dirty = false;
+ current = target;
+
+ while (asyncQueue.length) {
+ try {
+ asyncTask = asyncQueue.shift();
+ asyncTask.scope.$eval(asyncTask.expression);
+ } catch (e) {
+ $exceptionHandler(e);
+ }
+ lastDirtyWatch = null;
+ }
+
+ traverseScopesLoop:
+ do { // "traverse the scopes" loop
+ if ((watchers = current.$$watchers)) {
+ // process our watches
+ length = watchers.length;
+ while (length--) {
+ try {
+ watch = watchers[length];
+ // Most common watches are on primitives, in which case we can short
+ // circuit it with === operator, only when === fails do we use .equals
+ if (watch) {
+ if ((value = watch.get(current)) !== (last = watch.last) &&
+ !(watch.eq
+ ? equals(value, last)
+ : (typeof value === 'number' && typeof last === 'number'
+ && isNaN(value) && isNaN(last)))) {
+ dirty = true;
+ lastDirtyWatch = watch;
+ watch.last = watch.eq ? copy(value, null) : value;
+ watch.fn(value, ((last === initWatchVal) ? value : last), current);
+ if (ttl < 5) {
+ logIdx = 4 - ttl;
+ if (!watchLog[logIdx]) watchLog[logIdx] = [];
+ watchLog[logIdx].push({
+ msg: isFunction(watch.exp) ? 'fn: ' + (watch.exp.name || watch.exp.toString()) : watch.exp,
+ newVal: value,
+ oldVal: last
+ });
+ }
+ } else if (watch === lastDirtyWatch) {
+ // If the most recently dirty watcher is now clean, short circuit since the remaining watchers
+ // have already been tested.
+ dirty = false;
+ break traverseScopesLoop;
+ }
+ }
+ } catch (e) {
+ $exceptionHandler(e);
+ }
+ }
+ }
+
+ // Insanity Warning: scope depth-first traversal
+ // yes, this code is a bit crazy, but it works and we have tests to prove it!
+ // this piece should be kept in sync with the traversal in $broadcast
+ if (!(next = (current.$$childHead ||
+ (current !== target && current.$$nextSibling)))) {
+ while (current !== target && !(next = current.$$nextSibling)) {
+ current = current.$parent;
+ }
+ }
+ } while ((current = next));
+
+ // `break traverseScopesLoop;` takes us to here
+
+ if ((dirty || asyncQueue.length) && !(ttl--)) {
+ clearPhase();
+ throw $rootScopeMinErr('infdig',
+ '{0} $digest() iterations reached. Aborting!\n' +
+ 'Watchers fired in the last 5 iterations: {1}',
+ TTL, watchLog);
+ }
+
+ } while (dirty || asyncQueue.length);
+
+ clearPhase();
+
+ while (postDigestQueue.length) {
+ try {
+ postDigestQueue.shift()();
+ } catch (e) {
+ $exceptionHandler(e);
+ }
+ }
+ },
+
+
+ /**
+ * @ngdoc event
+ * @name $rootScope.Scope#$destroy
+ * @eventType broadcast on scope being destroyed
+ *
+ * @description
+ * Broadcasted when a scope and its children are being destroyed.
+ *
+ * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to
+ * clean up DOM bindings before an element is removed from the DOM.
+ */
+
+ /**
+ * @ngdoc method
+ * @name $rootScope.Scope#$destroy
+ * @kind function
+ *
+ * @description
+ * Removes the current scope (and all of its children) from the parent scope. Removal implies
+ * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer
+ * propagate to the current scope and its children. Removal also implies that the current
+ * scope is eligible for garbage collection.
+ *
+ * The `$destroy()` is usually used by directives such as
+ * {@link ng.directive:ngRepeat ngRepeat} for managing the
+ * unrolling of the loop.
+ *
+ * Just before a scope is destroyed, a `$destroy` event is broadcasted on this scope.
+ * Application code can register a `$destroy` event handler that will give it a chance to
+ * perform any necessary cleanup.
+ *
+ * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to
+ * clean up DOM bindings before an element is removed from the DOM.
+ */
+ $destroy: function() {
+ // we can't destroy the root scope or a scope that has been already destroyed
+ if (this.$$destroyed) return;
+ var parent = this.$parent;
+
+ this.$broadcast('$destroy');
+ this.$$destroyed = true;
+ if (this === $rootScope) return;
+
+ for (var eventName in this.$$listenerCount) {
+ decrementListenerCount(this, this.$$listenerCount[eventName], eventName);
+ }
+
+ // sever all the references to parent scopes (after this cleanup, the current scope should
+ // not be retained by any of our references and should be eligible for garbage collection)
+ if (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling;
+ if (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling;
+ if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling;
+ if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling;
+
+ // Disable listeners, watchers and apply/digest methods
+ this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = noop;
+ this.$on = this.$watch = this.$watchGroup = function() { return noop; };
+ this.$$listeners = {};
+
+ // All of the code below is bogus code that works around V8's memory leak via optimized code
+ // and inline caches.
+ //
+ // see:
+ // - https://code.google.com/p/v8/issues/detail?id=2073#c26
+ // - https://github.com/angular/angular.js/issues/6794#issuecomment-38648909
+ // - https://github.com/angular/angular.js/issues/1313#issuecomment-10378451
+
+ this.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead =
+ this.$$childTail = this.$root = this.$$watchers = null;
+ },
+
+ /**
+ * @ngdoc method
+ * @name $rootScope.Scope#$eval
+ * @kind function
+ *
+ * @description
+ * Executes the `expression` on the current scope and returns the result. Any exceptions in
+ * the expression are propagated (uncaught). This is useful when evaluating Angular
+ * expressions.
+ *
+ * # Example
+ * ```js
+ var scope = ng.$rootScope.Scope();
+ scope.a = 1;
+ scope.b = 2;
+
+ expect(scope.$eval('a+b')).toEqual(3);
+ expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3);
+ * ```
+ *
+ * @param {(string|function())=} expression An angular expression to be executed.
+ *
+ * - `string`: execute using the rules as defined in {@link guide/expression expression}.
+ * - `function(scope)`: execute the function with the current `scope` parameter.
+ *
+ * @param {(object)=} locals Local variables object, useful for overriding values in scope.
+ * @returns {*} The result of evaluating the expression.
+ */
+ $eval: function(expr, locals) {
+ return $parse(expr)(this, locals);
+ },
+
+ /**
+ * @ngdoc method
+ * @name $rootScope.Scope#$evalAsync
+ * @kind function
+ *
+ * @description
+ * Executes the expression on the current scope at a later point in time.
+ *
+ * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only
+ * that:
+ *
+ * - it will execute after the function that scheduled the evaluation (preferably before DOM
+ * rendering).
+ * - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after
+ * `expression` execution.
+ *
+ * Any exceptions from the execution of the expression are forwarded to the
+ * {@link ng.$exceptionHandler $exceptionHandler} service.
+ *
+ * __Note:__ if this function is called outside of a `$digest` cycle, a new `$digest` cycle
+ * will be scheduled. However, it is encouraged to always call code that changes the model
+ * from within an `$apply` call. That includes code evaluated via `$evalAsync`.
+ *
+ * @param {(string|function())=} expression An angular expression to be executed.
+ *
+ * - `string`: execute using the rules as defined in {@link guide/expression expression}.
+ * - `function(scope)`: execute the function with the current `scope` parameter.
+ *
+ */
+ $evalAsync: function(expr) {
+ // if we are outside of an $digest loop and this is the first time we are scheduling async
+ // task also schedule async auto-flush
+ if (!$rootScope.$$phase && !asyncQueue.length) {
+ $browser.defer(function() {
+ if (asyncQueue.length) {
+ $rootScope.$digest();
+ }
+ });
+ }
+
+ asyncQueue.push({scope: this, expression: expr});
+ },
+
+ $$postDigest: function(fn) {
+ postDigestQueue.push(fn);
+ },
+
+ /**
+ * @ngdoc method
+ * @name $rootScope.Scope#$apply
+ * @kind function
+ *
+ * @description
+ * `$apply()` is used to execute an expression in angular from outside of the angular
+ * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries).
+ * Because we are calling into the angular framework we need to perform proper scope life
+ * cycle of {@link ng.$exceptionHandler exception handling},
+ * {@link ng.$rootScope.Scope#$digest executing watches}.
+ *
+ * ## Life cycle
+ *
+ * # Pseudo-Code of `$apply()`
+ * ```js
+ function $apply(expr) {
+ try {
+ return $eval(expr);
+ } catch (e) {
+ $exceptionHandler(e);
+ } finally {
+ $root.$digest();
+ }
+ }
+ * ```
+ *
+ *
+ * Scope's `$apply()` method transitions through the following stages:
+ *
+ * 1. The {@link guide/expression expression} is executed using the
+ * {@link ng.$rootScope.Scope#$eval $eval()} method.
+ * 2. Any exceptions from the execution of the expression are forwarded to the
+ * {@link ng.$exceptionHandler $exceptionHandler} service.
+ * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the
+ * expression was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method.
+ *
+ *
+ * @param {(string|function())=} exp An angular expression to be executed.
+ *
+ * - `string`: execute using the rules as defined in {@link guide/expression expression}.
+ * - `function(scope)`: execute the function with current `scope` parameter.
+ *
+ * @returns {*} The result of evaluating the expression.
+ */
+ $apply: function(expr) {
+ try {
+ beginPhase('$apply');
+ return this.$eval(expr);
+ } catch (e) {
+ $exceptionHandler(e);
+ } finally {
+ clearPhase();
+ try {
+ $rootScope.$digest();
+ } catch (e) {
+ $exceptionHandler(e);
+ throw e;
+ }
+ }
+ },
+
+ /**
+ * @ngdoc method
+ * @name $rootScope.Scope#$applyAsync
+ * @kind function
+ *
+ * @description
+ * Schedule the invokation of $apply to occur at a later time. The actual time difference
+ * varies across browsers, but is typically around ~10 milliseconds.
+ *
+ * This can be used to queue up multiple expressions which need to be evaluated in the same
+ * digest.
+ *
+ * @param {(string|function())=} exp An angular expression to be executed.
+ *
+ * - `string`: execute using the rules as defined in {@link guide/expression expression}.
+ * - `function(scope)`: execute the function with current `scope` parameter.
+ */
+ $applyAsync: function(expr) {
+ var scope = this;
+ expr && applyAsyncQueue.push($applyAsyncExpression);
+ scheduleApplyAsync();
+
+ function $applyAsyncExpression() {
+ scope.$eval(expr);
+ }
+ },
+
+ /**
+ * @ngdoc method
+ * @name $rootScope.Scope#$on
+ * @kind function
+ *
+ * @description
+ * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for
+ * discussion of event life cycle.
+ *
+ * The event listener function format is: `function(event, args...)`. The `event` object
+ * passed into the listener has the following attributes:
+ *
+ * - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or
+ * `$broadcast`-ed.
+ * - `currentScope` - `{Scope}`: the scope that is currently handling the event. Once the
+ * event propagates through the scope hierarchy, this property is set to null.
+ * - `name` - `{string}`: name of the event.
+ * - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel
+ * further event propagation (available only for events that were `$emit`-ed).
+ * - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag
+ * to true.
+ * - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called.
+ *
+ * @param {string} name Event name to listen on.
+ * @param {function(event, ...args)} listener Function to call when the event is emitted.
+ * @returns {function()} Returns a deregistration function for this listener.
+ */
+ $on: function(name, listener) {
+ var namedListeners = this.$$listeners[name];
+ if (!namedListeners) {
+ this.$$listeners[name] = namedListeners = [];
+ }
+ namedListeners.push(listener);
+
+ var current = this;
+ do {
+ if (!current.$$listenerCount[name]) {
+ current.$$listenerCount[name] = 0;
+ }
+ current.$$listenerCount[name]++;
+ } while ((current = current.$parent));
+
+ var self = this;
+ return function() {
+ var indexOfListener = namedListeners.indexOf(listener);
+ if (indexOfListener !== -1) {
+ namedListeners[indexOfListener] = null;
+ decrementListenerCount(self, 1, name);
+ }
+ };
+ },
+
+
+ /**
+ * @ngdoc method
+ * @name $rootScope.Scope#$emit
+ * @kind function
+ *
+ * @description
+ * Dispatches an event `name` upwards through the scope hierarchy notifying the
+ * registered {@link ng.$rootScope.Scope#$on} listeners.
+ *
+ * The event life cycle starts at the scope on which `$emit` was called. All
+ * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get
+ * notified. Afterwards, the event traverses upwards toward the root scope and calls all
+ * registered listeners along the way. The event will stop propagating if one of the listeners
+ * cancels it.
+ *
+ * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed
+ * onto the {@link ng.$exceptionHandler $exceptionHandler} service.
+ *
+ * @param {string} name Event name to emit.
+ * @param {...*} args Optional one or more arguments which will be passed onto the event listeners.
+ * @return {Object} Event object (see {@link ng.$rootScope.Scope#$on}).
+ */
+ $emit: function(name, args) {
+ var empty = [],
+ namedListeners,
+ scope = this,
+ stopPropagation = false,
+ event = {
+ name: name,
+ targetScope: scope,
+ stopPropagation: function() {stopPropagation = true;},
+ preventDefault: function() {
+ event.defaultPrevented = true;
+ },
+ defaultPrevented: false
+ },
+ listenerArgs = concat([event], arguments, 1),
+ i, length;
+
+ do {
+ namedListeners = scope.$$listeners[name] || empty;
+ event.currentScope = scope;
+ for (i = 0, length = namedListeners.length; i < length; i++) {
+
+ // if listeners were deregistered, defragment the array
+ if (!namedListeners[i]) {
+ namedListeners.splice(i, 1);
+ i--;
+ length--;
+ continue;
+ }
+ try {
+ //allow all listeners attached to the current scope to run
+ namedListeners[i].apply(null, listenerArgs);
+ } catch (e) {
+ $exceptionHandler(e);
+ }
+ }
+ //if any listener on the current scope stops propagation, prevent bubbling
+ if (stopPropagation) {
+ event.currentScope = null;
+ return event;
+ }
+ //traverse upwards
+ scope = scope.$parent;
+ } while (scope);
+
+ event.currentScope = null;
+
+ return event;
+ },
+
+
+ /**
+ * @ngdoc method
+ * @name $rootScope.Scope#$broadcast
+ * @kind function
+ *
+ * @description
+ * Dispatches an event `name` downwards to all child scopes (and their children) notifying the
+ * registered {@link ng.$rootScope.Scope#$on} listeners.
+ *
+ * The event life cycle starts at the scope on which `$broadcast` was called. All
+ * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get
+ * notified. Afterwards, the event propagates to all direct and indirect scopes of the current
+ * scope and calls all registered listeners along the way. The event cannot be canceled.
+ *
+ * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed
+ * onto the {@link ng.$exceptionHandler $exceptionHandler} service.
+ *
+ * @param {string} name Event name to broadcast.
+ * @param {...*} args Optional one or more arguments which will be passed onto the event listeners.
+ * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on}
+ */
+ $broadcast: function(name, args) {
+ var target = this,
+ current = target,
+ next = target,
+ event = {
+ name: name,
+ targetScope: target,
+ preventDefault: function() {
+ event.defaultPrevented = true;
+ },
+ defaultPrevented: false
+ };
+
+ if (!target.$$listenerCount[name]) return event;
+
+ var listenerArgs = concat([event], arguments, 1),
+ listeners, i, length;
+
+ //down while you can, then up and next sibling or up and next sibling until back at root
+ while ((current = next)) {
+ event.currentScope = current;
+ listeners = current.$$listeners[name] || [];
+ for (i = 0, length = listeners.length; i < length; i++) {
+ // if listeners were deregistered, defragment the array
+ if (!listeners[i]) {
+ listeners.splice(i, 1);
+ i--;
+ length--;
+ continue;
+ }
+
+ try {
+ listeners[i].apply(null, listenerArgs);
+ } catch (e) {
+ $exceptionHandler(e);
+ }
+ }
+
+ // Insanity Warning: scope depth-first traversal
+ // yes, this code is a bit crazy, but it works and we have tests to prove it!
+ // this piece should be kept in sync with the traversal in $digest
+ // (though it differs due to having the extra check for $$listenerCount)
+ if (!(next = ((current.$$listenerCount[name] && current.$$childHead) ||
+ (current !== target && current.$$nextSibling)))) {
+ while (current !== target && !(next = current.$$nextSibling)) {
+ current = current.$parent;
+ }
+ }
+ }
+
+ event.currentScope = null;
+ return event;
+ }
+ };
+
+ var $rootScope = new Scope();
+
+ //The internal queues. Expose them on the $rootScope for debugging/testing purposes.
+ var asyncQueue = $rootScope.$$asyncQueue = [];
+ var postDigestQueue = $rootScope.$$postDigestQueue = [];
+ var applyAsyncQueue = $rootScope.$$applyAsyncQueue = [];
+
+ return $rootScope;
+
+
+ function beginPhase(phase) {
+ if ($rootScope.$$phase) {
+ throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase);
+ }
+
+ $rootScope.$$phase = phase;
+ }
+
+ function clearPhase() {
+ $rootScope.$$phase = null;
+ }
+
+
+ function decrementListenerCount(current, count, name) {
+ do {
+ current.$$listenerCount[name] -= count;
+
+ if (current.$$listenerCount[name] === 0) {
+ delete current.$$listenerCount[name];
+ }
+ } while ((current = current.$parent));
+ }
+
+ /**
+ * function used as an initial value for watchers.
+ * because it's unique we can easily tell it apart from other values
+ */
+ function initWatchVal() {}
+
+ function flushApplyAsync() {
+ while (applyAsyncQueue.length) {
+ try {
+ applyAsyncQueue.shift()();
+ } catch (e) {
+ $exceptionHandler(e);
+ }
+ }
+ applyAsyncId = null;
+ }
+
+ function scheduleApplyAsync() {
+ if (applyAsyncId === null) {
+ applyAsyncId = $browser.defer(function() {
+ $rootScope.$apply(flushApplyAsync);
+ });
+ }
+ }
+ }];
+}
+
+/**
+ * @description
+ * Private service to sanitize uris for links and images. Used by $compile and $sanitize.
+ */
+function $$SanitizeUriProvider() {
+ var aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/,
+ imgSrcSanitizationWhitelist = /^\s*((https?|ftp|file|blob):|data:image\/)/;
+
+ /**
+ * @description
+ * Retrieves or overrides the default regular expression that is used for whitelisting of safe
+ * urls during a[href] sanitization.
+ *
+ * The sanitization is a security measure aimed at prevent XSS attacks via html links.
+ *
+ * Any url about to be assigned to a[href] via data-binding is first normalized and turned into
+ * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`
+ * regular expression. If a match is found, the original url is written into the dom. Otherwise,
+ * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.
+ *
+ * @param {RegExp=} regexp New regexp to whitelist urls with.
+ * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for
+ * chaining otherwise.
+ */
+ this.aHrefSanitizationWhitelist = function(regexp) {
+ if (isDefined(regexp)) {
+ aHrefSanitizationWhitelist = regexp;
+ return this;
+ }
+ return aHrefSanitizationWhitelist;
+ };
+
+
+ /**
+ * @description
+ * Retrieves or overrides the default regular expression that is used for whitelisting of safe
+ * urls during img[src] sanitization.
+ *
+ * The sanitization is a security measure aimed at prevent XSS attacks via html links.
+ *
+ * Any url about to be assigned to img[src] via data-binding is first normalized and turned into
+ * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist`
+ * regular expression. If a match is found, the original url is written into the dom. Otherwise,
+ * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.
+ *
+ * @param {RegExp=} regexp New regexp to whitelist urls with.
+ * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for
+ * chaining otherwise.
+ */
+ this.imgSrcSanitizationWhitelist = function(regexp) {
+ if (isDefined(regexp)) {
+ imgSrcSanitizationWhitelist = regexp;
+ return this;
+ }
+ return imgSrcSanitizationWhitelist;
+ };
+
+ this.$get = function() {
+ return function sanitizeUri(uri, isImage) {
+ var regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist;
+ var normalizedVal;
+ normalizedVal = urlResolve(uri).href;
+ if (normalizedVal !== '' && !normalizedVal.match(regex)) {
+ return 'unsafe:' + normalizedVal;
+ }
+ return uri;
+ };
+ };
+}
+
+var $sceMinErr = minErr('$sce');
+
+var SCE_CONTEXTS = {
+ HTML: 'html',
+ CSS: 'css',
+ URL: 'url',
+ // RESOURCE_URL is a subtype of URL used in contexts where a privileged resource is sourced from a
+ // url. (e.g. ng-include, script src, templateUrl)
+ RESOURCE_URL: 'resourceUrl',
+ JS: 'js'
+};
+
+// Helper functions follow.
+
+function adjustMatcher(matcher) {
+ if (matcher === 'self') {
+ return matcher;
+ } else if (isString(matcher)) {
+ // Strings match exactly except for 2 wildcards - '*' and '**'.
+ // '*' matches any character except those from the set ':/.?&'.
+ // '**' matches any character (like .* in a RegExp).
+ // More than 2 *'s raises an error as it's ill defined.
+ if (matcher.indexOf('***') > -1) {
+ throw $sceMinErr('iwcard',
+ 'Illegal sequence *** in string matcher. String: {0}', matcher);
+ }
+ matcher = escapeForRegexp(matcher).
+ replace('\\*\\*', '.*').
+ replace('\\*', '[^:/.?&;]*');
+ return new RegExp('^' + matcher + '$');
+ } else if (isRegExp(matcher)) {
+ // The only other type of matcher allowed is a Regexp.
+ // Match entire URL / disallow partial matches.
+ // Flags are reset (i.e. no global, ignoreCase or multiline)
+ return new RegExp('^' + matcher.source + '$');
+ } else {
+ throw $sceMinErr('imatcher',
+ 'Matchers may only be "self", string patterns or RegExp objects');
+ }
+}
+
+
+function adjustMatchers(matchers) {
+ var adjustedMatchers = [];
+ if (isDefined(matchers)) {
+ forEach(matchers, function(matcher) {
+ adjustedMatchers.push(adjustMatcher(matcher));
+ });
+ }
+ return adjustedMatchers;
+}
+
+
+/**
+ * @ngdoc service
+ * @name $sceDelegate
+ * @kind function
+ *
+ * @description
+ *
+ * `$sceDelegate` is a service that is used by the `$sce` service to provide {@link ng.$sce Strict
+ * Contextual Escaping (SCE)} services to AngularJS.
+ *
+ * Typically, you would configure or override the {@link ng.$sceDelegate $sceDelegate} instead of
+ * the `$sce` service to customize the way Strict Contextual Escaping works in AngularJS. This is
+ * because, while the `$sce` provides numerous shorthand methods, etc., you really only need to
+ * override 3 core functions (`trustAs`, `getTrusted` and `valueOf`) to replace the way things
+ * work because `$sce` delegates to `$sceDelegate` for these operations.
+ *
+ * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} to configure this service.
+ *
+ * The default instance of `$sceDelegate` should work out of the box with little pain. While you
+ * can override it completely to change the behavior of `$sce`, the common case would
+ * involve configuring the {@link ng.$sceDelegateProvider $sceDelegateProvider} instead by setting
+ * your own whitelists and blacklists for trusting URLs used for loading AngularJS resources such as
+ * templates. Refer {@link ng.$sceDelegateProvider#resourceUrlWhitelist
+ * $sceDelegateProvider.resourceUrlWhitelist} and {@link
+ * ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist}
+ */
+
+/**
+ * @ngdoc provider
+ * @name $sceDelegateProvider
+ * @description
+ *
+ * The `$sceDelegateProvider` provider allows developers to configure the {@link ng.$sceDelegate
+ * $sceDelegate} service. This allows one to get/set the whitelists and blacklists used to ensure
+ * that the URLs used for sourcing Angular templates are safe. Refer {@link
+ * ng.$sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist} and
+ * {@link ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist}
+ *
+ * For the general details about this service in Angular, read the main page for {@link ng.$sce
+ * Strict Contextual Escaping (SCE)}.
+ *
+ * **Example**: Consider the following case. <a name="example"></a>
+ *
+ * - your app is hosted at url `http://myapp.example.com/`
+ * - but some of your templates are hosted on other domains you control such as
+ * `http://srv01.assets.example.com/`,  `http://srv02.assets.example.com/`, etc.
+ * - and you have an open redirect at `http://myapp.example.com/clickThru?...`.
+ *
+ * Here is what a secure configuration for this scenario might look like:
+ *
+ * ```
+ * angular.module('myApp', []).config(function($sceDelegateProvider) {
+ * $sceDelegateProvider.resourceUrlWhitelist([
+ * // Allow same origin resource loads.
+ * 'self',
+ * // Allow loading from our assets domain. Notice the difference between * and **.
+ * 'http://srv*.assets.example.com/**'
+ * ]);
+ *
+ * // The blacklist overrides the whitelist so the open redirect here is blocked.
+ * $sceDelegateProvider.resourceUrlBlacklist([
+ * 'http://myapp.example.com/clickThru**'
+ * ]);
+ * });
+ * ```
+ */
+
+function $SceDelegateProvider() {
+ this.SCE_CONTEXTS = SCE_CONTEXTS;
+
+ // Resource URLs can also be trusted by policy.
+ var resourceUrlWhitelist = ['self'],
+ resourceUrlBlacklist = [];
+
+ /**
+ * @ngdoc method
+ * @name $sceDelegateProvider#resourceUrlWhitelist
+ * @kind function
+ *
+ * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value
+ * provided. This must be an array or null. A snapshot of this array is used so further
+ * changes to the array are ignored.
+ *
+ * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items
+ * allowed in this array.
+ *
+ * Note: **an empty whitelist array will block all URLs**!
+ *
+ * @return {Array} the currently set whitelist array.
+ *
+ * The **default value** when no whitelist has been explicitly set is `['self']` allowing only
+ * same origin resource requests.
+ *
+ * @description
+ * Sets/Gets the whitelist of trusted resource URLs.
+ */
+ this.resourceUrlWhitelist = function(value) {
+ if (arguments.length) {
+ resourceUrlWhitelist = adjustMatchers(value);
+ }
+ return resourceUrlWhitelist;
+ };
+
+ /**
+ * @ngdoc method
+ * @name $sceDelegateProvider#resourceUrlBlacklist
+ * @kind function
+ *
+ * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value
+ * provided. This must be an array or null. A snapshot of this array is used so further
+ * changes to the array are ignored.
+ *
+ * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items
+ * allowed in this array.
+ *
+ * The typical usage for the blacklist is to **block
+ * [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as
+ * these would otherwise be trusted but actually return content from the redirected domain.
+ *
+ * Finally, **the blacklist overrides the whitelist** and has the final say.
+ *
+ * @return {Array} the currently set blacklist array.
+ *
+ * The **default value** when no whitelist has been explicitly set is the empty array (i.e. there
+ * is no blacklist.)
+ *
+ * @description
+ * Sets/Gets the blacklist of trusted resource URLs.
+ */
+
+ this.resourceUrlBlacklist = function(value) {
+ if (arguments.length) {
+ resourceUrlBlacklist = adjustMatchers(value);
+ }
+ return resourceUrlBlacklist;
+ };
+
+ this.$get = ['$injector', function($injector) {
+
+ var htmlSanitizer = function htmlSanitizer(html) {
+ throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');
+ };
+
+ if ($injector.has('$sanitize')) {
+ htmlSanitizer = $injector.get('$sanitize');
+ }
+
+
+ function matchUrl(matcher, parsedUrl) {
+ if (matcher === 'self') {
+ return urlIsSameOrigin(parsedUrl);
+ } else {
+ // definitely a regex. See adjustMatchers()
+ return !!matcher.exec(parsedUrl.href);
+ }
+ }
+
+ function isResourceUrlAllowedByPolicy(url) {
+ var parsedUrl = urlResolve(url.toString());
+ var i, n, allowed = false;
+ // Ensure that at least one item from the whitelist allows this url.
+ for (i = 0, n = resourceUrlWhitelist.length; i < n; i++) {
+ if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) {
+ allowed = true;
+ break;
+ }
+ }
+ if (allowed) {
+ // Ensure that no item from the blacklist blocked this url.
+ for (i = 0, n = resourceUrlBlacklist.length; i < n; i++) {
+ if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) {
+ allowed = false;
+ break;
+ }
+ }
+ }
+ return allowed;
+ }
+
+ function generateHolderType(Base) {
+ var holderType = function TrustedValueHolderType(trustedValue) {
+ this.$$unwrapTrustedValue = function() {
+ return trustedValue;
+ };
+ };
+ if (Base) {
+ holderType.prototype = new Base();
+ }
+ holderType.prototype.valueOf = function sceValueOf() {
+ return this.$$unwrapTrustedValue();
+ };
+ holderType.prototype.toString = function sceToString() {
+ return this.$$unwrapTrustedValue().toString();
+ };
+ return holderType;
+ }
+
+ var trustedValueHolderBase = generateHolderType(),
+ byType = {};
+
+ byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase);
+ byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase);
+ byType[SCE_CONTEXTS.URL] = generateHolderType(trustedValueHolderBase);
+ byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase);
+ byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]);
+
+ /**
+ * @ngdoc method
+ * @name $sceDelegate#trustAs
+ *
+ * @description
+ * Returns an object that is trusted by angular for use in specified strict
+ * contextual escaping contexts (such as ng-bind-html, ng-include, any src
+ * attribute interpolation, any dom event binding attribute interpolation
+ * such as for onclick, etc.) that uses the provided value.
+ * See {@link ng.$sce $sce} for enabling strict contextual escaping.
+ *
+ * @param {string} type The kind of context in which this value is safe for use. e.g. url,
+ * resourceUrl, html, js and css.
+ * @param {*} value The value that that should be considered trusted/safe.
+ * @returns {*} A value that can be used to stand in for the provided `value` in places
+ * where Angular expects a $sce.trustAs() return value.
+ */
+ function trustAs(type, trustedValue) {
+ var Constructor = (byType.hasOwnProperty(type) ? byType[type] : null);
+ if (!Constructor) {
+ throw $sceMinErr('icontext',
+ 'Attempted to trust a value in invalid context. Context: {0}; Value: {1}',
+ type, trustedValue);
+ }
+ if (trustedValue === null || trustedValue === undefined || trustedValue === '') {
+ return trustedValue;
+ }
+ // All the current contexts in SCE_CONTEXTS happen to be strings. In order to avoid trusting
+ // mutable objects, we ensure here that the value passed in is actually a string.
+ if (typeof trustedValue !== 'string') {
+ throw $sceMinErr('itype',
+ 'Attempted to trust a non-string value in a content requiring a string: Context: {0}',
+ type);
+ }
+ return new Constructor(trustedValue);
+ }
+
+ /**
+ * @ngdoc method
+ * @name $sceDelegate#valueOf
+ *
+ * @description
+ * If the passed parameter had been returned by a prior call to {@link ng.$sceDelegate#trustAs
+ * `$sceDelegate.trustAs`}, returns the value that had been passed to {@link
+ * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}.
+ *
+ * If the passed parameter is not a value that had been returned by {@link
+ * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}, returns it as-is.
+ *
+ * @param {*} value The result of a prior {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}
+ * call or anything else.
+ * @returns {*} The `value` that was originally provided to {@link ng.$sceDelegate#trustAs
+ * `$sceDelegate.trustAs`} if `value` is the result of such a call. Otherwise, returns
+ * `value` unchanged.
+ */
+ function valueOf(maybeTrusted) {
+ if (maybeTrusted instanceof trustedValueHolderBase) {
+ return maybeTrusted.$$unwrapTrustedValue();
+ } else {
+ return maybeTrusted;
+ }
+ }
+
+ /**
+ * @ngdoc method
+ * @name $sceDelegate#getTrusted
+ *
+ * @description
+ * Takes the result of a {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} call and
+ * returns the originally supplied value if the queried context type is a supertype of the
+ * created type. If this condition isn't satisfied, throws an exception.
+ *
+ * @param {string} type The kind of context in which this value is to be used.
+ * @param {*} maybeTrusted The result of a prior {@link ng.$sceDelegate#trustAs
+ * `$sceDelegate.trustAs`} call.
+ * @returns {*} The value the was originally provided to {@link ng.$sceDelegate#trustAs
+ * `$sceDelegate.trustAs`} if valid in this context. Otherwise, throws an exception.
+ */
+ function getTrusted(type, maybeTrusted) {
+ if (maybeTrusted === null || maybeTrusted === undefined || maybeTrusted === '') {
+ return maybeTrusted;
+ }
+ var constructor = (byType.hasOwnProperty(type) ? byType[type] : null);
+ if (constructor && maybeTrusted instanceof constructor) {
+ return maybeTrusted.$$unwrapTrustedValue();
+ }
+ // If we get here, then we may only take one of two actions.
+ // 1. sanitize the value for the requested type, or
+ // 2. throw an exception.
+ if (type === SCE_CONTEXTS.RESOURCE_URL) {
+ if (isResourceUrlAllowedByPolicy(maybeTrusted)) {
+ return maybeTrusted;
+ } else {
+ throw $sceMinErr('insecurl',
+ 'Blocked loading resource from url not allowed by $sceDelegate policy. URL: {0}',
+ maybeTrusted.toString());
+ }
+ } else if (type === SCE_CONTEXTS.HTML) {
+ return htmlSanitizer(maybeTrusted);
+ }
+ throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');
+ }
+
+ return { trustAs: trustAs,
+ getTrusted: getTrusted,
+ valueOf: valueOf };
+ }];
+}
+
+
+/**
+ * @ngdoc provider
+ * @name $sceProvider
+ * @description
+ *
+ * The $sceProvider provider allows developers to configure the {@link ng.$sce $sce} service.
+ * - enable/disable Strict Contextual Escaping (SCE) in a module
+ * - override the default implementation with a custom delegate
+ *
+ * Read more about {@link ng.$sce Strict Contextual Escaping (SCE)}.
+ */
+
+/* jshint maxlen: false*/
+
+/**
+ * @ngdoc service
+ * @name $sce
+ * @kind function
+ *
+ * @description
+ *
+ * `$sce` is a service that provides Strict Contextual Escaping services to AngularJS.
+ *
+ * # Strict Contextual Escaping
+ *
+ * Strict Contextual Escaping (SCE) is a mode in which AngularJS requires bindings in certain
+ * contexts to result in a value that is marked as safe to use for that context. One example of
+ * such a context is binding arbitrary html controlled by the user via `ng-bind-html`. We refer
+ * to these contexts as privileged or SCE contexts.
+ *
+ * As of version 1.2, Angular ships with SCE enabled by default.
+ *
+ * Note: When enabled (the default), IE<11 in quirks mode is not supported. In this mode, IE<11 allow
+ * one to execute arbitrary javascript by the use of the expression() syntax. Refer
+ * <http://blogs.msdn.com/b/ie/archive/2008/10/16/ending-expressions.aspx> to learn more about them.
+ * You can ensure your document is in standards mode and not quirks mode by adding `<!doctype html>`
+ * to the top of your HTML document.
+ *
+ * SCE assists in writing code in way that (a) is secure by default and (b) makes auditing for
+ * security vulnerabilities such as XSS, clickjacking, etc. a lot easier.
+ *
+ * Here's an example of a binding in a privileged context:
+ *
+ * ```
+ * <input ng-model="userHtml">
+ * <div ng-bind-html="userHtml"></div>
+ * ```
+ *
+ * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user. With SCE
+ * disabled, this application allows the user to render arbitrary HTML into the DIV.
+ * In a more realistic example, one may be rendering user comments, blog articles, etc. via
+ * bindings. (HTML is just one example of a context where rendering user controlled input creates
+ * security vulnerabilities.)
+ *
+ * For the case of HTML, you might use a library, either on the client side, or on the server side,
+ * to sanitize unsafe HTML before binding to the value and rendering it in the document.
+ *
+ * How would you ensure that every place that used these types of bindings was bound to a value that
+ * was sanitized by your library (or returned as safe for rendering by your server?) How can you
+ * ensure that you didn't accidentally delete the line that sanitized the value, or renamed some
+ * properties/fields and forgot to update the binding to the sanitized value?
+ *
+ * To be secure by default, you want to ensure that any such bindings are disallowed unless you can
+ * determine that something explicitly says it's safe to use a value for binding in that
+ * context. You can then audit your code (a simple grep would do) to ensure that this is only done
+ * for those values that you can easily tell are safe - because they were received from your server,
+ * sanitized by your library, etc. You can organize your codebase to help with this - perhaps
+ * allowing only the files in a specific directory to do this. Ensuring that the internal API
+ * exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task.
+ *
+ * In the case of AngularJS' SCE service, one uses {@link ng.$sce#trustAs $sce.trustAs}
+ * (and shorthand methods such as {@link ng.$sce#trustAsHtml $sce.trustAsHtml}, etc.) to
+ * obtain values that will be accepted by SCE / privileged contexts.
+ *
+ *
+ * ## How does it work?
+ *
+ * In privileged contexts, directives and code will bind to the result of {@link ng.$sce#getTrusted
+ * $sce.getTrusted(context, value)} rather than to the value directly. Directives use {@link
+ * ng.$sce#parseAs $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs the
+ * {@link ng.$sce#getTrusted $sce.getTrusted} behind the scenes on non-constant literals.
+ *
+ * As an example, {@link ng.directive:ngBindHtml ngBindHtml} uses {@link
+ * ng.$sce#parseAsHtml $sce.parseAsHtml(binding expression)}. Here's the actual code (slightly
+ * simplified):
+ *
+ * ```
+ * var ngBindHtmlDirective = ['$sce', function($sce) {
+ * return function(scope, element, attr) {
+ * scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) {
+ * element.html(value || '');
+ * });
+ * };
+ * }];
+ * ```
+ *
+ * ## Impact on loading templates
+ *
+ * This applies both to the {@link ng.directive:ngInclude `ng-include`} directive as well as
+ * `templateUrl`'s specified by {@link guide/directive directives}.
+ *
+ * By default, Angular only loads templates from the same domain and protocol as the application
+ * document. This is done by calling {@link ng.$sce#getTrustedResourceUrl
+ * $sce.getTrustedResourceUrl} on the template URL. To load templates from other domains and/or
+ * protocols, you may either either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist
+ * them} or {@link ng.$sce#trustAsResourceUrl wrap it} into a trusted value.
+ *
+ * *Please note*:
+ * The browser's
+ * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest)
+ * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/)
+ * policy apply in addition to this and may further restrict whether the template is successfully
+ * loaded. This means that without the right CORS policy, loading templates from a different domain
+ * won't work on all browsers. Also, loading templates from `file://` URL does not work on some
+ * browsers.
+ *
+ * ## This feels like too much overhead
+ *
+ * It's important to remember that SCE only applies to interpolation expressions.
+ *
+ * If your expressions are constant literals, they're automatically trusted and you don't need to
+ * call `$sce.trustAs` on them (remember to include the `ngSanitize` module) (e.g.
+ * `<div ng-bind-html="'<b>implicitly trusted</b>'"></div>`) just works.
+ *
+ * Additionally, `a[href]` and `img[src]` automatically sanitize their URLs and do not pass them
+ * through {@link ng.$sce#getTrusted $sce.getTrusted}. SCE doesn't play a role here.
+ *
+ * The included {@link ng.$sceDelegate $sceDelegate} comes with sane defaults to allow you to load
+ * templates in `ng-include` from your application's domain without having to even know about SCE.
+ * It blocks loading templates from other domains or loading templates over http from an https
+ * served document. You can change these by setting your own custom {@link
+ * ng.$sceDelegateProvider#resourceUrlWhitelist whitelists} and {@link
+ * ng.$sceDelegateProvider#resourceUrlBlacklist blacklists} for matching such URLs.
+ *
+ * This significantly reduces the overhead. It is far easier to pay the small overhead and have an
+ * application that's secure and can be audited to verify that with much more ease than bolting
+ * security onto an application later.
+ *
+ * <a name="contexts"></a>
+ * ## What trusted context types are supported?
+ *
+ * | Context | Notes |
+ * |---------------------|----------------|
+ * | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. |
+ * | `$sce.CSS` | For CSS that's safe to source into the application. Currently unused. Feel free to use it in your own directives. |
+ * | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`<a href=` and `<img src=` sanitize their urls and don't constitute an SCE context. |
+ * | `$sce.RESOURCE_URL` | For URLs that are not only safe to follow as links, but whose contents are also safe to include in your application. Examples include `ng-include`, `src` / `ngSrc` bindings for tags other than `IMG` (e.g. `IFRAME`, `OBJECT`, etc.) <br><br>Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. |
+ * | `$sce.JS` | For JavaScript that is safe to execute in your application's context. Currently unused. Feel free to use it in your own directives. |
+ *
+ * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist} <a name="resourceUrlPatternItem"></a>
+ *
+ * Each element in these arrays must be one of the following:
+ *
+ * - **'self'**
+ * - The special **string**, `'self'`, can be used to match against all URLs of the **same
+ * domain** as the application document using the **same protocol**.
+ * - **String** (except the special value `'self'`)
+ * - The string is matched against the full *normalized / absolute URL* of the resource
+ * being tested (substring matches are not good enough.)
+ * - There are exactly **two wildcard sequences** - `*` and `**`. All other characters
+ * match themselves.
+ * - `*`: matches zero or more occurrences of any character other than one of the following 6
+ * characters: '`:`', '`/`', '`.`', '`?`', '`&`' and ';'. It's a useful wildcard for use
+ * in a whitelist.
+ * - `**`: matches zero or more occurrences of *any* character. As such, it's not
+ * not appropriate to use in for a scheme, domain, etc. as it would match too much. (e.g.
+ * http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might
+ * not have been the intention.) Its usage at the very end of the path is ok. (e.g.
+ * http://foo.example.com/templates/**).
+ * - **RegExp** (*see caveat below*)
+ * - *Caveat*: While regular expressions are powerful and offer great flexibility, their syntax
+ * (and all the inevitable escaping) makes them *harder to maintain*. It's easy to
+ * accidentally introduce a bug when one updates a complex expression (imho, all regexes should
+ * have good test coverage.). For instance, the use of `.` in the regex is correct only in a
+ * small number of cases. A `.` character in the regex used when matching the scheme or a
+ * subdomain could be matched against a `:` or literal `.` that was likely not intended. It
+ * is highly recommended to use the string patterns and only fall back to regular expressions
+ * if they as a last resort.
+ * - The regular expression must be an instance of RegExp (i.e. not a string.) It is
+ * matched against the **entire** *normalized / absolute URL* of the resource being tested
+ * (even when the RegExp did not have the `^` and `$` codes.) In addition, any flags
+ * present on the RegExp (such as multiline, global, ignoreCase) are ignored.
+ * - If you are generating your JavaScript from some other templating engine (not
+ * recommended, e.g. in issue [#4006](https://github.com/angular/angular.js/issues/4006)),
+ * remember to escape your regular expression (and be aware that you might need more than
+ * one level of escaping depending on your templating engine and the way you interpolated
+ * the value.) Do make use of your platform's escaping mechanism as it might be good
+ * enough before coding your own. e.g. Ruby has
+ * [Regexp.escape(str)](http://www.ruby-doc.org/core-2.0.0/Regexp.html#method-c-escape)
+ * and Python has [re.escape](http://docs.python.org/library/re.html#re.escape).
+ * Javascript lacks a similar built in function for escaping. Take a look at Google
+ * Closure library's [goog.string.regExpEscape(s)](
+ * http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962).
+ *
+ * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} for an example.
+ *
+ * ## Show me an example using SCE.
+ *
+ * <example module="mySceApp" deps="angular-sanitize.js">
+ * <file name="index.html">
+ * <div ng-controller="AppController as myCtrl">
+ * <i ng-bind-html="myCtrl.explicitlyTrustedHtml" id="explicitlyTrustedHtml"></i><br><br>
+ * <b>User comments</b><br>
+ * By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when
+ * $sanitize is available. If $sanitize isn't available, this results in an error instead of an
+ * exploit.
+ * <div class="well">
+ * <div ng-repeat="userComment in myCtrl.userComments">
+ * <b>{{userComment.name}}</b>:
+ * <span ng-bind-html="userComment.htmlComment" class="htmlComment"></span>
+ * <br>
+ * </div>
+ * </div>
+ * </div>
+ * </file>
+ *
+ * <file name="script.js">
+ * angular.module('mySceApp', ['ngSanitize'])
+ * .controller('AppController', ['$http', '$templateCache', '$sce',
+ * function($http, $templateCache, $sce) {
+ * var self = this;
+ * $http.get("test_data.json", {cache: $templateCache}).success(function(userComments) {
+ * self.userComments = userComments;
+ * });
+ * self.explicitlyTrustedHtml = $sce.trustAsHtml(
+ * '<span onmouseover="this.textContent=&quot;Explicitly trusted HTML bypasses ' +
+ * 'sanitization.&quot;">Hover over this text.</span>');
+ * }]);
+ * </file>
+ *
+ * <file name="test_data.json">
+ * [
+ * { "name": "Alice",
+ * "htmlComment":
+ * "<span onmouseover='this.textContent=\"PWN3D!\"'>Is <i>anyone</i> reading this?</span>"
+ * },
+ * { "name": "Bob",
+ * "htmlComment": "<i>Yes!</i> Am I the only other one?"
+ * }
+ * ]
+ * </file>
+ *
+ * <file name="protractor.js" type="protractor">
+ * describe('SCE doc demo', function() {
+ * it('should sanitize untrusted values', function() {
+ * expect(element.all(by.css('.htmlComment')).first().getInnerHtml())
+ * .toBe('<span>Is <i>anyone</i> reading this?</span>');
+ * });
+ *
+ * it('should NOT sanitize explicitly trusted values', function() {
+ * expect(element(by.id('explicitlyTrustedHtml')).getInnerHtml()).toBe(
+ * '<span onmouseover="this.textContent=&quot;Explicitly trusted HTML bypasses ' +
+ * 'sanitization.&quot;">Hover over this text.</span>');
+ * });
+ * });
+ * </file>
+ * </example>
+ *
+ *
+ *
+ * ## Can I disable SCE completely?
+ *
+ * Yes, you can. However, this is strongly discouraged. SCE gives you a lot of security benefits
+ * for little coding overhead. It will be much harder to take an SCE disabled application and
+ * either secure it on your own or enable SCE at a later stage. It might make sense to disable SCE
+ * for cases where you have a lot of existing code that was written before SCE was introduced and
+ * you're migrating them a module at a time.
+ *
+ * That said, here's how you can completely disable SCE:
+ *
+ * ```
+ * angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) {
+ * // Completely disable SCE. For demonstration purposes only!
+ * // Do not use in new projects.
+ * $sceProvider.enabled(false);
+ * });
+ * ```
+ *
+ */
+/* jshint maxlen: 100 */
+
+function $SceProvider() {
+ var enabled = true;
+
+ /**
+ * @ngdoc method
+ * @name $sceProvider#enabled
+ * @kind function
+ *
+ * @param {boolean=} value If provided, then enables/disables SCE.
+ * @return {boolean} true if SCE is enabled, false otherwise.
+ *
+ * @description
+ * Enables/disables SCE and returns the current value.
+ */
+ this.enabled = function(value) {
+ if (arguments.length) {
+ enabled = !!value;
+ }
+ return enabled;
+ };
+
+
+ /* Design notes on the default implementation for SCE.
+ *
+ * The API contract for the SCE delegate
+ * -------------------------------------
+ * The SCE delegate object must provide the following 3 methods:
+ *
+ * - trustAs(contextEnum, value)
+ * This method is used to tell the SCE service that the provided value is OK to use in the
+ * contexts specified by contextEnum. It must return an object that will be accepted by
+ * getTrusted() for a compatible contextEnum and return this value.
+ *
+ * - valueOf(value)
+ * For values that were not produced by trustAs(), return them as is. For values that were
+ * produced by trustAs(), return the corresponding input value to trustAs. Basically, if
+ * trustAs is wrapping the given values into some type, this operation unwraps it when given
+ * such a value.
+ *
+ * - getTrusted(contextEnum, value)
+ * This function should return the a value that is safe to use in the context specified by
+ * contextEnum or throw and exception otherwise.
+ *
+ * NOTE: This contract deliberately does NOT state that values returned by trustAs() must be
+ * opaque or wrapped in some holder object. That happens to be an implementation detail. For
+ * instance, an implementation could maintain a registry of all trusted objects by context. In
+ * such a case, trustAs() would return the same object that was passed in. getTrusted() would
+ * return the same object passed in if it was found in the registry under a compatible context or
+ * throw an exception otherwise. An implementation might only wrap values some of the time based
+ * on some criteria. getTrusted() might return a value and not throw an exception for special
+ * constants or objects even if not wrapped. All such implementations fulfill this contract.
+ *
+ *
+ * A note on the inheritance model for SCE contexts
+ * ------------------------------------------------
+ * I've used inheritance and made RESOURCE_URL wrapped types a subtype of URL wrapped types. This
+ * is purely an implementation details.
+ *
+ * The contract is simply this:
+ *
+ * getTrusted($sce.RESOURCE_URL, value) succeeding implies that getTrusted($sce.URL, value)
+ * will also succeed.
+ *
+ * Inheritance happens to capture this in a natural way. In some future, we
+ * may not use inheritance anymore. That is OK because no code outside of
+ * sce.js and sceSpecs.js would need to be aware of this detail.
+ */
+
+ this.$get = ['$parse', '$sceDelegate', function(
+ $parse, $sceDelegate) {
+ // Prereq: Ensure that we're not running in IE<11 quirks mode. In that mode, IE < 11 allow
+ // the "expression(javascript expression)" syntax which is insecure.
+ if (enabled && msie < 8) {
+ throw $sceMinErr('iequirks',
+ 'Strict Contextual Escaping does not support Internet Explorer version < 11 in quirks ' +
+ 'mode. You can fix this by adding the text <!doctype html> to the top of your HTML ' +
+ 'document. See http://docs.angularjs.org/api/ng.$sce for more information.');
+ }
+
+ var sce = shallowCopy(SCE_CONTEXTS);
+
+ /**
+ * @ngdoc method
+ * @name $sce#isEnabled
+ * @kind function
+ *
+ * @return {Boolean} true if SCE is enabled, false otherwise. If you want to set the value, you
+ * have to do it at module config time on {@link ng.$sceProvider $sceProvider}.
+ *
+ * @description
+ * Returns a boolean indicating if SCE is enabled.
+ */
+ sce.isEnabled = function() {
+ return enabled;
+ };
+ sce.trustAs = $sceDelegate.trustAs;
+ sce.getTrusted = $sceDelegate.getTrusted;
+ sce.valueOf = $sceDelegate.valueOf;
+
+ if (!enabled) {
+ sce.trustAs = sce.getTrusted = function(type, value) { return value; };
+ sce.valueOf = identity;
+ }
+
+ /**
+ * @ngdoc method
+ * @name $sce#parseAs
+ *
+ * @description
+ * Converts Angular {@link guide/expression expression} into a function. This is like {@link
+ * ng.$parse $parse} and is identical when the expression is a literal constant. Otherwise, it
+ * wraps the expression in a call to {@link ng.$sce#getTrusted $sce.getTrusted(*type*,
+ * *result*)}
+ *
+ * @param {string} type The kind of SCE context in which this result will be used.
+ * @param {string} expression String expression to compile.
+ * @returns {function(context, locals)} a function which represents the compiled expression:
+ *
+ * * `context` – `{object}` – an object against which any expressions embedded in the strings
+ * are evaluated against (typically a scope object).
+ * * `locals` – `{object=}` – local variables context object, useful for overriding values in
+ * `context`.
+ */
+ sce.parseAs = function sceParseAs(type, expr) {
+ var parsed = $parse(expr);
+ if (parsed.literal && parsed.constant) {
+ return parsed;
+ } else {
+ return $parse(expr, function(value) {
+ return sce.getTrusted(type, value);
+ });
+ }
+ };
+
+ /**
+ * @ngdoc method
+ * @name $sce#trustAs
+ *
+ * @description
+ * Delegates to {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. As such,
+ * returns an object that is trusted by angular for use in specified strict contextual
+ * escaping contexts (such as ng-bind-html, ng-include, any src attribute
+ * interpolation, any dom event binding attribute interpolation such as for onclick, etc.)
+ * that uses the provided value. See * {@link ng.$sce $sce} for enabling strict contextual
+ * escaping.
+ *
+ * @param {string} type The kind of context in which this value is safe for use. e.g. url,
+ * resource_url, html, js and css.
+ * @param {*} value The value that that should be considered trusted/safe.
+ * @returns {*} A value that can be used to stand in for the provided `value` in places
+ * where Angular expects a $sce.trustAs() return value.
+ */
+
+ /**
+ * @ngdoc method
+ * @name $sce#trustAsHtml
+ *
+ * @description
+ * Shorthand method. `$sce.trustAsHtml(value)` →
+ * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.HTML, value)`}
+ *
+ * @param {*} value The value to trustAs.
+ * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedHtml
+ * $sce.getTrustedHtml(value)} to obtain the original value. (privileged directives
+ * only accept expressions that are either literal constants or are the
+ * return value of {@link ng.$sce#trustAs $sce.trustAs}.)
+ */
+
+ /**
+ * @ngdoc method
+ * @name $sce#trustAsUrl
+ *
+ * @description
+ * Shorthand method. `$sce.trustAsUrl(value)` →
+ * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.URL, value)`}
+ *
+ * @param {*} value The value to trustAs.
+ * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedUrl
+ * $sce.getTrustedUrl(value)} to obtain the original value. (privileged directives
+ * only accept expressions that are either literal constants or are the
+ * return value of {@link ng.$sce#trustAs $sce.trustAs}.)
+ */
+
+ /**
+ * @ngdoc method
+ * @name $sce#trustAsResourceUrl
+ *
+ * @description
+ * Shorthand method. `$sce.trustAsResourceUrl(value)` →
+ * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.RESOURCE_URL, value)`}
+ *
+ * @param {*} value The value to trustAs.
+ * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedResourceUrl
+ * $sce.getTrustedResourceUrl(value)} to obtain the original value. (privileged directives
+ * only accept expressions that are either literal constants or are the return
+ * value of {@link ng.$sce#trustAs $sce.trustAs}.)
+ */
+
+ /**
+ * @ngdoc method
+ * @name $sce#trustAsJs
+ *
+ * @description
+ * Shorthand method. `$sce.trustAsJs(value)` →
+ * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.JS, value)`}
+ *
+ * @param {*} value The value to trustAs.
+ * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedJs
+ * $sce.getTrustedJs(value)} to obtain the original value. (privileged directives
+ * only accept expressions that are either literal constants or are the
+ * return value of {@link ng.$sce#trustAs $sce.trustAs}.)
+ */
+
+ /**
+ * @ngdoc method
+ * @name $sce#getTrusted
+ *
+ * @description
+ * Delegates to {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted`}. As such,
+ * takes the result of a {@link ng.$sce#trustAs `$sce.trustAs`}() call and returns the
+ * originally supplied value if the queried context type is a supertype of the created type.
+ * If this condition isn't satisfied, throws an exception.
+ *
+ * @param {string} type The kind of context in which this value is to be used.
+ * @param {*} maybeTrusted The result of a prior {@link ng.$sce#trustAs `$sce.trustAs`}
+ * call.
+ * @returns {*} The value the was originally provided to
+ * {@link ng.$sce#trustAs `$sce.trustAs`} if valid in this context.
+ * Otherwise, throws an exception.
+ */
+
+ /**
+ * @ngdoc method
+ * @name $sce#getTrustedHtml
+ *
+ * @description
+ * Shorthand method. `$sce.getTrustedHtml(value)` →
+ * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.HTML, value)`}
+ *
+ * @param {*} value The value to pass to `$sce.getTrusted`.
+ * @returns {*} The return value of `$sce.getTrusted($sce.HTML, value)`
+ */
+
+ /**
+ * @ngdoc method
+ * @name $sce#getTrustedCss
+ *
+ * @description
+ * Shorthand method. `$sce.getTrustedCss(value)` →
+ * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.CSS, value)`}
+ *
+ * @param {*} value The value to pass to `$sce.getTrusted`.
+ * @returns {*} The return value of `$sce.getTrusted($sce.CSS, value)`
+ */
+
+ /**
+ * @ngdoc method
+ * @name $sce#getTrustedUrl
+ *
+ * @description
+ * Shorthand method. `$sce.getTrustedUrl(value)` →
+ * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.URL, value)`}
+ *
+ * @param {*} value The value to pass to `$sce.getTrusted`.
+ * @returns {*} The return value of `$sce.getTrusted($sce.URL, value)`
+ */
+
+ /**
+ * @ngdoc method
+ * @name $sce#getTrustedResourceUrl
+ *
+ * @description
+ * Shorthand method. `$sce.getTrustedResourceUrl(value)` →
+ * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.RESOURCE_URL, value)`}
+ *
+ * @param {*} value The value to pass to `$sceDelegate.getTrusted`.
+ * @returns {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)`
+ */
+
+ /**
+ * @ngdoc method
+ * @name $sce#getTrustedJs
+ *
+ * @description
+ * Shorthand method. `$sce.getTrustedJs(value)` →
+ * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.JS, value)`}
+ *
+ * @param {*} value The value to pass to `$sce.getTrusted`.
+ * @returns {*} The return value of `$sce.getTrusted($sce.JS, value)`
+ */
+
+ /**
+ * @ngdoc method
+ * @name $sce#parseAsHtml
+ *
+ * @description
+ * Shorthand method. `$sce.parseAsHtml(expression string)` →
+ * {@link ng.$sce#parseAs `$sce.parseAs($sce.HTML, value)`}
+ *
+ * @param {string} expression String expression to compile.
+ * @returns {function(context, locals)} a function which represents the compiled expression:
+ *
+ * * `context` – `{object}` – an object against which any expressions embedded in the strings
+ * are evaluated against (typically a scope object).
+ * * `locals` – `{object=}` – local variables context object, useful for overriding values in
+ * `context`.
+ */
+
+ /**
+ * @ngdoc method
+ * @name $sce#parseAsCss
+ *
+ * @description
+ * Shorthand method. `$sce.parseAsCss(value)` →
+ * {@link ng.$sce#parseAs `$sce.parseAs($sce.CSS, value)`}
+ *
+ * @param {string} expression String expression to compile.
+ * @returns {function(context, locals)} a function which represents the compiled expression:
+ *
+ * * `context` – `{object}` – an object against which any expressions embedded in the strings
+ * are evaluated against (typically a scope object).
+ * * `locals` – `{object=}` – local variables context object, useful for overriding values in
+ * `context`.
+ */
+
+ /**
+ * @ngdoc method
+ * @name $sce#parseAsUrl
+ *
+ * @description
+ * Shorthand method. `$sce.parseAsUrl(value)` →
+ * {@link ng.$sce#parseAs `$sce.parseAs($sce.URL, value)`}
+ *
+ * @param {string} expression String expression to compile.
+ * @returns {function(context, locals)} a function which represents the compiled expression:
+ *
+ * * `context` – `{object}` – an object against which any expressions embedded in the strings
+ * are evaluated against (typically a scope object).
+ * * `locals` – `{object=}` – local variables context object, useful for overriding values in
+ * `context`.
+ */
+
+ /**
+ * @ngdoc method
+ * @name $sce#parseAsResourceUrl
+ *
+ * @description
+ * Shorthand method. `$sce.parseAsResourceUrl(value)` →
+ * {@link ng.$sce#parseAs `$sce.parseAs($sce.RESOURCE_URL, value)`}
+ *
+ * @param {string} expression String expression to compile.
+ * @returns {function(context, locals)} a function which represents the compiled expression:
+ *
+ * * `context` – `{object}` – an object against which any expressions embedded in the strings
+ * are evaluated against (typically a scope object).
+ * * `locals` – `{object=}` – local variables context object, useful for overriding values in
+ * `context`.
+ */
+
+ /**
+ * @ngdoc method
+ * @name $sce#parseAsJs
+ *
+ * @description
+ * Shorthand method. `$sce.parseAsJs(value)` →
+ * {@link ng.$sce#parseAs `$sce.parseAs($sce.JS, value)`}
+ *
+ * @param {string} expression String expression to compile.
+ * @returns {function(context, locals)} a function which represents the compiled expression:
+ *
+ * * `context` – `{object}` – an object against which any expressions embedded in the strings
+ * are evaluated against (typically a scope object).
+ * * `locals` – `{object=}` – local variables context object, useful for overriding values in
+ * `context`.
+ */
+
+ // Shorthand delegations.
+ var parse = sce.parseAs,
+ getTrusted = sce.getTrusted,
+ trustAs = sce.trustAs;
+
+ forEach(SCE_CONTEXTS, function(enumValue, name) {
+ var lName = lowercase(name);
+ sce[camelCase("parse_as_" + lName)] = function(expr) {
+ return parse(enumValue, expr);
+ };
+ sce[camelCase("get_trusted_" + lName)] = function(value) {
+ return getTrusted(enumValue, value);
+ };
+ sce[camelCase("trust_as_" + lName)] = function(value) {
+ return trustAs(enumValue, value);
+ };
+ });
+
+ return sce;
+ }];
+}
+
+/**
+ * !!! This is an undocumented "private" service !!!
+ *
+ * @name $sniffer
+ * @requires $window
+ * @requires $document
+ *
+ * @property {boolean} history Does the browser support html5 history api ?
+ * @property {boolean} transitions Does the browser support CSS transition events ?
+ * @property {boolean} animations Does the browser support CSS animation events ?
+ *
+ * @description
+ * This is very simple implementation of testing browser's features.
+ */
+function $SnifferProvider() {
+ this.$get = ['$window', '$document', function($window, $document) {
+ var eventSupport = {},
+ android =
+ int((/android (\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]),
+ boxee = /Boxee/i.test(($window.navigator || {}).userAgent),
+ document = $document[0] || {},
+ vendorPrefix,
+ vendorRegex = /^(Moz|webkit|ms)(?=[A-Z])/,
+ bodyStyle = document.body && document.body.style,
+ transitions = false,
+ animations = false,
+ match;
+
+ if (bodyStyle) {
+ for (var prop in bodyStyle) {
+ if (match = vendorRegex.exec(prop)) {
+ vendorPrefix = match[0];
+ vendorPrefix = vendorPrefix.substr(0, 1).toUpperCase() + vendorPrefix.substr(1);
+ break;
+ }
+ }
+
+ if (!vendorPrefix) {
+ vendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit';
+ }
+
+ transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle));
+ animations = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle));
+
+ if (android && (!transitions || !animations)) {
+ transitions = isString(document.body.style.webkitTransition);
+ animations = isString(document.body.style.webkitAnimation);
+ }
+ }
+
+
+ return {
+ // Android has history.pushState, but it does not update location correctly
+ // so let's not use the history API at all.
+ // http://code.google.com/p/android/issues/detail?id=17471
+ // https://github.com/angular/angular.js/issues/904
+
+ // older webkit browser (533.9) on Boxee box has exactly the same problem as Android has
+ // so let's not use the history API also
+ // We are purposefully using `!(android < 4)` to cover the case when `android` is undefined
+ // jshint -W018
+ history: !!($window.history && $window.history.pushState && !(android < 4) && !boxee),
+ // jshint +W018
+ hasEvent: function(event) {
+ // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have
+ // it. In particular the event is not fired when backspace or delete key are pressed or
+ // when cut operation is performed.
+ if (event == 'input' && msie == 9) return false;
+
+ if (isUndefined(eventSupport[event])) {
+ var divElm = document.createElement('div');
+ eventSupport[event] = 'on' + event in divElm;
+ }
+
+ return eventSupport[event];
+ },
+ csp: csp(),
+ vendorPrefix: vendorPrefix,
+ transitions: transitions,
+ animations: animations,
+ android: android
+ };
+ }];
+}
+
+var $compileMinErr = minErr('$compile');
+
+/**
+ * @ngdoc service
+ * @name $templateRequest
+ *
+ * @description
+ * The `$templateRequest` service downloads the provided template using `$http` and, upon success,
+ * stores the contents inside of `$templateCache`. If the HTTP request fails or the response data
+ * of the HTTP request is empty then a `$compile` error will be thrown (the exception can be thwarted
+ * by setting the 2nd parameter of the function to true).
+ *
+ * @param {string} tpl The HTTP request template URL
+ * @param {boolean=} ignoreRequestError Whether or not to ignore the exception when the request fails or the template is empty
+ *
+ * @return {Promise} the HTTP Promise for the given.
+ *
+ * @property {number} totalPendingRequests total amount of pending template requests being downloaded.
+ */
+function $TemplateRequestProvider() {
+ this.$get = ['$templateCache', '$http', '$q', function($templateCache, $http, $q) {
+ function handleRequestFn(tpl, ignoreRequestError) {
+ var self = handleRequestFn;
+ self.totalPendingRequests++;
+
+ var transformResponse = $http.defaults && $http.defaults.transformResponse;
+
+ if (isArray(transformResponse)) {
+ transformResponse = transformResponse.filter(function(transformer) {
+ return transformer !== defaultHttpResponseTransform;
+ });
+ } else if (transformResponse === defaultHttpResponseTransform) {
+ transformResponse = null;
+ }
+
+ var httpOptions = {
+ cache: $templateCache,
+ transformResponse: transformResponse
+ };
+
+ return $http.get(tpl, httpOptions)
+ .then(function(response) {
+ var html = response.data;
+ self.totalPendingRequests--;
+ $templateCache.put(tpl, html);
+ return html;
+ }, handleError);
+
+ function handleError(resp) {
+ self.totalPendingRequests--;
+ if (!ignoreRequestError) {
+ throw $compileMinErr('tpload', 'Failed to load template: {0}', tpl);
+ }
+ return $q.reject(resp);
+ }
+ }
+
+ handleRequestFn.totalPendingRequests = 0;
+
+ return handleRequestFn;
+ }];
+}
+
+function $$TestabilityProvider() {
+ this.$get = ['$rootScope', '$browser', '$location',
+ function($rootScope, $browser, $location) {
+
+ /**
+ * @name $testability
+ *
+ * @description
+ * The private $$testability service provides a collection of methods for use when debugging
+ * or by automated test and debugging tools.
+ */
+ var testability = {};
+
+ /**
+ * @name $$testability#findBindings
+ *
+ * @description
+ * Returns an array of elements that are bound (via ng-bind or {{}})
+ * to expressions matching the input.
+ *
+ * @param {Element} element The element root to search from.
+ * @param {string} expression The binding expression to match.
+ * @param {boolean} opt_exactMatch If true, only returns exact matches
+ * for the expression. Filters and whitespace are ignored.
+ */
+ testability.findBindings = function(element, expression, opt_exactMatch) {
+ var bindings = element.getElementsByClassName('ng-binding');
+ var matches = [];
+ forEach(bindings, function(binding) {
+ var dataBinding = angular.element(binding).data('$binding');
+ if (dataBinding) {
+ forEach(dataBinding, function(bindingName) {
+ if (opt_exactMatch) {
+ var matcher = new RegExp('(^|\\s)' + escapeForRegexp(expression) + '(\\s|\\||$)');
+ if (matcher.test(bindingName)) {
+ matches.push(binding);
+ }
+ } else {
+ if (bindingName.indexOf(expression) != -1) {
+ matches.push(binding);
+ }
+ }
+ });
+ }
+ });
+ return matches;
+ };
+
+ /**
+ * @name $$testability#findModels
+ *
+ * @description
+ * Returns an array of elements that are two-way found via ng-model to
+ * expressions matching the input.
+ *
+ * @param {Element} element The element root to search from.
+ * @param {string} expression The model expression to match.
+ * @param {boolean} opt_exactMatch If true, only returns exact matches
+ * for the expression.
+ */
+ testability.findModels = function(element, expression, opt_exactMatch) {
+ var prefixes = ['ng-', 'data-ng-', 'ng\\:'];
+ for (var p = 0; p < prefixes.length; ++p) {
+ var attributeEquals = opt_exactMatch ? '=' : '*=';
+ var selector = '[' + prefixes[p] + 'model' + attributeEquals + '"' + expression + '"]';
+ var elements = element.querySelectorAll(selector);
+ if (elements.length) {
+ return elements;
+ }
+ }
+ };
+
+ /**
+ * @name $$testability#getLocation
+ *
+ * @description
+ * Shortcut for getting the location in a browser agnostic way. Returns
+ * the path, search, and hash. (e.g. /path?a=b#hash)
+ */
+ testability.getLocation = function() {
+ return $location.url();
+ };
+
+ /**
+ * @name $$testability#setLocation
+ *
+ * @description
+ * Shortcut for navigating to a location without doing a full page reload.
+ *
+ * @param {string} url The location url (path, search and hash,
+ * e.g. /path?a=b#hash) to go to.
+ */
+ testability.setLocation = function(url) {
+ if (url !== $location.url()) {
+ $location.url(url);
+ $rootScope.$digest();
+ }
+ };
+
+ /**
+ * @name $$testability#whenStable
+ *
+ * @description
+ * Calls the callback when $timeout and $http requests are completed.
+ *
+ * @param {function} callback
+ */
+ testability.whenStable = function(callback) {
+ $browser.notifyWhenNoOutstandingRequests(callback);
+ };
+
+ return testability;
+ }];
+}
+
+function $TimeoutProvider() {
+ this.$get = ['$rootScope', '$browser', '$q', '$$q', '$exceptionHandler',
+ function($rootScope, $browser, $q, $$q, $exceptionHandler) {
+ var deferreds = {};
+
+
+ /**
+ * @ngdoc service
+ * @name $timeout
+ *
+ * @description
+ * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch
+ * block and delegates any exceptions to
+ * {@link ng.$exceptionHandler $exceptionHandler} service.
+ *
+ * The return value of registering a timeout function is a promise, which will be resolved when
+ * the timeout is reached and the timeout function is executed.
+ *
+ * To cancel a timeout request, call `$timeout.cancel(promise)`.
+ *
+ * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to
+ * synchronously flush the queue of deferred functions.
+ *
+ * @param {function()} fn A function, whose execution should be delayed.
+ * @param {number=} [delay=0] Delay in milliseconds.
+ * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise
+ * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.
+ * @returns {Promise} Promise that will be resolved when the timeout is reached. The value this
+ * promise will be resolved with is the return value of the `fn` function.
+ *
+ */
+ function timeout(fn, delay, invokeApply) {
+ var skipApply = (isDefined(invokeApply) && !invokeApply),
+ deferred = (skipApply ? $$q : $q).defer(),
+ promise = deferred.promise,
+ timeoutId;
+
+ timeoutId = $browser.defer(function() {
+ try {
+ deferred.resolve(fn());
+ } catch (e) {
+ deferred.reject(e);
+ $exceptionHandler(e);
+ }
+ finally {
+ delete deferreds[promise.$$timeoutId];
+ }
+
+ if (!skipApply) $rootScope.$apply();
+ }, delay);
+
+ promise.$$timeoutId = timeoutId;
+ deferreds[timeoutId] = deferred;
+
+ return promise;
+ }
+
+
+ /**
+ * @ngdoc method
+ * @name $timeout#cancel
+ *
+ * @description
+ * Cancels a task associated with the `promise`. As a result of this, the promise will be
+ * resolved with a rejection.
+ *
+ * @param {Promise=} promise Promise returned by the `$timeout` function.
+ * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully
+ * canceled.
+ */
+ timeout.cancel = function(promise) {
+ if (promise && promise.$$timeoutId in deferreds) {
+ deferreds[promise.$$timeoutId].reject('canceled');
+ delete deferreds[promise.$$timeoutId];
+ return $browser.defer.cancel(promise.$$timeoutId);
+ }
+ return false;
+ };
+
+ return timeout;
+ }];
+}
+
+// NOTE: The usage of window and document instead of $window and $document here is
+// deliberate. This service depends on the specific behavior of anchor nodes created by the
+// browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and
+// cause us to break tests. In addition, when the browser resolves a URL for XHR, it
+// doesn't know about mocked locations and resolves URLs to the real document - which is
+// exactly the behavior needed here. There is little value is mocking these out for this
+// service.
+var urlParsingNode = document.createElement("a");
+var originUrl = urlResolve(window.location.href);
+
+
+/**
+ *
+ * Implementation Notes for non-IE browsers
+ * ----------------------------------------
+ * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM,
+ * results both in the normalizing and parsing of the URL. Normalizing means that a relative
+ * URL will be resolved into an absolute URL in the context of the application document.
+ * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related
+ * properties are all populated to reflect the normalized URL. This approach has wide
+ * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc. See
+ * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html
+ *
+ * Implementation Notes for IE
+ * ---------------------------
+ * IE >= 8 and <= 10 normalizes the URL when assigned to the anchor node similar to the other
+ * browsers. However, the parsed components will not be set if the URL assigned did not specify
+ * them. (e.g. if you assign a.href = "foo", then a.protocol, a.host, etc. will be empty.) We
+ * work around that by performing the parsing in a 2nd step by taking a previously normalized
+ * URL (e.g. by assigning to a.href) and assigning it a.href again. This correctly populates the
+ * properties such as protocol, hostname, port, etc.
+ *
+ * IE7 does not normalize the URL when assigned to an anchor node. (Apparently, it does, if one
+ * uses the inner HTML approach to assign the URL as part of an HTML snippet -
+ * http://stackoverflow.com/a/472729) However, setting img[src] does normalize the URL.
+ * Unfortunately, setting img[src] to something like "javascript:foo" on IE throws an exception.
+ * Since the primary usage for normalizing URLs is to sanitize such URLs, we can't use that
+ * method and IE < 8 is unsupported.
+ *
+ * References:
+ * http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement
+ * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html
+ * http://url.spec.whatwg.org/#urlutils
+ * https://github.com/angular/angular.js/pull/2902
+ * http://james.padolsey.com/javascript/parsing-urls-with-the-dom/
+ *
+ * @kind function
+ * @param {string} url The URL to be parsed.
+ * @description Normalizes and parses a URL.
+ * @returns {object} Returns the normalized URL as a dictionary.
+ *
+ * | member name | Description |
+ * |---------------|----------------|
+ * | href | A normalized version of the provided URL if it was not an absolute URL |
+ * | protocol | The protocol including the trailing colon |
+ * | host | The host and port (if the port is non-default) of the normalizedUrl |
+ * | search | The search params, minus the question mark |
+ * | hash | The hash string, minus the hash symbol
+ * | hostname | The hostname
+ * | port | The port, without ":"
+ * | pathname | The pathname, beginning with "/"
+ *
+ */
+function urlResolve(url) {
+ var href = url;
+
+ if (msie) {
+ // Normalize before parse. Refer Implementation Notes on why this is
+ // done in two steps on IE.
+ urlParsingNode.setAttribute("href", href);
+ href = urlParsingNode.href;
+ }
+
+ urlParsingNode.setAttribute('href', href);
+
+ // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
+ return {
+ href: urlParsingNode.href,
+ protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
+ host: urlParsingNode.host,
+ search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
+ hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
+ hostname: urlParsingNode.hostname,
+ port: urlParsingNode.port,
+ pathname: (urlParsingNode.pathname.charAt(0) === '/')
+ ? urlParsingNode.pathname
+ : '/' + urlParsingNode.pathname
+ };
+}
+
+/**
+ * Parse a request URL and determine whether this is a same-origin request as the application document.
+ *
+ * @param {string|object} requestUrl The url of the request as a string that will be resolved
+ * or a parsed URL object.
+ * @returns {boolean} Whether the request is for the same origin as the application document.
+ */
+function urlIsSameOrigin(requestUrl) {
+ var parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl;
+ return (parsed.protocol === originUrl.protocol &&
+ parsed.host === originUrl.host);
+}
+
+/**
+ * @ngdoc service
+ * @name $window
+ *
+ * @description
+ * A reference to the browser's `window` object. While `window`
+ * is globally available in JavaScript, it causes testability problems, because
+ * it is a global variable. In angular we always refer to it through the
+ * `$window` service, so it may be overridden, removed or mocked for testing.
+ *
+ * Expressions, like the one defined for the `ngClick` directive in the example
+ * below, are evaluated with respect to the current scope. Therefore, there is
+ * no risk of inadvertently coding in a dependency on a global value in such an
+ * expression.
+ *
+ * @example
+ <example module="windowExample">
+ <file name="index.html">
+ <script>
+ angular.module('windowExample', [])
+ .controller('ExampleController', ['$scope', '$window', function($scope, $window) {
+ $scope.greeting = 'Hello, World!';
+ $scope.doGreeting = function(greeting) {
+ $window.alert(greeting);
+ };
+ }]);
+ </script>
+ <div ng-controller="ExampleController">
+ <input type="text" ng-model="greeting" />
+ <button ng-click="doGreeting(greeting)">ALERT</button>
+ </div>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should display the greeting in the input box', function() {
+ element(by.model('greeting')).sendKeys('Hello, E2E Tests');
+ // If we click the button it will block the test runner
+ // element(':button').click();
+ });
+ </file>
+ </example>
+ */
+function $WindowProvider() {
+ this.$get = valueFn(window);
+}
+
+/* global currencyFilter: true,
+ dateFilter: true,
+ filterFilter: true,
+ jsonFilter: true,
+ limitToFilter: true,
+ lowercaseFilter: true,
+ numberFilter: true,
+ orderByFilter: true,
+ uppercaseFilter: true,
+ */
+
+/**
+ * @ngdoc provider
+ * @name $filterProvider
+ * @description
+ *
+ * Filters are just functions which transform input to an output. However filters need to be
+ * Dependency Injected. To achieve this a filter definition consists of a factory function which is
+ * annotated with dependencies and is responsible for creating a filter function.
+ *
+ * ```js
+ * // Filter registration
+ * function MyModule($provide, $filterProvider) {
+ * // create a service to demonstrate injection (not always needed)
+ * $provide.value('greet', function(name){
+ * return 'Hello ' + name + '!';
+ * });
+ *
+ * // register a filter factory which uses the
+ * // greet service to demonstrate DI.
+ * $filterProvider.register('greet', function(greet){
+ * // return the filter function which uses the greet service
+ * // to generate salutation
+ * return function(text) {
+ * // filters need to be forgiving so check input validity
+ * return text && greet(text) || text;
+ * };
+ * });
+ * }
+ * ```
+ *
+ * The filter function is registered with the `$injector` under the filter name suffix with
+ * `Filter`.
+ *
+ * ```js
+ * it('should be the same instance', inject(
+ * function($filterProvider) {
+ * $filterProvider.register('reverse', function(){
+ * return ...;
+ * });
+ * },
+ * function($filter, reverseFilter) {
+ * expect($filter('reverse')).toBe(reverseFilter);
+ * });
+ * ```
+ *
+ *
+ * For more information about how angular filters work, and how to create your own filters, see
+ * {@link guide/filter Filters} in the Angular Developer Guide.
+ */
+
+/**
+ * @ngdoc service
+ * @name $filter
+ * @kind function
+ * @description
+ * Filters are used for formatting data displayed to the user.
+ *
+ * The general syntax in templates is as follows:
+ *
+ * {{ expression [| filter_name[:parameter_value] ... ] }}
+ *
+ * @param {String} name Name of the filter function to retrieve
+ * @return {Function} the filter function
+ * @example
+ <example name="$filter" module="filterExample">
+ <file name="index.html">
+ <div ng-controller="MainCtrl">
+ <h3>{{ originalText }}</h3>
+ <h3>{{ filteredText }}</h3>
+ </div>
+ </file>
+
+ <file name="script.js">
+ angular.module('filterExample', [])
+ .controller('MainCtrl', function($scope, $filter) {
+ $scope.originalText = 'hello';
+ $scope.filteredText = $filter('uppercase')($scope.originalText);
+ });
+ </file>
+ </example>
+ */
+$FilterProvider.$inject = ['$provide'];
+function $FilterProvider($provide) {
+ var suffix = 'Filter';
+
+ /**
+ * @ngdoc method
+ * @name $filterProvider#register
+ * @param {string|Object} name Name of the filter function, or an object map of filters where
+ * the keys are the filter names and the values are the filter factories.
+ * @returns {Object} Registered filter instance, or if a map of filters was provided then a map
+ * of the registered filter instances.
+ */
+ function register(name, factory) {
+ if (isObject(name)) {
+ var filters = {};
+ forEach(name, function(filter, key) {
+ filters[key] = register(key, filter);
+ });
+ return filters;
+ } else {
+ return $provide.factory(name + suffix, factory);
+ }
+ }
+ this.register = register;
+
+ this.$get = ['$injector', function($injector) {
+ return function(name) {
+ return $injector.get(name + suffix);
+ };
+ }];
+
+ ////////////////////////////////////////
+
+ /* global
+ currencyFilter: false,
+ dateFilter: false,
+ filterFilter: false,
+ jsonFilter: false,
+ limitToFilter: false,
+ lowercaseFilter: false,
+ numberFilter: false,
+ orderByFilter: false,
+ uppercaseFilter: false,
+ */
+
+ register('currency', currencyFilter);
+ register('date', dateFilter);
+ register('filter', filterFilter);
+ register('json', jsonFilter);
+ register('limitTo', limitToFilter);
+ register('lowercase', lowercaseFilter);
+ register('number', numberFilter);
+ register('orderBy', orderByFilter);
+ register('uppercase', uppercaseFilter);
+}
+
+/**
+ * @ngdoc filter
+ * @name filter
+ * @kind function
+ *
+ * @description
+ * Selects a subset of items from `array` and returns it as a new array.
+ *
+ * @param {Array} array The source array.
+ * @param {string|Object|function()} expression The predicate to be used for selecting items from
+ * `array`.
+ *
+ * Can be one of:
+ *
+ * - `string`: The string is evaluated as an expression and the resulting value is used for substring match against
+ * the contents of the `array`. All strings or objects with string properties in `array` that contain this string
+ * will be returned. The predicate can be negated by prefixing the string with `!`.
+ *
+ * - `Object`: A pattern object can be used to filter specific properties on objects contained
+ * by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items
+ * which have property `name` containing "M" and property `phone` containing "1". A special
+ * property name `$` can be used (as in `{$:"text"}`) to accept a match against any
+ * property of the object. That's equivalent to the simple substring match with a `string`
+ * as described above. The predicate can be negated by prefixing the string with `!`.
+ * For Example `{name: "!M"}` predicate will return an array of items which have property `name`
+ * not containing "M".
+ *
+ * - `function(value, index)`: A predicate function can be used to write arbitrary filters. The
+ * function is called for each element of `array`. The final result is an array of those
+ * elements that the predicate returned true for.
+ *
+ * @param {function(actual, expected)|true|undefined} comparator Comparator which is used in
+ * determining if the expected value (from the filter expression) and actual value (from
+ * the object in the array) should be considered a match.
+ *
+ * Can be one of:
+ *
+ * - `function(actual, expected)`:
+ * The function will be given the object value and the predicate value to compare and
+ * should return true if the item should be included in filtered result.
+ *
+ * - `true`: A shorthand for `function(actual, expected) { return angular.equals(expected, actual)}`.
+ * this is essentially strict comparison of expected and actual.
+ *
+ * - `false|undefined`: A short hand for a function which will look for a substring match in case
+ * insensitive way.
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <div ng-init="friends = [{name:'John', phone:'555-1276'},
+ {name:'Mary', phone:'800-BIG-MARY'},
+ {name:'Mike', phone:'555-4321'},
+ {name:'Adam', phone:'555-5678'},
+ {name:'Julie', phone:'555-8765'},
+ {name:'Juliette', phone:'555-5678'}]"></div>
+
+ Search: <input ng-model="searchText">
+ <table id="searchTextResults">
+ <tr><th>Name</th><th>Phone</th></tr>
+ <tr ng-repeat="friend in friends | filter:searchText">
+ <td>{{friend.name}}</td>
+ <td>{{friend.phone}}</td>
+ </tr>
+ </table>
+ <hr>
+ Any: <input ng-model="search.$"> <br>
+ Name only <input ng-model="search.name"><br>
+ Phone only <input ng-model="search.phone"><br>
+ Equality <input type="checkbox" ng-model="strict"><br>
+ <table id="searchObjResults">
+ <tr><th>Name</th><th>Phone</th></tr>
+ <tr ng-repeat="friendObj in friends | filter:search:strict">
+ <td>{{friendObj.name}}</td>
+ <td>{{friendObj.phone}}</td>
+ </tr>
+ </table>
+ </file>
+ <file name="protractor.js" type="protractor">
+ var expectFriendNames = function(expectedNames, key) {
+ element.all(by.repeater(key + ' in friends').column(key + '.name')).then(function(arr) {
+ arr.forEach(function(wd, i) {
+ expect(wd.getText()).toMatch(expectedNames[i]);
+ });
+ });
+ };
+
+ it('should search across all fields when filtering with a string', function() {
+ var searchText = element(by.model('searchText'));
+ searchText.clear();
+ searchText.sendKeys('m');
+ expectFriendNames(['Mary', 'Mike', 'Adam'], 'friend');
+
+ searchText.clear();
+ searchText.sendKeys('76');
+ expectFriendNames(['John', 'Julie'], 'friend');
+ });
+
+ it('should search in specific fields when filtering with a predicate object', function() {
+ var searchAny = element(by.model('search.$'));
+ searchAny.clear();
+ searchAny.sendKeys('i');
+ expectFriendNames(['Mary', 'Mike', 'Julie', 'Juliette'], 'friendObj');
+ });
+ it('should use a equal comparison when comparator is true', function() {
+ var searchName = element(by.model('search.name'));
+ var strict = element(by.model('strict'));
+ searchName.clear();
+ searchName.sendKeys('Julie');
+ strict.click();
+ expectFriendNames(['Julie'], 'friendObj');
+ });
+ </file>
+ </example>
+ */
+function filterFilter() {
+ return function(array, expression, comparator) {
+ if (!isArray(array)) return array;
+
+ var comparatorType = typeof(comparator),
+ predicates = [];
+
+ predicates.check = function(value, index) {
+ for (var j = 0; j < predicates.length; j++) {
+ if (!predicates[j](value, index)) {
+ return false;
+ }
+ }
+ return true;
+ };
+
+ if (comparatorType !== 'function') {
+ if (comparatorType === 'boolean' && comparator) {
+ comparator = function(obj, text) {
+ return angular.equals(obj, text);
+ };
+ } else {
+ comparator = function(obj, text) {
+ if (obj && text && typeof obj === 'object' && typeof text === 'object') {
+ for (var objKey in obj) {
+ if (objKey.charAt(0) !== '$' && hasOwnProperty.call(obj, objKey) &&
+ comparator(obj[objKey], text[objKey])) {
+ return true;
+ }
+ }
+ return false;
+ }
+ text = ('' + text).toLowerCase();
+ return ('' + obj).toLowerCase().indexOf(text) > -1;
+ };
+ }
+ }
+
+ var search = function(obj, text) {
+ if (typeof text === 'string' && text.charAt(0) === '!') {
+ return !search(obj, text.substr(1));
+ }
+ switch (typeof obj) {
+ case 'boolean':
+ case 'number':
+ case 'string':
+ return comparator(obj, text);
+ case 'object':
+ switch (typeof text) {
+ case 'object':
+ return comparator(obj, text);
+ default:
+ for (var objKey in obj) {
+ if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) {
+ return true;
+ }
+ }
+ break;
+ }
+ return false;
+ case 'array':
+ for (var i = 0; i < obj.length; i++) {
+ if (search(obj[i], text)) {
+ return true;
+ }
+ }
+ return false;
+ default:
+ return false;
+ }
+ };
+ switch (typeof expression) {
+ case 'boolean':
+ case 'number':
+ case 'string':
+ // Set up expression object and fall through
+ expression = {$:expression};
+ // jshint -W086
+ case 'object':
+ // jshint +W086
+ for (var key in expression) {
+ (function(path) {
+ if (typeof expression[path] === 'undefined') return;
+ predicates.push(function(value) {
+ return search(path == '$' ? value : (value && value[path]), expression[path]);
+ });
+ })(key);
+ }
+ break;
+ case 'function':
+ predicates.push(expression);
+ break;
+ default:
+ return array;
+ }
+ var filtered = [];
+ for (var j = 0; j < array.length; j++) {
+ var value = array[j];
+ if (predicates.check(value, j)) {
+ filtered.push(value);
+ }
+ }
+ return filtered;
+ };
+}
+
+/**
+ * @ngdoc filter
+ * @name currency
+ * @kind function
+ *
+ * @description
+ * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default
+ * symbol for current locale is used.
+ *
+ * @param {number} amount Input to filter.
+ * @param {string=} symbol Currency symbol or identifier to be displayed.
+ * @param {number=} fractionSize Number of decimal places to round the amount to, defaults to default max fraction size for current locale
+ * @returns {string} Formatted number.
+ *
+ *
+ * @example
+ <example module="currencyExample">
+ <file name="index.html">
+ <script>
+ angular.module('currencyExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.amount = 1234.56;
+ }]);
+ </script>
+ <div ng-controller="ExampleController">
+ <input type="number" ng-model="amount"> <br>
+ default currency symbol ($): <span id="currency-default">{{amount | currency}}</span><br>
+ custom currency identifier (USD$): <span id="currency-custom">{{amount | currency:"USD$"}}</span>
+ no fractions (0): <span id="currency-no-fractions">{{amount | currency:"USD$":0}}</span>
+ </div>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should init with 1234.56', function() {
+ expect(element(by.id('currency-default')).getText()).toBe('$1,234.56');
+ expect(element(by.id('currency-custom')).getText()).toBe('USD$1,234.56');
+ expect(element(by.id('currency-no-fractions')).getText()).toBe('USD$1,235');
+ });
+ it('should update', function() {
+ if (browser.params.browser == 'safari') {
+ // Safari does not understand the minus key. See
+ // https://github.com/angular/protractor/issues/481
+ return;
+ }
+ element(by.model('amount')).clear();
+ element(by.model('amount')).sendKeys('-1234');
+ expect(element(by.id('currency-default')).getText()).toBe('($1,234.00)');
+ expect(element(by.id('currency-custom')).getText()).toBe('(USD$1,234.00)');
+ expect(element(by.id('currency-no-fractions')).getText()).toBe('(USD$1,234)');
+ });
+ </file>
+ </example>
+ */
+currencyFilter.$inject = ['$locale'];
+function currencyFilter($locale) {
+ var formats = $locale.NUMBER_FORMATS;
+ return function(amount, currencySymbol, fractionSize) {
+ if (isUndefined(currencySymbol)) {
+ currencySymbol = formats.CURRENCY_SYM;
+ }
+
+ if (isUndefined(fractionSize)) {
+ fractionSize = formats.PATTERNS[1].maxFrac;
+ }
+
+ // if null or undefined pass it through
+ return (amount == null)
+ ? amount
+ : formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize).
+ replace(/\u00A4/g, currencySymbol);
+ };
+}
+
+/**
+ * @ngdoc filter
+ * @name number
+ * @kind function
+ *
+ * @description
+ * Formats a number as text.
+ *
+ * If the input is not a number an empty string is returned.
+ *
+ * @param {number|string} number Number to format.
+ * @param {(number|string)=} fractionSize Number of decimal places to round the number to.
+ * If this is not provided then the fraction size is computed from the current locale's number
+ * formatting pattern. In the case of the default locale, it will be 3.
+ * @returns {string} Number rounded to decimalPlaces and places a “,” after each third digit.
+ *
+ * @example
+ <example module="numberFilterExample">
+ <file name="index.html">
+ <script>
+ angular.module('numberFilterExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.val = 1234.56789;
+ }]);
+ </script>
+ <div ng-controller="ExampleController">
+ Enter number: <input ng-model='val'><br>
+ Default formatting: <span id='number-default'>{{val | number}}</span><br>
+ No fractions: <span>{{val | number:0}}</span><br>
+ Negative number: <span>{{-val | number:4}}</span>
+ </div>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should format numbers', function() {
+ expect(element(by.id('number-default')).getText()).toBe('1,234.568');
+ expect(element(by.binding('val | number:0')).getText()).toBe('1,235');
+ expect(element(by.binding('-val | number:4')).getText()).toBe('-1,234.5679');
+ });
+
+ it('should update', function() {
+ element(by.model('val')).clear();
+ element(by.model('val')).sendKeys('3374.333');
+ expect(element(by.id('number-default')).getText()).toBe('3,374.333');
+ expect(element(by.binding('val | number:0')).getText()).toBe('3,374');
+ expect(element(by.binding('-val | number:4')).getText()).toBe('-3,374.3330');
+ });
+ </file>
+ </example>
+ */
+
+
+numberFilter.$inject = ['$locale'];
+function numberFilter($locale) {
+ var formats = $locale.NUMBER_FORMATS;
+ return function(number, fractionSize) {
+
+ // if null or undefined pass it through
+ return (number == null)
+ ? number
+ : formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP,
+ fractionSize);
+ };
+}
+
+var DECIMAL_SEP = '.';
+function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
+ if (!isFinite(number) || isObject(number)) return '';
+
+ var isNegative = number < 0;
+ number = Math.abs(number);
+ var numStr = number + '',
+ formatedText = '',
+ parts = [];
+
+ var hasExponent = false;
+ if (numStr.indexOf('e') !== -1) {
+ var match = numStr.match(/([\d\.]+)e(-?)(\d+)/);
+ if (match && match[2] == '-' && match[3] > fractionSize + 1) {
+ numStr = '0';
+ number = 0;
+ } else {
+ formatedText = numStr;
+ hasExponent = true;
+ }
+ }
+
+ if (!hasExponent) {
+ var fractionLen = (numStr.split(DECIMAL_SEP)[1] || '').length;
+
+ // determine fractionSize if it is not specified
+ if (isUndefined(fractionSize)) {
+ fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac);
+ }
+
+ // safely round numbers in JS without hitting imprecisions of floating-point arithmetics
+ // inspired by:
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round
+ number = +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize);
+
+ if (number === 0) {
+ isNegative = false;
+ }
+
+ var fraction = ('' + number).split(DECIMAL_SEP);
+ var whole = fraction[0];
+ fraction = fraction[1] || '';
+
+ var i, pos = 0,
+ lgroup = pattern.lgSize,
+ group = pattern.gSize;
+
+ if (whole.length >= (lgroup + group)) {
+ pos = whole.length - lgroup;
+ for (i = 0; i < pos; i++) {
+ if ((pos - i) % group === 0 && i !== 0) {
+ formatedText += groupSep;
+ }
+ formatedText += whole.charAt(i);
+ }
+ }
+
+ for (i = pos; i < whole.length; i++) {
+ if ((whole.length - i) % lgroup === 0 && i !== 0) {
+ formatedText += groupSep;
+ }
+ formatedText += whole.charAt(i);
+ }
+
+ // format fraction part.
+ while (fraction.length < fractionSize) {
+ fraction += '0';
+ }
+
+ if (fractionSize && fractionSize !== "0") formatedText += decimalSep + fraction.substr(0, fractionSize);
+ } else {
+
+ if (fractionSize > 0 && number > -1 && number < 1) {
+ formatedText = number.toFixed(fractionSize);
+ }
+ }
+
+ parts.push(isNegative ? pattern.negPre : pattern.posPre,
+ formatedText,
+ isNegative ? pattern.negSuf : pattern.posSuf);
+ return parts.join('');
+}
+
+function padNumber(num, digits, trim) {
+ var neg = '';
+ if (num < 0) {
+ neg = '-';
+ num = -num;
+ }
+ num = '' + num;
+ while (num.length < digits) num = '0' + num;
+ if (trim)
+ num = num.substr(num.length - digits);
+ return neg + num;
+}
+
+
+function dateGetter(name, size, offset, trim) {
+ offset = offset || 0;
+ return function(date) {
+ var value = date['get' + name]();
+ if (offset > 0 || value > -offset)
+ value += offset;
+ if (value === 0 && offset == -12) value = 12;
+ return padNumber(value, size, trim);
+ };
+}
+
+function dateStrGetter(name, shortForm) {
+ return function(date, formats) {
+ var value = date['get' + name]();
+ var get = uppercase(shortForm ? ('SHORT' + name) : name);
+
+ return formats[get][value];
+ };
+}
+
+function timeZoneGetter(date) {
+ var zone = -1 * date.getTimezoneOffset();
+ var paddedZone = (zone >= 0) ? "+" : "";
+
+ paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) +
+ padNumber(Math.abs(zone % 60), 2);
+
+ return paddedZone;
+}
+
+function getFirstThursdayOfYear(year) {
+ // 0 = index of January
+ var dayOfWeekOnFirst = (new Date(year, 0, 1)).getDay();
+ // 4 = index of Thursday (+1 to account for 1st = 5)
+ // 11 = index of *next* Thursday (+1 account for 1st = 12)
+ return new Date(year, 0, ((dayOfWeekOnFirst <= 4) ? 5 : 12) - dayOfWeekOnFirst);
+}
+
+function getThursdayThisWeek(datetime) {
+ return new Date(datetime.getFullYear(), datetime.getMonth(),
+ // 4 = index of Thursday
+ datetime.getDate() + (4 - datetime.getDay()));
+}
+
+function weekGetter(size) {
+ return function(date) {
+ var firstThurs = getFirstThursdayOfYear(date.getFullYear()),
+ thisThurs = getThursdayThisWeek(date);
+
+ var diff = +thisThurs - +firstThurs,
+ result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week
+
+ return padNumber(result, size);
+ };
+}
+
+function ampmGetter(date, formats) {
+ return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1];
+}
+
+var DATE_FORMATS = {
+ yyyy: dateGetter('FullYear', 4),
+ yy: dateGetter('FullYear', 2, 0, true),
+ y: dateGetter('FullYear', 1),
+ MMMM: dateStrGetter('Month'),
+ MMM: dateStrGetter('Month', true),
+ MM: dateGetter('Month', 2, 1),
+ M: dateGetter('Month', 1, 1),
+ dd: dateGetter('Date', 2),
+ d: dateGetter('Date', 1),
+ HH: dateGetter('Hours', 2),
+ H: dateGetter('Hours', 1),
+ hh: dateGetter('Hours', 2, -12),
+ h: dateGetter('Hours', 1, -12),
+ mm: dateGetter('Minutes', 2),
+ m: dateGetter('Minutes', 1),
+ ss: dateGetter('Seconds', 2),
+ s: dateGetter('Seconds', 1),
+ // while ISO 8601 requires fractions to be prefixed with `.` or `,`
+ // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions
+ sss: dateGetter('Milliseconds', 3),
+ EEEE: dateStrGetter('Day'),
+ EEE: dateStrGetter('Day', true),
+ a: ampmGetter,
+ Z: timeZoneGetter,
+ ww: weekGetter(2),
+ w: weekGetter(1)
+};
+
+var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZEw']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|w+))(.*)/,
+ NUMBER_STRING = /^\-?\d+$/;
+
+/**
+ * @ngdoc filter
+ * @name date
+ * @kind function
+ *
+ * @description
+ * Formats `date` to a string based on the requested `format`.
+ *
+ * `format` string can be composed of the following elements:
+ *
+ * * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010)
+ * * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10)
+ * * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199)
+ * * `'MMMM'`: Month in year (January-December)
+ * * `'MMM'`: Month in year (Jan-Dec)
+ * * `'MM'`: Month in year, padded (01-12)
+ * * `'M'`: Month in year (1-12)
+ * * `'dd'`: Day in month, padded (01-31)
+ * * `'d'`: Day in month (1-31)
+ * * `'EEEE'`: Day in Week,(Sunday-Saturday)
+ * * `'EEE'`: Day in Week, (Sun-Sat)
+ * * `'HH'`: Hour in day, padded (00-23)
+ * * `'H'`: Hour in day (0-23)
+ * * `'hh'`: Hour in AM/PM, padded (01-12)
+ * * `'h'`: Hour in AM/PM, (1-12)
+ * * `'mm'`: Minute in hour, padded (00-59)
+ * * `'m'`: Minute in hour (0-59)
+ * * `'ss'`: Second in minute, padded (00-59)
+ * * `'s'`: Second in minute (0-59)
+ * * `'.sss' or ',sss'`: Millisecond in second, padded (000-999)
+ * * `'a'`: AM/PM marker
+ * * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200)
+ * * `'ww'`: ISO-8601 week of year (00-53)
+ * * `'w'`: ISO-8601 week of year (0-53)
+ *
+ * `format` string can also be one of the following predefined
+ * {@link guide/i18n localizable formats}:
+ *
+ * * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale
+ * (e.g. Sep 3, 2010 12:05:08 PM)
+ * * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US locale (e.g. 9/3/10 12:05 PM)
+ * * `'fullDate'`: equivalent to `'EEEE, MMMM d, y'` for en_US locale
+ * (e.g. Friday, September 3, 2010)
+ * * `'longDate'`: equivalent to `'MMMM d, y'` for en_US locale (e.g. September 3, 2010)
+ * * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US locale (e.g. Sep 3, 2010)
+ * * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10)
+ * * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 PM)
+ * * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 PM)
+ *
+ * `format` string can contain literal values. These need to be escaped by surrounding with single quotes (e.g.
+ * `"h 'in the morning'"`). In order to output a single quote, escape it - i.e., two single quotes in a sequence
+ * (e.g. `"h 'o''clock'"`).
+ *
+ * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or
+ * number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.sssZ and its
+ * shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is
+ * specified in the string input, the time is considered to be in the local timezone.
+ * @param {string=} format Formatting rules (see Description). If not specified,
+ * `mediumDate` is used.
+ * @param {string=} timezone Timezone to be used for formatting. Right now, only `'UTC'` is supported.
+ * If not specified, the timezone of the browser will be used.
+ * @returns {string} Formatted string or the input if input is not recognized as date/millis.
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <span ng-non-bindable>{{1288323623006 | date:'medium'}}</span>:
+ <span>{{1288323623006 | date:'medium'}}</span><br>
+ <span ng-non-bindable>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span>:
+ <span>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span><br>
+ <span ng-non-bindable>{{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}</span>:
+ <span>{{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}</span><br>
+ <span ng-non-bindable>{{1288323623006 | date:"MM/dd/yyyy 'at' h:mma"}}</span>:
+ <span>{{'1288323623006' | date:"MM/dd/yyyy 'at' h:mma"}}</span><br>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should format date', function() {
+ expect(element(by.binding("1288323623006 | date:'medium'")).getText()).
+ toMatch(/Oct 2\d, 2010 \d{1,2}:\d{2}:\d{2} (AM|PM)/);
+ expect(element(by.binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")).getText()).
+ toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} (\-|\+)?\d{4}/);
+ expect(element(by.binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")).getText()).
+ toMatch(/10\/2\d\/2010 @ \d{1,2}:\d{2}(AM|PM)/);
+ expect(element(by.binding("'1288323623006' | date:\"MM/dd/yyyy 'at' h:mma\"")).getText()).
+ toMatch(/10\/2\d\/2010 at \d{1,2}:\d{2}(AM|PM)/);
+ });
+ </file>
+ </example>
+ */
+dateFilter.$inject = ['$locale'];
+function dateFilter($locale) {
+
+
+ var R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;
+ // 1 2 3 4 5 6 7 8 9 10 11
+ function jsonStringToDate(string) {
+ var match;
+ if (match = string.match(R_ISO8601_STR)) {
+ var date = new Date(0),
+ tzHour = 0,
+ tzMin = 0,
+ dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear,
+ timeSetter = match[8] ? date.setUTCHours : date.setHours;
+
+ if (match[9]) {
+ tzHour = int(match[9] + match[10]);
+ tzMin = int(match[9] + match[11]);
+ }
+ dateSetter.call(date, int(match[1]), int(match[2]) - 1, int(match[3]));
+ var h = int(match[4] || 0) - tzHour;
+ var m = int(match[5] || 0) - tzMin;
+ var s = int(match[6] || 0);
+ var ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000);
+ timeSetter.call(date, h, m, s, ms);
+ return date;
+ }
+ return string;
+ }
+
+
+ return function(date, format, timezone) {
+ var text = '',
+ parts = [],
+ fn, match;
+
+ format = format || 'mediumDate';
+ format = $locale.DATETIME_FORMATS[format] || format;
+ if (isString(date)) {
+ date = NUMBER_STRING.test(date) ? int(date) : jsonStringToDate(date);
+ }
+
+ if (isNumber(date)) {
+ date = new Date(date);
+ }
+
+ if (!isDate(date)) {
+ return date;
+ }
+
+ while (format) {
+ match = DATE_FORMATS_SPLIT.exec(format);
+ if (match) {
+ parts = concat(parts, match, 1);
+ format = parts.pop();
+ } else {
+ parts.push(format);
+ format = null;
+ }
+ }
+
+ if (timezone && timezone === 'UTC') {
+ date = new Date(date.getTime());
+ date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
+ }
+ forEach(parts, function(value) {
+ fn = DATE_FORMATS[value];
+ text += fn ? fn(date, $locale.DATETIME_FORMATS)
+ : value.replace(/(^'|'$)/g, '').replace(/''/g, "'");
+ });
+
+ return text;
+ };
+}
+
+
+/**
+ * @ngdoc filter
+ * @name json
+ * @kind function
+ *
+ * @description
+ * Allows you to convert a JavaScript object into JSON string.
+ *
+ * This filter is mostly useful for debugging. When using the double curly {{value}} notation
+ * the binding is automatically converted to JSON.
+ *
+ * @param {*} object Any JavaScript object (including arrays and primitive types) to filter.
+ * @returns {string} JSON string.
+ *
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <pre>{{ {'name':'value'} | json }}</pre>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should jsonify filtered objects', function() {
+ expect(element(by.binding("{'name':'value'}")).getText()).toMatch(/\{\n "name": ?"value"\n}/);
+ });
+ </file>
+ </example>
+ *
+ */
+function jsonFilter() {
+ return function(object) {
+ return toJson(object, true);
+ };
+}
+
+
+/**
+ * @ngdoc filter
+ * @name lowercase
+ * @kind function
+ * @description
+ * Converts string to lowercase.
+ * @see angular.lowercase
+ */
+var lowercaseFilter = valueFn(lowercase);
+
+
+/**
+ * @ngdoc filter
+ * @name uppercase
+ * @kind function
+ * @description
+ * Converts string to uppercase.
+ * @see angular.uppercase
+ */
+var uppercaseFilter = valueFn(uppercase);
+
+/**
+ * @ngdoc filter
+ * @name limitTo
+ * @kind function
+ *
+ * @description
+ * Creates a new array or string containing only a specified number of elements. The elements
+ * are taken from either the beginning or the end of the source array, string or number, as specified by
+ * the value and sign (positive or negative) of `limit`. If a number is used as input, it is
+ * converted to a string.
+ *
+ * @param {Array|string|number} input Source array, string or number to be limited.
+ * @param {string|number} limit The length of the returned array or string. If the `limit` number
+ * is positive, `limit` number of items from the beginning of the source array/string are copied.
+ * If the number is negative, `limit` number of items from the end of the source array/string
+ * are copied. The `limit` will be trimmed if it exceeds `array.length`
+ * @returns {Array|string} A new sub-array or substring of length `limit` or less if input array
+ * had less than `limit` elements.
+ *
+ * @example
+ <example module="limitToExample">
+ <file name="index.html">
+ <script>
+ angular.module('limitToExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.numbers = [1,2,3,4,5,6,7,8,9];
+ $scope.letters = "abcdefghi";
+ $scope.longNumber = 2345432342;
+ $scope.numLimit = 3;
+ $scope.letterLimit = 3;
+ $scope.longNumberLimit = 3;
+ }]);
+ </script>
+ <div ng-controller="ExampleController">
+ Limit {{numbers}} to: <input type="number" step="1" ng-model="numLimit">
+ <p>Output numbers: {{ numbers | limitTo:numLimit }}</p>
+ Limit {{letters}} to: <input type="number" step="1" ng-model="letterLimit">
+ <p>Output letters: {{ letters | limitTo:letterLimit }}</p>
+ Limit {{longNumber}} to: <input type="number" step="1" ng-model="longNumberLimit">
+ <p>Output long number: {{ longNumber | limitTo:longNumberLimit }}</p>
+ </div>
+ </file>
+ <file name="protractor.js" type="protractor">
+ var numLimitInput = element(by.model('numLimit'));
+ var letterLimitInput = element(by.model('letterLimit'));
+ var longNumberLimitInput = element(by.model('longNumberLimit'));
+ var limitedNumbers = element(by.binding('numbers | limitTo:numLimit'));
+ var limitedLetters = element(by.binding('letters | limitTo:letterLimit'));
+ var limitedLongNumber = element(by.binding('longNumber | limitTo:longNumberLimit'));
+
+ it('should limit the number array to first three items', function() {
+ expect(numLimitInput.getAttribute('value')).toBe('3');
+ expect(letterLimitInput.getAttribute('value')).toBe('3');
+ expect(longNumberLimitInput.getAttribute('value')).toBe('3');
+ expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3]');
+ expect(limitedLetters.getText()).toEqual('Output letters: abc');
+ expect(limitedLongNumber.getText()).toEqual('Output long number: 234');
+ });
+
+ // There is a bug in safari and protractor that doesn't like the minus key
+ // it('should update the output when -3 is entered', function() {
+ // numLimitInput.clear();
+ // numLimitInput.sendKeys('-3');
+ // letterLimitInput.clear();
+ // letterLimitInput.sendKeys('-3');
+ // longNumberLimitInput.clear();
+ // longNumberLimitInput.sendKeys('-3');
+ // expect(limitedNumbers.getText()).toEqual('Output numbers: [7,8,9]');
+ // expect(limitedLetters.getText()).toEqual('Output letters: ghi');
+ // expect(limitedLongNumber.getText()).toEqual('Output long number: 342');
+ // });
+
+ it('should not exceed the maximum size of input array', function() {
+ numLimitInput.clear();
+ numLimitInput.sendKeys('100');
+ letterLimitInput.clear();
+ letterLimitInput.sendKeys('100');
+ longNumberLimitInput.clear();
+ longNumberLimitInput.sendKeys('100');
+ expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3,4,5,6,7,8,9]');
+ expect(limitedLetters.getText()).toEqual('Output letters: abcdefghi');
+ expect(limitedLongNumber.getText()).toEqual('Output long number: 2345432342');
+ });
+ </file>
+ </example>
+*/
+function limitToFilter() {
+ return function(input, limit) {
+ if (isNumber(input)) input = input.toString();
+ if (!isArray(input) && !isString(input)) return input;
+
+ if (Math.abs(Number(limit)) === Infinity) {
+ limit = Number(limit);
+ } else {
+ limit = int(limit);
+ }
+
+ if (isString(input)) {
+ //NaN check on limit
+ if (limit) {
+ return limit >= 0 ? input.slice(0, limit) : input.slice(limit, input.length);
+ } else {
+ return "";
+ }
+ }
+
+ var out = [],
+ i, n;
+
+ // if abs(limit) exceeds maximum length, trim it
+ if (limit > input.length)
+ limit = input.length;
+ else if (limit < -input.length)
+ limit = -input.length;
+
+ if (limit > 0) {
+ i = 0;
+ n = limit;
+ } else {
+ i = input.length + limit;
+ n = input.length;
+ }
+
+ for (; i < n; i++) {
+ out.push(input[i]);
+ }
+
+ return out;
+ };
+}
+
+/**
+ * @ngdoc filter
+ * @name orderBy
+ * @kind function
+ *
+ * @description
+ * Orders a specified `array` by the `expression` predicate. It is ordered alphabetically
+ * for strings and numerically for numbers. Note: if you notice numbers are not being sorted
+ * correctly, make sure they are actually being saved as numbers and not strings.
+ *
+ * @param {Array} array The array to sort.
+ * @param {function(*)|string|Array.<(function(*)|string)>=} expression A predicate to be
+ * used by the comparator to determine the order of elements.
+ *
+ * Can be one of:
+ *
+ * - `function`: Getter function. The result of this function will be sorted using the
+ * `<`, `=`, `>` operator.
+ * - `string`: An Angular expression. The result of this expression is used to compare elements
+ * (for example `name` to sort by a property called `name` or `name.substr(0, 3)` to sort by
+ * 3 first characters of a property called `name`). The result of a constant expression
+ * is interpreted as a property name to be used in comparisons (for example `"special name"`
+ * to sort object by the value of their `special name` property). An expression can be
+ * optionally prefixed with `+` or `-` to control ascending or descending sort order
+ * (for example, `+name` or `-name`). If no property is provided, (e.g. `'+'`) then the array
+ * element itself is used to compare where sorting.
+ * - `Array`: An array of function or string predicates. The first predicate in the array
+ * is used for sorting, but when two items are equivalent, the next predicate is used.
+ *
+ * If the predicate is missing or empty then it defaults to `'+'`.
+ *
+ * @param {boolean=} reverse Reverse the order of the array.
+ * @returns {Array} Sorted copy of the source array.
+ *
+ * @example
+ <example module="orderByExample">
+ <file name="index.html">
+ <script>
+ angular.module('orderByExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.friends =
+ [{name:'John', phone:'555-1212', age:10},
+ {name:'Mary', phone:'555-9876', age:19},
+ {name:'Mike', phone:'555-4321', age:21},
+ {name:'Adam', phone:'555-5678', age:35},
+ {name:'Julie', phone:'555-8765', age:29}];
+ $scope.predicate = '-age';
+ }]);
+ </script>
+ <div ng-controller="ExampleController">
+ <pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>
+ <hr/>
+ [ <a href="" ng-click="predicate=''">unsorted</a> ]
+ <table class="friend">
+ <tr>
+ <th><a href="" ng-click="predicate = 'name'; reverse=false">Name</a>
+ (<a href="" ng-click="predicate = '-name'; reverse=false">^</a>)</th>
+ <th><a href="" ng-click="predicate = 'phone'; reverse=!reverse">Phone Number</a></th>
+ <th><a href="" ng-click="predicate = 'age'; reverse=!reverse">Age</a></th>
+ </tr>
+ <tr ng-repeat="friend in friends | orderBy:predicate:reverse">
+ <td>{{friend.name}}</td>
+ <td>{{friend.phone}}</td>
+ <td>{{friend.age}}</td>
+ </tr>
+ </table>
+ </div>
+ </file>
+ </example>
+ *
+ * It's also possible to call the orderBy filter manually, by injecting `$filter`, retrieving the
+ * filter routine with `$filter('orderBy')`, and calling the returned filter routine with the
+ * desired parameters.
+ *
+ * Example:
+ *
+ * @example
+ <example module="orderByExample">
+ <file name="index.html">
+ <div ng-controller="ExampleController">
+ <table class="friend">
+ <tr>
+ <th><a href="" ng-click="reverse=false;order('name', false)">Name</a>
+ (<a href="" ng-click="order('-name',false)">^</a>)</th>
+ <th><a href="" ng-click="reverse=!reverse;order('phone', reverse)">Phone Number</a></th>
+ <th><a href="" ng-click="reverse=!reverse;order('age',reverse)">Age</a></th>
+ </tr>
+ <tr ng-repeat="friend in friends">
+ <td>{{friend.name}}</td>
+ <td>{{friend.phone}}</td>
+ <td>{{friend.age}}</td>
+ </tr>
+ </table>
+ </div>
+ </file>
+
+ <file name="script.js">
+ angular.module('orderByExample', [])
+ .controller('ExampleController', ['$scope', '$filter', function($scope, $filter) {
+ var orderBy = $filter('orderBy');
+ $scope.friends = [
+ { name: 'John', phone: '555-1212', age: 10 },
+ { name: 'Mary', phone: '555-9876', age: 19 },
+ { name: 'Mike', phone: '555-4321', age: 21 },
+ { name: 'Adam', phone: '555-5678', age: 35 },
+ { name: 'Julie', phone: '555-8765', age: 29 }
+ ];
+ $scope.order = function(predicate, reverse) {
+ $scope.friends = orderBy($scope.friends, predicate, reverse);
+ };
+ $scope.order('-age',false);
+ }]);
+ </file>
+</example>
+ */
+orderByFilter.$inject = ['$parse'];
+function orderByFilter($parse) {
+ return function(array, sortPredicate, reverseOrder) {
+ if (!(isArrayLike(array))) return array;
+ sortPredicate = isArray(sortPredicate) ? sortPredicate : [sortPredicate];
+ if (sortPredicate.length === 0) { sortPredicate = ['+']; }
+ sortPredicate = sortPredicate.map(function(predicate) {
+ var descending = false, get = predicate || identity;
+ if (isString(predicate)) {
+ if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) {
+ descending = predicate.charAt(0) == '-';
+ predicate = predicate.substring(1);
+ }
+ if (predicate === '') {
+ // Effectively no predicate was passed so we compare identity
+ return reverseComparator(function(a, b) {
+ return compare(a, b);
+ }, descending);
+ }
+ get = $parse(predicate);
+ if (get.constant) {
+ var key = get();
+ return reverseComparator(function(a, b) {
+ return compare(a[key], b[key]);
+ }, descending);
+ }
+ }
+ return reverseComparator(function(a, b) {
+ return compare(get(a),get(b));
+ }, descending);
+ });
+ return slice.call(array).sort(reverseComparator(comparator, reverseOrder));
+
+ function comparator(o1, o2) {
+ for (var i = 0; i < sortPredicate.length; i++) {
+ var comp = sortPredicate[i](o1, o2);
+ if (comp !== 0) return comp;
+ }
+ return 0;
+ }
+ function reverseComparator(comp, descending) {
+ return descending
+ ? function(a, b) {return comp(b,a);}
+ : comp;
+ }
+ function compare(v1, v2) {
+ var t1 = typeof v1;
+ var t2 = typeof v2;
+ if (t1 == t2) {
+ if (isDate(v1) && isDate(v2)) {
+ v1 = v1.valueOf();
+ v2 = v2.valueOf();
+ }
+ if (t1 == "string") {
+ v1 = v1.toLowerCase();
+ v2 = v2.toLowerCase();
+ }
+ if (v1 === v2) return 0;
+ return v1 < v2 ? -1 : 1;
+ } else {
+ return t1 < t2 ? -1 : 1;
+ }
+ }
+ };
+}
+
+function ngDirective(directive) {
+ if (isFunction(directive)) {
+ directive = {
+ link: directive
+ };
+ }
+ directive.restrict = directive.restrict || 'AC';
+ return valueFn(directive);
+}
+
+/**
+ * @ngdoc directive
+ * @name a
+ * @restrict E
+ *
+ * @description
+ * Modifies the default behavior of the html A tag so that the default action is prevented when
+ * the href attribute is empty.
+ *
+ * This change permits the easy creation of action links with the `ngClick` directive
+ * without changing the location or causing page reloads, e.g.:
+ * `<a href="" ng-click="list.addItem()">Add Item</a>`
+ */
+var htmlAnchorDirective = valueFn({
+ restrict: 'E',
+ compile: function(element, attr) {
+ if (!attr.href && !attr.xlinkHref && !attr.name) {
+ return function(scope, element) {
+ // SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute.
+ var href = toString.call(element.prop('href')) === '[object SVGAnimatedString]' ?
+ 'xlink:href' : 'href';
+ element.on('click', function(event) {
+ // if we have no href url, then don't navigate anywhere.
+ if (!element.attr(href)) {
+ event.preventDefault();
+ }
+ });
+ };
+ }
+ }
+});
+
+/**
+ * @ngdoc directive
+ * @name ngHref
+ * @restrict A
+ * @priority 99
+ *
+ * @description
+ * Using Angular markup like `{{hash}}` in an href attribute will
+ * make the link go to the wrong URL if the user clicks it before
+ * Angular has a chance to replace the `{{hash}}` markup with its
+ * value. Until Angular replaces the markup the link will be broken
+ * and will most likely return a 404 error. The `ngHref` directive
+ * solves this problem.
+ *
+ * The wrong way to write it:
+ * ```html
+ * <a href="http://www.gravatar.com/avatar/{{hash}}">link1</a>
+ * ```
+ *
+ * The correct way to write it:
+ * ```html
+ * <a ng-href="http://www.gravatar.com/avatar/{{hash}}">link1</a>
+ * ```
+ *
+ * @element A
+ * @param {template} ngHref any string which can contain `{{}}` markup.
+ *
+ * @example
+ * This example shows various combinations of `href`, `ng-href` and `ng-click` attributes
+ * in links and their different behaviors:
+ <example>
+ <file name="index.html">
+ <input ng-model="value" /><br />
+ <a id="link-1" href ng-click="value = 1">link 1</a> (link, don't reload)<br />
+ <a id="link-2" href="" ng-click="value = 2">link 2</a> (link, don't reload)<br />
+ <a id="link-3" ng-href="/{{'123'}}">link 3</a> (link, reload!)<br />
+ <a id="link-4" href="" name="xx" ng-click="value = 4">anchor</a> (link, don't reload)<br />
+ <a id="link-5" name="xxx" ng-click="value = 5">anchor</a> (no link)<br />
+ <a id="link-6" ng-href="{{value}}">link</a> (link, change location)
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should execute ng-click but not reload when href without value', function() {
+ element(by.id('link-1')).click();
+ expect(element(by.model('value')).getAttribute('value')).toEqual('1');
+ expect(element(by.id('link-1')).getAttribute('href')).toBe('');
+ });
+
+ it('should execute ng-click but not reload when href empty string', function() {
+ element(by.id('link-2')).click();
+ expect(element(by.model('value')).getAttribute('value')).toEqual('2');
+ expect(element(by.id('link-2')).getAttribute('href')).toBe('');
+ });
+
+ it('should execute ng-click and change url when ng-href specified', function() {
+ expect(element(by.id('link-3')).getAttribute('href')).toMatch(/\/123$/);
+
+ element(by.id('link-3')).click();
+
+ // At this point, we navigate away from an Angular page, so we need
+ // to use browser.driver to get the base webdriver.
+
+ browser.wait(function() {
+ return browser.driver.getCurrentUrl().then(function(url) {
+ return url.match(/\/123$/);
+ });
+ }, 5000, 'page should navigate to /123');
+ });
+
+ xit('should execute ng-click but not reload when href empty string and name specified', function() {
+ element(by.id('link-4')).click();
+ expect(element(by.model('value')).getAttribute('value')).toEqual('4');
+ expect(element(by.id('link-4')).getAttribute('href')).toBe('');
+ });
+
+ it('should execute ng-click but not reload when no href but name specified', function() {
+ element(by.id('link-5')).click();
+ expect(element(by.model('value')).getAttribute('value')).toEqual('5');
+ expect(element(by.id('link-5')).getAttribute('href')).toBe(null);
+ });
+
+ it('should only change url when only ng-href', function() {
+ element(by.model('value')).clear();
+ element(by.model('value')).sendKeys('6');
+ expect(element(by.id('link-6')).getAttribute('href')).toMatch(/\/6$/);
+
+ element(by.id('link-6')).click();
+
+ // At this point, we navigate away from an Angular page, so we need
+ // to use browser.driver to get the base webdriver.
+ browser.wait(function() {
+ return browser.driver.getCurrentUrl().then(function(url) {
+ return url.match(/\/6$/);
+ });
+ }, 5000, 'page should navigate to /6');
+ });
+ </file>
+ </example>
+ */
+
+/**
+ * @ngdoc directive
+ * @name ngSrc
+ * @restrict A
+ * @priority 99
+ *
+ * @description
+ * Using Angular markup like `{{hash}}` in a `src` attribute doesn't
+ * work right: The browser will fetch from the URL with the literal
+ * text `{{hash}}` until Angular replaces the expression inside
+ * `{{hash}}`. The `ngSrc` directive solves this problem.
+ *
+ * The buggy way to write it:
+ * ```html
+ * <img src="http://www.gravatar.com/avatar/{{hash}}"/>
+ * ```
+ *
+ * The correct way to write it:
+ * ```html
+ * <img ng-src="http://www.gravatar.com/avatar/{{hash}}"/>
+ * ```
+ *
+ * @element IMG
+ * @param {template} ngSrc any string which can contain `{{}}` markup.
+ */
+
+/**
+ * @ngdoc directive
+ * @name ngSrcset
+ * @restrict A
+ * @priority 99
+ *
+ * @description
+ * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't
+ * work right: The browser will fetch from the URL with the literal
+ * text `{{hash}}` until Angular replaces the expression inside
+ * `{{hash}}`. The `ngSrcset` directive solves this problem.
+ *
+ * The buggy way to write it:
+ * ```html
+ * <img srcset="http://www.gravatar.com/avatar/{{hash}} 2x"/>
+ * ```
+ *
+ * The correct way to write it:
+ * ```html
+ * <img ng-srcset="http://www.gravatar.com/avatar/{{hash}} 2x"/>
+ * ```
+ *
+ * @element IMG
+ * @param {template} ngSrcset any string which can contain `{{}}` markup.
+ */
+
+/**
+ * @ngdoc directive
+ * @name ngDisabled
+ * @restrict A
+ * @priority 100
+ *
+ * @description
+ *
+ * We shouldn't do this, because it will make the button enabled on Chrome/Firefox but not on IE8 and older IEs:
+ * ```html
+ * <div ng-init="scope = { isDisabled: false }">
+ * <button disabled="{{scope.isDisabled}}">Disabled</button>
+ * </div>
+ * ```
+ *
+ * The HTML specification does not require browsers to preserve the values of boolean attributes
+ * such as disabled. (Their presence means true and their absence means false.)
+ * If we put an Angular interpolation expression into such an attribute then the
+ * binding information would be lost when the browser removes the attribute.
+ * The `ngDisabled` directive solves this problem for the `disabled` attribute.
+ * This complementary directive is not removed by the browser and so provides
+ * a permanent reliable place to store the binding information.
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ Click me to toggle: <input type="checkbox" ng-model="checked"><br/>
+ <button ng-model="button" ng-disabled="checked">Button</button>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should toggle button', function() {
+ expect(element(by.css('button')).getAttribute('disabled')).toBeFalsy();
+ element(by.model('checked')).click();
+ expect(element(by.css('button')).getAttribute('disabled')).toBeTruthy();
+ });
+ </file>
+ </example>
+ *
+ * @element INPUT
+ * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy,
+ * then special attribute "disabled" will be set on the element
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ngChecked
+ * @restrict A
+ * @priority 100
+ *
+ * @description
+ * The HTML specification does not require browsers to preserve the values of boolean attributes
+ * such as checked. (Their presence means true and their absence means false.)
+ * If we put an Angular interpolation expression into such an attribute then the
+ * binding information would be lost when the browser removes the attribute.
+ * The `ngChecked` directive solves this problem for the `checked` attribute.
+ * This complementary directive is not removed by the browser and so provides
+ * a permanent reliable place to store the binding information.
+ * @example
+ <example>
+ <file name="index.html">
+ Check me to check both: <input type="checkbox" ng-model="master"><br/>
+ <input id="checkSlave" type="checkbox" ng-checked="master">
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should check both checkBoxes', function() {
+ expect(element(by.id('checkSlave')).getAttribute('checked')).toBeFalsy();
+ element(by.model('master')).click();
+ expect(element(by.id('checkSlave')).getAttribute('checked')).toBeTruthy();
+ });
+ </file>
+ </example>
+ *
+ * @element INPUT
+ * @param {expression} ngChecked If the {@link guide/expression expression} is truthy,
+ * then special attribute "checked" will be set on the element
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ngReadonly
+ * @restrict A
+ * @priority 100
+ *
+ * @description
+ * The HTML specification does not require browsers to preserve the values of boolean attributes
+ * such as readonly. (Their presence means true and their absence means false.)
+ * If we put an Angular interpolation expression into such an attribute then the
+ * binding information would be lost when the browser removes the attribute.
+ * The `ngReadonly` directive solves this problem for the `readonly` attribute.
+ * This complementary directive is not removed by the browser and so provides
+ * a permanent reliable place to store the binding information.
+ * @example
+ <example>
+ <file name="index.html">
+ Check me to make text readonly: <input type="checkbox" ng-model="checked"><br/>
+ <input type="text" ng-readonly="checked" value="I'm Angular"/>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should toggle readonly attr', function() {
+ expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeFalsy();
+ element(by.model('checked')).click();
+ expect(element(by.css('[type="text"]')).getAttribute('readonly')).toBeTruthy();
+ });
+ </file>
+ </example>
+ *
+ * @element INPUT
+ * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy,
+ * then special attribute "readonly" will be set on the element
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ngSelected
+ * @restrict A
+ * @priority 100
+ *
+ * @description
+ * The HTML specification does not require browsers to preserve the values of boolean attributes
+ * such as selected. (Their presence means true and their absence means false.)
+ * If we put an Angular interpolation expression into such an attribute then the
+ * binding information would be lost when the browser removes the attribute.
+ * The `ngSelected` directive solves this problem for the `selected` attribute.
+ * This complementary directive is not removed by the browser and so provides
+ * a permanent reliable place to store the binding information.
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ Check me to select: <input type="checkbox" ng-model="selected"><br/>
+ <select>
+ <option>Hello!</option>
+ <option id="greet" ng-selected="selected">Greetings!</option>
+ </select>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should select Greetings!', function() {
+ expect(element(by.id('greet')).getAttribute('selected')).toBeFalsy();
+ element(by.model('selected')).click();
+ expect(element(by.id('greet')).getAttribute('selected')).toBeTruthy();
+ });
+ </file>
+ </example>
+ *
+ * @element OPTION
+ * @param {expression} ngSelected If the {@link guide/expression expression} is truthy,
+ * then special attribute "selected" will be set on the element
+ */
+
+/**
+ * @ngdoc directive
+ * @name ngOpen
+ * @restrict A
+ * @priority 100
+ *
+ * @description
+ * The HTML specification does not require browsers to preserve the values of boolean attributes
+ * such as open. (Their presence means true and their absence means false.)
+ * If we put an Angular interpolation expression into such an attribute then the
+ * binding information would be lost when the browser removes the attribute.
+ * The `ngOpen` directive solves this problem for the `open` attribute.
+ * This complementary directive is not removed by the browser and so provides
+ * a permanent reliable place to store the binding information.
+ * @example
+ <example>
+ <file name="index.html">
+ Check me check multiple: <input type="checkbox" ng-model="open"><br/>
+ <details id="details" ng-open="open">
+ <summary>Show/Hide me</summary>
+ </details>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should toggle open', function() {
+ expect(element(by.id('details')).getAttribute('open')).toBeFalsy();
+ element(by.model('open')).click();
+ expect(element(by.id('details')).getAttribute('open')).toBeTruthy();
+ });
+ </file>
+ </example>
+ *
+ * @element DETAILS
+ * @param {expression} ngOpen If the {@link guide/expression expression} is truthy,
+ * then special attribute "open" will be set on the element
+ */
+
+var ngAttributeAliasDirectives = {};
+
+
+// boolean attrs are evaluated
+forEach(BOOLEAN_ATTR, function(propName, attrName) {
+ // binding to multiple is not supported
+ if (propName == "multiple") return;
+
+ var normalized = directiveNormalize('ng-' + attrName);
+ ngAttributeAliasDirectives[normalized] = function() {
+ return {
+ restrict: 'A',
+ priority: 100,
+ link: function(scope, element, attr) {
+ scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) {
+ attr.$set(attrName, !!value);
+ });
+ }
+ };
+ };
+});
+
+// aliased input attrs are evaluated
+forEach(ALIASED_ATTR, function(htmlAttr, ngAttr) {
+ ngAttributeAliasDirectives[ngAttr] = function() {
+ return {
+ priority: 100,
+ link: function(scope, element, attr) {
+ //special case ngPattern when a literal regular expression value
+ //is used as the expression (this way we don't have to watch anything).
+ if (ngAttr === "ngPattern" && attr.ngPattern.charAt(0) == "/") {
+ var match = attr.ngPattern.match(REGEX_STRING_REGEXP);
+ if (match) {
+ attr.$set("ngPattern", new RegExp(match[1], match[2]));
+ return;
+ }
+ }
+
+ scope.$watch(attr[ngAttr], function ngAttrAliasWatchAction(value) {
+ attr.$set(ngAttr, value);
+ });
+ }
+ };
+ };
+});
+
+// ng-src, ng-srcset, ng-href are interpolated
+forEach(['src', 'srcset', 'href'], function(attrName) {
+ var normalized = directiveNormalize('ng-' + attrName);
+ ngAttributeAliasDirectives[normalized] = function() {
+ return {
+ priority: 99, // it needs to run after the attributes are interpolated
+ link: function(scope, element, attr) {
+ var propName = attrName,
+ name = attrName;
+
+ if (attrName === 'href' &&
+ toString.call(element.prop('href')) === '[object SVGAnimatedString]') {
+ name = 'xlinkHref';
+ attr.$attr[name] = 'xlink:href';
+ propName = null;
+ }
+
+ attr.$observe(normalized, function(value) {
+ if (!value) {
+ if (attrName === 'href') {
+ attr.$set(name, null);
+ }
+ return;
+ }
+
+ attr.$set(name, value);
+
+ // on IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist
+ // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need
+ // to set the property as well to achieve the desired effect.
+ // we use attr[attrName] value since $set can sanitize the url.
+ if (msie && propName) element.prop(propName, attr[name]);
+ });
+ }
+ };
+ };
+});
+
+/* global -nullFormCtrl, -SUBMITTED_CLASS, addSetValidityMethod: true
+ */
+var nullFormCtrl = {
+ $addControl: noop,
+ $$renameControl: nullFormRenameControl,
+ $removeControl: noop,
+ $setValidity: noop,
+ $setDirty: noop,
+ $setPristine: noop,
+ $setSubmitted: noop
+},
+SUBMITTED_CLASS = 'ng-submitted';
+
+function nullFormRenameControl(control, name) {
+ control.$name = name;
+}
+
+/**
+ * @ngdoc type
+ * @name form.FormController
+ *
+ * @property {boolean} $pristine True if user has not interacted with the form yet.
+ * @property {boolean} $dirty True if user has already interacted with the form.
+ * @property {boolean} $valid True if all of the containing forms and controls are valid.
+ * @property {boolean} $invalid True if at least one containing control or form is invalid.
+ * @property {boolean} $submitted True if user has submitted the form even if its invalid.
+ *
+ * @property {Object} $error Is an object hash, containing references to controls or
+ * forms with failing validators, where:
+ *
+ * - keys are validation tokens (error names),
+ * - values are arrays of controls or forms that have a failing validator for given error name.
+ *
+ * Built-in validation tokens:
+ *
+ * - `email`
+ * - `max`
+ * - `maxlength`
+ * - `min`
+ * - `minlength`
+ * - `number`
+ * - `pattern`
+ * - `required`
+ * - `url`
+ * - `date`
+ * - `datetimelocal`
+ * - `time`
+ * - `week`
+ * - `month`
+ *
+ * @description
+ * `FormController` keeps track of all its controls and nested forms as well as the state of them,
+ * such as being valid/invalid or dirty/pristine.
+ *
+ * Each {@link ng.directive:form form} directive creates an instance
+ * of `FormController`.
+ *
+ */
+//asks for $scope to fool the BC controller module
+FormController.$inject = ['$element', '$attrs', '$scope', '$animate', '$interpolate'];
+function FormController(element, attrs, $scope, $animate, $interpolate) {
+ var form = this,
+ controls = [];
+
+ var parentForm = form.$$parentForm = element.parent().controller('form') || nullFormCtrl;
+
+ // init state
+ form.$error = {};
+ form.$$success = {};
+ form.$pending = undefined;
+ form.$name = $interpolate(attrs.name || attrs.ngForm || '')($scope);
+ form.$dirty = false;
+ form.$pristine = true;
+ form.$valid = true;
+ form.$invalid = false;
+ form.$submitted = false;
+
+ parentForm.$addControl(form);
+
+ /**
+ * @ngdoc method
+ * @name form.FormController#$rollbackViewValue
+ *
+ * @description
+ * Rollback all form controls pending updates to the `$modelValue`.
+ *
+ * Updates may be pending by a debounced event or because the input is waiting for a some future
+ * event defined in `ng-model-options`. This method is typically needed by the reset button of
+ * a form that uses `ng-model-options` to pend updates.
+ */
+ form.$rollbackViewValue = function() {
+ forEach(controls, function(control) {
+ control.$rollbackViewValue();
+ });
+ };
+
+ /**
+ * @ngdoc method
+ * @name form.FormController#$commitViewValue
+ *
+ * @description
+ * Commit all form controls pending updates to the `$modelValue`.
+ *
+ * Updates may be pending by a debounced event or because the input is waiting for a some future
+ * event defined in `ng-model-options`. This method is rarely needed as `NgModelController`
+ * usually handles calling this in response to input events.
+ */
+ form.$commitViewValue = function() {
+ forEach(controls, function(control) {
+ control.$commitViewValue();
+ });
+ };
+
+ /**
+ * @ngdoc method
+ * @name form.FormController#$addControl
+ *
+ * @description
+ * Register a control with the form.
+ *
+ * Input elements using ngModelController do this automatically when they are linked.
+ */
+ form.$addControl = function(control) {
+ // Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored
+ // and not added to the scope. Now we throw an error.
+ assertNotHasOwnProperty(control.$name, 'input');
+ controls.push(control);
+
+ if (control.$name) {
+ form[control.$name] = control;
+ }
+ };
+
+ // Private API: rename a form control
+ form.$$renameControl = function(control, newName) {
+ var oldName = control.$name;
+
+ if (form[oldName] === control) {
+ delete form[oldName];
+ }
+ form[newName] = control;
+ control.$name = newName;
+ };
+
+ /**
+ * @ngdoc method
+ * @name form.FormController#$removeControl
+ *
+ * @description
+ * Deregister a control from the form.
+ *
+ * Input elements using ngModelController do this automatically when they are destroyed.
+ */
+ form.$removeControl = function(control) {
+ if (control.$name && form[control.$name] === control) {
+ delete form[control.$name];
+ }
+ forEach(form.$pending, function(value, name) {
+ form.$setValidity(name, null, control);
+ });
+ forEach(form.$error, function(value, name) {
+ form.$setValidity(name, null, control);
+ });
+
+ arrayRemove(controls, control);
+ };
+
+
+ /**
+ * @ngdoc method
+ * @name form.FormController#$setValidity
+ *
+ * @description
+ * Sets the validity of a form control.
+ *
+ * This method will also propagate to parent forms.
+ */
+ addSetValidityMethod({
+ ctrl: this,
+ $element: element,
+ set: function(object, property, control) {
+ var list = object[property];
+ if (!list) {
+ object[property] = [control];
+ } else {
+ var index = list.indexOf(control);
+ if (index === -1) {
+ list.push(control);
+ }
+ }
+ },
+ unset: function(object, property, control) {
+ var list = object[property];
+ if (!list) {
+ return;
+ }
+ arrayRemove(list, control);
+ if (list.length === 0) {
+ delete object[property];
+ }
+ },
+ parentForm: parentForm,
+ $animate: $animate
+ });
+
+ /**
+ * @ngdoc method
+ * @name form.FormController#$setDirty
+ *
+ * @description
+ * Sets the form to a dirty state.
+ *
+ * This method can be called to add the 'ng-dirty' class and set the form to a dirty
+ * state (ng-dirty class). This method will also propagate to parent forms.
+ */
+ form.$setDirty = function() {
+ $animate.removeClass(element, PRISTINE_CLASS);
+ $animate.addClass(element, DIRTY_CLASS);
+ form.$dirty = true;
+ form.$pristine = false;
+ parentForm.$setDirty();
+ };
+
+ /**
+ * @ngdoc method
+ * @name form.FormController#$setPristine
+ *
+ * @description
+ * Sets the form to its pristine state.
+ *
+ * This method can be called to remove the 'ng-dirty' class and set the form to its pristine
+ * state (ng-pristine class). This method will also propagate to all the controls contained
+ * in this form.
+ *
+ * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after
+ * saving or resetting it.
+ */
+ form.$setPristine = function() {
+ $animate.setClass(element, PRISTINE_CLASS, DIRTY_CLASS + ' ' + SUBMITTED_CLASS);
+ form.$dirty = false;
+ form.$pristine = true;
+ form.$submitted = false;
+ forEach(controls, function(control) {
+ control.$setPristine();
+ });
+ };
+
+ /**
+ * @ngdoc method
+ * @name form.FormController#$setUntouched
+ *
+ * @description
+ * Sets the form to its untouched state.
+ *
+ * This method can be called to remove the 'ng-touched' class and set the form controls to their
+ * untouched state (ng-untouched class).
+ *
+ * Setting a form controls back to their untouched state is often useful when setting the form
+ * back to its pristine state.
+ */
+ form.$setUntouched = function() {
+ forEach(controls, function(control) {
+ control.$setUntouched();
+ });
+ };
+
+ /**
+ * @ngdoc method
+ * @name form.FormController#$setSubmitted
+ *
+ * @description
+ * Sets the form to its submitted state.
+ */
+ form.$setSubmitted = function() {
+ $animate.addClass(element, SUBMITTED_CLASS);
+ form.$submitted = true;
+ parentForm.$setSubmitted();
+ };
+}
+
+/**
+ * @ngdoc directive
+ * @name ngForm
+ * @restrict EAC
+ *
+ * @description
+ * Nestable alias of {@link ng.directive:form `form`} directive. HTML
+ * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a
+ * sub-group of controls needs to be determined.
+ *
+ * Note: the purpose of `ngForm` is to group controls,
+ * but not to be a replacement for the `<form>` tag with all of its capabilities
+ * (e.g. posting to the server, ...).
+ *
+ * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into
+ * related scope, under this name.
+ *
+ */
+
+ /**
+ * @ngdoc directive
+ * @name form
+ * @restrict E
+ *
+ * @description
+ * Directive that instantiates
+ * {@link form.FormController FormController}.
+ *
+ * If the `name` attribute is specified, the form controller is published onto the current scope under
+ * this name.
+ *
+ * # Alias: {@link ng.directive:ngForm `ngForm`}
+ *
+ * In Angular forms can be nested. This means that the outer form is valid when all of the child
+ * forms are valid as well. However, browsers do not allow nesting of `<form>` elements, so
+ * Angular provides the {@link ng.directive:ngForm `ngForm`} directive which behaves identically to
+ * `<form>` but can be nested. This allows you to have nested forms, which is very useful when
+ * using Angular validation directives in forms that are dynamically generated using the
+ * {@link ng.directive:ngRepeat `ngRepeat`} directive. Since you cannot dynamically generate the `name`
+ * attribute of input elements using interpolation, you have to wrap each set of repeated inputs in an
+ * `ngForm` directive and nest these in an outer `form` element.
+ *
+ *
+ * # CSS classes
+ * - `ng-valid` is set if the form is valid.
+ * - `ng-invalid` is set if the form is invalid.
+ * - `ng-pristine` is set if the form is pristine.
+ * - `ng-dirty` is set if the form is dirty.
+ * - `ng-submitted` is set if the form was submitted.
+ *
+ * Keep in mind that ngAnimate can detect each of these classes when added and removed.
+ *
+ *
+ * # Submitting a form and preventing the default action
+ *
+ * Since the role of forms in client-side Angular applications is different than in classical
+ * roundtrip apps, it is desirable for the browser not to translate the form submission into a full
+ * page reload that sends the data to the server. Instead some javascript logic should be triggered
+ * to handle the form submission in an application-specific way.
+ *
+ * For this reason, Angular prevents the default action (form submission to the server) unless the
+ * `<form>` element has an `action` attribute specified.
+ *
+ * You can use one of the following two ways to specify what javascript method should be called when
+ * a form is submitted:
+ *
+ * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element
+ * - {@link ng.directive:ngClick ngClick} directive on the first
+ * button or input field of type submit (input[type=submit])
+ *
+ * To prevent double execution of the handler, use only one of the {@link ng.directive:ngSubmit ngSubmit}
+ * or {@link ng.directive:ngClick ngClick} directives.
+ * This is because of the following form submission rules in the HTML specification:
+ *
+ * - If a form has only one input field then hitting enter in this field triggers form submit
+ * (`ngSubmit`)
+ * - if a form has 2+ input fields and no buttons or input[type=submit] then hitting enter
+ * doesn't trigger submit
+ * - if a form has one or more input fields and one or more buttons or input[type=submit] then
+ * hitting enter in any of the input fields will trigger the click handler on the *first* button or
+ * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`)
+ *
+ * Any pending `ngModelOptions` changes will take place immediately when an enclosing form is
+ * submitted. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit`
+ * to have access to the updated model.
+ *
+ * ## Animation Hooks
+ *
+ * Animations in ngForm are triggered when any of the associated CSS classes are added and removed.
+ * These classes are: `.ng-pristine`, `.ng-dirty`, `.ng-invalid` and `.ng-valid` as well as any
+ * other validations that are performed within the form. Animations in ngForm are similar to how
+ * they work in ngClass and animations can be hooked into using CSS transitions, keyframes as well
+ * as JS animations.
+ *
+ * The following example shows a simple way to utilize CSS transitions to style a form element
+ * that has been rendered as invalid after it has been validated:
+ *
+ * <pre>
+ * //be sure to include ngAnimate as a module to hook into more
+ * //advanced animations
+ * .my-form {
+ * transition:0.5s linear all;
+ * background: white;
+ * }
+ * .my-form.ng-invalid {
+ * background: red;
+ * color:white;
+ * }
+ * </pre>
+ *
+ * @example
+ <example deps="angular-animate.js" animations="true" fixBase="true" module="formExample">
+ <file name="index.html">
+ <script>
+ angular.module('formExample', [])
+ .controller('FormController', ['$scope', function($scope) {
+ $scope.userType = 'guest';
+ }]);
+ </script>
+ <style>
+ .my-form {
+ -webkit-transition:all linear 0.5s;
+ transition:all linear 0.5s;
+ background: transparent;
+ }
+ .my-form.ng-invalid {
+ background: red;
+ }
+ </style>
+ <form name="myForm" ng-controller="FormController" class="my-form">
+ userType: <input name="input" ng-model="userType" required>
+ <span class="error" ng-show="myForm.input.$error.required">Required!</span><br>
+ <tt>userType = {{userType}}</tt><br>
+ <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br>
+ <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br>
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br>
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br>
+ </form>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should initialize to model', function() {
+ var userType = element(by.binding('userType'));
+ var valid = element(by.binding('myForm.input.$valid'));
+
+ expect(userType.getText()).toContain('guest');
+ expect(valid.getText()).toContain('true');
+ });
+
+ it('should be invalid if empty', function() {
+ var userType = element(by.binding('userType'));
+ var valid = element(by.binding('myForm.input.$valid'));
+ var userInput = element(by.model('userType'));
+
+ userInput.clear();
+ userInput.sendKeys('');
+
+ expect(userType.getText()).toEqual('userType =');
+ expect(valid.getText()).toContain('false');
+ });
+ </file>
+ </example>
+ *
+ * @param {string=} name Name of the form. If specified, the form controller will be published into
+ * related scope, under this name.
+ */
+var formDirectiveFactory = function(isNgForm) {
+ return ['$timeout', function($timeout) {
+ var formDirective = {
+ name: 'form',
+ restrict: isNgForm ? 'EAC' : 'E',
+ controller: FormController,
+ compile: function ngFormCompile(formElement) {
+ // Setup initial state of the control
+ formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS);
+
+ return {
+ pre: function ngFormPreLink(scope, formElement, attr, controller) {
+ // if `action` attr is not present on the form, prevent the default action (submission)
+ if (!('action' in attr)) {
+ // we can't use jq events because if a form is destroyed during submission the default
+ // action is not prevented. see #1238
+ //
+ // IE 9 is not affected because it doesn't fire a submit event and try to do a full
+ // page reload if the form was destroyed by submission of the form via a click handler
+ // on a button in the form. Looks like an IE9 specific bug.
+ var handleFormSubmission = function(event) {
+ scope.$apply(function() {
+ controller.$commitViewValue();
+ controller.$setSubmitted();
+ });
+
+ event.preventDefault();
+ };
+
+ addEventListenerFn(formElement[0], 'submit', handleFormSubmission);
+
+ // unregister the preventDefault listener so that we don't not leak memory but in a
+ // way that will achieve the prevention of the default action.
+ formElement.on('$destroy', function() {
+ $timeout(function() {
+ removeEventListenerFn(formElement[0], 'submit', handleFormSubmission);
+ }, 0, false);
+ });
+ }
+
+ var parentFormCtrl = controller.$$parentForm,
+ alias = controller.$name;
+
+ if (alias) {
+ setter(scope, alias, controller, alias);
+ attr.$observe(attr.name ? 'name' : 'ngForm', function(newValue) {
+ if (alias === newValue) return;
+ setter(scope, alias, undefined, alias);
+ alias = newValue;
+ setter(scope, alias, controller, alias);
+ parentFormCtrl.$$renameControl(controller, alias);
+ });
+ }
+ formElement.on('$destroy', function() {
+ parentFormCtrl.$removeControl(controller);
+ if (alias) {
+ setter(scope, alias, undefined, alias);
+ }
+ extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards
+ });
+ }
+ };
+ }
+ };
+
+ return formDirective;
+ }];
+};
+
+var formDirective = formDirectiveFactory();
+var ngFormDirective = formDirectiveFactory(true);
+
+/* global VALID_CLASS: true,
+ INVALID_CLASS: true,
+ PRISTINE_CLASS: true,
+ DIRTY_CLASS: true,
+ UNTOUCHED_CLASS: true,
+ TOUCHED_CLASS: true,
+*/
+
+// Regex code is obtained from SO: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime#answer-3143231
+var ISO_DATE_REGEXP = /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/;
+var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
+var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i;
+var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/;
+var DATE_REGEXP = /^(\d{4})-(\d{2})-(\d{2})$/;
+var DATETIMELOCAL_REGEXP = /^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/;
+var WEEK_REGEXP = /^(\d{4})-W(\d\d)$/;
+var MONTH_REGEXP = /^(\d{4})-(\d\d)$/;
+var TIME_REGEXP = /^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/;
+var DEFAULT_REGEXP = /(\s+|^)default(\s+|$)/;
+
+var $ngModelMinErr = new minErr('ngModel');
+
+var inputType = {
+
+ /**
+ * @ngdoc input
+ * @name input[text]
+ *
+ * @description
+ * Standard HTML text input with angular data binding, inherited by most of the `input` elements.
+ *
+ *
+ * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {string=} required Adds `required` validation error key if the value is not entered.
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+ * `required` when you want to data-bind to the `required` attribute.
+ * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
+ * minlength.
+ * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
+ * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of
+ * any length.
+ * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string
+ * that contains the regular expression body that will be converted to a regular expression
+ * as in the ngPattern directive.
+ * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match
+ * a RegExp found by evaluating the Angular expression given in the attribute value.
+ * If the expression evaluates to a RegExp object then this is used directly.
+ * If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$`
+ * characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`.
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
+ * interaction with the input element.
+ * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.
+ * This parameter is ignored for input[type=password] controls, which will never trim the
+ * input.
+ *
+ * @example
+ <example name="text-input-directive" module="textInputExample">
+ <file name="index.html">
+ <script>
+ angular.module('textInputExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.text = 'guest';
+ $scope.word = /^\s*\w*\s*$/;
+ }]);
+ </script>
+ <form name="myForm" ng-controller="ExampleController">
+ Single word: <input type="text" name="input" ng-model="text"
+ ng-pattern="word" required ng-trim="false">
+ <span class="error" ng-show="myForm.input.$error.required">
+ Required!</span>
+ <span class="error" ng-show="myForm.input.$error.pattern">
+ Single word only!</span>
+
+ <tt>text = {{text}}</tt><br/>
+ <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
+ <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
+ </form>
+ </file>
+ <file name="protractor.js" type="protractor">
+ var text = element(by.binding('text'));
+ var valid = element(by.binding('myForm.input.$valid'));
+ var input = element(by.model('text'));
+
+ it('should initialize to model', function() {
+ expect(text.getText()).toContain('guest');
+ expect(valid.getText()).toContain('true');
+ });
+
+ it('should be invalid if empty', function() {
+ input.clear();
+ input.sendKeys('');
+
+ expect(text.getText()).toEqual('text =');
+ expect(valid.getText()).toContain('false');
+ });
+
+ it('should be invalid if multi word', function() {
+ input.clear();
+ input.sendKeys('hello world');
+
+ expect(valid.getText()).toContain('false');
+ });
+ </file>
+ </example>
+ */
+ 'text': textInputType,
+
+ /**
+ * @ngdoc input
+ * @name input[date]
+ *
+ * @description
+ * Input with date validation and transformation. In browsers that do not yet support
+ * the HTML5 date input, a text element will be used. In that case, text must be entered in a valid ISO-8601
+ * date format (yyyy-MM-dd), for example: `2009-01-06`. Since many
+ * modern browsers do not yet support this input type, it is important to provide cues to users on the
+ * expected input format via a placeholder or label.
+ *
+ * The model must always be a Date object, otherwise Angular will throw an error.
+ * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.
+ *
+ * The timezone to be used to read/write the `Date` instance in the model can be defined using
+ * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.
+ *
+ * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a
+ * valid ISO date string (yyyy-MM-dd).
+ * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be
+ * a valid ISO date string (yyyy-MM-dd).
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+ * `required` when you want to data-bind to the `required` attribute.
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
+ * interaction with the input element.
+ *
+ * @example
+ <example name="date-input-directive" module="dateInputExample">
+ <file name="index.html">
+ <script>
+ angular.module('dateInputExample', [])
+ .controller('DateController', ['$scope', function($scope) {
+ $scope.value = new Date(2013, 9, 22);
+ }]);
+ </script>
+ <form name="myForm" ng-controller="DateController as dateCtrl">
+ Pick a date in 2013:
+ <input type="date" id="exampleInput" name="input" ng-model="value"
+ placeholder="yyyy-MM-dd" min="2013-01-01" max="2013-12-31" required />
+ <span class="error" ng-show="myForm.input.$error.required">
+ Required!</span>
+ <span class="error" ng-show="myForm.input.$error.date">
+ Not a valid date!</span>
+ <tt>value = {{value | date: "yyyy-MM-dd"}}</tt><br/>
+ <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
+ <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
+ </form>
+ </file>
+ <file name="protractor.js" type="protractor">
+ var value = element(by.binding('value | date: "yyyy-MM-dd"'));
+ var valid = element(by.binding('myForm.input.$valid'));
+ var input = element(by.model('value'));
+
+ // currently protractor/webdriver does not support
+ // sending keys to all known HTML5 input controls
+ // for various browsers (see https://github.com/angular/protractor/issues/562).
+ function setInput(val) {
+ // set the value of the element and force validation.
+ var scr = "var ipt = document.getElementById('exampleInput'); " +
+ "ipt.value = '" + val + "';" +
+ "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });";
+ browser.executeScript(scr);
+ }
+
+ it('should initialize to model', function() {
+ expect(value.getText()).toContain('2013-10-22');
+ expect(valid.getText()).toContain('myForm.input.$valid = true');
+ });
+
+ it('should be invalid if empty', function() {
+ setInput('');
+ expect(value.getText()).toEqual('value =');
+ expect(valid.getText()).toContain('myForm.input.$valid = false');
+ });
+
+ it('should be invalid if over max', function() {
+ setInput('2015-01-01');
+ expect(value.getText()).toContain('');
+ expect(valid.getText()).toContain('myForm.input.$valid = false');
+ });
+ </file>
+ </example>
+ */
+ 'date': createDateInputType('date', DATE_REGEXP,
+ createDateParser(DATE_REGEXP, ['yyyy', 'MM', 'dd']),
+ 'yyyy-MM-dd'),
+
+ /**
+ * @ngdoc input
+ * @name input[datetime-local]
+ *
+ * @description
+ * Input with datetime validation and transformation. In browsers that do not yet support
+ * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601
+ * local datetime format (yyyy-MM-ddTHH:mm:ss), for example: `2010-12-28T14:57:00`.
+ *
+ * The model must always be a Date object, otherwise Angular will throw an error.
+ * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.
+ *
+ * The timezone to be used to read/write the `Date` instance in the model can be defined using
+ * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.
+ *
+ * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a
+ * valid ISO datetime format (yyyy-MM-ddTHH:mm:ss).
+ * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be
+ * a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss).
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+ * `required` when you want to data-bind to the `required` attribute.
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
+ * interaction with the input element.
+ *
+ * @example
+ <example name="datetimelocal-input-directive" module="dateExample">
+ <file name="index.html">
+ <script>
+ angular.module('dateExample', [])
+ .controller('DateController', ['$scope', function($scope) {
+ $scope.value = new Date(2010, 11, 28, 14, 57);
+ }]);
+ </script>
+ <form name="myForm" ng-controller="DateController as dateCtrl">
+ Pick a date between in 2013:
+ <input type="datetime-local" id="exampleInput" name="input" ng-model="value"
+ placeholder="yyyy-MM-ddTHH:mm:ss" min="2001-01-01T00:00:00" max="2013-12-31T00:00:00" required />
+ <span class="error" ng-show="myForm.input.$error.required">
+ Required!</span>
+ <span class="error" ng-show="myForm.input.$error.datetimelocal">
+ Not a valid date!</span>
+ <tt>value = {{value | date: "yyyy-MM-ddTHH:mm:ss"}}</tt><br/>
+ <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
+ <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
+ </form>
+ </file>
+ <file name="protractor.js" type="protractor">
+ var value = element(by.binding('value | date: "yyyy-MM-ddTHH:mm:ss"'));
+ var valid = element(by.binding('myForm.input.$valid'));
+ var input = element(by.model('value'));
+
+ // currently protractor/webdriver does not support
+ // sending keys to all known HTML5 input controls
+ // for various browsers (https://github.com/angular/protractor/issues/562).
+ function setInput(val) {
+ // set the value of the element and force validation.
+ var scr = "var ipt = document.getElementById('exampleInput'); " +
+ "ipt.value = '" + val + "';" +
+ "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });";
+ browser.executeScript(scr);
+ }
+
+ it('should initialize to model', function() {
+ expect(value.getText()).toContain('2010-12-28T14:57:00');
+ expect(valid.getText()).toContain('myForm.input.$valid = true');
+ });
+
+ it('should be invalid if empty', function() {
+ setInput('');
+ expect(value.getText()).toEqual('value =');
+ expect(valid.getText()).toContain('myForm.input.$valid = false');
+ });
+
+ it('should be invalid if over max', function() {
+ setInput('2015-01-01T23:59:00');
+ expect(value.getText()).toContain('');
+ expect(valid.getText()).toContain('myForm.input.$valid = false');
+ });
+ </file>
+ </example>
+ */
+ 'datetime-local': createDateInputType('datetimelocal', DATETIMELOCAL_REGEXP,
+ createDateParser(DATETIMELOCAL_REGEXP, ['yyyy', 'MM', 'dd', 'HH', 'mm', 'ss', 'sss']),
+ 'yyyy-MM-ddTHH:mm:ss.sss'),
+
+ /**
+ * @ngdoc input
+ * @name input[time]
+ *
+ * @description
+ * Input with time validation and transformation. In browsers that do not yet support
+ * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601
+ * local time format (HH:mm:ss), for example: `14:57:00`. Model must be a Date object. This binding will always output a
+ * Date object to the model of January 1, 1970, or local date `new Date(1970, 0, 1, HH, mm, ss)`.
+ *
+ * The model must always be a Date object, otherwise Angular will throw an error.
+ * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.
+ *
+ * The timezone to be used to read/write the `Date` instance in the model can be defined using
+ * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.
+ *
+ * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a
+ * valid ISO time format (HH:mm:ss).
+ * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be a
+ * valid ISO time format (HH:mm:ss).
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+ * `required` when you want to data-bind to the `required` attribute.
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
+ * interaction with the input element.
+ *
+ * @example
+ <example name="time-input-directive" module="timeExample">
+ <file name="index.html">
+ <script>
+ angular.module('timeExample', [])
+ .controller('DateController', ['$scope', function($scope) {
+ $scope.value = new Date(1970, 0, 1, 14, 57, 0);
+ }]);
+ </script>
+ <form name="myForm" ng-controller="DateController as dateCtrl">
+ Pick a between 8am and 5pm:
+ <input type="time" id="exampleInput" name="input" ng-model="value"
+ placeholder="HH:mm:ss" min="08:00:00" max="17:00:00" required />
+ <span class="error" ng-show="myForm.input.$error.required">
+ Required!</span>
+ <span class="error" ng-show="myForm.input.$error.time">
+ Not a valid date!</span>
+ <tt>value = {{value | date: "HH:mm:ss"}}</tt><br/>
+ <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
+ <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
+ </form>
+ </file>
+ <file name="protractor.js" type="protractor">
+ var value = element(by.binding('value | date: "HH:mm:ss"'));
+ var valid = element(by.binding('myForm.input.$valid'));
+ var input = element(by.model('value'));
+
+ // currently protractor/webdriver does not support
+ // sending keys to all known HTML5 input controls
+ // for various browsers (https://github.com/angular/protractor/issues/562).
+ function setInput(val) {
+ // set the value of the element and force validation.
+ var scr = "var ipt = document.getElementById('exampleInput'); " +
+ "ipt.value = '" + val + "';" +
+ "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });";
+ browser.executeScript(scr);
+ }
+
+ it('should initialize to model', function() {
+ expect(value.getText()).toContain('14:57:00');
+ expect(valid.getText()).toContain('myForm.input.$valid = true');
+ });
+
+ it('should be invalid if empty', function() {
+ setInput('');
+ expect(value.getText()).toEqual('value =');
+ expect(valid.getText()).toContain('myForm.input.$valid = false');
+ });
+
+ it('should be invalid if over max', function() {
+ setInput('23:59:00');
+ expect(value.getText()).toContain('');
+ expect(valid.getText()).toContain('myForm.input.$valid = false');
+ });
+ </file>
+ </example>
+ */
+ 'time': createDateInputType('time', TIME_REGEXP,
+ createDateParser(TIME_REGEXP, ['HH', 'mm', 'ss', 'sss']),
+ 'HH:mm:ss.sss'),
+
+ /**
+ * @ngdoc input
+ * @name input[week]
+ *
+ * @description
+ * Input with week-of-the-year validation and transformation to Date. In browsers that do not yet support
+ * the HTML5 week input, a text element will be used. In that case, the text must be entered in a valid ISO-8601
+ * week format (yyyy-W##), for example: `2013-W02`.
+ *
+ * The model must always be a Date object, otherwise Angular will throw an error.
+ * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.
+ *
+ * The timezone to be used to read/write the `Date` instance in the model can be defined using
+ * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.
+ *
+ * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a
+ * valid ISO week format (yyyy-W##).
+ * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be
+ * a valid ISO week format (yyyy-W##).
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+ * `required` when you want to data-bind to the `required` attribute.
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
+ * interaction with the input element.
+ *
+ * @example
+ <example name="week-input-directive" module="weekExample">
+ <file name="index.html">
+ <script>
+ angular.module('weekExample', [])
+ .controller('DateController', ['$scope', function($scope) {
+ $scope.value = new Date(2013, 0, 3);
+ }]);
+ </script>
+ <form name="myForm" ng-controller="DateController as dateCtrl">
+ Pick a date between in 2013:
+ <input id="exampleInput" type="week" name="input" ng-model="value"
+ placeholder="YYYY-W##" min="2012-W32" max="2013-W52" required />
+ <span class="error" ng-show="myForm.input.$error.required">
+ Required!</span>
+ <span class="error" ng-show="myForm.input.$error.week">
+ Not a valid date!</span>
+ <tt>value = {{value | date: "yyyy-Www"}}</tt><br/>
+ <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
+ <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
+ </form>
+ </file>
+ <file name="protractor.js" type="protractor">
+ var value = element(by.binding('value | date: "yyyy-Www"'));
+ var valid = element(by.binding('myForm.input.$valid'));
+ var input = element(by.model('value'));
+
+ // currently protractor/webdriver does not support
+ // sending keys to all known HTML5 input controls
+ // for various browsers (https://github.com/angular/protractor/issues/562).
+ function setInput(val) {
+ // set the value of the element and force validation.
+ var scr = "var ipt = document.getElementById('exampleInput'); " +
+ "ipt.value = '" + val + "';" +
+ "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });";
+ browser.executeScript(scr);
+ }
+
+ it('should initialize to model', function() {
+ expect(value.getText()).toContain('2013-W01');
+ expect(valid.getText()).toContain('myForm.input.$valid = true');
+ });
+
+ it('should be invalid if empty', function() {
+ setInput('');
+ expect(value.getText()).toEqual('value =');
+ expect(valid.getText()).toContain('myForm.input.$valid = false');
+ });
+
+ it('should be invalid if over max', function() {
+ setInput('2015-W01');
+ expect(value.getText()).toContain('');
+ expect(valid.getText()).toContain('myForm.input.$valid = false');
+ });
+ </file>
+ </example>
+ */
+ 'week': createDateInputType('week', WEEK_REGEXP, weekParser, 'yyyy-Www'),
+
+ /**
+ * @ngdoc input
+ * @name input[month]
+ *
+ * @description
+ * Input with month validation and transformation. In browsers that do not yet support
+ * the HTML5 month input, a text element will be used. In that case, the text must be entered in a valid ISO-8601
+ * month format (yyyy-MM), for example: `2009-01`.
+ *
+ * The model must always be a Date object, otherwise Angular will throw an error.
+ * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.
+ * If the model is not set to the first of the month, the next view to model update will set it
+ * to the first of the month.
+ *
+ * The timezone to be used to read/write the `Date` instance in the model can be defined using
+ * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.
+ *
+ * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be
+ * a valid ISO month format (yyyy-MM).
+ * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must
+ * be a valid ISO month format (yyyy-MM).
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+ * `required` when you want to data-bind to the `required` attribute.
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
+ * interaction with the input element.
+ *
+ * @example
+ <example name="month-input-directive" module="monthExample">
+ <file name="index.html">
+ <script>
+ angular.module('monthExample', [])
+ .controller('DateController', ['$scope', function($scope) {
+ $scope.value = new Date(2013, 9, 1);
+ }]);
+ </script>
+ <form name="myForm" ng-controller="DateController as dateCtrl">
+ Pick a month int 2013:
+ <input id="exampleInput" type="month" name="input" ng-model="value"
+ placeholder="yyyy-MM" min="2013-01" max="2013-12" required />
+ <span class="error" ng-show="myForm.input.$error.required">
+ Required!</span>
+ <span class="error" ng-show="myForm.input.$error.month">
+ Not a valid month!</span>
+ <tt>value = {{value | date: "yyyy-MM"}}</tt><br/>
+ <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
+ <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
+ </form>
+ </file>
+ <file name="protractor.js" type="protractor">
+ var value = element(by.binding('value | date: "yyyy-MM"'));
+ var valid = element(by.binding('myForm.input.$valid'));
+ var input = element(by.model('value'));
+
+ // currently protractor/webdriver does not support
+ // sending keys to all known HTML5 input controls
+ // for various browsers (https://github.com/angular/protractor/issues/562).
+ function setInput(val) {
+ // set the value of the element and force validation.
+ var scr = "var ipt = document.getElementById('exampleInput'); " +
+ "ipt.value = '" + val + "';" +
+ "angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('" + val + "'); });";
+ browser.executeScript(scr);
+ }
+
+ it('should initialize to model', function() {
+ expect(value.getText()).toContain('2013-10');
+ expect(valid.getText()).toContain('myForm.input.$valid = true');
+ });
+
+ it('should be invalid if empty', function() {
+ setInput('');
+ expect(value.getText()).toEqual('value =');
+ expect(valid.getText()).toContain('myForm.input.$valid = false');
+ });
+
+ it('should be invalid if over max', function() {
+ setInput('2015-01');
+ expect(value.getText()).toContain('');
+ expect(valid.getText()).toContain('myForm.input.$valid = false');
+ });
+ </file>
+ </example>
+ */
+ 'month': createDateInputType('month', MONTH_REGEXP,
+ createDateParser(MONTH_REGEXP, ['yyyy', 'MM']),
+ 'yyyy-MM'),
+
+ /**
+ * @ngdoc input
+ * @name input[number]
+ *
+ * @description
+ * Text input with number validation and transformation. Sets the `number` validation
+ * error if not a valid number.
+ *
+ * The model must always be a number, otherwise Angular will throw an error.
+ *
+ * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.
+ * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+ * `required` when you want to data-bind to the `required` attribute.
+ * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
+ * minlength.
+ * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
+ * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of
+ * any length.
+ * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string
+ * that contains the regular expression body that will be converted to a regular expression
+ * as in the ngPattern directive.
+ * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match
+ * a RegExp found by evaluating the Angular expression given in the attribute value.
+ * If the expression evaluates to a RegExp object then this is used directly.
+ * If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$`
+ * characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`.
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
+ * interaction with the input element.
+ *
+ * @example
+ <example name="number-input-directive" module="numberExample">
+ <file name="index.html">
+ <script>
+ angular.module('numberExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.value = 12;
+ }]);
+ </script>
+ <form name="myForm" ng-controller="ExampleController">
+ Number: <input type="number" name="input" ng-model="value"
+ min="0" max="99" required>
+ <span class="error" ng-show="myForm.input.$error.required">
+ Required!</span>
+ <span class="error" ng-show="myForm.input.$error.number">
+ Not valid number!</span>
+ <tt>value = {{value}}</tt><br/>
+ <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
+ <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
+ </form>
+ </file>
+ <file name="protractor.js" type="protractor">
+ var value = element(by.binding('value'));
+ var valid = element(by.binding('myForm.input.$valid'));
+ var input = element(by.model('value'));
+
+ it('should initialize to model', function() {
+ expect(value.getText()).toContain('12');
+ expect(valid.getText()).toContain('true');
+ });
+
+ it('should be invalid if empty', function() {
+ input.clear();
+ input.sendKeys('');
+ expect(value.getText()).toEqual('value =');
+ expect(valid.getText()).toContain('false');
+ });
+
+ it('should be invalid if over max', function() {
+ input.clear();
+ input.sendKeys('123');
+ expect(value.getText()).toEqual('value =');
+ expect(valid.getText()).toContain('false');
+ });
+ </file>
+ </example>
+ */
+ 'number': numberInputType,
+
+
+ /**
+ * @ngdoc input
+ * @name input[url]
+ *
+ * @description
+ * Text input with URL validation. Sets the `url` validation error key if the content is not a
+ * valid URL.
+ *
+ * <div class="alert alert-warning">
+ * **Note:** `input[url]` uses a regex to validate urls that is derived from the regex
+ * used in Chromium. If you need stricter validation, you can use `ng-pattern` or modify
+ * the built-in validators (see the {@link guide/forms Forms guide})
+ * </div>
+ *
+ * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+ * `required` when you want to data-bind to the `required` attribute.
+ * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
+ * minlength.
+ * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
+ * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of
+ * any length.
+ * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string
+ * that contains the regular expression body that will be converted to a regular expression
+ * as in the ngPattern directive.
+ * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match
+ * a RegExp found by evaluating the Angular expression given in the attribute value.
+ * If the expression evaluates to a RegExp object then this is used directly.
+ * If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$`
+ * characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`.
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
+ * interaction with the input element.
+ *
+ * @example
+ <example name="url-input-directive" module="urlExample">
+ <file name="index.html">
+ <script>
+ angular.module('urlExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.text = 'http://google.com';
+ }]);
+ </script>
+ <form name="myForm" ng-controller="ExampleController">
+ URL: <input type="url" name="input" ng-model="text" required>
+ <span class="error" ng-show="myForm.input.$error.required">
+ Required!</span>
+ <span class="error" ng-show="myForm.input.$error.url">
+ Not valid url!</span>
+ <tt>text = {{text}}</tt><br/>
+ <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
+ <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
+ <tt>myForm.$error.url = {{!!myForm.$error.url}}</tt><br/>
+ </form>
+ </file>
+ <file name="protractor.js" type="protractor">
+ var text = element(by.binding('text'));
+ var valid = element(by.binding('myForm.input.$valid'));
+ var input = element(by.model('text'));
+
+ it('should initialize to model', function() {
+ expect(text.getText()).toContain('http://google.com');
+ expect(valid.getText()).toContain('true');
+ });
+
+ it('should be invalid if empty', function() {
+ input.clear();
+ input.sendKeys('');
+
+ expect(text.getText()).toEqual('text =');
+ expect(valid.getText()).toContain('false');
+ });
+
+ it('should be invalid if not url', function() {
+ input.clear();
+ input.sendKeys('box');
+
+ expect(valid.getText()).toContain('false');
+ });
+ </file>
+ </example>
+ */
+ 'url': urlInputType,
+
+
+ /**
+ * @ngdoc input
+ * @name input[email]
+ *
+ * @description
+ * Text input with email validation. Sets the `email` validation error key if not a valid email
+ * address.
+ *
+ * <div class="alert alert-warning">
+ * **Note:** `input[email]` uses a regex to validate email addresses that is derived from the regex
+ * used in Chromium. If you need stricter validation (e.g. requiring a top-level domain), you can
+ * use `ng-pattern` or modify the built-in validators (see the {@link guide/forms Forms guide})
+ * </div>
+ *
+ * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+ * `required` when you want to data-bind to the `required` attribute.
+ * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
+ * minlength.
+ * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
+ * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of
+ * any length.
+ * @param {string=} pattern Similar to `ngPattern` except that the attribute value is the actual string
+ * that contains the regular expression body that will be converted to a regular expression
+ * as in the ngPattern directive.
+ * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel value does not match
+ * a RegExp found by evaluating the Angular expression given in the attribute value.
+ * If the expression evaluates to a RegExp object then this is used directly.
+ * If the expression is a string then it will be converted to a RegExp after wrapping it in `^` and `$`
+ * characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`.
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
+ * interaction with the input element.
+ *
+ * @example
+ <example name="email-input-directive" module="emailExample">
+ <file name="index.html">
+ <script>
+ angular.module('emailExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.text = 'me@example.com';
+ }]);
+ </script>
+ <form name="myForm" ng-controller="ExampleController">
+ Email: <input type="email" name="input" ng-model="text" required>
+ <span class="error" ng-show="myForm.input.$error.required">
+ Required!</span>
+ <span class="error" ng-show="myForm.input.$error.email">
+ Not valid email!</span>
+ <tt>text = {{text}}</tt><br/>
+ <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
+ <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
+ <tt>myForm.$error.email = {{!!myForm.$error.email}}</tt><br/>
+ </form>
+ </file>
+ <file name="protractor.js" type="protractor">
+ var text = element(by.binding('text'));
+ var valid = element(by.binding('myForm.input.$valid'));
+ var input = element(by.model('text'));
+
+ it('should initialize to model', function() {
+ expect(text.getText()).toContain('me@example.com');
+ expect(valid.getText()).toContain('true');
+ });
+
+ it('should be invalid if empty', function() {
+ input.clear();
+ input.sendKeys('');
+ expect(text.getText()).toEqual('text =');
+ expect(valid.getText()).toContain('false');
+ });
+
+ it('should be invalid if not email', function() {
+ input.clear();
+ input.sendKeys('xxx');
+
+ expect(valid.getText()).toContain('false');
+ });
+ </file>
+ </example>
+ */
+ 'email': emailInputType,
+
+
+ /**
+ * @ngdoc input
+ * @name input[radio]
+ *
+ * @description
+ * HTML radio button.
+ *
+ * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string} value The value to which the expression should be set when selected.
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
+ * interaction with the input element.
+ * @param {string} ngValue Angular expression which sets the value to which the expression should
+ * be set when selected.
+ *
+ * @example
+ <example name="radio-input-directive" module="radioExample">
+ <file name="index.html">
+ <script>
+ angular.module('radioExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.color = 'blue';
+ $scope.specialValue = {
+ "id": "12345",
+ "value": "green"
+ };
+ }]);
+ </script>
+ <form name="myForm" ng-controller="ExampleController">
+ <input type="radio" ng-model="color" value="red"> Red <br/>
+ <input type="radio" ng-model="color" ng-value="specialValue"> Green <br/>
+ <input type="radio" ng-model="color" value="blue"> Blue <br/>
+ <tt>color = {{color | json}}</tt><br/>
+ </form>
+ Note that `ng-value="specialValue"` sets radio item's value to be the value of `$scope.specialValue`.
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should change state', function() {
+ var color = element(by.binding('color'));
+
+ expect(color.getText()).toContain('blue');
+
+ element.all(by.model('color')).get(0).click();
+
+ expect(color.getText()).toContain('red');
+ });
+ </file>
+ </example>
+ */
+ 'radio': radioInputType,
+
+
+ /**
+ * @ngdoc input
+ * @name input[checkbox]
+ *
+ * @description
+ * HTML checkbox.
+ *
+ * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {expression=} ngTrueValue The value to which the expression should be set when selected.
+ * @param {expression=} ngFalseValue The value to which the expression should be set when not selected.
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
+ * interaction with the input element.
+ *
+ * @example
+ <example name="checkbox-input-directive" module="checkboxExample">
+ <file name="index.html">
+ <script>
+ angular.module('checkboxExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.value1 = true;
+ $scope.value2 = 'YES'
+ }]);
+ </script>
+ <form name="myForm" ng-controller="ExampleController">
+ Value1: <input type="checkbox" ng-model="value1"> <br/>
+ Value2: <input type="checkbox" ng-model="value2"
+ ng-true-value="'YES'" ng-false-value="'NO'"> <br/>
+ <tt>value1 = {{value1}}</tt><br/>
+ <tt>value2 = {{value2}}</tt><br/>
+ </form>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should change state', function() {
+ var value1 = element(by.binding('value1'));
+ var value2 = element(by.binding('value2'));
+
+ expect(value1.getText()).toContain('true');
+ expect(value2.getText()).toContain('YES');
+
+ element(by.model('value1')).click();
+ element(by.model('value2')).click();
+
+ expect(value1.getText()).toContain('false');
+ expect(value2.getText()).toContain('NO');
+ });
+ </file>
+ </example>
+ */
+ 'checkbox': checkboxInputType,
+
+ 'hidden': noop,
+ 'button': noop,
+ 'submit': noop,
+ 'reset': noop,
+ 'file': noop
+};
+
+function stringBasedInputType(ctrl) {
+ ctrl.$formatters.push(function(value) {
+ return ctrl.$isEmpty(value) ? value : value.toString();
+ });
+}
+
+function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
+ baseInputType(scope, element, attr, ctrl, $sniffer, $browser);
+ stringBasedInputType(ctrl);
+}
+
+function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
+ var placeholder = element[0].placeholder, noevent = {};
+ var type = lowercase(element[0].type);
+
+ // In composition mode, users are still inputing intermediate text buffer,
+ // hold the listener until composition is done.
+ // More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent
+ if (!$sniffer.android) {
+ var composing = false;
+
+ element.on('compositionstart', function(data) {
+ composing = true;
+ });
+
+ element.on('compositionend', function() {
+ composing = false;
+ listener();
+ });
+ }
+
+ var listener = function(ev) {
+ if (composing) return;
+ var value = element.val(),
+ event = ev && ev.type;
+
+ // IE (11 and under) seem to emit an 'input' event if the placeholder value changes.
+ // We don't want to dirty the value when this happens, so we abort here. Unfortunately,
+ // IE also sends input events for other non-input-related things, (such as focusing on a
+ // form control), so this change is not entirely enough to solve this.
+ if (msie && (ev || noevent).type === 'input' && element[0].placeholder !== placeholder) {
+ placeholder = element[0].placeholder;
+ return;
+ }
+
+ // By default we will trim the value
+ // If the attribute ng-trim exists we will avoid trimming
+ // If input type is 'password', the value is never trimmed
+ if (type !== 'password' && (!attr.ngTrim || attr.ngTrim !== 'false')) {
+ value = trim(value);
+ }
+
+ // If a control is suffering from bad input (due to native validators), browsers discard its
+ // value, so it may be necessary to revalidate (by calling $setViewValue again) even if the
+ // control's value is the same empty value twice in a row.
+ if (ctrl.$viewValue !== value || (value === '' && ctrl.$$hasNativeValidators)) {
+ ctrl.$setViewValue(value, event);
+ }
+ };
+
+ // if the browser does support "input" event, we are fine - except on IE9 which doesn't fire the
+ // input event on backspace, delete or cut
+ if ($sniffer.hasEvent('input')) {
+ element.on('input', listener);
+ } else {
+ var timeout;
+
+ var deferListener = function(ev) {
+ if (!timeout) {
+ timeout = $browser.defer(function() {
+ listener(ev);
+ timeout = null;
+ });
+ }
+ };
+
+ element.on('keydown', function(event) {
+ var key = event.keyCode;
+
+ // ignore
+ // command modifiers arrows
+ if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return;
+
+ deferListener(event);
+ });
+
+ // if user modifies input value using context menu in IE, we need "paste" and "cut" events to catch it
+ if ($sniffer.hasEvent('paste')) {
+ element.on('paste cut', deferListener);
+ }
+ }
+
+ // if user paste into input using mouse on older browser
+ // or form autocomplete on newer browser, we need "change" event to catch it
+ element.on('change', listener);
+
+ ctrl.$render = function() {
+ element.val(ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue);
+ };
+}
+
+function weekParser(isoWeek, existingDate) {
+ if (isDate(isoWeek)) {
+ return isoWeek;
+ }
+
+ if (isString(isoWeek)) {
+ WEEK_REGEXP.lastIndex = 0;
+ var parts = WEEK_REGEXP.exec(isoWeek);
+ if (parts) {
+ var year = +parts[1],
+ week = +parts[2],
+ hours = 0,
+ minutes = 0,
+ seconds = 0,
+ milliseconds = 0,
+ firstThurs = getFirstThursdayOfYear(year),
+ addDays = (week - 1) * 7;
+
+ if (existingDate) {
+ hours = existingDate.getHours();
+ minutes = existingDate.getMinutes();
+ seconds = existingDate.getSeconds();
+ milliseconds = existingDate.getMilliseconds();
+ }
+
+ return new Date(year, 0, firstThurs.getDate() + addDays, hours, minutes, seconds, milliseconds);
+ }
+ }
+
+ return NaN;
+}
+
+function createDateParser(regexp, mapping) {
+ return function(iso, date) {
+ var parts, map;
+
+ if (isDate(iso)) {
+ return iso;
+ }
+
+ if (isString(iso)) {
+ // When a date is JSON'ified to wraps itself inside of an extra
+ // set of double quotes. This makes the date parsing code unable
+ // to match the date string and parse it as a date.
+ if (iso.charAt(0) == '"' && iso.charAt(iso.length - 1) == '"') {
+ iso = iso.substring(1, iso.length - 1);
+ }
+ if (ISO_DATE_REGEXP.test(iso)) {
+ return new Date(iso);
+ }
+ regexp.lastIndex = 0;
+ parts = regexp.exec(iso);
+
+ if (parts) {
+ parts.shift();
+ if (date) {
+ map = {
+ yyyy: date.getFullYear(),
+ MM: date.getMonth() + 1,
+ dd: date.getDate(),
+ HH: date.getHours(),
+ mm: date.getMinutes(),
+ ss: date.getSeconds(),
+ sss: date.getMilliseconds() / 1000
+ };
+ } else {
+ map = { yyyy: 1970, MM: 1, dd: 1, HH: 0, mm: 0, ss: 0, sss: 0 };
+ }
+
+ forEach(parts, function(part, index) {
+ if (index < mapping.length) {
+ map[mapping[index]] = +part;
+ }
+ });
+ return new Date(map.yyyy, map.MM - 1, map.dd, map.HH, map.mm, map.ss || 0, map.sss * 1000 || 0);
+ }
+ }
+
+ return NaN;
+ };
+}
+
+function createDateInputType(type, regexp, parseDate, format) {
+ return function dynamicDateInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter) {
+ badInputChecker(scope, element, attr, ctrl);
+ baseInputType(scope, element, attr, ctrl, $sniffer, $browser);
+ var timezone = ctrl && ctrl.$options && ctrl.$options.timezone;
+ var previousDate;
+
+ ctrl.$$parserName = type;
+ ctrl.$parsers.push(function(value) {
+ if (ctrl.$isEmpty(value)) return null;
+ if (regexp.test(value)) {
+ // Note: We cannot read ctrl.$modelValue, as there might be a different
+ // parser/formatter in the processing chain so that the model
+ // contains some different data format!
+ var parsedDate = parseDate(value, previousDate);
+ if (timezone === 'UTC') {
+ parsedDate.setMinutes(parsedDate.getMinutes() - parsedDate.getTimezoneOffset());
+ }
+ return parsedDate;
+ }
+ return undefined;
+ });
+
+ ctrl.$formatters.push(function(value) {
+ if (value && !isDate(value)) {
+ throw $ngModelMinErr('datefmt', 'Expected `{0}` to be a date', value);
+ }
+ if (isValidDate(value)) {
+ previousDate = value;
+ if (previousDate && timezone === 'UTC') {
+ var timezoneOffset = 60000 * previousDate.getTimezoneOffset();
+ previousDate = new Date(previousDate.getTime() + timezoneOffset);
+ }
+ return $filter('date')(value, format, timezone);
+ } else {
+ previousDate = null;
+ return '';
+ }
+ });
+
+ if (isDefined(attr.min) || attr.ngMin) {
+ var minVal;
+ ctrl.$validators.min = function(value) {
+ return !isValidDate(value) || isUndefined(minVal) || parseDate(value) >= minVal;
+ };
+ attr.$observe('min', function(val) {
+ minVal = parseObservedDateValue(val);
+ ctrl.$validate();
+ });
+ }
+
+ if (isDefined(attr.max) || attr.ngMax) {
+ var maxVal;
+ ctrl.$validators.max = function(value) {
+ return !isValidDate(value) || isUndefined(maxVal) || parseDate(value) <= maxVal;
+ };
+ attr.$observe('max', function(val) {
+ maxVal = parseObservedDateValue(val);
+ ctrl.$validate();
+ });
+ }
+
+ function isValidDate(value) {
+ // Invalid Date: getTime() returns NaN
+ return value && !(value.getTime && value.getTime() !== value.getTime());
+ }
+
+ function parseObservedDateValue(val) {
+ return isDefined(val) ? (isDate(val) ? val : parseDate(val)) : undefined;
+ }
+ };
+}
+
+function badInputChecker(scope, element, attr, ctrl) {
+ var node = element[0];
+ var nativeValidation = ctrl.$$hasNativeValidators = isObject(node.validity);
+ if (nativeValidation) {
+ ctrl.$parsers.push(function(value) {
+ var validity = element.prop(VALIDITY_STATE_PROPERTY) || {};
+ // Detect bug in FF35 for input[email] (https://bugzilla.mozilla.org/show_bug.cgi?id=1064430):
+ // - also sets validity.badInput (should only be validity.typeMismatch).
+ // - see http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#e-mail-state-(type=email)
+ // - can ignore this case as we can still read out the erroneous email...
+ return validity.badInput && !validity.typeMismatch ? undefined : value;
+ });
+ }
+}
+
+function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
+ badInputChecker(scope, element, attr, ctrl);
+ baseInputType(scope, element, attr, ctrl, $sniffer, $browser);
+
+ ctrl.$$parserName = 'number';
+ ctrl.$parsers.push(function(value) {
+ if (ctrl.$isEmpty(value)) return null;
+ if (NUMBER_REGEXP.test(value)) return parseFloat(value);
+ return undefined;
+ });
+
+ ctrl.$formatters.push(function(value) {
+ if (!ctrl.$isEmpty(value)) {
+ if (!isNumber(value)) {
+ throw $ngModelMinErr('numfmt', 'Expected `{0}` to be a number', value);
+ }
+ value = value.toString();
+ }
+ return value;
+ });
+
+ if (attr.min || attr.ngMin) {
+ var minVal;
+ ctrl.$validators.min = function(value) {
+ return ctrl.$isEmpty(value) || isUndefined(minVal) || value >= minVal;
+ };
+
+ attr.$observe('min', function(val) {
+ if (isDefined(val) && !isNumber(val)) {
+ val = parseFloat(val, 10);
+ }
+ minVal = isNumber(val) && !isNaN(val) ? val : undefined;
+ // TODO(matsko): implement validateLater to reduce number of validations
+ ctrl.$validate();
+ });
+ }
+
+ if (attr.max || attr.ngMax) {
+ var maxVal;
+ ctrl.$validators.max = function(value) {
+ return ctrl.$isEmpty(value) || isUndefined(maxVal) || value <= maxVal;
+ };
+
+ attr.$observe('max', function(val) {
+ if (isDefined(val) && !isNumber(val)) {
+ val = parseFloat(val, 10);
+ }
+ maxVal = isNumber(val) && !isNaN(val) ? val : undefined;
+ // TODO(matsko): implement validateLater to reduce number of validations
+ ctrl.$validate();
+ });
+ }
+}
+
+function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
+ // Note: no badInputChecker here by purpose as `url` is only a validation
+ // in browsers, i.e. we can always read out input.value even if it is not valid!
+ baseInputType(scope, element, attr, ctrl, $sniffer, $browser);
+ stringBasedInputType(ctrl);
+
+ ctrl.$$parserName = 'url';
+ ctrl.$validators.url = function(modelValue, viewValue) {
+ var value = modelValue || viewValue;
+ return ctrl.$isEmpty(value) || URL_REGEXP.test(value);
+ };
+}
+
+function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
+ // Note: no badInputChecker here by purpose as `url` is only a validation
+ // in browsers, i.e. we can always read out input.value even if it is not valid!
+ baseInputType(scope, element, attr, ctrl, $sniffer, $browser);
+ stringBasedInputType(ctrl);
+
+ ctrl.$$parserName = 'email';
+ ctrl.$validators.email = function(modelValue, viewValue) {
+ var value = modelValue || viewValue;
+ return ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value);
+ };
+}
+
+function radioInputType(scope, element, attr, ctrl) {
+ // make the name unique, if not defined
+ if (isUndefined(attr.name)) {
+ element.attr('name', nextUid());
+ }
+
+ var listener = function(ev) {
+ if (element[0].checked) {
+ ctrl.$setViewValue(attr.value, ev && ev.type);
+ }
+ };
+
+ element.on('click', listener);
+
+ ctrl.$render = function() {
+ var value = attr.value;
+ element[0].checked = (value == ctrl.$viewValue);
+ };
+
+ attr.$observe('value', ctrl.$render);
+}
+
+function parseConstantExpr($parse, context, name, expression, fallback) {
+ var parseFn;
+ if (isDefined(expression)) {
+ parseFn = $parse(expression);
+ if (!parseFn.constant) {
+ throw minErr('ngModel')('constexpr', 'Expected constant expression for `{0}`, but saw ' +
+ '`{1}`.', name, expression);
+ }
+ return parseFn(context);
+ }
+ return fallback;
+}
+
+function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter, $parse) {
+ var trueValue = parseConstantExpr($parse, scope, 'ngTrueValue', attr.ngTrueValue, true);
+ var falseValue = parseConstantExpr($parse, scope, 'ngFalseValue', attr.ngFalseValue, false);
+
+ var listener = function(ev) {
+ ctrl.$setViewValue(element[0].checked, ev && ev.type);
+ };
+
+ element.on('click', listener);
+
+ ctrl.$render = function() {
+ element[0].checked = ctrl.$viewValue;
+ };
+
+ // Override the standard `$isEmpty` because the $viewValue of an empty checkbox is always set to `false`
+ // This is because of the parser below, which compares the `$modelValue` with `trueValue` to convert
+ // it to a boolean.
+ ctrl.$isEmpty = function(value) {
+ return value === false;
+ };
+
+ ctrl.$formatters.push(function(value) {
+ return equals(value, trueValue);
+ });
+
+ ctrl.$parsers.push(function(value) {
+ return value ? trueValue : falseValue;
+ });
+}
+
+
+/**
+ * @ngdoc directive
+ * @name textarea
+ * @restrict E
+ *
+ * @description
+ * HTML textarea element control with angular data-binding. The data-binding and validation
+ * properties of this element are exactly the same as those of the
+ * {@link ng.directive:input input element}.
+ *
+ * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+ * `required` when you want to data-bind to the `required` attribute.
+ * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
+ * minlength.
+ * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
+ * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any
+ * length.
+ * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
+ * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
+ * patterns defined as scope expressions.
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
+ * interaction with the input element.
+ * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name input
+ * @restrict E
+ *
+ * @description
+ * HTML input element control. When used together with {@link ngModel `ngModel`}, it provides data-binding,
+ * input state control, and validation.
+ * Input control follows HTML5 input types and polyfills the HTML5 validation behavior for older browsers.
+ *
+ * <div class="alert alert-warning">
+ * **Note:** Not every feature offered is available for all input types.
+ * Specifically, data binding and event handling via `ng-model` is unsupported for `input[file]`.
+ * </div>
+ *
+ * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
+ * @param {boolean=} ngRequired Sets `required` attribute if set to true
+ * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
+ * minlength.
+ * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
+ * maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any
+ * length.
+ * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
+ * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
+ * patterns defined as scope expressions.
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
+ * interaction with the input element.
+ * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.
+ * This parameter is ignored for input[type=password] controls, which will never trim the
+ * input.
+ *
+ * @example
+ <example name="input-directive" module="inputExample">
+ <file name="index.html">
+ <script>
+ angular.module('inputExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.user = {name: 'guest', last: 'visitor'};
+ }]);
+ </script>
+ <div ng-controller="ExampleController">
+ <form name="myForm">
+ User name: <input type="text" name="userName" ng-model="user.name" required>
+ <span class="error" ng-show="myForm.userName.$error.required">
+ Required!</span><br>
+ Last name: <input type="text" name="lastName" ng-model="user.last"
+ ng-minlength="3" ng-maxlength="10">
+ <span class="error" ng-show="myForm.lastName.$error.minlength">
+ Too short!</span>
+ <span class="error" ng-show="myForm.lastName.$error.maxlength">
+ Too long!</span><br>
+ </form>
+ <hr>
+ <tt>user = {{user}}</tt><br/>
+ <tt>myForm.userName.$valid = {{myForm.userName.$valid}}</tt><br>
+ <tt>myForm.userName.$error = {{myForm.userName.$error}}</tt><br>
+ <tt>myForm.lastName.$valid = {{myForm.lastName.$valid}}</tt><br>
+ <tt>myForm.lastName.$error = {{myForm.lastName.$error}}</tt><br>
+ <tt>myForm.$valid = {{myForm.$valid}}</tt><br>
+ <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br>
+ <tt>myForm.$error.minlength = {{!!myForm.$error.minlength}}</tt><br>
+ <tt>myForm.$error.maxlength = {{!!myForm.$error.maxlength}}</tt><br>
+ </div>
+ </file>
+ <file name="protractor.js" type="protractor">
+ var user = element(by.exactBinding('user'));
+ var userNameValid = element(by.binding('myForm.userName.$valid'));
+ var lastNameValid = element(by.binding('myForm.lastName.$valid'));
+ var lastNameError = element(by.binding('myForm.lastName.$error'));
+ var formValid = element(by.binding('myForm.$valid'));
+ var userNameInput = element(by.model('user.name'));
+ var userLastInput = element(by.model('user.last'));
+
+ it('should initialize to model', function() {
+ expect(user.getText()).toContain('{"name":"guest","last":"visitor"}');
+ expect(userNameValid.getText()).toContain('true');
+ expect(formValid.getText()).toContain('true');
+ });
+
+ it('should be invalid if empty when required', function() {
+ userNameInput.clear();
+ userNameInput.sendKeys('');
+
+ expect(user.getText()).toContain('{"last":"visitor"}');
+ expect(userNameValid.getText()).toContain('false');
+ expect(formValid.getText()).toContain('false');
+ });
+
+ it('should be valid if empty when min length is set', function() {
+ userLastInput.clear();
+ userLastInput.sendKeys('');
+
+ expect(user.getText()).toContain('{"name":"guest","last":""}');
+ expect(lastNameValid.getText()).toContain('true');
+ expect(formValid.getText()).toContain('true');
+ });
+
+ it('should be invalid if less than required min length', function() {
+ userLastInput.clear();
+ userLastInput.sendKeys('xx');
+
+ expect(user.getText()).toContain('{"name":"guest"}');
+ expect(lastNameValid.getText()).toContain('false');
+ expect(lastNameError.getText()).toContain('minlength');
+ expect(formValid.getText()).toContain('false');
+ });
+
+ it('should be invalid if longer than max length', function() {
+ userLastInput.clear();
+ userLastInput.sendKeys('some ridiculously long name');
+
+ expect(user.getText()).toContain('{"name":"guest"}');
+ expect(lastNameValid.getText()).toContain('false');
+ expect(lastNameError.getText()).toContain('maxlength');
+ expect(formValid.getText()).toContain('false');
+ });
+ </file>
+ </example>
+ */
+var inputDirective = ['$browser', '$sniffer', '$filter', '$parse',
+ function($browser, $sniffer, $filter, $parse) {
+ return {
+ restrict: 'E',
+ require: ['?ngModel'],
+ link: {
+ pre: function(scope, element, attr, ctrls) {
+ if (ctrls[0]) {
+ (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer,
+ $browser, $filter, $parse);
+ }
+ }
+ }
+ };
+}];
+
+var VALID_CLASS = 'ng-valid',
+ INVALID_CLASS = 'ng-invalid',
+ PRISTINE_CLASS = 'ng-pristine',
+ DIRTY_CLASS = 'ng-dirty',
+ UNTOUCHED_CLASS = 'ng-untouched',
+ TOUCHED_CLASS = 'ng-touched',
+ PENDING_CLASS = 'ng-pending';
+
+/**
+ * @ngdoc type
+ * @name ngModel.NgModelController
+ *
+ * @property {string} $viewValue Actual string value in the view.
+ * @property {*} $modelValue The value in the model that the control is bound to.
+ * @property {Array.<Function>} $parsers Array of functions to execute, as a pipeline, whenever
+ the control reads value from the DOM. The functions are called in array order, each passing
+ its return value through to the next. The last return value is forwarded to the
+ {@link ngModel.NgModelController#$validators `$validators`} collection.
+
+Parsers are used to sanitize / convert the {@link ngModel.NgModelController#$viewValue
+`$viewValue`}.
+
+Returning `undefined` from a parser means a parse error occurred. In that case,
+no {@link ngModel.NgModelController#$validators `$validators`} will run and the `ngModel`
+will be set to `undefined` unless {@link ngModelOptions `ngModelOptions.allowInvalid`}
+is set to `true`. The parse error is stored in `ngModel.$error.parse`.
+
+ *
+ * @property {Array.<Function>} $formatters Array of functions to execute, as a pipeline, whenever
+ the model value changes. The functions are called in reverse array order, each passing the value through to the
+ next. The last return value is used as the actual DOM value.
+ Used to format / convert values for display in the control.
+ * ```js
+ * function formatter(value) {
+ * if (value) {
+ * return value.toUpperCase();
+ * }
+ * }
+ * ngModel.$formatters.push(formatter);
+ * ```
+ *
+ * @property {Object.<string, function>} $validators A collection of validators that are applied
+ * whenever the model value changes. The key value within the object refers to the name of the
+ * validator while the function refers to the validation operation. The validation operation is
+ * provided with the model value as an argument and must return a true or false value depending
+ * on the response of that validation.
+ *
+ * ```js
+ * ngModel.$validators.validCharacters = function(modelValue, viewValue) {
+ * var value = modelValue || viewValue;
+ * return /[0-9]+/.test(value) &&
+ * /[a-z]+/.test(value) &&
+ * /[A-Z]+/.test(value) &&
+ * /\W+/.test(value);
+ * };
+ * ```
+ *
+ * @property {Object.<string, function>} $asyncValidators A collection of validations that are expected to
+ * perform an asynchronous validation (e.g. a HTTP request). The validation function that is provided
+ * is expected to return a promise when it is run during the model validation process. Once the promise
+ * is delivered then the validation status will be set to true when fulfilled and false when rejected.
+ * When the asynchronous validators are triggered, each of the validators will run in parallel and the model
+ * value will only be updated once all validators have been fulfilled. As long as an asynchronous validator
+ * is unfulfilled, its key will be added to the controllers `$pending` property. Also, all asynchronous validators
+ * will only run once all synchronous validators have passed.
+ *
+ * Please note that if $http is used then it is important that the server returns a success HTTP response code
+ * in order to fulfill the validation and a status level of `4xx` in order to reject the validation.
+ *
+ * ```js
+ * ngModel.$asyncValidators.uniqueUsername = function(modelValue, viewValue) {
+ * var value = modelValue || viewValue;
+ *
+ * // Lookup user by username
+ * return $http.get('/api/users/' + value).
+ * then(function resolved() {
+ * //username exists, this means validation fails
+ * return $q.reject('exists');
+ * }, function rejected() {
+ * //username does not exist, therefore this validation passes
+ * return true;
+ * });
+ * };
+ * ```
+ *
+ * @property {Array.<Function>} $viewChangeListeners Array of functions to execute whenever the
+ * view value has changed. It is called with no arguments, and its return value is ignored.
+ * This can be used in place of additional $watches against the model value.
+ *
+ * @property {Object} $error An object hash with all failing validator ids as keys.
+ * @property {Object} $pending An object hash with all pending validator ids as keys.
+ *
+ * @property {boolean} $untouched True if control has not lost focus yet.
+ * @property {boolean} $touched True if control has lost focus.
+ * @property {boolean} $pristine True if user has not interacted with the control yet.
+ * @property {boolean} $dirty True if user has already interacted with the control.
+ * @property {boolean} $valid True if there is no error.
+ * @property {boolean} $invalid True if at least one error on the control.
+ * @property {string} $name The name attribute of the control.
+ *
+ * @description
+ *
+ * `NgModelController` provides API for the {@link ngModel `ngModel`} directive.
+ * The controller contains services for data-binding, validation, CSS updates, and value formatting
+ * and parsing. It purposefully does not contain any logic which deals with DOM rendering or
+ * listening to DOM events.
+ * Such DOM related logic should be provided by other directives which make use of
+ * `NgModelController` for data-binding to control elements.
+ * Angular provides this DOM logic for most {@link input `input`} elements.
+ * At the end of this page you can find a {@link ngModel.NgModelController#custom-control-example
+ * custom control example} that uses `ngModelController` to bind to `contenteditable` elements.
+ *
+ * @example
+ * ### Custom Control Example
+ * This example shows how to use `NgModelController` with a custom control to achieve
+ * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`)
+ * collaborate together to achieve the desired result.
+ *
+ * Note that `contenteditable` is an HTML5 attribute, which tells the browser to let the element
+ * contents be edited in place by the user. This will not work on older browsers.
+ *
+ * We are using the {@link ng.service:$sce $sce} service here and include the {@link ngSanitize $sanitize}
+ * module to automatically remove "bad" content like inline event listener (e.g. `<span onclick="...">`).
+ * However, as we are using `$sce` the model can still decide to provide unsafe content if it marks
+ * that content using the `$sce` service.
+ *
+ * <example name="NgModelController" module="customControl" deps="angular-sanitize.js">
+ <file name="style.css">
+ [contenteditable] {
+ border: 1px solid black;
+ background-color: white;
+ min-height: 20px;
+ }
+
+ .ng-invalid {
+ border: 1px solid red;
+ }
+
+ </file>
+ <file name="script.js">
+ angular.module('customControl', ['ngSanitize']).
+ directive('contenteditable', ['$sce', function($sce) {
+ return {
+ restrict: 'A', // only activate on element attribute
+ require: '?ngModel', // get a hold of NgModelController
+ link: function(scope, element, attrs, ngModel) {
+ if (!ngModel) return; // do nothing if no ng-model
+
+ // Specify how UI should be updated
+ ngModel.$render = function() {
+ element.html($sce.getTrustedHtml(ngModel.$viewValue || ''));
+ };
+
+ // Listen for change events to enable binding
+ element.on('blur keyup change', function() {
+ scope.$evalAsync(read);
+ });
+ read(); // initialize
+
+ // Write data to the model
+ function read() {
+ var html = element.html();
+ // When we clear the content editable the browser leaves a <br> behind
+ // If strip-br attribute is provided then we strip this out
+ if ( attrs.stripBr && html == '<br>' ) {
+ html = '';
+ }
+ ngModel.$setViewValue(html);
+ }
+ }
+ };
+ }]);
+ </file>
+ <file name="index.html">
+ <form name="myForm">
+ <div contenteditable
+ name="myWidget" ng-model="userContent"
+ strip-br="true"
+ required>Change me!</div>
+ <span ng-show="myForm.myWidget.$error.required">Required!</span>
+ <hr>
+ <textarea ng-model="userContent"></textarea>
+ </form>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should data-bind and become invalid', function() {
+ if (browser.params.browser == 'safari' || browser.params.browser == 'firefox') {
+ // SafariDriver can't handle contenteditable
+ // and Firefox driver can't clear contenteditables very well
+ return;
+ }
+ var contentEditable = element(by.css('[contenteditable]'));
+ var content = 'Change me!';
+
+ expect(contentEditable.getText()).toEqual(content);
+
+ contentEditable.clear();
+ contentEditable.sendKeys(protractor.Key.BACK_SPACE);
+ expect(contentEditable.getText()).toEqual('');
+ expect(contentEditable.getAttribute('class')).toMatch(/ng-invalid-required/);
+ });
+ </file>
+ * </example>
+ *
+ *
+ */
+var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', '$animate', '$timeout', '$rootScope', '$q', '$interpolate',
+ function($scope, $exceptionHandler, $attr, $element, $parse, $animate, $timeout, $rootScope, $q, $interpolate) {
+ this.$viewValue = Number.NaN;
+ this.$modelValue = Number.NaN;
+ this.$$rawModelValue = undefined; // stores the parsed modelValue / model set from scope regardless of validity.
+ this.$validators = {};
+ this.$asyncValidators = {};
+ this.$parsers = [];
+ this.$formatters = [];
+ this.$viewChangeListeners = [];
+ this.$untouched = true;
+ this.$touched = false;
+ this.$pristine = true;
+ this.$dirty = false;
+ this.$valid = true;
+ this.$invalid = false;
+ this.$error = {}; // keep invalid keys here
+ this.$$success = {}; // keep valid keys here
+ this.$pending = undefined; // keep pending keys here
+ this.$name = $interpolate($attr.name || '', false)($scope);
+
+
+ var parsedNgModel = $parse($attr.ngModel),
+ parsedNgModelAssign = parsedNgModel.assign,
+ ngModelGet = parsedNgModel,
+ ngModelSet = parsedNgModelAssign,
+ pendingDebounce = null,
+ ctrl = this;
+
+ this.$$setOptions = function(options) {
+ ctrl.$options = options;
+ if (options && options.getterSetter) {
+ var invokeModelGetter = $parse($attr.ngModel + '()'),
+ invokeModelSetter = $parse($attr.ngModel + '($$$p)');
+
+ ngModelGet = function($scope) {
+ var modelValue = parsedNgModel($scope);
+ if (isFunction(modelValue)) {
+ modelValue = invokeModelGetter($scope);
+ }
+ return modelValue;
+ };
+ ngModelSet = function($scope, newValue) {
+ if (isFunction(parsedNgModel($scope))) {
+ invokeModelSetter($scope, {$$$p: ctrl.$modelValue});
+ } else {
+ parsedNgModelAssign($scope, ctrl.$modelValue);
+ }
+ };
+ } else if (!parsedNgModel.assign) {
+ throw $ngModelMinErr('nonassign', "Expression '{0}' is non-assignable. Element: {1}",
+ $attr.ngModel, startingTag($element));
+ }
+ };
+
+ /**
+ * @ngdoc method
+ * @name ngModel.NgModelController#$render
+ *
+ * @description
+ * Called when the view needs to be updated. It is expected that the user of the ng-model
+ * directive will implement this method.
+ *
+ * The `$render()` method is invoked in the following situations:
+ *
+ * * `$rollbackViewValue()` is called. If we are rolling back the view value to the last
+ * committed value then `$render()` is called to update the input control.
+ * * The value referenced by `ng-model` is changed programmatically and both the `$modelValue` and
+ * the `$viewValue` are different to last time.
+ *
+ * Since `ng-model` does not do a deep watch, `$render()` is only invoked if the values of
+ * `$modelValue` and `$viewValue` are actually different to their previous value. If `$modelValue`
+ * or `$viewValue` are objects (rather than a string or number) then `$render()` will not be
+ * invoked if you only change a property on the objects.
+ */
+ this.$render = noop;
+
+ /**
+ * @ngdoc method
+ * @name ngModel.NgModelController#$isEmpty
+ *
+ * @description
+ * This is called when we need to determine if the value of an input is empty.
+ *
+ * For instance, the required directive does this to work out if the input has data or not.
+ *
+ * The default `$isEmpty` function checks whether the value is `undefined`, `''`, `null` or `NaN`.
+ *
+ * You can override this for input directives whose concept of being empty is different to the
+ * default. The `checkboxInputType` directive does this because in its case a value of `false`
+ * implies empty.
+ *
+ * @param {*} value The value of the input to check for emptiness.
+ * @returns {boolean} True if `value` is "empty".
+ */
+ this.$isEmpty = function(value) {
+ return isUndefined(value) || value === '' || value === null || value !== value;
+ };
+
+ var parentForm = $element.inheritedData('$formController') || nullFormCtrl,
+ currentValidationRunId = 0;
+
+ /**
+ * @ngdoc method
+ * @name ngModel.NgModelController#$setValidity
+ *
+ * @description
+ * Change the validity state, and notify the form.
+ *
+ * This method can be called within $parsers/$formatters or a custom validation implementation.
+ * However, in most cases it should be sufficient to use the `ngModel.$validators` and
+ * `ngModel.$asyncValidators` collections which will call `$setValidity` automatically.
+ *
+ * @param {string} validationErrorKey Name of the validator. The `validationErrorKey` will be assigned
+ * to either `$error[validationErrorKey]` or `$pending[validationErrorKey]`
+ * (for unfulfilled `$asyncValidators`), so that it is available for data-binding.
+ * The `validationErrorKey` should be in camelCase and will get converted into dash-case
+ * for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error`
+ * class and can be bound to as `{{someForm.someControl.$error.myError}}` .
+ * @param {boolean} isValid Whether the current state is valid (true), invalid (false), pending (undefined),
+ * or skipped (null). Pending is used for unfulfilled `$asyncValidators`.
+ * Skipped is used by Angular when validators do not run because of parse errors and
+ * when `$asyncValidators` do not run because any of the `$validators` failed.
+ */
+ addSetValidityMethod({
+ ctrl: this,
+ $element: $element,
+ set: function(object, property) {
+ object[property] = true;
+ },
+ unset: function(object, property) {
+ delete object[property];
+ },
+ parentForm: parentForm,
+ $animate: $animate
+ });
+
+ /**
+ * @ngdoc method
+ * @name ngModel.NgModelController#$setPristine
+ *
+ * @description
+ * Sets the control to its pristine state.
+ *
+ * This method can be called to remove the `ng-dirty` class and set the control to its pristine
+ * state (`ng-pristine` class). A model is considered to be pristine when the control
+ * has not been changed from when first compiled.
+ */
+ this.$setPristine = function() {
+ ctrl.$dirty = false;
+ ctrl.$pristine = true;
+ $animate.removeClass($element, DIRTY_CLASS);
+ $animate.addClass($element, PRISTINE_CLASS);
+ };
+
+ /**
+ * @ngdoc method
+ * @name ngModel.NgModelController#$setDirty
+ *
+ * @description
+ * Sets the control to its dirty state.
+ *
+ * This method can be called to remove the `ng-pristine` class and set the control to its dirty
+ * state (`ng-dirty` class). A model is considered to be dirty when the control has been changed
+ * from when first compiled.
+ */
+ this.$setDirty = function() {
+ ctrl.$dirty = true;
+ ctrl.$pristine = false;
+ $animate.removeClass($element, PRISTINE_CLASS);
+ $animate.addClass($element, DIRTY_CLASS);
+ parentForm.$setDirty();
+ };
+
+ /**
+ * @ngdoc method
+ * @name ngModel.NgModelController#$setUntouched
+ *
+ * @description
+ * Sets the control to its untouched state.
+ *
+ * This method can be called to remove the `ng-touched` class and set the control to its
+ * untouched state (`ng-untouched` class). Upon compilation, a model is set as untouched
+ * by default, however this function can be used to restore that state if the model has
+ * already been touched by the user.
+ */
+ this.$setUntouched = function() {
+ ctrl.$touched = false;
+ ctrl.$untouched = true;
+ $animate.setClass($element, UNTOUCHED_CLASS, TOUCHED_CLASS);
+ };
+
+ /**
+ * @ngdoc method
+ * @name ngModel.NgModelController#$setTouched
+ *
+ * @description
+ * Sets the control to its touched state.
+ *
+ * This method can be called to remove the `ng-untouched` class and set the control to its
+ * touched state (`ng-touched` class). A model is considered to be touched when the user has
+ * first focused the control element and then shifted focus away from the control (blur event).
+ */
+ this.$setTouched = function() {
+ ctrl.$touched = true;
+ ctrl.$untouched = false;
+ $animate.setClass($element, TOUCHED_CLASS, UNTOUCHED_CLASS);
+ };
+
+ /**
+ * @ngdoc method
+ * @name ngModel.NgModelController#$rollbackViewValue
+ *
+ * @description
+ * Cancel an update and reset the input element's value to prevent an update to the `$modelValue`,
+ * which may be caused by a pending debounced event or because the input is waiting for a some
+ * future event.
+ *
+ * If you have an input that uses `ng-model-options` to set up debounced events or events such
+ * as blur you can have a situation where there is a period when the `$viewValue`
+ * is out of synch with the ngModel's `$modelValue`.
+ *
+ * In this case, you can run into difficulties if you try to update the ngModel's `$modelValue`
+ * programmatically before these debounced/future events have resolved/occurred, because Angular's
+ * dirty checking mechanism is not able to tell whether the model has actually changed or not.
+ *
+ * The `$rollbackViewValue()` method should be called before programmatically changing the model of an
+ * input which may have such events pending. This is important in order to make sure that the
+ * input field will be updated with the new model value and any pending operations are cancelled.
+ *
+ * <example name="ng-model-cancel-update" module="cancel-update-example">
+ * <file name="app.js">
+ * angular.module('cancel-update-example', [])
+ *
+ * .controller('CancelUpdateController', ['$scope', function($scope) {
+ * $scope.resetWithCancel = function(e) {
+ * if (e.keyCode == 27) {
+ * $scope.myForm.myInput1.$rollbackViewValue();
+ * $scope.myValue = '';
+ * }
+ * };
+ * $scope.resetWithoutCancel = function(e) {
+ * if (e.keyCode == 27) {
+ * $scope.myValue = '';
+ * }
+ * };
+ * }]);
+ * </file>
+ * <file name="index.html">
+ * <div ng-controller="CancelUpdateController">
+ * <p>Try typing something in each input. See that the model only updates when you
+ * blur off the input.
+ * </p>
+ * <p>Now see what happens if you start typing then press the Escape key</p>
+ *
+ * <form name="myForm" ng-model-options="{ updateOn: 'blur' }">
+ * <p>With $rollbackViewValue()</p>
+ * <input name="myInput1" ng-model="myValue" ng-keydown="resetWithCancel($event)"><br/>
+ * myValue: "{{ myValue }}"
+ *
+ * <p>Without $rollbackViewValue()</p>
+ * <input name="myInput2" ng-model="myValue" ng-keydown="resetWithoutCancel($event)"><br/>
+ * myValue: "{{ myValue }}"
+ * </form>
+ * </div>
+ * </file>
+ * </example>
+ */
+ this.$rollbackViewValue = function() {
+ $timeout.cancel(pendingDebounce);
+ ctrl.$viewValue = ctrl.$$lastCommittedViewValue;
+ ctrl.$render();
+ };
+
+ /**
+ * @ngdoc method
+ * @name ngModel.NgModelController#$validate
+ *
+ * @description
+ * Runs each of the registered validators (first synchronous validators and then
+ * asynchronous validators).
+ * If the validity changes to invalid, the model will be set to `undefined`,
+ * unless {@link ngModelOptions `ngModelOptions.allowInvalid`} is `true`.
+ * If the validity changes to valid, it will set the model to the last available valid
+ * modelValue, i.e. either the last parsed value or the last value set from the scope.
+ */
+ this.$validate = function() {
+ // ignore $validate before model is initialized
+ if (isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue)) {
+ return;
+ }
+
+ var viewValue = ctrl.$$lastCommittedViewValue;
+ // Note: we use the $$rawModelValue as $modelValue might have been
+ // set to undefined during a view -> model update that found validation
+ // errors. We can't parse the view here, since that could change
+ // the model although neither viewValue nor the model on the scope changed
+ var modelValue = ctrl.$$rawModelValue;
+
+ // Check if the there's a parse error, so we don't unset it accidentially
+ var parserName = ctrl.$$parserName || 'parse';
+ var parserValid = ctrl.$error[parserName] ? false : undefined;
+
+ var prevValid = ctrl.$valid;
+ var prevModelValue = ctrl.$modelValue;
+
+ var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid;
+
+ ctrl.$$runValidators(parserValid, modelValue, viewValue, function(allValid) {
+ // If there was no change in validity, don't update the model
+ // This prevents changing an invalid modelValue to undefined
+ if (!allowInvalid && prevValid !== allValid) {
+ // Note: Don't check ctrl.$valid here, as we could have
+ // external validators (e.g. calculated on the server),
+ // that just call $setValidity and need the model value
+ // to calculate their validity.
+ ctrl.$modelValue = allValid ? modelValue : undefined;
+
+ if (ctrl.$modelValue !== prevModelValue) {
+ ctrl.$$writeModelToScope();
+ }
+ }
+ });
+
+ };
+
+ this.$$runValidators = function(parseValid, modelValue, viewValue, doneCallback) {
+ currentValidationRunId++;
+ var localValidationRunId = currentValidationRunId;
+
+ // check parser error
+ if (!processParseErrors(parseValid)) {
+ validationDone(false);
+ return;
+ }
+ if (!processSyncValidators()) {
+ validationDone(false);
+ return;
+ }
+ processAsyncValidators();
+
+ function processParseErrors(parseValid) {
+ var errorKey = ctrl.$$parserName || 'parse';
+ if (parseValid === undefined) {
+ setValidity(errorKey, null);
+ } else {
+ setValidity(errorKey, parseValid);
+ if (!parseValid) {
+ forEach(ctrl.$validators, function(v, name) {
+ setValidity(name, null);
+ });
+ forEach(ctrl.$asyncValidators, function(v, name) {
+ setValidity(name, null);
+ });
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function processSyncValidators() {
+ var syncValidatorsValid = true;
+ forEach(ctrl.$validators, function(validator, name) {
+ var result = validator(modelValue, viewValue);
+ syncValidatorsValid = syncValidatorsValid && result;
+ setValidity(name, result);
+ });
+ if (!syncValidatorsValid) {
+ forEach(ctrl.$asyncValidators, function(v, name) {
+ setValidity(name, null);
+ });
+ return false;
+ }
+ return true;
+ }
+
+ function processAsyncValidators() {
+ var validatorPromises = [];
+ var allValid = true;
+ forEach(ctrl.$asyncValidators, function(validator, name) {
+ var promise = validator(modelValue, viewValue);
+ if (!isPromiseLike(promise)) {
+ throw $ngModelMinErr("$asyncValidators",
+ "Expected asynchronous validator to return a promise but got '{0}' instead.", promise);
+ }
+ setValidity(name, undefined);
+ validatorPromises.push(promise.then(function() {
+ setValidity(name, true);
+ }, function(error) {
+ allValid = false;
+ setValidity(name, false);
+ }));
+ });
+ if (!validatorPromises.length) {
+ validationDone(true);
+ } else {
+ $q.all(validatorPromises).then(function() {
+ validationDone(allValid);
+ }, noop);
+ }
+ }
+
+ function setValidity(name, isValid) {
+ if (localValidationRunId === currentValidationRunId) {
+ ctrl.$setValidity(name, isValid);
+ }
+ }
+
+ function validationDone(allValid) {
+ if (localValidationRunId === currentValidationRunId) {
+
+ doneCallback(allValid);
+ }
+ }
+ };
+
+ /**
+ * @ngdoc method
+ * @name ngModel.NgModelController#$commitViewValue
+ *
+ * @description
+ * Commit a pending update to the `$modelValue`.
+ *
+ * Updates may be pending by a debounced event or because the input is waiting for a some future
+ * event defined in `ng-model-options`. this method is rarely needed as `NgModelController`
+ * usually handles calling this in response to input events.
+ */
+ this.$commitViewValue = function() {
+ var viewValue = ctrl.$viewValue;
+
+ $timeout.cancel(pendingDebounce);
+
+ // If the view value has not changed then we should just exit, except in the case where there is
+ // a native validator on the element. In this case the validation state may have changed even though
+ // the viewValue has stayed empty.
+ if (ctrl.$$lastCommittedViewValue === viewValue && (viewValue !== '' || !ctrl.$$hasNativeValidators)) {
+ return;
+ }
+ ctrl.$$lastCommittedViewValue = viewValue;
+
+ // change to dirty
+ if (ctrl.$pristine) {
+ this.$setDirty();
+ }
+ this.$$parseAndValidate();
+ };
+
+ this.$$parseAndValidate = function() {
+ var viewValue = ctrl.$$lastCommittedViewValue;
+ var modelValue = viewValue;
+ var parserValid = isUndefined(modelValue) ? undefined : true;
+
+ if (parserValid) {
+ for (var i = 0; i < ctrl.$parsers.length; i++) {
+ modelValue = ctrl.$parsers[i](modelValue);
+ if (isUndefined(modelValue)) {
+ parserValid = false;
+ break;
+ }
+ }
+ }
+ if (isNumber(ctrl.$modelValue) && isNaN(ctrl.$modelValue)) {
+ // ctrl.$modelValue has not been touched yet...
+ ctrl.$modelValue = ngModelGet($scope);
+ }
+ var prevModelValue = ctrl.$modelValue;
+ var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid;
+ ctrl.$$rawModelValue = modelValue;
+ if (allowInvalid) {
+ ctrl.$modelValue = modelValue;
+ writeToModelIfNeeded();
+ }
+ ctrl.$$runValidators(parserValid, modelValue, viewValue, function(allValid) {
+ if (!allowInvalid) {
+ // Note: Don't check ctrl.$valid here, as we could have
+ // external validators (e.g. calculated on the server),
+ // that just call $setValidity and need the model value
+ // to calculate their validity.
+ ctrl.$modelValue = allValid ? modelValue : undefined;
+ writeToModelIfNeeded();
+ }
+ });
+
+ function writeToModelIfNeeded() {
+ if (ctrl.$modelValue !== prevModelValue) {
+ ctrl.$$writeModelToScope();
+ }
+ }
+ };
+
+ this.$$writeModelToScope = function() {
+ ngModelSet($scope, ctrl.$modelValue);
+ forEach(ctrl.$viewChangeListeners, function(listener) {
+ try {
+ listener();
+ } catch (e) {
+ $exceptionHandler(e);
+ }
+ });
+ };
+
+ /**
+ * @ngdoc method
+ * @name ngModel.NgModelController#$setViewValue
+ *
+ * @description
+ * Update the view value.
+ *
+ * This method should be called when an input directive want to change the view value; typically,
+ * this is done from within a DOM event handler.
+ *
+ * For example {@link ng.directive:input input} calls it when the value of the input changes and
+ * {@link ng.directive:select select} calls it when an option is selected.
+ *
+ * If the new `value` is an object (rather than a string or a number), we should make a copy of the
+ * object before passing it to `$setViewValue`. This is because `ngModel` does not perform a deep
+ * watch of objects, it only looks for a change of identity. If you only change the property of
+ * the object then ngModel will not realise that the object has changed and will not invoke the
+ * `$parsers` and `$validators` pipelines.
+ *
+ * For this reason, you should not change properties of the copy once it has been passed to
+ * `$setViewValue`. Otherwise you may cause the model value on the scope to change incorrectly.
+ *
+ * When this method is called, the new `value` will be staged for committing through the `$parsers`
+ * and `$validators` pipelines. If there are no special {@link ngModelOptions} specified then the staged
+ * value sent directly for processing, finally to be applied to `$modelValue` and then the
+ * **expression** specified in the `ng-model` attribute.
+ *
+ * Lastly, all the registered change listeners, in the `$viewChangeListeners` list, are called.
+ *
+ * In case the {@link ng.directive:ngModelOptions ngModelOptions} directive is used with `updateOn`
+ * and the `default` trigger is not listed, all those actions will remain pending until one of the
+ * `updateOn` events is triggered on the DOM element.
+ * All these actions will be debounced if the {@link ng.directive:ngModelOptions ngModelOptions}
+ * directive is used with a custom debounce for this particular event.
+ *
+ * Note that calling this function does not trigger a `$digest`.
+ *
+ * @param {string} value Value from the view.
+ * @param {string} trigger Event that triggered the update.
+ */
+ this.$setViewValue = function(value, trigger) {
+ ctrl.$viewValue = value;
+ if (!ctrl.$options || ctrl.$options.updateOnDefault) {
+ ctrl.$$debounceViewValueCommit(trigger);
+ }
+ };
+
+ this.$$debounceViewValueCommit = function(trigger) {
+ var debounceDelay = 0,
+ options = ctrl.$options,
+ debounce;
+
+ if (options && isDefined(options.debounce)) {
+ debounce = options.debounce;
+ if (isNumber(debounce)) {
+ debounceDelay = debounce;
+ } else if (isNumber(debounce[trigger])) {
+ debounceDelay = debounce[trigger];
+ } else if (isNumber(debounce['default'])) {
+ debounceDelay = debounce['default'];
+ }
+ }
+
+ $timeout.cancel(pendingDebounce);
+ if (debounceDelay) {
+ pendingDebounce = $timeout(function() {
+ ctrl.$commitViewValue();
+ }, debounceDelay);
+ } else if ($rootScope.$$phase) {
+ ctrl.$commitViewValue();
+ } else {
+ $scope.$apply(function() {
+ ctrl.$commitViewValue();
+ });
+ }
+ };
+
+ // model -> value
+ // Note: we cannot use a normal scope.$watch as we want to detect the following:
+ // 1. scope value is 'a'
+ // 2. user enters 'b'
+ // 3. ng-change kicks in and reverts scope value to 'a'
+ // -> scope value did not change since the last digest as
+ // ng-change executes in apply phase
+ // 4. view should be changed back to 'a'
+ $scope.$watch(function ngModelWatch() {
+ var modelValue = ngModelGet($scope);
+
+ // if scope model value and ngModel value are out of sync
+ // TODO(perf): why not move this to the action fn?
+ if (modelValue !== ctrl.$modelValue) {
+ ctrl.$modelValue = ctrl.$$rawModelValue = modelValue;
+
+ var formatters = ctrl.$formatters,
+ idx = formatters.length;
+
+ var viewValue = modelValue;
+ while (idx--) {
+ viewValue = formatters[idx](viewValue);
+ }
+ if (ctrl.$viewValue !== viewValue) {
+ ctrl.$viewValue = ctrl.$$lastCommittedViewValue = viewValue;
+ ctrl.$render();
+
+ ctrl.$$runValidators(undefined, modelValue, viewValue, noop);
+ }
+ }
+
+ return modelValue;
+ });
+}];
+
+
+/**
+ * @ngdoc directive
+ * @name ngModel
+ *
+ * @element input
+ * @priority 1
+ *
+ * @description
+ * The `ngModel` directive binds an `input`,`select`, `textarea` (or custom form control) to a
+ * property on the scope using {@link ngModel.NgModelController NgModelController},
+ * which is created and exposed by this directive.
+ *
+ * `ngModel` is responsible for:
+ *
+ * - Binding the view into the model, which other directives such as `input`, `textarea` or `select`
+ * require.
+ * - Providing validation behavior (i.e. required, number, email, url).
+ * - Keeping the state of the control (valid/invalid, dirty/pristine, touched/untouched, validation errors).
+ * - Setting related css classes on the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`, `ng-touched`, `ng-untouched`) including animations.
+ * - Registering the control with its parent {@link ng.directive:form form}.
+ *
+ * Note: `ngModel` will try to bind to the property given by evaluating the expression on the
+ * current scope. If the property doesn't already exist on this scope, it will be created
+ * implicitly and added to the scope.
+ *
+ * For best practices on using `ngModel`, see:
+ *
+ * - [Understanding Scopes](https://github.com/angular/angular.js/wiki/Understanding-Scopes)
+ *
+ * For basic examples, how to use `ngModel`, see:
+ *
+ * - {@link ng.directive:input input}
+ * - {@link input[text] text}
+ * - {@link input[checkbox] checkbox}
+ * - {@link input[radio] radio}
+ * - {@link input[number] number}
+ * - {@link input[email] email}
+ * - {@link input[url] url}
+ * - {@link input[date] date}
+ * - {@link input[datetime-local] datetime-local}
+ * - {@link input[time] time}
+ * - {@link input[month] month}
+ * - {@link input[week] week}
+ * - {@link ng.directive:select select}
+ * - {@link ng.directive:textarea textarea}
+ *
+ * # CSS classes
+ * The following CSS classes are added and removed on the associated input/select/textarea element
+ * depending on the validity of the model.
+ *
+ * - `ng-valid`: the model is valid
+ * - `ng-invalid`: the model is invalid
+ * - `ng-valid-[key]`: for each valid key added by `$setValidity`
+ * - `ng-invalid-[key]`: for each invalid key added by `$setValidity`
+ * - `ng-pristine`: the control hasn't been interacted with yet
+ * - `ng-dirty`: the control has been interacted with
+ * - `ng-touched`: the control has been blurred
+ * - `ng-untouched`: the control hasn't been blurred
+ * - `ng-pending`: any `$asyncValidators` are unfulfilled
+ *
+ * Keep in mind that ngAnimate can detect each of these classes when added and removed.
+ *
+ * ## Animation Hooks
+ *
+ * Animations within models are triggered when any of the associated CSS classes are added and removed
+ * on the input element which is attached to the model. These classes are: `.ng-pristine`, `.ng-dirty`,
+ * `.ng-invalid` and `.ng-valid` as well as any other validations that are performed on the model itself.
+ * The animations that are triggered within ngModel are similar to how they work in ngClass and
+ * animations can be hooked into using CSS transitions, keyframes as well as JS animations.
+ *
+ * The following example shows a simple way to utilize CSS transitions to style an input element
+ * that has been rendered as invalid after it has been validated:
+ *
+ * <pre>
+ * //be sure to include ngAnimate as a module to hook into more
+ * //advanced animations
+ * .my-input {
+ * transition:0.5s linear all;
+ * background: white;
+ * }
+ * .my-input.ng-invalid {
+ * background: red;
+ * color:white;
+ * }
+ * </pre>
+ *
+ * @example
+ * <example deps="angular-animate.js" animations="true" fixBase="true" module="inputExample">
+ <file name="index.html">
+ <script>
+ angular.module('inputExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.val = '1';
+ }]);
+ </script>
+ <style>
+ .my-input {
+ -webkit-transition:all linear 0.5s;
+ transition:all linear 0.5s;
+ background: transparent;
+ }
+ .my-input.ng-invalid {
+ color:white;
+ background: red;
+ }
+ </style>
+ Update input to see transitions when valid/invalid.
+ Integer is a valid value.
+ <form name="testForm" ng-controller="ExampleController">
+ <input ng-model="val" ng-pattern="/^\d+$/" name="anim" class="my-input" />
+ </form>
+ </file>
+ * </example>
+ *
+ * ## Binding to a getter/setter
+ *
+ * Sometimes it's helpful to bind `ngModel` to a getter/setter function. A getter/setter is a
+ * function that returns a representation of the model when called with zero arguments, and sets
+ * the internal state of a model when called with an argument. It's sometimes useful to use this
+ * for models that have an internal representation that's different than what the model exposes
+ * to the view.
+ *
+ * <div class="alert alert-success">
+ * **Best Practice:** It's best to keep getters fast because Angular is likely to call them more
+ * frequently than other parts of your code.
+ * </div>
+ *
+ * You use this behavior by adding `ng-model-options="{ getterSetter: true }"` to an element that
+ * has `ng-model` attached to it. You can also add `ng-model-options="{ getterSetter: true }"` to
+ * a `<form>`, which will enable this behavior for all `<input>`s within it. See
+ * {@link ng.directive:ngModelOptions `ngModelOptions`} for more.
+ *
+ * The following example shows how to use `ngModel` with a getter/setter:
+ *
+ * @example
+ * <example name="ngModel-getter-setter" module="getterSetterExample">
+ <file name="index.html">
+ <div ng-controller="ExampleController">
+ <form name="userForm">
+ Name:
+ <input type="text" name="userName"
+ ng-model="user.name"
+ ng-model-options="{ getterSetter: true }" />
+ </form>
+ <pre>user.name = <span ng-bind="user.name()"></span></pre>
+ </div>
+ </file>
+ <file name="app.js">
+ angular.module('getterSetterExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ var _name = 'Brian';
+ $scope.user = {
+ name: function(newName) {
+ if (angular.isDefined(newName)) {
+ _name = newName;
+ }
+ return _name;
+ }
+ };
+ }]);
+ </file>
+ * </example>
+ */
+var ngModelDirective = ['$rootScope', function($rootScope) {
+ return {
+ restrict: 'A',
+ require: ['ngModel', '^?form', '^?ngModelOptions'],
+ controller: NgModelController,
+ // Prelink needs to run before any input directive
+ // so that we can set the NgModelOptions in NgModelController
+ // before anyone else uses it.
+ priority: 1,
+ compile: function ngModelCompile(element) {
+ // Setup initial state of the control
+ element.addClass(PRISTINE_CLASS).addClass(UNTOUCHED_CLASS).addClass(VALID_CLASS);
+
+ return {
+ pre: function ngModelPreLink(scope, element, attr, ctrls) {
+ var modelCtrl = ctrls[0],
+ formCtrl = ctrls[1] || nullFormCtrl;
+
+ modelCtrl.$$setOptions(ctrls[2] && ctrls[2].$options);
+
+ // notify others, especially parent forms
+ formCtrl.$addControl(modelCtrl);
+
+ attr.$observe('name', function(newValue) {
+ if (modelCtrl.$name !== newValue) {
+ formCtrl.$$renameControl(modelCtrl, newValue);
+ }
+ });
+
+ scope.$on('$destroy', function() {
+ formCtrl.$removeControl(modelCtrl);
+ });
+ },
+ post: function ngModelPostLink(scope, element, attr, ctrls) {
+ var modelCtrl = ctrls[0];
+ if (modelCtrl.$options && modelCtrl.$options.updateOn) {
+ element.on(modelCtrl.$options.updateOn, function(ev) {
+ modelCtrl.$$debounceViewValueCommit(ev && ev.type);
+ });
+ }
+
+ element.on('blur', function(ev) {
+ if (modelCtrl.$touched) return;
+
+ if ($rootScope.$$phase) {
+ scope.$evalAsync(modelCtrl.$setTouched);
+ } else {
+ scope.$apply(modelCtrl.$setTouched);
+ }
+ });
+ }
+ };
+ }
+ };
+}];
+
+
+/**
+ * @ngdoc directive
+ * @name ngChange
+ *
+ * @description
+ * Evaluate the given expression when the user changes the input.
+ * The expression is evaluated immediately, unlike the JavaScript onchange event
+ * which only triggers at the end of a change (usually, when the user leaves the
+ * form element or presses the return key).
+ *
+ * The `ngChange` expression is only evaluated when a change in the input value causes
+ * a new value to be committed to the model.
+ *
+ * It will not be evaluated:
+ * * if the value returned from the `$parsers` transformation pipeline has not changed
+ * * if the input has continued to be invalid since the model will stay `null`
+ * * if the model is changed programmatically and not by a change to the input value
+ *
+ *
+ * Note, this directive requires `ngModel` to be present.
+ *
+ * @element input
+ * @param {expression} ngChange {@link guide/expression Expression} to evaluate upon change
+ * in input value.
+ *
+ * @example
+ * <example name="ngChange-directive" module="changeExample">
+ * <file name="index.html">
+ * <script>
+ * angular.module('changeExample', [])
+ * .controller('ExampleController', ['$scope', function($scope) {
+ * $scope.counter = 0;
+ * $scope.change = function() {
+ * $scope.counter++;
+ * };
+ * }]);
+ * </script>
+ * <div ng-controller="ExampleController">
+ * <input type="checkbox" ng-model="confirmed" ng-change="change()" id="ng-change-example1" />
+ * <input type="checkbox" ng-model="confirmed" id="ng-change-example2" />
+ * <label for="ng-change-example2">Confirmed</label><br />
+ * <tt>debug = {{confirmed}}</tt><br/>
+ * <tt>counter = {{counter}}</tt><br/>
+ * </div>
+ * </file>
+ * <file name="protractor.js" type="protractor">
+ * var counter = element(by.binding('counter'));
+ * var debug = element(by.binding('confirmed'));
+ *
+ * it('should evaluate the expression if changing from view', function() {
+ * expect(counter.getText()).toContain('0');
+ *
+ * element(by.id('ng-change-example1')).click();
+ *
+ * expect(counter.getText()).toContain('1');
+ * expect(debug.getText()).toContain('true');
+ * });
+ *
+ * it('should not evaluate the expression if changing from model', function() {
+ * element(by.id('ng-change-example2')).click();
+
+ * expect(counter.getText()).toContain('0');
+ * expect(debug.getText()).toContain('true');
+ * });
+ * </file>
+ * </example>
+ */
+var ngChangeDirective = valueFn({
+ restrict: 'A',
+ require: 'ngModel',
+ link: function(scope, element, attr, ctrl) {
+ ctrl.$viewChangeListeners.push(function() {
+ scope.$eval(attr.ngChange);
+ });
+ }
+});
+
+
+var requiredDirective = function() {
+ return {
+ restrict: 'A',
+ require: '?ngModel',
+ link: function(scope, elm, attr, ctrl) {
+ if (!ctrl) return;
+ attr.required = true; // force truthy in case we are on non input element
+
+ ctrl.$validators.required = function(modelValue, viewValue) {
+ return !attr.required || !ctrl.$isEmpty(viewValue);
+ };
+
+ attr.$observe('required', function() {
+ ctrl.$validate();
+ });
+ }
+ };
+};
+
+
+var patternDirective = function() {
+ return {
+ restrict: 'A',
+ require: '?ngModel',
+ link: function(scope, elm, attr, ctrl) {
+ if (!ctrl) return;
+
+ var regexp, patternExp = attr.ngPattern || attr.pattern;
+ attr.$observe('pattern', function(regex) {
+ if (isString(regex) && regex.length > 0) {
+ regex = new RegExp('^' + regex + '$');
+ }
+
+ if (regex && !regex.test) {
+ throw minErr('ngPattern')('noregexp',
+ 'Expected {0} to be a RegExp but was {1}. Element: {2}', patternExp,
+ regex, startingTag(elm));
+ }
+
+ regexp = regex || undefined;
+ ctrl.$validate();
+ });
+
+ ctrl.$validators.pattern = function(value) {
+ return ctrl.$isEmpty(value) || isUndefined(regexp) || regexp.test(value);
+ };
+ }
+ };
+};
+
+
+var maxlengthDirective = function() {
+ return {
+ restrict: 'A',
+ require: '?ngModel',
+ link: function(scope, elm, attr, ctrl) {
+ if (!ctrl) return;
+
+ var maxlength = -1;
+ attr.$observe('maxlength', function(value) {
+ var intVal = int(value);
+ maxlength = isNaN(intVal) ? -1 : intVal;
+ ctrl.$validate();
+ });
+ ctrl.$validators.maxlength = function(modelValue, viewValue) {
+ return (maxlength < 0) || ctrl.$isEmpty(modelValue) || (viewValue.length <= maxlength);
+ };
+ }
+ };
+};
+
+var minlengthDirective = function() {
+ return {
+ restrict: 'A',
+ require: '?ngModel',
+ link: function(scope, elm, attr, ctrl) {
+ if (!ctrl) return;
+
+ var minlength = 0;
+ attr.$observe('minlength', function(value) {
+ minlength = int(value) || 0;
+ ctrl.$validate();
+ });
+ ctrl.$validators.minlength = function(modelValue, viewValue) {
+ return ctrl.$isEmpty(viewValue) || viewValue.length >= minlength;
+ };
+ }
+ };
+};
+
+
+/**
+ * @ngdoc directive
+ * @name ngList
+ *
+ * @description
+ * Text input that converts between a delimited string and an array of strings. The default
+ * delimiter is a comma followed by a space - equivalent to `ng-list=", "`. You can specify a custom
+ * delimiter as the value of the `ngList` attribute - for example, `ng-list=" | "`.
+ *
+ * The behaviour of the directive is affected by the use of the `ngTrim` attribute.
+ * * If `ngTrim` is set to `"false"` then whitespace around both the separator and each
+ * list item is respected. This implies that the user of the directive is responsible for
+ * dealing with whitespace but also allows you to use whitespace as a delimiter, such as a
+ * tab or newline character.
+ * * Otherwise whitespace around the delimiter is ignored when splitting (although it is respected
+ * when joining the list items back together) and whitespace around each list item is stripped
+ * before it is added to the model.
+ *
+ * ### Example with Validation
+ *
+ * <example name="ngList-directive" module="listExample">
+ * <file name="app.js">
+ * angular.module('listExample', [])
+ * .controller('ExampleController', ['$scope', function($scope) {
+ * $scope.names = ['morpheus', 'neo', 'trinity'];
+ * }]);
+ * </file>
+ * <file name="index.html">
+ * <form name="myForm" ng-controller="ExampleController">
+ * List: <input name="namesInput" ng-model="names" ng-list required>
+ * <span class="error" ng-show="myForm.namesInput.$error.required">
+ * Required!</span>
+ * <br>
+ * <tt>names = {{names}}</tt><br/>
+ * <tt>myForm.namesInput.$valid = {{myForm.namesInput.$valid}}</tt><br/>
+ * <tt>myForm.namesInput.$error = {{myForm.namesInput.$error}}</tt><br/>
+ * <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
+ * <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
+ * </form>
+ * </file>
+ * <file name="protractor.js" type="protractor">
+ * var listInput = element(by.model('names'));
+ * var names = element(by.exactBinding('names'));
+ * var valid = element(by.binding('myForm.namesInput.$valid'));
+ * var error = element(by.css('span.error'));
+ *
+ * it('should initialize to model', function() {
+ * expect(names.getText()).toContain('["morpheus","neo","trinity"]');
+ * expect(valid.getText()).toContain('true');
+ * expect(error.getCssValue('display')).toBe('none');
+ * });
+ *
+ * it('should be invalid if empty', function() {
+ * listInput.clear();
+ * listInput.sendKeys('');
+ *
+ * expect(names.getText()).toContain('');
+ * expect(valid.getText()).toContain('false');
+ * expect(error.getCssValue('display')).not.toBe('none');
+ * });
+ * </file>
+ * </example>
+ *
+ * ### Example - splitting on whitespace
+ * <example name="ngList-directive-newlines">
+ * <file name="index.html">
+ * <textarea ng-model="list" ng-list="&#10;" ng-trim="false"></textarea>
+ * <pre>{{ list | json }}</pre>
+ * </file>
+ * <file name="protractor.js" type="protractor">
+ * it("should split the text by newlines", function() {
+ * var listInput = element(by.model('list'));
+ * var output = element(by.binding('list | json'));
+ * listInput.sendKeys('abc\ndef\nghi');
+ * expect(output.getText()).toContain('[\n "abc",\n "def",\n "ghi"\n]');
+ * });
+ * </file>
+ * </example>
+ *
+ * @element input
+ * @param {string=} ngList optional delimiter that should be used to split the value.
+ */
+var ngListDirective = function() {
+ return {
+ restrict: 'A',
+ priority: 100,
+ require: 'ngModel',
+ link: function(scope, element, attr, ctrl) {
+ // We want to control whitespace trimming so we use this convoluted approach
+ // to access the ngList attribute, which doesn't pre-trim the attribute
+ var ngList = element.attr(attr.$attr.ngList) || ', ';
+ var trimValues = attr.ngTrim !== 'false';
+ var separator = trimValues ? trim(ngList) : ngList;
+
+ var parse = function(viewValue) {
+ // If the viewValue is invalid (say required but empty) it will be `undefined`
+ if (isUndefined(viewValue)) return;
+
+ var list = [];
+
+ if (viewValue) {
+ forEach(viewValue.split(separator), function(value) {
+ if (value) list.push(trimValues ? trim(value) : value);
+ });
+ }
+
+ return list;
+ };
+
+ ctrl.$parsers.push(parse);
+ ctrl.$formatters.push(function(value) {
+ if (isArray(value)) {
+ return value.join(ngList);
+ }
+
+ return undefined;
+ });
+
+ // Override the standard $isEmpty because an empty array means the input is empty.
+ ctrl.$isEmpty = function(value) {
+ return !value || !value.length;
+ };
+ }
+ };
+};
+
+
+var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/;
+/**
+ * @ngdoc directive
+ * @name ngValue
+ *
+ * @description
+ * Binds the given expression to the value of `<option>` or {@link input[radio] `input[radio]`},
+ * so that when the element is selected, the {@link ngModel `ngModel`} of that element is set to
+ * the bound value.
+ *
+ * `ngValue` is useful when dynamically generating lists of radio buttons using
+ * {@link ngRepeat `ngRepeat`}, as shown below.
+ *
+ * Likewise, `ngValue` can be used to generate `<option>` elements for
+ * the {@link select `select`} element. In that case however, only strings are supported
+ * for the `value `attribute, so the resulting `ngModel` will always be a string.
+ * Support for `select` models with non-string values is available via `ngOptions`.
+ *
+ * @element input
+ * @param {string=} ngValue angular expression, whose value will be bound to the `value` attribute
+ * of the `input` element
+ *
+ * @example
+ <example name="ngValue-directive" module="valueExample">
+ <file name="index.html">
+ <script>
+ angular.module('valueExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.names = ['pizza', 'unicorns', 'robots'];
+ $scope.my = { favorite: 'unicorns' };
+ }]);
+ </script>
+ <form ng-controller="ExampleController">
+ <h2>Which is your favorite?</h2>
+ <label ng-repeat="name in names" for="{{name}}">
+ {{name}}
+ <input type="radio"
+ ng-model="my.favorite"
+ ng-value="name"
+ id="{{name}}"
+ name="favorite">
+ </label>
+ <div>You chose {{my.favorite}}</div>
+ </form>
+ </file>
+ <file name="protractor.js" type="protractor">
+ var favorite = element(by.binding('my.favorite'));
+
+ it('should initialize to model', function() {
+ expect(favorite.getText()).toContain('unicorns');
+ });
+ it('should bind the values to the inputs', function() {
+ element.all(by.model('my.favorite')).get(0).click();
+ expect(favorite.getText()).toContain('pizza');
+ });
+ </file>
+ </example>
+ */
+var ngValueDirective = function() {
+ return {
+ restrict: 'A',
+ priority: 100,
+ compile: function(tpl, tplAttr) {
+ if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) {
+ return function ngValueConstantLink(scope, elm, attr) {
+ attr.$set('value', scope.$eval(attr.ngValue));
+ };
+ } else {
+ return function ngValueLink(scope, elm, attr) {
+ scope.$watch(attr.ngValue, function valueWatchAction(value) {
+ attr.$set('value', value);
+ });
+ };
+ }
+ }
+ };
+};
+
+/**
+ * @ngdoc directive
+ * @name ngModelOptions
+ *
+ * @description
+ * Allows tuning how model updates are done. Using `ngModelOptions` you can specify a custom list of
+ * events that will trigger a model update and/or a debouncing delay so that the actual update only
+ * takes place when a timer expires; this timer will be reset after another change takes place.
+ *
+ * Given the nature of `ngModelOptions`, the value displayed inside input fields in the view might
+ * be different than the value in the actual model. This means that if you update the model you
+ * should also invoke {@link ngModel.NgModelController `$rollbackViewValue`} on the relevant input field in
+ * order to make sure it is synchronized with the model and that any debounced action is canceled.
+ *
+ * The easiest way to reference the control's {@link ngModel.NgModelController `$rollbackViewValue`}
+ * method is by making sure the input is placed inside a form that has a `name` attribute. This is
+ * important because `form` controllers are published to the related scope under the name in their
+ * `name` attribute.
+ *
+ * Any pending changes will take place immediately when an enclosing form is submitted via the
+ * `submit` event. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit`
+ * to have access to the updated model.
+ *
+ * `ngModelOptions` has an effect on the element it's declared on and its descendants.
+ *
+ * @param {Object} ngModelOptions options to apply to the current model. Valid keys are:
+ * - `updateOn`: string specifying which event should the input be bound to. You can set several
+ * events using an space delimited list. There is a special event called `default` that
+ * matches the default events belonging of the control.
+ * - `debounce`: integer value which contains the debounce model update value in milliseconds. A
+ * value of 0 triggers an immediate update. If an object is supplied instead, you can specify a
+ * custom value for each event. For example:
+ * `ng-model-options="{ updateOn: 'default blur', debounce: {'default': 500, 'blur': 0} }"`
+ * - `allowInvalid`: boolean value which indicates that the model can be set with values that did
+ * not validate correctly instead of the default behavior of setting the model to undefined.
+ * - `getterSetter`: boolean value which determines whether or not to treat functions bound to
+ `ngModel` as getters/setters.
+ * - `timezone`: Defines the timezone to be used to read/write the `Date` instance in the model for
+ * `<input type="date">`, `<input type="time">`, ... . Right now, the only supported value is `'UTC'`,
+ * otherwise the default timezone of the browser will be used.
+ *
+ * @example
+
+ The following example shows how to override immediate updates. Changes on the inputs within the
+ form will update the model only when the control loses focus (blur event). If `escape` key is
+ pressed while the input field is focused, the value is reset to the value in the current model.
+
+ <example name="ngModelOptions-directive-blur" module="optionsExample">
+ <file name="index.html">
+ <div ng-controller="ExampleController">
+ <form name="userForm">
+ Name:
+ <input type="text" name="userName"
+ ng-model="user.name"
+ ng-model-options="{ updateOn: 'blur' }"
+ ng-keyup="cancel($event)" /><br />
+
+ Other data:
+ <input type="text" ng-model="user.data" /><br />
+ </form>
+ <pre>user.name = <span ng-bind="user.name"></span></pre>
+ </div>
+ </file>
+ <file name="app.js">
+ angular.module('optionsExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.user = { name: 'say', data: '' };
+
+ $scope.cancel = function(e) {
+ if (e.keyCode == 27) {
+ $scope.userForm.userName.$rollbackViewValue();
+ }
+ };
+ }]);
+ </file>
+ <file name="protractor.js" type="protractor">
+ var model = element(by.binding('user.name'));
+ var input = element(by.model('user.name'));
+ var other = element(by.model('user.data'));
+
+ it('should allow custom events', function() {
+ input.sendKeys(' hello');
+ input.click();
+ expect(model.getText()).toEqual('say');
+ other.click();
+ expect(model.getText()).toEqual('say hello');
+ });
+
+ it('should $rollbackViewValue when model changes', function() {
+ input.sendKeys(' hello');
+ expect(input.getAttribute('value')).toEqual('say hello');
+ input.sendKeys(protractor.Key.ESCAPE);
+ expect(input.getAttribute('value')).toEqual('say');
+ other.click();
+ expect(model.getText()).toEqual('say');
+ });
+ </file>
+ </example>
+
+ This one shows how to debounce model changes. Model will be updated only 1 sec after last change.
+ If the `Clear` button is pressed, any debounced action is canceled and the value becomes empty.
+
+ <example name="ngModelOptions-directive-debounce" module="optionsExample">
+ <file name="index.html">
+ <div ng-controller="ExampleController">
+ <form name="userForm">
+ Name:
+ <input type="text" name="userName"
+ ng-model="user.name"
+ ng-model-options="{ debounce: 1000 }" />
+ <button ng-click="userForm.userName.$rollbackViewValue(); user.name=''">Clear</button><br />
+ </form>
+ <pre>user.name = <span ng-bind="user.name"></span></pre>
+ </div>
+ </file>
+ <file name="app.js">
+ angular.module('optionsExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.user = { name: 'say' };
+ }]);
+ </file>
+ </example>
+
+ This one shows how to bind to getter/setters:
+
+ <example name="ngModelOptions-directive-getter-setter" module="getterSetterExample">
+ <file name="index.html">
+ <div ng-controller="ExampleController">
+ <form name="userForm">
+ Name:
+ <input type="text" name="userName"
+ ng-model="user.name"
+ ng-model-options="{ getterSetter: true }" />
+ </form>
+ <pre>user.name = <span ng-bind="user.name()"></span></pre>
+ </div>
+ </file>
+ <file name="app.js">
+ angular.module('getterSetterExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ var _name = 'Brian';
+ $scope.user = {
+ name: function(newName) {
+ return angular.isDefined(newName) ? (_name = newName) : _name;
+ }
+ };
+ }]);
+ </file>
+ </example>
+ */
+var ngModelOptionsDirective = function() {
+ return {
+ restrict: 'A',
+ controller: ['$scope', '$attrs', function($scope, $attrs) {
+ var that = this;
+ this.$options = $scope.$eval($attrs.ngModelOptions);
+ // Allow adding/overriding bound events
+ if (this.$options.updateOn !== undefined) {
+ this.$options.updateOnDefault = false;
+ // extract "default" pseudo-event from list of events that can trigger a model update
+ this.$options.updateOn = trim(this.$options.updateOn.replace(DEFAULT_REGEXP, function() {
+ that.$options.updateOnDefault = true;
+ return ' ';
+ }));
+ } else {
+ this.$options.updateOnDefault = true;
+ }
+ }]
+ };
+};
+
+// helper methods
+function addSetValidityMethod(context) {
+ var ctrl = context.ctrl,
+ $element = context.$element,
+ classCache = {},
+ set = context.set,
+ unset = context.unset,
+ parentForm = context.parentForm,
+ $animate = context.$animate;
+
+ classCache[INVALID_CLASS] = !(classCache[VALID_CLASS] = $element.hasClass(VALID_CLASS));
+
+ ctrl.$setValidity = setValidity;
+
+ function setValidity(validationErrorKey, state, options) {
+ if (state === undefined) {
+ createAndSet('$pending', validationErrorKey, options);
+ } else {
+ unsetAndCleanup('$pending', validationErrorKey, options);
+ }
+ if (!isBoolean(state)) {
+ unset(ctrl.$error, validationErrorKey, options);
+ unset(ctrl.$$success, validationErrorKey, options);
+ } else {
+ if (state) {
+ unset(ctrl.$error, validationErrorKey, options);
+ set(ctrl.$$success, validationErrorKey, options);
+ } else {
+ set(ctrl.$error, validationErrorKey, options);
+ unset(ctrl.$$success, validationErrorKey, options);
+ }
+ }
+ if (ctrl.$pending) {
+ cachedToggleClass(PENDING_CLASS, true);
+ ctrl.$valid = ctrl.$invalid = undefined;
+ toggleValidationCss('', null);
+ } else {
+ cachedToggleClass(PENDING_CLASS, false);
+ ctrl.$valid = isObjectEmpty(ctrl.$error);
+ ctrl.$invalid = !ctrl.$valid;
+ toggleValidationCss('', ctrl.$valid);
+ }
+
+ // re-read the state as the set/unset methods could have
+ // combined state in ctrl.$error[validationError] (used for forms),
+ // where setting/unsetting only increments/decrements the value,
+ // and does not replace it.
+ var combinedState;
+ if (ctrl.$pending && ctrl.$pending[validationErrorKey]) {
+ combinedState = undefined;
+ } else if (ctrl.$error[validationErrorKey]) {
+ combinedState = false;
+ } else if (ctrl.$$success[validationErrorKey]) {
+ combinedState = true;
+ } else {
+ combinedState = null;
+ }
+ toggleValidationCss(validationErrorKey, combinedState);
+ parentForm.$setValidity(validationErrorKey, combinedState, ctrl);
+ }
+
+ function createAndSet(name, value, options) {
+ if (!ctrl[name]) {
+ ctrl[name] = {};
+ }
+ set(ctrl[name], value, options);
+ }
+
+ function unsetAndCleanup(name, value, options) {
+ if (ctrl[name]) {
+ unset(ctrl[name], value, options);
+ }
+ if (isObjectEmpty(ctrl[name])) {
+ ctrl[name] = undefined;
+ }
+ }
+
+ function cachedToggleClass(className, switchValue) {
+ if (switchValue && !classCache[className]) {
+ $animate.addClass($element, className);
+ classCache[className] = true;
+ } else if (!switchValue && classCache[className]) {
+ $animate.removeClass($element, className);
+ classCache[className] = false;
+ }
+ }
+
+ function toggleValidationCss(validationErrorKey, isValid) {
+ validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';
+
+ cachedToggleClass(VALID_CLASS + validationErrorKey, isValid === true);
+ cachedToggleClass(INVALID_CLASS + validationErrorKey, isValid === false);
+ }
+}
+
+function isObjectEmpty(obj) {
+ if (obj) {
+ for (var prop in obj) {
+ return false;
+ }
+ }
+ return true;
+}
+
+/**
+ * @ngdoc directive
+ * @name ngBind
+ * @restrict AC
+ *
+ * @description
+ * The `ngBind` attribute tells Angular to replace the text content of the specified HTML element
+ * with the value of a given expression, and to update the text content when the value of that
+ * expression changes.
+ *
+ * Typically, you don't use `ngBind` directly, but instead you use the double curly markup like
+ * `{{ expression }}` which is similar but less verbose.
+ *
+ * It is preferable to use `ngBind` instead of `{{ expression }}` if a template is momentarily
+ * displayed by the browser in its raw state before Angular compiles it. Since `ngBind` is an
+ * element attribute, it makes the bindings invisible to the user while the page is loading.
+ *
+ * An alternative solution to this problem would be using the
+ * {@link ng.directive:ngCloak ngCloak} directive.
+ *
+ *
+ * @element ANY
+ * @param {expression} ngBind {@link guide/expression Expression} to evaluate.
+ *
+ * @example
+ * Enter a name in the Live Preview text box; the greeting below the text box changes instantly.
+ <example module="bindExample">
+ <file name="index.html">
+ <script>
+ angular.module('bindExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.name = 'Whirled';
+ }]);
+ </script>
+ <div ng-controller="ExampleController">
+ Enter name: <input type="text" ng-model="name"><br>
+ Hello <span ng-bind="name"></span>!
+ </div>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should check ng-bind', function() {
+ var nameInput = element(by.model('name'));
+
+ expect(element(by.binding('name')).getText()).toBe('Whirled');
+ nameInput.clear();
+ nameInput.sendKeys('world');
+ expect(element(by.binding('name')).getText()).toBe('world');
+ });
+ </file>
+ </example>
+ */
+var ngBindDirective = ['$compile', function($compile) {
+ return {
+ restrict: 'AC',
+ compile: function ngBindCompile(templateElement) {
+ $compile.$$addBindingClass(templateElement);
+ return function ngBindLink(scope, element, attr) {
+ $compile.$$addBindingInfo(element, attr.ngBind);
+ element = element[0];
+ scope.$watch(attr.ngBind, function ngBindWatchAction(value) {
+ element.textContent = value === undefined ? '' : value;
+ });
+ };
+ }
+ };
+}];
+
+
+/**
+ * @ngdoc directive
+ * @name ngBindTemplate
+ *
+ * @description
+ * The `ngBindTemplate` directive specifies that the element
+ * text content should be replaced with the interpolation of the template
+ * in the `ngBindTemplate` attribute.
+ * Unlike `ngBind`, the `ngBindTemplate` can contain multiple `{{` `}}`
+ * expressions. This directive is needed since some HTML elements
+ * (such as TITLE and OPTION) cannot contain SPAN elements.
+ *
+ * @element ANY
+ * @param {string} ngBindTemplate template of form
+ * <tt>{{</tt> <tt>expression</tt> <tt>}}</tt> to eval.
+ *
+ * @example
+ * Try it here: enter text in text box and watch the greeting change.
+ <example module="bindExample">
+ <file name="index.html">
+ <script>
+ angular.module('bindExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.salutation = 'Hello';
+ $scope.name = 'World';
+ }]);
+ </script>
+ <div ng-controller="ExampleController">
+ Salutation: <input type="text" ng-model="salutation"><br>
+ Name: <input type="text" ng-model="name"><br>
+ <pre ng-bind-template="{{salutation}} {{name}}!"></pre>
+ </div>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should check ng-bind', function() {
+ var salutationElem = element(by.binding('salutation'));
+ var salutationInput = element(by.model('salutation'));
+ var nameInput = element(by.model('name'));
+
+ expect(salutationElem.getText()).toBe('Hello World!');
+
+ salutationInput.clear();
+ salutationInput.sendKeys('Greetings');
+ nameInput.clear();
+ nameInput.sendKeys('user');
+
+ expect(salutationElem.getText()).toBe('Greetings user!');
+ });
+ </file>
+ </example>
+ */
+var ngBindTemplateDirective = ['$interpolate', '$compile', function($interpolate, $compile) {
+ return {
+ compile: function ngBindTemplateCompile(templateElement) {
+ $compile.$$addBindingClass(templateElement);
+ return function ngBindTemplateLink(scope, element, attr) {
+ var interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate));
+ $compile.$$addBindingInfo(element, interpolateFn.expressions);
+ element = element[0];
+ attr.$observe('ngBindTemplate', function(value) {
+ element.textContent = value === undefined ? '' : value;
+ });
+ };
+ }
+ };
+}];
+
+
+/**
+ * @ngdoc directive
+ * @name ngBindHtml
+ *
+ * @description
+ * Evaluates the expression and inserts the resulting HTML into the element in a secure way. By default,
+ * the resulting HTML content will be sanitized using the {@link ngSanitize.$sanitize $sanitize} service.
+ * To utilize this functionality, ensure that `$sanitize` is available, for example, by including {@link
+ * ngSanitize} in your module's dependencies (not in core Angular). In order to use {@link ngSanitize}
+ * in your module's dependencies, you need to include "angular-sanitize.js" in your application.
+ *
+ * You may also bypass sanitization for values you know are safe. To do so, bind to
+ * an explicitly trusted value via {@link ng.$sce#trustAsHtml $sce.trustAsHtml}. See the example
+ * under {@link ng.$sce#show-me-an-example-using-sce- Strict Contextual Escaping (SCE)}.
+ *
+ * Note: If a `$sanitize` service is unavailable and the bound value isn't explicitly trusted, you
+ * will have an exception (instead of an exploit.)
+ *
+ * @element ANY
+ * @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate.
+ *
+ * @example
+
+ <example module="bindHtmlExample" deps="angular-sanitize.js">
+ <file name="index.html">
+ <div ng-controller="ExampleController">
+ <p ng-bind-html="myHTML"></p>
+ </div>
+ </file>
+
+ <file name="script.js">
+ angular.module('bindHtmlExample', ['ngSanitize'])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.myHTML =
+ 'I am an <code>HTML</code>string with ' +
+ '<a href="#">links!</a> and other <em>stuff</em>';
+ }]);
+ </file>
+
+ <file name="protractor.js" type="protractor">
+ it('should check ng-bind-html', function() {
+ expect(element(by.binding('myHTML')).getText()).toBe(
+ 'I am an HTMLstring with links! and other stuff');
+ });
+ </file>
+ </example>
+ */
+var ngBindHtmlDirective = ['$sce', '$parse', '$compile', function($sce, $parse, $compile) {
+ return {
+ restrict: 'A',
+ compile: function ngBindHtmlCompile(tElement, tAttrs) {
+ var ngBindHtmlGetter = $parse(tAttrs.ngBindHtml);
+ var ngBindHtmlWatch = $parse(tAttrs.ngBindHtml, function getStringValue(value) {
+ return (value || '').toString();
+ });
+ $compile.$$addBindingClass(tElement);
+
+ return function ngBindHtmlLink(scope, element, attr) {
+ $compile.$$addBindingInfo(element, attr.ngBindHtml);
+
+ scope.$watch(ngBindHtmlWatch, function ngBindHtmlWatchAction() {
+ // we re-evaluate the expr because we want a TrustedValueHolderType
+ // for $sce, not a string
+ element.html($sce.getTrustedHtml(ngBindHtmlGetter(scope)) || '');
+ });
+ };
+ }
+ };
+}];
+
+function classDirective(name, selector) {
+ name = 'ngClass' + name;
+ return ['$animate', function($animate) {
+ return {
+ restrict: 'AC',
+ link: function(scope, element, attr) {
+ var oldVal;
+
+ scope.$watch(attr[name], ngClassWatchAction, true);
+
+ attr.$observe('class', function(value) {
+ ngClassWatchAction(scope.$eval(attr[name]));
+ });
+
+
+ if (name !== 'ngClass') {
+ scope.$watch('$index', function($index, old$index) {
+ // jshint bitwise: false
+ var mod = $index & 1;
+ if (mod !== (old$index & 1)) {
+ var classes = arrayClasses(scope.$eval(attr[name]));
+ mod === selector ?
+ addClasses(classes) :
+ removeClasses(classes);
+ }
+ });
+ }
+
+ function addClasses(classes) {
+ var newClasses = digestClassCounts(classes, 1);
+ attr.$addClass(newClasses);
+ }
+
+ function removeClasses(classes) {
+ var newClasses = digestClassCounts(classes, -1);
+ attr.$removeClass(newClasses);
+ }
+
+ function digestClassCounts(classes, count) {
+ var classCounts = element.data('$classCounts') || {};
+ var classesToUpdate = [];
+ forEach(classes, function(className) {
+ if (count > 0 || classCounts[className]) {
+ classCounts[className] = (classCounts[className] || 0) + count;
+ if (classCounts[className] === +(count > 0)) {
+ classesToUpdate.push(className);
+ }
+ }
+ });
+ element.data('$classCounts', classCounts);
+ return classesToUpdate.join(' ');
+ }
+
+ function updateClasses(oldClasses, newClasses) {
+ var toAdd = arrayDifference(newClasses, oldClasses);
+ var toRemove = arrayDifference(oldClasses, newClasses);
+ toAdd = digestClassCounts(toAdd, 1);
+ toRemove = digestClassCounts(toRemove, -1);
+ if (toAdd && toAdd.length) {
+ $animate.addClass(element, toAdd);
+ }
+ if (toRemove && toRemove.length) {
+ $animate.removeClass(element, toRemove);
+ }
+ }
+
+ function ngClassWatchAction(newVal) {
+ if (selector === true || scope.$index % 2 === selector) {
+ var newClasses = arrayClasses(newVal || []);
+ if (!oldVal) {
+ addClasses(newClasses);
+ } else if (!equals(newVal,oldVal)) {
+ var oldClasses = arrayClasses(oldVal);
+ updateClasses(oldClasses, newClasses);
+ }
+ }
+ oldVal = shallowCopy(newVal);
+ }
+ }
+ };
+
+ function arrayDifference(tokens1, tokens2) {
+ var values = [];
+
+ outer:
+ for (var i = 0; i < tokens1.length; i++) {
+ var token = tokens1[i];
+ for (var j = 0; j < tokens2.length; j++) {
+ if (token == tokens2[j]) continue outer;
+ }
+ values.push(token);
+ }
+ return values;
+ }
+
+ function arrayClasses(classVal) {
+ if (isArray(classVal)) {
+ return classVal;
+ } else if (isString(classVal)) {
+ return classVal.split(' ');
+ } else if (isObject(classVal)) {
+ var classes = [];
+ forEach(classVal, function(v, k) {
+ if (v) {
+ classes = classes.concat(k.split(' '));
+ }
+ });
+ return classes;
+ }
+ return classVal;
+ }
+ }];
+}
+
+/**
+ * @ngdoc directive
+ * @name ngClass
+ * @restrict AC
+ *
+ * @description
+ * The `ngClass` directive allows you to dynamically set CSS classes on an HTML element by databinding
+ * an expression that represents all classes to be added.
+ *
+ * The directive operates in three different ways, depending on which of three types the expression
+ * evaluates to:
+ *
+ * 1. If the expression evaluates to a string, the string should be one or more space-delimited class
+ * names.
+ *
+ * 2. If the expression evaluates to an array, each element of the array should be a string that is
+ * one or more space-delimited class names.
+ *
+ * 3. If the expression evaluates to an object, then for each key-value pair of the
+ * object with a truthy value the corresponding key is used as a class name.
+ *
+ * The directive won't add duplicate classes if a particular class was already set.
+ *
+ * When the expression changes, the previously added classes are removed and only then the
+ * new classes are added.
+ *
+ * @animations
+ * add - happens just before the class is applied to the element
+ * remove - happens just before the class is removed from the element
+ *
+ * @element ANY
+ * @param {expression} ngClass {@link guide/expression Expression} to eval. The result
+ * of the evaluation can be a string representing space delimited class
+ * names, an array, or a map of class names to boolean values. In the case of a map, the
+ * names of the properties whose values are truthy will be added as css classes to the
+ * element.
+ *
+ * @example Example that demonstrates basic bindings via ngClass directive.
+ <example>
+ <file name="index.html">
+ <p ng-class="{strike: deleted, bold: important, red: error}">Map Syntax Example</p>
+ <input type="checkbox" ng-model="deleted"> deleted (apply "strike" class)<br>
+ <input type="checkbox" ng-model="important"> important (apply "bold" class)<br>
+ <input type="checkbox" ng-model="error"> error (apply "red" class)
+ <hr>
+ <p ng-class="style">Using String Syntax</p>
+ <input type="text" ng-model="style" placeholder="Type: bold strike red">
+ <hr>
+ <p ng-class="[style1, style2, style3]">Using Array Syntax</p>
+ <input ng-model="style1" placeholder="Type: bold, strike or red"><br>
+ <input ng-model="style2" placeholder="Type: bold, strike or red"><br>
+ <input ng-model="style3" placeholder="Type: bold, strike or red"><br>
+ </file>
+ <file name="style.css">
+ .strike {
+ text-decoration: line-through;
+ }
+ .bold {
+ font-weight: bold;
+ }
+ .red {
+ color: red;
+ }
+ </file>
+ <file name="protractor.js" type="protractor">
+ var ps = element.all(by.css('p'));
+
+ it('should let you toggle the class', function() {
+
+ expect(ps.first().getAttribute('class')).not.toMatch(/bold/);
+ expect(ps.first().getAttribute('class')).not.toMatch(/red/);
+
+ element(by.model('important')).click();
+ expect(ps.first().getAttribute('class')).toMatch(/bold/);
+
+ element(by.model('error')).click();
+ expect(ps.first().getAttribute('class')).toMatch(/red/);
+ });
+
+ it('should let you toggle string example', function() {
+ expect(ps.get(1).getAttribute('class')).toBe('');
+ element(by.model('style')).clear();
+ element(by.model('style')).sendKeys('red');
+ expect(ps.get(1).getAttribute('class')).toBe('red');
+ });
+
+ it('array example should have 3 classes', function() {
+ expect(ps.last().getAttribute('class')).toBe('');
+ element(by.model('style1')).sendKeys('bold');
+ element(by.model('style2')).sendKeys('strike');
+ element(by.model('style3')).sendKeys('red');
+ expect(ps.last().getAttribute('class')).toBe('bold strike red');
+ });
+ </file>
+ </example>
+
+ ## Animations
+
+ The example below demonstrates how to perform animations using ngClass.
+
+ <example module="ngAnimate" deps="angular-animate.js" animations="true">
+ <file name="index.html">
+ <input id="setbtn" type="button" value="set" ng-click="myVar='my-class'">
+ <input id="clearbtn" type="button" value="clear" ng-click="myVar=''">
+ <br>
+ <span class="base-class" ng-class="myVar">Sample Text</span>
+ </file>
+ <file name="style.css">
+ .base-class {
+ -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
+ transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
+ }
+
+ .base-class.my-class {
+ color: red;
+ font-size:3em;
+ }
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should check ng-class', function() {
+ expect(element(by.css('.base-class')).getAttribute('class')).not.
+ toMatch(/my-class/);
+
+ element(by.id('setbtn')).click();
+
+ expect(element(by.css('.base-class')).getAttribute('class')).
+ toMatch(/my-class/);
+
+ element(by.id('clearbtn')).click();
+
+ expect(element(by.css('.base-class')).getAttribute('class')).not.
+ toMatch(/my-class/);
+ });
+ </file>
+ </example>
+
+
+ ## ngClass and pre-existing CSS3 Transitions/Animations
+ The ngClass directive still supports CSS3 Transitions/Animations even if they do not follow the ngAnimate CSS naming structure.
+ Upon animation ngAnimate will apply supplementary CSS classes to track the start and end of an animation, but this will not hinder
+ any pre-existing CSS transitions already on the element. To get an idea of what happens during a class-based animation, be sure
+ to view the step by step details of {@link ng.$animate#addClass $animate.addClass} and
+ {@link ng.$animate#removeClass $animate.removeClass}.
+ */
+var ngClassDirective = classDirective('', true);
+
+/**
+ * @ngdoc directive
+ * @name ngClassOdd
+ * @restrict AC
+ *
+ * @description
+ * The `ngClassOdd` and `ngClassEven` directives work exactly as
+ * {@link ng.directive:ngClass ngClass}, except they work in
+ * conjunction with `ngRepeat` and take effect only on odd (even) rows.
+ *
+ * This directive can be applied only within the scope of an
+ * {@link ng.directive:ngRepeat ngRepeat}.
+ *
+ * @element ANY
+ * @param {expression} ngClassOdd {@link guide/expression Expression} to eval. The result
+ * of the evaluation can be a string representing space delimited class names or an array.
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <ol ng-init="names=['John', 'Mary', 'Cate', 'Suz']">
+ <li ng-repeat="name in names">
+ <span ng-class-odd="'odd'" ng-class-even="'even'">
+ {{name}}
+ </span>
+ </li>
+ </ol>
+ </file>
+ <file name="style.css">
+ .odd {
+ color: red;
+ }
+ .even {
+ color: blue;
+ }
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should check ng-class-odd and ng-class-even', function() {
+ expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')).
+ toMatch(/odd/);
+ expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')).
+ toMatch(/even/);
+ });
+ </file>
+ </example>
+ */
+var ngClassOddDirective = classDirective('Odd', 0);
+
+/**
+ * @ngdoc directive
+ * @name ngClassEven
+ * @restrict AC
+ *
+ * @description
+ * The `ngClassOdd` and `ngClassEven` directives work exactly as
+ * {@link ng.directive:ngClass ngClass}, except they work in
+ * conjunction with `ngRepeat` and take effect only on odd (even) rows.
+ *
+ * This directive can be applied only within the scope of an
+ * {@link ng.directive:ngRepeat ngRepeat}.
+ *
+ * @element ANY
+ * @param {expression} ngClassEven {@link guide/expression Expression} to eval. The
+ * result of the evaluation can be a string representing space delimited class names or an array.
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <ol ng-init="names=['John', 'Mary', 'Cate', 'Suz']">
+ <li ng-repeat="name in names">
+ <span ng-class-odd="'odd'" ng-class-even="'even'">
+ {{name}} &nbsp; &nbsp; &nbsp;
+ </span>
+ </li>
+ </ol>
+ </file>
+ <file name="style.css">
+ .odd {
+ color: red;
+ }
+ .even {
+ color: blue;
+ }
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should check ng-class-odd and ng-class-even', function() {
+ expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')).
+ toMatch(/odd/);
+ expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')).
+ toMatch(/even/);
+ });
+ </file>
+ </example>
+ */
+var ngClassEvenDirective = classDirective('Even', 1);
+
+/**
+ * @ngdoc directive
+ * @name ngCloak
+ * @restrict AC
+ *
+ * @description
+ * The `ngCloak` directive is used to prevent the Angular html template from being briefly
+ * displayed by the browser in its raw (uncompiled) form while your application is loading. Use this
+ * directive to avoid the undesirable flicker effect caused by the html template display.
+ *
+ * The directive can be applied to the `<body>` element, but the preferred usage is to apply
+ * multiple `ngCloak` directives to small portions of the page to permit progressive rendering
+ * of the browser view.
+ *
+ * `ngCloak` works in cooperation with the following css rule embedded within `angular.js` and
+ * `angular.min.js`.
+ * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).
+ *
+ * ```css
+ * [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
+ * display: none !important;
+ * }
+ * ```
+ *
+ * When this css rule is loaded by the browser, all html elements (including their children) that
+ * are tagged with the `ngCloak` directive are hidden. When Angular encounters this directive
+ * during the compilation of the template it deletes the `ngCloak` element attribute, making
+ * the compiled element visible.
+ *
+ * For the best result, the `angular.js` script must be loaded in the head section of the html
+ * document; alternatively, the css rule above must be included in the external stylesheet of the
+ * application.
+ *
+ * Legacy browsers, like IE7, do not provide attribute selector support (added in CSS 2.1) so they
+ * cannot match the `[ng\:cloak]` selector. To work around this limitation, you must add the css
+ * class `ng-cloak` in addition to the `ngCloak` directive as shown in the example below.
+ *
+ * @element ANY
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <div id="template1" ng-cloak>{{ 'hello' }}</div>
+ <div id="template2" ng-cloak class="ng-cloak">{{ 'hello IE7' }}</div>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should remove the template directive and css class', function() {
+ expect($('#template1').getAttribute('ng-cloak')).
+ toBeNull();
+ expect($('#template2').getAttribute('ng-cloak')).
+ toBeNull();
+ });
+ </file>
+ </example>
+ *
+ */
+var ngCloakDirective = ngDirective({
+ compile: function(element, attr) {
+ attr.$set('ngCloak', undefined);
+ element.removeClass('ng-cloak');
+ }
+});
+
+/**
+ * @ngdoc directive
+ * @name ngController
+ *
+ * @description
+ * The `ngController` directive attaches a controller class to the view. This is a key aspect of how angular
+ * supports the principles behind the Model-View-Controller design pattern.
+ *
+ * MVC components in angular:
+ *
+ * * Model — Models are the properties of a scope; scopes are attached to the DOM where scope properties
+ * are accessed through bindings.
+ * * View — The template (HTML with data bindings) that is rendered into the View.
+ * * Controller — The `ngController` directive specifies a Controller class; the class contains business
+ * logic behind the application to decorate the scope with functions and values
+ *
+ * Note that you can also attach controllers to the DOM by declaring it in a route definition
+ * via the {@link ngRoute.$route $route} service. A common mistake is to declare the controller
+ * again using `ng-controller` in the template itself. This will cause the controller to be attached
+ * and executed twice.
+ *
+ * @element ANY
+ * @scope
+ * @priority 500
+ * @param {expression} ngController Name of a constructor function registered with the current
+ * {@link ng.$controllerProvider $controllerProvider} or an {@link guide/expression expression}
+ * that on the current scope evaluates to a constructor function.
+ *
+ * The controller instance can be published into a scope property by specifying
+ * `ng-controller="as propertyName"`.
+ *
+ * If the current `$controllerProvider` is configured to use globals (via
+ * {@link ng.$controllerProvider#allowGlobals `$controllerProvider.allowGlobals()` }), this may
+ * also be the name of a globally accessible constructor function (not recommended).
+ *
+ * @example
+ * Here is a simple form for editing user contact information. Adding, removing, clearing, and
+ * greeting are methods declared on the controller (see source tab). These methods can
+ * easily be called from the angular markup. Any changes to the data are automatically reflected
+ * in the View without the need for a manual update.
+ *
+ * Two different declaration styles are included below:
+ *
+ * * one binds methods and properties directly onto the controller using `this`:
+ * `ng-controller="SettingsController1 as settings"`
+ * * one injects `$scope` into the controller:
+ * `ng-controller="SettingsController2"`
+ *
+ * The second option is more common in the Angular community, and is generally used in boilerplates
+ * and in this guide. However, there are advantages to binding properties directly to the controller
+ * and avoiding scope.
+ *
+ * * Using `controller as` makes it obvious which controller you are accessing in the template when
+ * multiple controllers apply to an element.
+ * * If you are writing your controllers as classes you have easier access to the properties and
+ * methods, which will appear on the scope, from inside the controller code.
+ * * Since there is always a `.` in the bindings, you don't have to worry about prototypal
+ * inheritance masking primitives.
+ *
+ * This example demonstrates the `controller as` syntax.
+ *
+ * <example name="ngControllerAs" module="controllerAsExample">
+ * <file name="index.html">
+ * <div id="ctrl-as-exmpl" ng-controller="SettingsController1 as settings">
+ * Name: <input type="text" ng-model="settings.name"/>
+ * [ <a href="" ng-click="settings.greet()">greet</a> ]<br/>
+ * Contact:
+ * <ul>
+ * <li ng-repeat="contact in settings.contacts">
+ * <select ng-model="contact.type">
+ * <option>phone</option>
+ * <option>email</option>
+ * </select>
+ * <input type="text" ng-model="contact.value"/>
+ * [ <a href="" ng-click="settings.clearContact(contact)">clear</a>
+ * | <a href="" ng-click="settings.removeContact(contact)">X</a> ]
+ * </li>
+ * <li>[ <a href="" ng-click="settings.addContact()">add</a> ]</li>
+ * </ul>
+ * </div>
+ * </file>
+ * <file name="app.js">
+ * angular.module('controllerAsExample', [])
+ * .controller('SettingsController1', SettingsController1);
+ *
+ * function SettingsController1() {
+ * this.name = "John Smith";
+ * this.contacts = [
+ * {type: 'phone', value: '408 555 1212'},
+ * {type: 'email', value: 'john.smith@example.org'} ];
+ * }
+ *
+ * SettingsController1.prototype.greet = function() {
+ * alert(this.name);
+ * };
+ *
+ * SettingsController1.prototype.addContact = function() {
+ * this.contacts.push({type: 'email', value: 'yourname@example.org'});
+ * };
+ *
+ * SettingsController1.prototype.removeContact = function(contactToRemove) {
+ * var index = this.contacts.indexOf(contactToRemove);
+ * this.contacts.splice(index, 1);
+ * };
+ *
+ * SettingsController1.prototype.clearContact = function(contact) {
+ * contact.type = 'phone';
+ * contact.value = '';
+ * };
+ * </file>
+ * <file name="protractor.js" type="protractor">
+ * it('should check controller as', function() {
+ * var container = element(by.id('ctrl-as-exmpl'));
+ * expect(container.element(by.model('settings.name'))
+ * .getAttribute('value')).toBe('John Smith');
+ *
+ * var firstRepeat =
+ * container.element(by.repeater('contact in settings.contacts').row(0));
+ * var secondRepeat =
+ * container.element(by.repeater('contact in settings.contacts').row(1));
+ *
+ * expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))
+ * .toBe('408 555 1212');
+ *
+ * expect(secondRepeat.element(by.model('contact.value')).getAttribute('value'))
+ * .toBe('john.smith@example.org');
+ *
+ * firstRepeat.element(by.linkText('clear')).click();
+ *
+ * expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))
+ * .toBe('');
+ *
+ * container.element(by.linkText('add')).click();
+ *
+ * expect(container.element(by.repeater('contact in settings.contacts').row(2))
+ * .element(by.model('contact.value'))
+ * .getAttribute('value'))
+ * .toBe('yourname@example.org');
+ * });
+ * </file>
+ * </example>
+ *
+ * This example demonstrates the "attach to `$scope`" style of controller.
+ *
+ * <example name="ngController" module="controllerExample">
+ * <file name="index.html">
+ * <div id="ctrl-exmpl" ng-controller="SettingsController2">
+ * Name: <input type="text" ng-model="name"/>
+ * [ <a href="" ng-click="greet()">greet</a> ]<br/>
+ * Contact:
+ * <ul>
+ * <li ng-repeat="contact in contacts">
+ * <select ng-model="contact.type">
+ * <option>phone</option>
+ * <option>email</option>
+ * </select>
+ * <input type="text" ng-model="contact.value"/>
+ * [ <a href="" ng-click="clearContact(contact)">clear</a>
+ * | <a href="" ng-click="removeContact(contact)">X</a> ]
+ * </li>
+ * <li>[ <a href="" ng-click="addContact()">add</a> ]</li>
+ * </ul>
+ * </div>
+ * </file>
+ * <file name="app.js">
+ * angular.module('controllerExample', [])
+ * .controller('SettingsController2', ['$scope', SettingsController2]);
+ *
+ * function SettingsController2($scope) {
+ * $scope.name = "John Smith";
+ * $scope.contacts = [
+ * {type:'phone', value:'408 555 1212'},
+ * {type:'email', value:'john.smith@example.org'} ];
+ *
+ * $scope.greet = function() {
+ * alert($scope.name);
+ * };
+ *
+ * $scope.addContact = function() {
+ * $scope.contacts.push({type:'email', value:'yourname@example.org'});
+ * };
+ *
+ * $scope.removeContact = function(contactToRemove) {
+ * var index = $scope.contacts.indexOf(contactToRemove);
+ * $scope.contacts.splice(index, 1);
+ * };
+ *
+ * $scope.clearContact = function(contact) {
+ * contact.type = 'phone';
+ * contact.value = '';
+ * };
+ * }
+ * </file>
+ * <file name="protractor.js" type="protractor">
+ * it('should check controller', function() {
+ * var container = element(by.id('ctrl-exmpl'));
+ *
+ * expect(container.element(by.model('name'))
+ * .getAttribute('value')).toBe('John Smith');
+ *
+ * var firstRepeat =
+ * container.element(by.repeater('contact in contacts').row(0));
+ * var secondRepeat =
+ * container.element(by.repeater('contact in contacts').row(1));
+ *
+ * expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))
+ * .toBe('408 555 1212');
+ * expect(secondRepeat.element(by.model('contact.value')).getAttribute('value'))
+ * .toBe('john.smith@example.org');
+ *
+ * firstRepeat.element(by.linkText('clear')).click();
+ *
+ * expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))
+ * .toBe('');
+ *
+ * container.element(by.linkText('add')).click();
+ *
+ * expect(container.element(by.repeater('contact in contacts').row(2))
+ * .element(by.model('contact.value'))
+ * .getAttribute('value'))
+ * .toBe('yourname@example.org');
+ * });
+ * </file>
+ *</example>
+
+ */
+var ngControllerDirective = [function() {
+ return {
+ restrict: 'A',
+ scope: true,
+ controller: '@',
+ priority: 500
+ };
+}];
+
+/**
+ * @ngdoc directive
+ * @name ngCsp
+ *
+ * @element html
+ * @description
+ * Enables [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) support.
+ *
+ * This is necessary when developing things like Google Chrome Extensions or Universal Windows Apps.
+ *
+ * CSP forbids apps to use `eval` or `Function(string)` generated functions (among other things).
+ * For Angular to be CSP compatible there are only two things that we need to do differently:
+ *
+ * - don't use `Function` constructor to generate optimized value getters
+ * - don't inject custom stylesheet into the document
+ *
+ * AngularJS uses `Function(string)` generated functions as a speed optimization. Applying the `ngCsp`
+ * directive will cause Angular to use CSP compatibility mode. When this mode is on AngularJS will
+ * evaluate all expressions up to 30% slower than in non-CSP mode, but no security violations will
+ * be raised.
+ *
+ * CSP forbids JavaScript to inline stylesheet rules. In non CSP mode Angular automatically
+ * includes some CSS rules (e.g. {@link ng.directive:ngCloak ngCloak}).
+ * To make those directives work in CSP mode, include the `angular-csp.css` manually.
+ *
+ * Angular tries to autodetect if CSP is active and automatically turn on the CSP-safe mode. This
+ * autodetection however triggers a CSP error to be logged in the console:
+ *
+ * ```
+ * Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of
+ * script in the following Content Security Policy directive: "default-src 'self'". Note that
+ * 'script-src' was not explicitly set, so 'default-src' is used as a fallback.
+ * ```
+ *
+ * This error is harmless but annoying. To prevent the error from showing up, put the `ngCsp`
+ * directive on the root element of the application or on the `angular.js` script tag, whichever
+ * appears first in the html document.
+ *
+ * *Note: This directive is only available in the `ng-csp` and `data-ng-csp` attribute form.*
+ *
+ * @example
+ * This example shows how to apply the `ngCsp` directive to the `html` tag.
+ ```html
+ <!doctype html>
+ <html ng-app ng-csp>
+ ...
+ ...
+ </html>
+ ```
+ * @example
+ // Note: the suffix `.csp` in the example name triggers
+ // csp mode in our http server!
+ <example name="example.csp" module="cspExample" ng-csp="true">
+ <file name="index.html">
+ <div ng-controller="MainController as ctrl">
+ <div>
+ <button ng-click="ctrl.inc()" id="inc">Increment</button>
+ <span id="counter">
+ {{ctrl.counter}}
+ </span>
+ </div>
+
+ <div>
+ <button ng-click="ctrl.evil()" id="evil">Evil</button>
+ <span id="evilError">
+ {{ctrl.evilError}}
+ </span>
+ </div>
+ </div>
+ </file>
+ <file name="script.js">
+ angular.module('cspExample', [])
+ .controller('MainController', function() {
+ this.counter = 0;
+ this.inc = function() {
+ this.counter++;
+ };
+ this.evil = function() {
+ // jshint evil:true
+ try {
+ eval('1+2');
+ } catch (e) {
+ this.evilError = e.message;
+ }
+ };
+ });
+ </file>
+ <file name="protractor.js" type="protractor">
+ var util, webdriver;
+
+ var incBtn = element(by.id('inc'));
+ var counter = element(by.id('counter'));
+ var evilBtn = element(by.id('evil'));
+ var evilError = element(by.id('evilError'));
+
+ function getAndClearSevereErrors() {
+ return browser.manage().logs().get('browser').then(function(browserLog) {
+ return browserLog.filter(function(logEntry) {
+ return logEntry.level.value > webdriver.logging.Level.WARNING.value;
+ });
+ });
+ }
+
+ function clearErrors() {
+ getAndClearSevereErrors();
+ }
+
+ function expectNoErrors() {
+ getAndClearSevereErrors().then(function(filteredLog) {
+ expect(filteredLog.length).toEqual(0);
+ if (filteredLog.length) {
+ console.log('browser console errors: ' + util.inspect(filteredLog));
+ }
+ });
+ }
+
+ function expectError(regex) {
+ getAndClearSevereErrors().then(function(filteredLog) {
+ var found = false;
+ filteredLog.forEach(function(log) {
+ if (log.message.match(regex)) {
+ found = true;
+ }
+ });
+ if (!found) {
+ throw new Error('expected an error that matches ' + regex);
+ }
+ });
+ }
+
+ beforeEach(function() {
+ util = require('util');
+ webdriver = require('protractor/node_modules/selenium-webdriver');
+ });
+
+ // For now, we only test on Chrome,
+ // as Safari does not load the page with Protractor's injected scripts,
+ // and Firefox webdriver always disables content security policy (#6358)
+ if (browser.params.browser !== 'chrome') {
+ return;
+ }
+
+ it('should not report errors when the page is loaded', function() {
+ // clear errors so we are not dependent on previous tests
+ clearErrors();
+ // Need to reload the page as the page is already loaded when
+ // we come here
+ browser.driver.getCurrentUrl().then(function(url) {
+ browser.get(url);
+ });
+ expectNoErrors();
+ });
+
+ it('should evaluate expressions', function() {
+ expect(counter.getText()).toEqual('0');
+ incBtn.click();
+ expect(counter.getText()).toEqual('1');
+ expectNoErrors();
+ });
+
+ it('should throw and report an error when using "eval"', function() {
+ evilBtn.click();
+ expect(evilError.getText()).toMatch(/Content Security Policy/);
+ expectError(/Content Security Policy/);
+ });
+ </file>
+ </example>
+ */
+
+// ngCsp is not implemented as a proper directive any more, because we need it be processed while we
+// bootstrap the system (before $parse is instantiated), for this reason we just have
+// the csp.isActive() fn that looks for ng-csp attribute anywhere in the current doc
+
+/**
+ * @ngdoc directive
+ * @name ngClick
+ *
+ * @description
+ * The ngClick directive allows you to specify custom behavior when
+ * an element is clicked.
+ *
+ * @element ANY
+ * @priority 0
+ * @param {expression} ngClick {@link guide/expression Expression} to evaluate upon
+ * click. ({@link guide/expression#-event- Event object is available as `$event`})
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <button ng-click="count = count + 1" ng-init="count=0">
+ Increment
+ </button>
+ <span>
+ count: {{count}}
+ </span>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should check ng-click', function() {
+ expect(element(by.binding('count')).getText()).toMatch('0');
+ element(by.css('button')).click();
+ expect(element(by.binding('count')).getText()).toMatch('1');
+ });
+ </file>
+ </example>
+ */
+/*
+ * A collection of directives that allows creation of custom event handlers that are defined as
+ * angular expressions and are compiled and executed within the current scope.
+ */
+var ngEventDirectives = {};
+
+// For events that might fire synchronously during DOM manipulation
+// we need to execute their event handlers asynchronously using $evalAsync,
+// so that they are not executed in an inconsistent state.
+var forceAsyncEvents = {
+ 'blur': true,
+ 'focus': true
+};
+forEach(
+ 'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' '),
+ function(eventName) {
+ var directiveName = directiveNormalize('ng-' + eventName);
+ ngEventDirectives[directiveName] = ['$parse', '$rootScope', function($parse, $rootScope) {
+ return {
+ restrict: 'A',
+ compile: function($element, attr) {
+ // We expose the powerful $event object on the scope that provides access to the Window,
+ // etc. that isn't protected by the fast paths in $parse. We explicitly request better
+ // checks at the cost of speed since event handler expressions are not executed as
+ // frequently as regular change detection.
+ var fn = $parse(attr[directiveName], /* interceptorFn */ null, /* expensiveChecks */ true);
+ return function ngEventHandler(scope, element) {
+ element.on(eventName, function(event) {
+ var callback = function() {
+ fn(scope, {$event:event});
+ };
+ if (forceAsyncEvents[eventName] && $rootScope.$$phase) {
+ scope.$evalAsync(callback);
+ } else {
+ scope.$apply(callback);
+ }
+ });
+ };
+ }
+ };
+ }];
+ }
+);
+
+/**
+ * @ngdoc directive
+ * @name ngDblclick
+ *
+ * @description
+ * The `ngDblclick` directive allows you to specify custom behavior on a dblclick event.
+ *
+ * @element ANY
+ * @priority 0
+ * @param {expression} ngDblclick {@link guide/expression Expression} to evaluate upon
+ * a dblclick. (The Event object is available as `$event`)
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <button ng-dblclick="count = count + 1" ng-init="count=0">
+ Increment (on double click)
+ </button>
+ count: {{count}}
+ </file>
+ </example>
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ngMousedown
+ *
+ * @description
+ * The ngMousedown directive allows you to specify custom behavior on mousedown event.
+ *
+ * @element ANY
+ * @priority 0
+ * @param {expression} ngMousedown {@link guide/expression Expression} to evaluate upon
+ * mousedown. ({@link guide/expression#-event- Event object is available as `$event`})
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <button ng-mousedown="count = count + 1" ng-init="count=0">
+ Increment (on mouse down)
+ </button>
+ count: {{count}}
+ </file>
+ </example>
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ngMouseup
+ *
+ * @description
+ * Specify custom behavior on mouseup event.
+ *
+ * @element ANY
+ * @priority 0
+ * @param {expression} ngMouseup {@link guide/expression Expression} to evaluate upon
+ * mouseup. ({@link guide/expression#-event- Event object is available as `$event`})
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <button ng-mouseup="count = count + 1" ng-init="count=0">
+ Increment (on mouse up)
+ </button>
+ count: {{count}}
+ </file>
+ </example>
+ */
+
+/**
+ * @ngdoc directive
+ * @name ngMouseover
+ *
+ * @description
+ * Specify custom behavior on mouseover event.
+ *
+ * @element ANY
+ * @priority 0
+ * @param {expression} ngMouseover {@link guide/expression Expression} to evaluate upon
+ * mouseover. ({@link guide/expression#-event- Event object is available as `$event`})
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <button ng-mouseover="count = count + 1" ng-init="count=0">
+ Increment (when mouse is over)
+ </button>
+ count: {{count}}
+ </file>
+ </example>
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ngMouseenter
+ *
+ * @description
+ * Specify custom behavior on mouseenter event.
+ *
+ * @element ANY
+ * @priority 0
+ * @param {expression} ngMouseenter {@link guide/expression Expression} to evaluate upon
+ * mouseenter. ({@link guide/expression#-event- Event object is available as `$event`})
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <button ng-mouseenter="count = count + 1" ng-init="count=0">
+ Increment (when mouse enters)
+ </button>
+ count: {{count}}
+ </file>
+ </example>
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ngMouseleave
+ *
+ * @description
+ * Specify custom behavior on mouseleave event.
+ *
+ * @element ANY
+ * @priority 0
+ * @param {expression} ngMouseleave {@link guide/expression Expression} to evaluate upon
+ * mouseleave. ({@link guide/expression#-event- Event object is available as `$event`})
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <button ng-mouseleave="count = count + 1" ng-init="count=0">
+ Increment (when mouse leaves)
+ </button>
+ count: {{count}}
+ </file>
+ </example>
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ngMousemove
+ *
+ * @description
+ * Specify custom behavior on mousemove event.
+ *
+ * @element ANY
+ * @priority 0
+ * @param {expression} ngMousemove {@link guide/expression Expression} to evaluate upon
+ * mousemove. ({@link guide/expression#-event- Event object is available as `$event`})
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <button ng-mousemove="count = count + 1" ng-init="count=0">
+ Increment (when mouse moves)
+ </button>
+ count: {{count}}
+ </file>
+ </example>
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ngKeydown
+ *
+ * @description
+ * Specify custom behavior on keydown event.
+ *
+ * @element ANY
+ * @priority 0
+ * @param {expression} ngKeydown {@link guide/expression Expression} to evaluate upon
+ * keydown. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <input ng-keydown="count = count + 1" ng-init="count=0">
+ key down count: {{count}}
+ </file>
+ </example>
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ngKeyup
+ *
+ * @description
+ * Specify custom behavior on keyup event.
+ *
+ * @element ANY
+ * @priority 0
+ * @param {expression} ngKeyup {@link guide/expression Expression} to evaluate upon
+ * keyup. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <p>Typing in the input box below updates the key count</p>
+ <input ng-keyup="count = count + 1" ng-init="count=0"> key up count: {{count}}
+
+ <p>Typing in the input box below updates the keycode</p>
+ <input ng-keyup="event=$event">
+ <p>event keyCode: {{ event.keyCode }}</p>
+ <p>event altKey: {{ event.altKey }}</p>
+ </file>
+ </example>
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ngKeypress
+ *
+ * @description
+ * Specify custom behavior on keypress event.
+ *
+ * @element ANY
+ * @param {expression} ngKeypress {@link guide/expression Expression} to evaluate upon
+ * keypress. ({@link guide/expression#-event- Event object is available as `$event`}
+ * and can be interrogated for keyCode, altKey, etc.)
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <input ng-keypress="count = count + 1" ng-init="count=0">
+ key press count: {{count}}
+ </file>
+ </example>
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ngSubmit
+ *
+ * @description
+ * Enables binding angular expressions to onsubmit events.
+ *
+ * Additionally it prevents the default action (which for form means sending the request to the
+ * server and reloading the current page), but only if the form does not contain `action`,
+ * `data-action`, or `x-action` attributes.
+ *
+ * <div class="alert alert-warning">
+ * **Warning:** Be careful not to cause "double-submission" by using both the `ngClick` and
+ * `ngSubmit` handlers together. See the
+ * {@link form#submitting-a-form-and-preventing-the-default-action `form` directive documentation}
+ * for a detailed discussion of when `ngSubmit` may be triggered.
+ * </div>
+ *
+ * @element form
+ * @priority 0
+ * @param {expression} ngSubmit {@link guide/expression Expression} to eval.
+ * ({@link guide/expression#-event- Event object is available as `$event`})
+ *
+ * @example
+ <example module="submitExample">
+ <file name="index.html">
+ <script>
+ angular.module('submitExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.list = [];
+ $scope.text = 'hello';
+ $scope.submit = function() {
+ if ($scope.text) {
+ $scope.list.push(this.text);
+ $scope.text = '';
+ }
+ };
+ }]);
+ </script>
+ <form ng-submit="submit()" ng-controller="ExampleController">
+ Enter text and hit enter:
+ <input type="text" ng-model="text" name="text" />
+ <input type="submit" id="submit" value="Submit" />
+ <pre>list={{list}}</pre>
+ </form>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should check ng-submit', function() {
+ expect(element(by.binding('list')).getText()).toBe('list=[]');
+ element(by.css('#submit')).click();
+ expect(element(by.binding('list')).getText()).toContain('hello');
+ expect(element(by.model('text')).getAttribute('value')).toBe('');
+ });
+ it('should ignore empty strings', function() {
+ expect(element(by.binding('list')).getText()).toBe('list=[]');
+ element(by.css('#submit')).click();
+ element(by.css('#submit')).click();
+ expect(element(by.binding('list')).getText()).toContain('hello');
+ });
+ </file>
+ </example>
+ */
+
+/**
+ * @ngdoc directive
+ * @name ngFocus
+ *
+ * @description
+ * Specify custom behavior on focus event.
+ *
+ * Note: As the `focus` event is executed synchronously when calling `input.focus()`
+ * AngularJS executes the expression using `scope.$evalAsync` if the event is fired
+ * during an `$apply` to ensure a consistent state.
+ *
+ * @element window, input, select, textarea, a
+ * @priority 0
+ * @param {expression} ngFocus {@link guide/expression Expression} to evaluate upon
+ * focus. ({@link guide/expression#-event- Event object is available as `$event`})
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+/**
+ * @ngdoc directive
+ * @name ngBlur
+ *
+ * @description
+ * Specify custom behavior on blur event.
+ *
+ * A [blur event](https://developer.mozilla.org/en-US/docs/Web/Events/blur) fires when
+ * an element has lost focus.
+ *
+ * Note: As the `blur` event is executed synchronously also during DOM manipulations
+ * (e.g. removing a focussed input),
+ * AngularJS executes the expression using `scope.$evalAsync` if the event is fired
+ * during an `$apply` to ensure a consistent state.
+ *
+ * @element window, input, select, textarea, a
+ * @priority 0
+ * @param {expression} ngBlur {@link guide/expression Expression} to evaluate upon
+ * blur. ({@link guide/expression#-event- Event object is available as `$event`})
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+/**
+ * @ngdoc directive
+ * @name ngCopy
+ *
+ * @description
+ * Specify custom behavior on copy event.
+ *
+ * @element window, input, select, textarea, a
+ * @priority 0
+ * @param {expression} ngCopy {@link guide/expression Expression} to evaluate upon
+ * copy. ({@link guide/expression#-event- Event object is available as `$event`})
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <input ng-copy="copied=true" ng-init="copied=false; value='copy me'" ng-model="value">
+ copied: {{copied}}
+ </file>
+ </example>
+ */
+
+/**
+ * @ngdoc directive
+ * @name ngCut
+ *
+ * @description
+ * Specify custom behavior on cut event.
+ *
+ * @element window, input, select, textarea, a
+ * @priority 0
+ * @param {expression} ngCut {@link guide/expression Expression} to evaluate upon
+ * cut. ({@link guide/expression#-event- Event object is available as `$event`})
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <input ng-cut="cut=true" ng-init="cut=false; value='cut me'" ng-model="value">
+ cut: {{cut}}
+ </file>
+ </example>
+ */
+
+/**
+ * @ngdoc directive
+ * @name ngPaste
+ *
+ * @description
+ * Specify custom behavior on paste event.
+ *
+ * @element window, input, select, textarea, a
+ * @priority 0
+ * @param {expression} ngPaste {@link guide/expression Expression} to evaluate upon
+ * paste. ({@link guide/expression#-event- Event object is available as `$event`})
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <input ng-paste="paste=true" ng-init="paste=false" placeholder='paste here'>
+ pasted: {{paste}}
+ </file>
+ </example>
+ */
+
+/**
+ * @ngdoc directive
+ * @name ngIf
+ * @restrict A
+ *
+ * @description
+ * The `ngIf` directive removes or recreates a portion of the DOM tree based on an
+ * {expression}. If the expression assigned to `ngIf` evaluates to a false
+ * value then the element is removed from the DOM, otherwise a clone of the
+ * element is reinserted into the DOM.
+ *
+ * `ngIf` differs from `ngShow` and `ngHide` in that `ngIf` completely removes and recreates the
+ * element in the DOM rather than changing its visibility via the `display` css property. A common
+ * case when this difference is significant is when using css selectors that rely on an element's
+ * position within the DOM, such as the `:first-child` or `:last-child` pseudo-classes.
+ *
+ * Note that when an element is removed using `ngIf` its scope is destroyed and a new scope
+ * is created when the element is restored. The scope created within `ngIf` inherits from
+ * its parent scope using
+ * [prototypal inheritance](https://github.com/angular/angular.js/wiki/Understanding-Scopes#javascript-prototypal-inheritance).
+ * An important implication of this is if `ngModel` is used within `ngIf` to bind to
+ * a javascript primitive defined in the parent scope. In this case any modifications made to the
+ * variable within the child scope will override (hide) the value in the parent scope.
+ *
+ * Also, `ngIf` recreates elements using their compiled state. An example of this behavior
+ * is if an element's class attribute is directly modified after it's compiled, using something like
+ * jQuery's `.addClass()` method, and the element is later removed. When `ngIf` recreates the element
+ * the added class will be lost because the original compiled state is used to regenerate the element.
+ *
+ * Additionally, you can provide animations via the `ngAnimate` module to animate the `enter`
+ * and `leave` effects.
+ *
+ * @animations
+ * enter - happens just after the `ngIf` contents change and a new DOM element is created and injected into the `ngIf` container
+ * leave - happens just before the `ngIf` contents are removed from the DOM
+ *
+ * @element ANY
+ * @scope
+ * @priority 600
+ * @param {expression} ngIf If the {@link guide/expression expression} is falsy then
+ * the element is removed from the DOM tree. If it is truthy a copy of the compiled
+ * element is added to the DOM tree.
+ *
+ * @example
+ <example module="ngAnimate" deps="angular-animate.js" animations="true">
+ <file name="index.html">
+ Click me: <input type="checkbox" ng-model="checked" ng-init="checked=true" /><br/>
+ Show when checked:
+ <span ng-if="checked" class="animate-if">
+ This is removed when the checkbox is unchecked.
+ </span>
+ </file>
+ <file name="animations.css">
+ .animate-if {
+ background:white;
+ border:1px solid black;
+ padding:10px;
+ }
+
+ .animate-if.ng-enter, .animate-if.ng-leave {
+ -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
+ transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
+ }
+
+ .animate-if.ng-enter,
+ .animate-if.ng-leave.ng-leave-active {
+ opacity:0;
+ }
+
+ .animate-if.ng-leave,
+ .animate-if.ng-enter.ng-enter-active {
+ opacity:1;
+ }
+ </file>
+ </example>
+ */
+var ngIfDirective = ['$animate', function($animate) {
+ return {
+ multiElement: true,
+ transclude: 'element',
+ priority: 600,
+ terminal: true,
+ restrict: 'A',
+ $$tlb: true,
+ link: function($scope, $element, $attr, ctrl, $transclude) {
+ var block, childScope, previousElements;
+ $scope.$watch($attr.ngIf, function ngIfWatchAction(value) {
+
+ if (value) {
+ if (!childScope) {
+ $transclude(function(clone, newScope) {
+ childScope = newScope;
+ clone[clone.length++] = document.createComment(' end ngIf: ' + $attr.ngIf + ' ');
+ // Note: We only need the first/last node of the cloned nodes.
+ // However, we need to keep the reference to the jqlite wrapper as it might be changed later
+ // by a directive with templateUrl when its template arrives.
+ block = {
+ clone: clone
+ };
+ $animate.enter(clone, $element.parent(), $element);
+ });
+ }
+ } else {
+ if (previousElements) {
+ previousElements.remove();
+ previousElements = null;
+ }
+ if (childScope) {
+ childScope.$destroy();
+ childScope = null;
+ }
+ if (block) {
+ previousElements = getBlockNodes(block.clone);
+ $animate.leave(previousElements).then(function() {
+ previousElements = null;
+ });
+ block = null;
+ }
+ }
+ });
+ }
+ };
+}];
+
+/**
+ * @ngdoc directive
+ * @name ngInclude
+ * @restrict ECA
+ *
+ * @description
+ * Fetches, compiles and includes an external HTML fragment.
+ *
+ * By default, the template URL is restricted to the same domain and protocol as the
+ * application document. This is done by calling {@link $sce#getTrustedResourceUrl
+ * $sce.getTrustedResourceUrl} on it. To load templates from other domains or protocols
+ * you may either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist them} or
+ * {@link $sce#trustAsResourceUrl wrap them} as trusted values. Refer to Angular's {@link
+ * ng.$sce Strict Contextual Escaping}.
+ *
+ * In addition, the browser's
+ * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest)
+ * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/)
+ * policy may further restrict whether the template is successfully loaded.
+ * For example, `ngInclude` won't work for cross-domain requests on all browsers and for `file://`
+ * access on some browsers.
+ *
+ * @animations
+ * enter - animation is used to bring new content into the browser.
+ * leave - animation is used to animate existing content away.
+ *
+ * The enter and leave animation occur concurrently.
+ *
+ * @scope
+ * @priority 400
+ *
+ * @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant,
+ * make sure you wrap it in **single** quotes, e.g. `src="'myPartialTemplate.html'"`.
+ * @param {string=} onload Expression to evaluate when a new partial is loaded.
+ *
+ * @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll
+ * $anchorScroll} to scroll the viewport after the content is loaded.
+ *
+ * - If the attribute is not set, disable scrolling.
+ * - If the attribute is set without value, enable scrolling.
+ * - Otherwise enable scrolling only if the expression evaluates to truthy value.
+ *
+ * @example
+ <example module="includeExample" deps="angular-animate.js" animations="true">
+ <file name="index.html">
+ <div ng-controller="ExampleController">
+ <select ng-model="template" ng-options="t.name for t in templates">
+ <option value="">(blank)</option>
+ </select>
+ url of the template: <tt>{{template.url}}</tt>
+ <hr/>
+ <div class="slide-animate-container">
+ <div class="slide-animate" ng-include="template.url"></div>
+ </div>
+ </div>
+ </file>
+ <file name="script.js">
+ angular.module('includeExample', ['ngAnimate'])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.templates =
+ [ { name: 'template1.html', url: 'template1.html'},
+ { name: 'template2.html', url: 'template2.html'} ];
+ $scope.template = $scope.templates[0];
+ }]);
+ </file>
+ <file name="template1.html">
+ Content of template1.html
+ </file>
+ <file name="template2.html">
+ Content of template2.html
+ </file>
+ <file name="animations.css">
+ .slide-animate-container {
+ position:relative;
+ background:white;
+ border:1px solid black;
+ height:40px;
+ overflow:hidden;
+ }
+
+ .slide-animate {
+ padding:10px;
+ }
+
+ .slide-animate.ng-enter, .slide-animate.ng-leave {
+ -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
+ transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
+
+ position:absolute;
+ top:0;
+ left:0;
+ right:0;
+ bottom:0;
+ display:block;
+ padding:10px;
+ }
+
+ .slide-animate.ng-enter {
+ top:-50px;
+ }
+ .slide-animate.ng-enter.ng-enter-active {
+ top:0;
+ }
+
+ .slide-animate.ng-leave {
+ top:0;
+ }
+ .slide-animate.ng-leave.ng-leave-active {
+ top:50px;
+ }
+ </file>
+ <file name="protractor.js" type="protractor">
+ var templateSelect = element(by.model('template'));
+ var includeElem = element(by.css('[ng-include]'));
+
+ it('should load template1.html', function() {
+ expect(includeElem.getText()).toMatch(/Content of template1.html/);
+ });
+
+ it('should load template2.html', function() {
+ if (browser.params.browser == 'firefox') {
+ // Firefox can't handle using selects
+ // See https://github.com/angular/protractor/issues/480
+ return;
+ }
+ templateSelect.click();
+ templateSelect.all(by.css('option')).get(2).click();
+ expect(includeElem.getText()).toMatch(/Content of template2.html/);
+ });
+
+ it('should change to blank', function() {
+ if (browser.params.browser == 'firefox') {
+ // Firefox can't handle using selects
+ return;
+ }
+ templateSelect.click();
+ templateSelect.all(by.css('option')).get(0).click();
+ expect(includeElem.isPresent()).toBe(false);
+ });
+ </file>
+ </example>
+ */
+
+
+/**
+ * @ngdoc event
+ * @name ngInclude#$includeContentRequested
+ * @eventType emit on the scope ngInclude was declared in
+ * @description
+ * Emitted every time the ngInclude content is requested.
+ *
+ * @param {Object} angularEvent Synthetic event object.
+ * @param {String} src URL of content to load.
+ */
+
+
+/**
+ * @ngdoc event
+ * @name ngInclude#$includeContentLoaded
+ * @eventType emit on the current ngInclude scope
+ * @description
+ * Emitted every time the ngInclude content is reloaded.
+ *
+ * @param {Object} angularEvent Synthetic event object.
+ * @param {String} src URL of content to load.
+ */
+
+
+/**
+ * @ngdoc event
+ * @name ngInclude#$includeContentError
+ * @eventType emit on the scope ngInclude was declared in
+ * @description
+ * Emitted when a template HTTP request yields an erronous response (status < 200 || status > 299)
+ *
+ * @param {Object} angularEvent Synthetic event object.
+ * @param {String} src URL of content to load.
+ */
+var ngIncludeDirective = ['$templateRequest', '$anchorScroll', '$animate', '$sce',
+ function($templateRequest, $anchorScroll, $animate, $sce) {
+ return {
+ restrict: 'ECA',
+ priority: 400,
+ terminal: true,
+ transclude: 'element',
+ controller: angular.noop,
+ compile: function(element, attr) {
+ var srcExp = attr.ngInclude || attr.src,
+ onloadExp = attr.onload || '',
+ autoScrollExp = attr.autoscroll;
+
+ return function(scope, $element, $attr, ctrl, $transclude) {
+ var changeCounter = 0,
+ currentScope,
+ previousElement,
+ currentElement;
+
+ var cleanupLastIncludeContent = function() {
+ if (previousElement) {
+ previousElement.remove();
+ previousElement = null;
+ }
+ if (currentScope) {
+ currentScope.$destroy();
+ currentScope = null;
+ }
+ if (currentElement) {
+ $animate.leave(currentElement).then(function() {
+ previousElement = null;
+ });
+ previousElement = currentElement;
+ currentElement = null;
+ }
+ };
+
+ scope.$watch($sce.parseAsResourceUrl(srcExp), function ngIncludeWatchAction(src) {
+ var afterAnimation = function() {
+ if (isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) {
+ $anchorScroll();
+ }
+ };
+ var thisChangeId = ++changeCounter;
+
+ if (src) {
+ //set the 2nd param to true to ignore the template request error so that the inner
+ //contents and scope can be cleaned up.
+ $templateRequest(src, true).then(function(response) {
+ if (thisChangeId !== changeCounter) return;
+ var newScope = scope.$new();
+ ctrl.template = response;
+
+ // Note: This will also link all children of ng-include that were contained in the original
+ // html. If that content contains controllers, ... they could pollute/change the scope.
+ // However, using ng-include on an element with additional content does not make sense...
+ // Note: We can't remove them in the cloneAttchFn of $transclude as that
+ // function is called before linking the content, which would apply child
+ // directives to non existing elements.
+ var clone = $transclude(newScope, function(clone) {
+ cleanupLastIncludeContent();
+ $animate.enter(clone, null, $element).then(afterAnimation);
+ });
+
+ currentScope = newScope;
+ currentElement = clone;
+
+ currentScope.$emit('$includeContentLoaded', src);
+ scope.$eval(onloadExp);
+ }, function() {
+ if (thisChangeId === changeCounter) {
+ cleanupLastIncludeContent();
+ scope.$emit('$includeContentError', src);
+ }
+ });
+ scope.$emit('$includeContentRequested', src);
+ } else {
+ cleanupLastIncludeContent();
+ ctrl.template = null;
+ }
+ });
+ };
+ }
+ };
+}];
+
+// This directive is called during the $transclude call of the first `ngInclude` directive.
+// It will replace and compile the content of the element with the loaded template.
+// We need this directive so that the element content is already filled when
+// the link function of another directive on the same element as ngInclude
+// is called.
+var ngIncludeFillContentDirective = ['$compile',
+ function($compile) {
+ return {
+ restrict: 'ECA',
+ priority: -400,
+ require: 'ngInclude',
+ link: function(scope, $element, $attr, ctrl) {
+ if (/SVG/.test($element[0].toString())) {
+ // WebKit: https://bugs.webkit.org/show_bug.cgi?id=135698 --- SVG elements do not
+ // support innerHTML, so detect this here and try to generate the contents
+ // specially.
+ $element.empty();
+ $compile(jqLiteBuildFragment(ctrl.template, document).childNodes)(scope,
+ function namespaceAdaptedClone(clone) {
+ $element.append(clone);
+ }, {futureParentElement: $element});
+ return;
+ }
+
+ $element.html(ctrl.template);
+ $compile($element.contents())(scope);
+ }
+ };
+ }];
+
+/**
+ * @ngdoc directive
+ * @name ngInit
+ * @restrict AC
+ *
+ * @description
+ * The `ngInit` directive allows you to evaluate an expression in the
+ * current scope.
+ *
+ * <div class="alert alert-error">
+ * The only appropriate use of `ngInit` is for aliasing special properties of
+ * {@link ng.directive:ngRepeat `ngRepeat`}, as seen in the demo below. Besides this case, you
+ * should use {@link guide/controller controllers} rather than `ngInit`
+ * to initialize values on a scope.
+ * </div>
+ * <div class="alert alert-warning">
+ * **Note**: If you have assignment in `ngInit` along with {@link ng.$filter `$filter`}, make
+ * sure you have parenthesis for correct precedence:
+ * <pre class="prettyprint">
+ * <div ng-init="test1 = (data | orderBy:'name')"></div>
+ * </pre>
+ * </div>
+ *
+ * @priority 450
+ *
+ * @element ANY
+ * @param {expression} ngInit {@link guide/expression Expression} to eval.
+ *
+ * @example
+ <example module="initExample">
+ <file name="index.html">
+ <script>
+ angular.module('initExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.list = [['a', 'b'], ['c', 'd']];
+ }]);
+ </script>
+ <div ng-controller="ExampleController">
+ <div ng-repeat="innerList in list" ng-init="outerIndex = $index">
+ <div ng-repeat="value in innerList" ng-init="innerIndex = $index">
+ <span class="example-init">list[ {{outerIndex}} ][ {{innerIndex}} ] = {{value}};</span>
+ </div>
+ </div>
+ </div>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should alias index positions', function() {
+ var elements = element.all(by.css('.example-init'));
+ expect(elements.get(0).getText()).toBe('list[ 0 ][ 0 ] = a;');
+ expect(elements.get(1).getText()).toBe('list[ 0 ][ 1 ] = b;');
+ expect(elements.get(2).getText()).toBe('list[ 1 ][ 0 ] = c;');
+ expect(elements.get(3).getText()).toBe('list[ 1 ][ 1 ] = d;');
+ });
+ </file>
+ </example>
+ */
+var ngInitDirective = ngDirective({
+ priority: 450,
+ compile: function() {
+ return {
+ pre: function(scope, element, attrs) {
+ scope.$eval(attrs.ngInit);
+ }
+ };
+ }
+});
+
+/**
+ * @ngdoc directive
+ * @name ngNonBindable
+ * @restrict AC
+ * @priority 1000
+ *
+ * @description
+ * The `ngNonBindable` directive tells Angular not to compile or bind the contents of the current
+ * DOM element. This is useful if the element contains what appears to be Angular directives and
+ * bindings but which should be ignored by Angular. This could be the case if you have a site that
+ * displays snippets of code, for instance.
+ *
+ * @element ANY
+ *
+ * @example
+ * In this example there are two locations where a simple interpolation binding (`{{}}`) is present,
+ * but the one wrapped in `ngNonBindable` is left alone.
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <div>Normal: {{1 + 2}}</div>
+ <div ng-non-bindable>Ignored: {{1 + 2}}</div>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should check ng-non-bindable', function() {
+ expect(element(by.binding('1 + 2')).getText()).toContain('3');
+ expect(element.all(by.css('div')).last().getText()).toMatch(/1 \+ 2/);
+ });
+ </file>
+ </example>
+ */
+var ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });
+
+/**
+ * @ngdoc directive
+ * @name ngPluralize
+ * @restrict EA
+ *
+ * @description
+ * `ngPluralize` is a directive that displays messages according to en-US localization rules.
+ * These rules are bundled with angular.js, but can be overridden
+ * (see {@link guide/i18n Angular i18n} dev guide). You configure ngPluralize directive
+ * by specifying the mappings between
+ * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)
+ * and the strings to be displayed.
+ *
+ * # Plural categories and explicit number rules
+ * There are two
+ * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)
+ * in Angular's default en-US locale: "one" and "other".
+ *
+ * While a plural category may match many numbers (for example, in en-US locale, "other" can match
+ * any number that is not 1), an explicit number rule can only match one number. For example, the
+ * explicit number rule for "3" matches the number 3. There are examples of plural categories
+ * and explicit number rules throughout the rest of this documentation.
+ *
+ * # Configuring ngPluralize
+ * You configure ngPluralize by providing 2 attributes: `count` and `when`.
+ * You can also provide an optional attribute, `offset`.
+ *
+ * The value of the `count` attribute can be either a string or an {@link guide/expression
+ * Angular expression}; these are evaluated on the current scope for its bound value.
+ *
+ * The `when` attribute specifies the mappings between plural categories and the actual
+ * string to be displayed. The value of the attribute should be a JSON object.
+ *
+ * The following example shows how to configure ngPluralize:
+ *
+ * ```html
+ * <ng-pluralize count="personCount"
+ when="{'0': 'Nobody is viewing.',
+ * 'one': '1 person is viewing.',
+ * 'other': '{} people are viewing.'}">
+ * </ng-pluralize>
+ *```
+ *
+ * In the example, `"0: Nobody is viewing."` is an explicit number rule. If you did not
+ * specify this rule, 0 would be matched to the "other" category and "0 people are viewing"
+ * would be shown instead of "Nobody is viewing". You can specify an explicit number rule for
+ * other numbers, for example 12, so that instead of showing "12 people are viewing", you can
+ * show "a dozen people are viewing".
+ *
+ * You can use a set of closed braces (`{}`) as a placeholder for the number that you want substituted
+ * into pluralized strings. In the previous example, Angular will replace `{}` with
+ * <span ng-non-bindable>`{{personCount}}`</span>. The closed braces `{}` is a placeholder
+ * for <span ng-non-bindable>{{numberExpression}}</span>.
+ *
+ * # Configuring ngPluralize with offset
+ * The `offset` attribute allows further customization of pluralized text, which can result in
+ * a better user experience. For example, instead of the message "4 people are viewing this document",
+ * you might display "John, Kate and 2 others are viewing this document".
+ * The offset attribute allows you to offset a number by any desired value.
+ * Let's take a look at an example:
+ *
+ * ```html
+ * <ng-pluralize count="personCount" offset=2
+ * when="{'0': 'Nobody is viewing.',
+ * '1': '{{person1}} is viewing.',
+ * '2': '{{person1}} and {{person2}} are viewing.',
+ * 'one': '{{person1}}, {{person2}} and one other person are viewing.',
+ * 'other': '{{person1}}, {{person2}} and {} other people are viewing.'}">
+ * </ng-pluralize>
+ * ```
+ *
+ * Notice that we are still using two plural categories(one, other), but we added
+ * three explicit number rules 0, 1 and 2.
+ * When one person, perhaps John, views the document, "John is viewing" will be shown.
+ * When three people view the document, no explicit number rule is found, so
+ * an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category.
+ * In this case, plural category 'one' is matched and "John, Mary and one other person are viewing"
+ * is shown.
+ *
+ * Note that when you specify offsets, you must provide explicit number rules for
+ * numbers from 0 up to and including the offset. If you use an offset of 3, for example,
+ * you must provide explicit number rules for 0, 1, 2 and 3. You must also provide plural strings for
+ * plural categories "one" and "other".
+ *
+ * @param {string|expression} count The variable to be bound to.
+ * @param {string} when The mapping between plural category to its corresponding strings.
+ * @param {number=} offset Offset to deduct from the total number.
+ *
+ * @example
+ <example module="pluralizeExample">
+ <file name="index.html">
+ <script>
+ angular.module('pluralizeExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.person1 = 'Igor';
+ $scope.person2 = 'Misko';
+ $scope.personCount = 1;
+ }]);
+ </script>
+ <div ng-controller="ExampleController">
+ Person 1:<input type="text" ng-model="person1" value="Igor" /><br/>
+ Person 2:<input type="text" ng-model="person2" value="Misko" /><br/>
+ Number of People:<input type="text" ng-model="personCount" value="1" /><br/>
+
+ <!--- Example with simple pluralization rules for en locale --->
+ Without Offset:
+ <ng-pluralize count="personCount"
+ when="{'0': 'Nobody is viewing.',
+ 'one': '1 person is viewing.',
+ 'other': '{} people are viewing.'}">
+ </ng-pluralize><br>
+
+ <!--- Example with offset --->
+ With Offset(2):
+ <ng-pluralize count="personCount" offset=2
+ when="{'0': 'Nobody is viewing.',
+ '1': '{{person1}} is viewing.',
+ '2': '{{person1}} and {{person2}} are viewing.',
+ 'one': '{{person1}}, {{person2}} and one other person are viewing.',
+ 'other': '{{person1}}, {{person2}} and {} other people are viewing.'}">
+ </ng-pluralize>
+ </div>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should show correct pluralized string', function() {
+ var withoutOffset = element.all(by.css('ng-pluralize')).get(0);
+ var withOffset = element.all(by.css('ng-pluralize')).get(1);
+ var countInput = element(by.model('personCount'));
+
+ expect(withoutOffset.getText()).toEqual('1 person is viewing.');
+ expect(withOffset.getText()).toEqual('Igor is viewing.');
+
+ countInput.clear();
+ countInput.sendKeys('0');
+
+ expect(withoutOffset.getText()).toEqual('Nobody is viewing.');
+ expect(withOffset.getText()).toEqual('Nobody is viewing.');
+
+ countInput.clear();
+ countInput.sendKeys('2');
+
+ expect(withoutOffset.getText()).toEqual('2 people are viewing.');
+ expect(withOffset.getText()).toEqual('Igor and Misko are viewing.');
+
+ countInput.clear();
+ countInput.sendKeys('3');
+
+ expect(withoutOffset.getText()).toEqual('3 people are viewing.');
+ expect(withOffset.getText()).toEqual('Igor, Misko and one other person are viewing.');
+
+ countInput.clear();
+ countInput.sendKeys('4');
+
+ expect(withoutOffset.getText()).toEqual('4 people are viewing.');
+ expect(withOffset.getText()).toEqual('Igor, Misko and 2 other people are viewing.');
+ });
+ it('should show data-bound names', function() {
+ var withOffset = element.all(by.css('ng-pluralize')).get(1);
+ var personCount = element(by.model('personCount'));
+ var person1 = element(by.model('person1'));
+ var person2 = element(by.model('person2'));
+ personCount.clear();
+ personCount.sendKeys('4');
+ person1.clear();
+ person1.sendKeys('Di');
+ person2.clear();
+ person2.sendKeys('Vojta');
+ expect(withOffset.getText()).toEqual('Di, Vojta and 2 other people are viewing.');
+ });
+ </file>
+ </example>
+ */
+var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interpolate) {
+ var BRACE = /{}/g,
+ IS_WHEN = /^when(Minus)?(.+)$/;
+
+ return {
+ restrict: 'EA',
+ link: function(scope, element, attr) {
+ var numberExp = attr.count,
+ whenExp = attr.$attr.when && element.attr(attr.$attr.when), // we have {{}} in attrs
+ offset = attr.offset || 0,
+ whens = scope.$eval(whenExp) || {},
+ whensExpFns = {},
+ startSymbol = $interpolate.startSymbol(),
+ endSymbol = $interpolate.endSymbol(),
+ braceReplacement = startSymbol + numberExp + '-' + offset + endSymbol,
+ watchRemover = angular.noop,
+ lastCount;
+
+ forEach(attr, function(expression, attributeName) {
+ var tmpMatch = IS_WHEN.exec(attributeName);
+ if (tmpMatch) {
+ var whenKey = (tmpMatch[1] ? '-' : '') + lowercase(tmpMatch[2]);
+ whens[whenKey] = element.attr(attr.$attr[attributeName]);
+ }
+ });
+ forEach(whens, function(expression, key) {
+ whensExpFns[key] = $interpolate(expression.replace(BRACE, braceReplacement));
+
+ });
+
+ scope.$watch(numberExp, function ngPluralizeWatchAction(newVal) {
+ var count = parseFloat(newVal);
+ var countIsNaN = isNaN(count);
+
+ if (!countIsNaN && !(count in whens)) {
+ // If an explicit number rule such as 1, 2, 3... is defined, just use it.
+ // Otherwise, check it against pluralization rules in $locale service.
+ count = $locale.pluralCat(count - offset);
+ }
+
+ // If both `count` and `lastCount` are NaN, we don't need to re-register a watch.
+ // In JS `NaN !== NaN`, so we have to exlicitly check.
+ if ((count !== lastCount) && !(countIsNaN && isNaN(lastCount))) {
+ watchRemover();
+ watchRemover = scope.$watch(whensExpFns[count], updateElementText);
+ lastCount = count;
+ }
+ });
+
+ function updateElementText(newText) {
+ element.text(newText || '');
+ }
+ }
+ };
+}];
+
+/**
+ * @ngdoc directive
+ * @name ngRepeat
+ *
+ * @description
+ * The `ngRepeat` directive instantiates a template once per item from a collection. Each template
+ * instance gets its own scope, where the given loop variable is set to the current collection item,
+ * and `$index` is set to the item index or key.
+ *
+ * Special properties are exposed on the local scope of each template instance, including:
+ *
+ * | Variable | Type | Details |
+ * |-----------|-----------------|-----------------------------------------------------------------------------|
+ * | `$index` | {@type number} | iterator offset of the repeated element (0..length-1) |
+ * | `$first` | {@type boolean} | true if the repeated element is first in the iterator. |
+ * | `$middle` | {@type boolean} | true if the repeated element is between the first and last in the iterator. |
+ * | `$last` | {@type boolean} | true if the repeated element is last in the iterator. |
+ * | `$even` | {@type boolean} | true if the iterator position `$index` is even (otherwise false). |
+ * | `$odd` | {@type boolean} | true if the iterator position `$index` is odd (otherwise false). |
+ *
+ * Creating aliases for these properties is possible with {@link ng.directive:ngInit `ngInit`}.
+ * This may be useful when, for instance, nesting ngRepeats.
+ *
+ * # Special repeat start and end points
+ * To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending
+ * the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively.
+ * The **ng-repeat-start** directive works the same as **ng-repeat**, but will repeat all the HTML code (including the tag it's defined on)
+ * up to and including the ending HTML tag where **ng-repeat-end** is placed.
+ *
+ * The example below makes use of this feature:
+ * ```html
+ * <header ng-repeat-start="item in items">
+ * Header {{ item }}
+ * </header>
+ * <div class="body">
+ * Body {{ item }}
+ * </div>
+ * <footer ng-repeat-end>
+ * Footer {{ item }}
+ * </footer>
+ * ```
+ *
+ * And with an input of {@type ['A','B']} for the items variable in the example above, the output will evaluate to:
+ * ```html
+ * <header>
+ * Header A
+ * </header>
+ * <div class="body">
+ * Body A
+ * </div>
+ * <footer>
+ * Footer A
+ * </footer>
+ * <header>
+ * Header B
+ * </header>
+ * <div class="body">
+ * Body B
+ * </div>
+ * <footer>
+ * Footer B
+ * </footer>
+ * ```
+ *
+ * The custom start and end points for ngRepeat also support all other HTML directive syntax flavors provided in AngularJS (such
+ * as **data-ng-repeat-start**, **x-ng-repeat-start** and **ng:repeat-start**).
+ *
+ * @animations
+ * **.enter** - when a new item is added to the list or when an item is revealed after a filter
+ *
+ * **.leave** - when an item is removed from the list or when an item is filtered out
+ *
+ * **.move** - when an adjacent item is filtered out causing a reorder or when the item contents are reordered
+ *
+ * @element ANY
+ * @scope
+ * @priority 1000
+ * @param {repeat_expression} ngRepeat The expression indicating how to enumerate a collection. These
+ * formats are currently supported:
+ *
+ * * `variable in expression` – where variable is the user defined loop variable and `expression`
+ * is a scope expression giving the collection to enumerate.
+ *
+ * For example: `album in artist.albums`.
+ *
+ * * `(key, value) in expression` – where `key` and `value` can be any user defined identifiers,
+ * and `expression` is the scope expression giving the collection to enumerate.
+ *
+ * For example: `(name, age) in {'adam':10, 'amalie':12}`.
+ *
+ * * `variable in expression track by tracking_expression` – You can also provide an optional tracking function
+ * which can be used to associate the objects in the collection with the DOM elements. If no tracking function
+ * is specified the ng-repeat associates elements by identity in the collection. It is an error to have
+ * more than one tracking function to resolve to the same key. (This would mean that two distinct objects are
+ * mapped to the same DOM element, which is not possible.) Filters should be applied to the expression,
+ * before specifying a tracking expression.
+ *
+ * For example: `item in items` is equivalent to `item in items track by $id(item)`. This implies that the DOM elements
+ * will be associated by item identity in the array.
+ *
+ * For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique
+ * `$$hashKey` property to each item in the array. This property is then used as a key to associated DOM elements
+ * with the corresponding item in the array by identity. Moving the same object in array would move the DOM
+ * element in the same way in the DOM.
+ *
+ * For example: `item in items track by item.id` is a typical pattern when the items come from the database. In this
+ * case the object identity does not matter. Two objects are considered equivalent as long as their `id`
+ * property is same.
+ *
+ * For example: `item in items | filter:searchText track by item.id` is a pattern that might be used to apply a filter
+ * to items in conjunction with a tracking expression.
+ *
+ * * `variable in expression as alias_expression` – You can also provide an optional alias expression which will then store the
+ * intermediate results of the repeater after the filters have been applied. Typically this is used to render a special message
+ * when a filter is active on the repeater, but the filtered result set is empty.
+ *
+ * For example: `item in items | filter:x as results` will store the fragment of the repeated items as `results`, but only after
+ * the items have been processed through the filter.
+ *
+ * @example
+ * This example initializes the scope to a list of names and
+ * then uses `ngRepeat` to display every person:
+ <example module="ngAnimate" deps="angular-animate.js" animations="true">
+ <file name="index.html">
+ <div ng-init="friends = [
+ {name:'John', age:25, gender:'boy'},
+ {name:'Jessie', age:30, gender:'girl'},
+ {name:'Johanna', age:28, gender:'girl'},
+ {name:'Joy', age:15, gender:'girl'},
+ {name:'Mary', age:28, gender:'girl'},
+ {name:'Peter', age:95, gender:'boy'},
+ {name:'Sebastian', age:50, gender:'boy'},
+ {name:'Erika', age:27, gender:'girl'},
+ {name:'Patrick', age:40, gender:'boy'},
+ {name:'Samantha', age:60, gender:'girl'}
+ ]">
+ I have {{friends.length}} friends. They are:
+ <input type="search" ng-model="q" placeholder="filter friends..." />
+ <ul class="example-animate-container">
+ <li class="animate-repeat" ng-repeat="friend in friends | filter:q as results">
+ [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.
+ </li>
+ <li class="animate-repeat" ng-if="results.length == 0">
+ <strong>No results found...</strong>
+ </li>
+ </ul>
+ </div>
+ </file>
+ <file name="animations.css">
+ .example-animate-container {
+ background:white;
+ border:1px solid black;
+ list-style:none;
+ margin:0;
+ padding:0 10px;
+ }
+
+ .animate-repeat {
+ line-height:40px;
+ list-style:none;
+ box-sizing:border-box;
+ }
+
+ .animate-repeat.ng-move,
+ .animate-repeat.ng-enter,
+ .animate-repeat.ng-leave {
+ -webkit-transition:all linear 0.5s;
+ transition:all linear 0.5s;
+ }
+
+ .animate-repeat.ng-leave.ng-leave-active,
+ .animate-repeat.ng-move,
+ .animate-repeat.ng-enter {
+ opacity:0;
+ max-height:0;
+ }
+
+ .animate-repeat.ng-leave,
+ .animate-repeat.ng-move.ng-move-active,
+ .animate-repeat.ng-enter.ng-enter-active {
+ opacity:1;
+ max-height:40px;
+ }
+ </file>
+ <file name="protractor.js" type="protractor">
+ var friends = element.all(by.repeater('friend in friends'));
+
+ it('should render initial data set', function() {
+ expect(friends.count()).toBe(10);
+ expect(friends.get(0).getText()).toEqual('[1] John who is 25 years old.');
+ expect(friends.get(1).getText()).toEqual('[2] Jessie who is 30 years old.');
+ expect(friends.last().getText()).toEqual('[10] Samantha who is 60 years old.');
+ expect(element(by.binding('friends.length')).getText())
+ .toMatch("I have 10 friends. They are:");
+ });
+
+ it('should update repeater when filter predicate changes', function() {
+ expect(friends.count()).toBe(10);
+
+ element(by.model('q')).sendKeys('ma');
+
+ expect(friends.count()).toBe(2);
+ expect(friends.get(0).getText()).toEqual('[1] Mary who is 28 years old.');
+ expect(friends.last().getText()).toEqual('[2] Samantha who is 60 years old.');
+ });
+ </file>
+ </example>
+ */
+var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
+ var NG_REMOVED = '$$NG_REMOVED';
+ var ngRepeatMinErr = minErr('ngRepeat');
+
+ var updateScope = function(scope, index, valueIdentifier, value, keyIdentifier, key, arrayLength) {
+ // TODO(perf): generate setters to shave off ~40ms or 1-1.5%
+ scope[valueIdentifier] = value;
+ if (keyIdentifier) scope[keyIdentifier] = key;
+ scope.$index = index;
+ scope.$first = (index === 0);
+ scope.$last = (index === (arrayLength - 1));
+ scope.$middle = !(scope.$first || scope.$last);
+ // jshint bitwise: false
+ scope.$odd = !(scope.$even = (index&1) === 0);
+ // jshint bitwise: true
+ };
+
+ var getBlockStart = function(block) {
+ return block.clone[0];
+ };
+
+ var getBlockEnd = function(block) {
+ return block.clone[block.clone.length - 1];
+ };
+
+
+ return {
+ restrict: 'A',
+ multiElement: true,
+ transclude: 'element',
+ priority: 1000,
+ terminal: true,
+ $$tlb: true,
+ compile: function ngRepeatCompile($element, $attr) {
+ var expression = $attr.ngRepeat;
+ var ngRepeatEndComment = document.createComment(' end ngRepeat: ' + expression + ' ');
+
+ var match = expression.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);
+
+ if (!match) {
+ throw ngRepeatMinErr('iexp', "Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.",
+ expression);
+ }
+
+ var lhs = match[1];
+ var rhs = match[2];
+ var aliasAs = match[3];
+ var trackByExp = match[4];
+
+ match = lhs.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);
+
+ if (!match) {
+ throw ngRepeatMinErr('iidexp', "'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.",
+ lhs);
+ }
+ var valueIdentifier = match[3] || match[1];
+ var keyIdentifier = match[2];
+
+ if (aliasAs && (!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(aliasAs) ||
+ /^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent)$/.test(aliasAs))) {
+ throw ngRepeatMinErr('badident', "alias '{0}' is invalid --- must be a valid JS identifier which is not a reserved name.",
+ aliasAs);
+ }
+
+ var trackByExpGetter, trackByIdExpFn, trackByIdArrayFn, trackByIdObjFn;
+ var hashFnLocals = {$id: hashKey};
+
+ if (trackByExp) {
+ trackByExpGetter = $parse(trackByExp);
+ } else {
+ trackByIdArrayFn = function(key, value) {
+ return hashKey(value);
+ };
+ trackByIdObjFn = function(key) {
+ return key;
+ };
+ }
+
+ return function ngRepeatLink($scope, $element, $attr, ctrl, $transclude) {
+
+ if (trackByExpGetter) {
+ trackByIdExpFn = function(key, value, index) {
+ // assign key, value, and $index to the locals so that they can be used in hash functions
+ if (keyIdentifier) hashFnLocals[keyIdentifier] = key;
+ hashFnLocals[valueIdentifier] = value;
+ hashFnLocals.$index = index;
+ return trackByExpGetter($scope, hashFnLocals);
+ };
+ }
+
+ // Store a list of elements from previous run. This is a hash where key is the item from the
+ // iterator, and the value is objects with following properties.
+ // - scope: bound scope
+ // - element: previous element.
+ // - index: position
+ //
+ // We are using no-proto object so that we don't need to guard against inherited props via
+ // hasOwnProperty.
+ var lastBlockMap = createMap();
+
+ //watch props
+ $scope.$watchCollection(rhs, function ngRepeatAction(collection) {
+ var index, length,
+ previousNode = $element[0], // node that cloned nodes should be inserted after
+ // initialized to the comment node anchor
+ nextNode,
+ // Same as lastBlockMap but it has the current state. It will become the
+ // lastBlockMap on the next iteration.
+ nextBlockMap = createMap(),
+ collectionLength,
+ key, value, // key/value of iteration
+ trackById,
+ trackByIdFn,
+ collectionKeys,
+ block, // last object information {scope, element, id}
+ nextBlockOrder,
+ elementsToRemove;
+
+ if (aliasAs) {
+ $scope[aliasAs] = collection;
+ }
+
+ if (isArrayLike(collection)) {
+ collectionKeys = collection;
+ trackByIdFn = trackByIdExpFn || trackByIdArrayFn;
+ } else {
+ trackByIdFn = trackByIdExpFn || trackByIdObjFn;
+ // if object, extract keys, sort them and use to determine order of iteration over obj props
+ collectionKeys = [];
+ for (var itemKey in collection) {
+ if (collection.hasOwnProperty(itemKey) && itemKey.charAt(0) != '$') {
+ collectionKeys.push(itemKey);
+ }
+ }
+ collectionKeys.sort();
+ }
+
+ collectionLength = collectionKeys.length;
+ nextBlockOrder = new Array(collectionLength);
+
+ // locate existing items
+ for (index = 0; index < collectionLength; index++) {
+ key = (collection === collectionKeys) ? index : collectionKeys[index];
+ value = collection[key];
+ trackById = trackByIdFn(key, value, index);
+ if (lastBlockMap[trackById]) {
+ // found previously seen block
+ block = lastBlockMap[trackById];
+ delete lastBlockMap[trackById];
+ nextBlockMap[trackById] = block;
+ nextBlockOrder[index] = block;
+ } else if (nextBlockMap[trackById]) {
+ // if collision detected. restore lastBlockMap and throw an error
+ forEach(nextBlockOrder, function(block) {
+ if (block && block.scope) lastBlockMap[block.id] = block;
+ });
+ throw ngRepeatMinErr('dupes',
+ "Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}, Duplicate value: {2}",
+ expression, trackById, value);
+ } else {
+ // new never before seen block
+ nextBlockOrder[index] = {id: trackById, scope: undefined, clone: undefined};
+ nextBlockMap[trackById] = true;
+ }
+ }
+
+ // remove leftover items
+ for (var blockKey in lastBlockMap) {
+ block = lastBlockMap[blockKey];
+ elementsToRemove = getBlockNodes(block.clone);
+ $animate.leave(elementsToRemove);
+ if (elementsToRemove[0].parentNode) {
+ // if the element was not removed yet because of pending animation, mark it as deleted
+ // so that we can ignore it later
+ for (index = 0, length = elementsToRemove.length; index < length; index++) {
+ elementsToRemove[index][NG_REMOVED] = true;
+ }
+ }
+ block.scope.$destroy();
+ }
+
+ // we are not using forEach for perf reasons (trying to avoid #call)
+ for (index = 0; index < collectionLength; index++) {
+ key = (collection === collectionKeys) ? index : collectionKeys[index];
+ value = collection[key];
+ block = nextBlockOrder[index];
+
+ if (block.scope) {
+ // if we have already seen this object, then we need to reuse the
+ // associated scope/element
+
+ nextNode = previousNode;
+
+ // skip nodes that are already pending removal via leave animation
+ do {
+ nextNode = nextNode.nextSibling;
+ } while (nextNode && nextNode[NG_REMOVED]);
+
+ if (getBlockStart(block) != nextNode) {
+ // existing item which got moved
+ $animate.move(getBlockNodes(block.clone), null, jqLite(previousNode));
+ }
+ previousNode = getBlockEnd(block);
+ updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength);
+ } else {
+ // new item which we don't know about
+ $transclude(function ngRepeatTransclude(clone, scope) {
+ block.scope = scope;
+ // http://jsperf.com/clone-vs-createcomment
+ var endNode = ngRepeatEndComment.cloneNode(false);
+ clone[clone.length++] = endNode;
+
+ // TODO(perf): support naked previousNode in `enter` to avoid creation of jqLite wrapper?
+ $animate.enter(clone, null, jqLite(previousNode));
+ previousNode = endNode;
+ // Note: We only need the first/last node of the cloned nodes.
+ // However, we need to keep the reference to the jqlite wrapper as it might be changed later
+ // by a directive with templateUrl when its template arrives.
+ block.clone = clone;
+ nextBlockMap[block.id] = block;
+ updateScope(block.scope, index, valueIdentifier, value, keyIdentifier, key, collectionLength);
+ });
+ }
+ }
+ lastBlockMap = nextBlockMap;
+ });
+ };
+ }
+ };
+}];
+
+var NG_HIDE_CLASS = 'ng-hide';
+var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';
+/**
+ * @ngdoc directive
+ * @name ngShow
+ *
+ * @description
+ * The `ngShow` directive shows or hides the given HTML element based on the expression
+ * provided to the `ngShow` attribute. The element is shown or hidden by removing or adding
+ * the `.ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined
+ * in AngularJS and sets the display style to none (using an !important flag).
+ * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).
+ *
+ * ```html
+ * <!-- when $scope.myValue is truthy (element is visible) -->
+ * <div ng-show="myValue"></div>
+ *
+ * <!-- when $scope.myValue is falsy (element is hidden) -->
+ * <div ng-show="myValue" class="ng-hide"></div>
+ * ```
+ *
+ * When the `ngShow` expression evaluates to a falsy value then the `.ng-hide` CSS class is added to the class
+ * attribute on the element causing it to become hidden. When truthy, the `.ng-hide` CSS class is removed
+ * from the element causing the element not to appear hidden.
+ *
+ * ## Why is !important used?
+ *
+ * You may be wondering why !important is used for the `.ng-hide` CSS class. This is because the `.ng-hide` selector
+ * can be easily overridden by heavier selectors. For example, something as simple
+ * as changing the display style on a HTML list item would make hidden elements appear visible.
+ * This also becomes a bigger issue when dealing with CSS frameworks.
+ *
+ * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector
+ * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the
+ * styling to change how to hide an element then it is just a matter of using !important in their own CSS code.
+ *
+ * ### Overriding `.ng-hide`
+ *
+ * By default, the `.ng-hide` class will style the element with `display: none!important`. If you wish to change
+ * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide`
+ * class in CSS:
+ *
+ * ```css
+ * .ng-hide {
+ * /&#42; this is just another form of hiding an element &#42;/
+ * display: block!important;
+ * position: absolute;
+ * top: -9999px;
+ * left: -9999px;
+ * }
+ * ```
+ *
+ * By default you don't need to override in CSS anything and the animations will work around the display style.
+ *
+ * ## A note about animations with `ngShow`
+ *
+ * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression
+ * is true and false. This system works like the animation system present with ngClass except that
+ * you must also include the !important flag to override the display property
+ * so that you can perform an animation when the element is hidden during the time of the animation.
+ *
+ * ```css
+ * //
+ * //a working example can be found at the bottom of this page
+ * //
+ * .my-element.ng-hide-add, .my-element.ng-hide-remove {
+ * /&#42; this is required as of 1.3x to properly
+ * apply all styling in a show/hide animation &#42;/
+ * transition: 0s linear all;
+ * }
+ *
+ * .my-element.ng-hide-add-active,
+ * .my-element.ng-hide-remove-active {
+ * /&#42; the transition is defined in the active class &#42;/
+ * transition: 1s linear all;
+ * }
+ *
+ * .my-element.ng-hide-add { ... }
+ * .my-element.ng-hide-add.ng-hide-add-active { ... }
+ * .my-element.ng-hide-remove { ... }
+ * .my-element.ng-hide-remove.ng-hide-remove-active { ... }
+ * ```
+ *
+ * Keep in mind that, as of AngularJS version 1.3.0-beta.11, there is no need to change the display
+ * property to block during animation states--ngAnimate will handle the style toggling automatically for you.
+ *
+ * @animations
+ * addClass: `.ng-hide` - happens after the `ngShow` expression evaluates to a truthy value and the just before contents are set to visible
+ * removeClass: `.ng-hide` - happens after the `ngShow` expression evaluates to a non truthy value and just before the contents are set to hidden
+ *
+ * @element ANY
+ * @param {expression} ngShow If the {@link guide/expression expression} is truthy
+ * then the element is shown or hidden respectively.
+ *
+ * @example
+ <example module="ngAnimate" deps="angular-animate.js" animations="true">
+ <file name="index.html">
+ Click me: <input type="checkbox" ng-model="checked"><br/>
+ <div>
+ Show:
+ <div class="check-element animate-show" ng-show="checked">
+ <span class="glyphicon glyphicon-thumbs-up"></span> I show up when your checkbox is checked.
+ </div>
+ </div>
+ <div>
+ Hide:
+ <div class="check-element animate-show" ng-hide="checked">
+ <span class="glyphicon glyphicon-thumbs-down"></span> I hide when your checkbox is checked.
+ </div>
+ </div>
+ </file>
+ <file name="glyphicons.css">
+ @import url(../../components/bootstrap-3.1.1/css/bootstrap.css);
+ </file>
+ <file name="animations.css">
+ .animate-show {
+ line-height: 20px;
+ opacity: 1;
+ padding: 10px;
+ border: 1px solid black;
+ background: white;
+ }
+
+ .animate-show.ng-hide-add.ng-hide-add-active,
+ .animate-show.ng-hide-remove.ng-hide-remove-active {
+ -webkit-transition: all linear 0.5s;
+ transition: all linear 0.5s;
+ }
+
+ .animate-show.ng-hide {
+ line-height: 0;
+ opacity: 0;
+ padding: 0 10px;
+ }
+
+ .check-element {
+ padding: 10px;
+ border: 1px solid black;
+ background: white;
+ }
+ </file>
+ <file name="protractor.js" type="protractor">
+ var thumbsUp = element(by.css('span.glyphicon-thumbs-up'));
+ var thumbsDown = element(by.css('span.glyphicon-thumbs-down'));
+
+ it('should check ng-show / ng-hide', function() {
+ expect(thumbsUp.isDisplayed()).toBeFalsy();
+ expect(thumbsDown.isDisplayed()).toBeTruthy();
+
+ element(by.model('checked')).click();
+
+ expect(thumbsUp.isDisplayed()).toBeTruthy();
+ expect(thumbsDown.isDisplayed()).toBeFalsy();
+ });
+ </file>
+ </example>
+ */
+var ngShowDirective = ['$animate', function($animate) {
+ return {
+ restrict: 'A',
+ multiElement: true,
+ link: function(scope, element, attr) {
+ scope.$watch(attr.ngShow, function ngShowWatchAction(value) {
+ // we're adding a temporary, animation-specific class for ng-hide since this way
+ // we can control when the element is actually displayed on screen without having
+ // to have a global/greedy CSS selector that breaks when other animations are run.
+ // Read: https://github.com/angular/angular.js/issues/9103#issuecomment-58335845
+ $animate[value ? 'removeClass' : 'addClass'](element, NG_HIDE_CLASS, {
+ tempClasses: NG_HIDE_IN_PROGRESS_CLASS
+ });
+ });
+ }
+ };
+}];
+
+
+/**
+ * @ngdoc directive
+ * @name ngHide
+ *
+ * @description
+ * The `ngHide` directive shows or hides the given HTML element based on the expression
+ * provided to the `ngHide` attribute. The element is shown or hidden by removing or adding
+ * the `ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined
+ * in AngularJS and sets the display style to none (using an !important flag).
+ * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).
+ *
+ * ```html
+ * <!-- when $scope.myValue is truthy (element is hidden) -->
+ * <div ng-hide="myValue" class="ng-hide"></div>
+ *
+ * <!-- when $scope.myValue is falsy (element is visible) -->
+ * <div ng-hide="myValue"></div>
+ * ```
+ *
+ * When the `ngHide` expression evaluates to a truthy value then the `.ng-hide` CSS class is added to the class
+ * attribute on the element causing it to become hidden. When falsy, the `.ng-hide` CSS class is removed
+ * from the element causing the element not to appear hidden.
+ *
+ * ## Why is !important used?
+ *
+ * You may be wondering why !important is used for the `.ng-hide` CSS class. This is because the `.ng-hide` selector
+ * can be easily overridden by heavier selectors. For example, something as simple
+ * as changing the display style on a HTML list item would make hidden elements appear visible.
+ * This also becomes a bigger issue when dealing with CSS frameworks.
+ *
+ * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector
+ * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the
+ * styling to change how to hide an element then it is just a matter of using !important in their own CSS code.
+ *
+ * ### Overriding `.ng-hide`
+ *
+ * By default, the `.ng-hide` class will style the element with `display: none!important`. If you wish to change
+ * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide`
+ * class in CSS:
+ *
+ * ```css
+ * .ng-hide {
+ * /&#42; this is just another form of hiding an element &#42;/
+ * display: block!important;
+ * position: absolute;
+ * top: -9999px;
+ * left: -9999px;
+ * }
+ * ```
+ *
+ * By default you don't need to override in CSS anything and the animations will work around the display style.
+ *
+ * ## A note about animations with `ngHide`
+ *
+ * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression
+ * is true and false. This system works like the animation system present with ngClass, except that the `.ng-hide`
+ * CSS class is added and removed for you instead of your own CSS class.
+ *
+ * ```css
+ * //
+ * //a working example can be found at the bottom of this page
+ * //
+ * .my-element.ng-hide-add, .my-element.ng-hide-remove {
+ * transition: 0.5s linear all;
+ * }
+ *
+ * .my-element.ng-hide-add { ... }
+ * .my-element.ng-hide-add.ng-hide-add-active { ... }
+ * .my-element.ng-hide-remove { ... }
+ * .my-element.ng-hide-remove.ng-hide-remove-active { ... }
+ * ```
+ *
+ * Keep in mind that, as of AngularJS version 1.3.0-beta.11, there is no need to change the display
+ * property to block during animation states--ngAnimate will handle the style toggling automatically for you.
+ *
+ * @animations
+ * removeClass: `.ng-hide` - happens after the `ngHide` expression evaluates to a truthy value and just before the contents are set to hidden
+ * addClass: `.ng-hide` - happens after the `ngHide` expression evaluates to a non truthy value and just before the contents are set to visible
+ *
+ * @element ANY
+ * @param {expression} ngHide If the {@link guide/expression expression} is truthy then
+ * the element is shown or hidden respectively.
+ *
+ * @example
+ <example module="ngAnimate" deps="angular-animate.js" animations="true">
+ <file name="index.html">
+ Click me: <input type="checkbox" ng-model="checked"><br/>
+ <div>
+ Show:
+ <div class="check-element animate-hide" ng-show="checked">
+ <span class="glyphicon glyphicon-thumbs-up"></span> I show up when your checkbox is checked.
+ </div>
+ </div>
+ <div>
+ Hide:
+ <div class="check-element animate-hide" ng-hide="checked">
+ <span class="glyphicon glyphicon-thumbs-down"></span> I hide when your checkbox is checked.
+ </div>
+ </div>
+ </file>
+ <file name="glyphicons.css">
+ @import url(../../components/bootstrap-3.1.1/css/bootstrap.css);
+ </file>
+ <file name="animations.css">
+ .animate-hide {
+ -webkit-transition: all linear 0.5s;
+ transition: all linear 0.5s;
+ line-height: 20px;
+ opacity: 1;
+ padding: 10px;
+ border: 1px solid black;
+ background: white;
+ }
+
+ .animate-hide.ng-hide {
+ line-height: 0;
+ opacity: 0;
+ padding: 0 10px;
+ }
+
+ .check-element {
+ padding: 10px;
+ border: 1px solid black;
+ background: white;
+ }
+ </file>
+ <file name="protractor.js" type="protractor">
+ var thumbsUp = element(by.css('span.glyphicon-thumbs-up'));
+ var thumbsDown = element(by.css('span.glyphicon-thumbs-down'));
+
+ it('should check ng-show / ng-hide', function() {
+ expect(thumbsUp.isDisplayed()).toBeFalsy();
+ expect(thumbsDown.isDisplayed()).toBeTruthy();
+
+ element(by.model('checked')).click();
+
+ expect(thumbsUp.isDisplayed()).toBeTruthy();
+ expect(thumbsDown.isDisplayed()).toBeFalsy();
+ });
+ </file>
+ </example>
+ */
+var ngHideDirective = ['$animate', function($animate) {
+ return {
+ restrict: 'A',
+ multiElement: true,
+ link: function(scope, element, attr) {
+ scope.$watch(attr.ngHide, function ngHideWatchAction(value) {
+ // The comment inside of the ngShowDirective explains why we add and
+ // remove a temporary class for the show/hide animation
+ $animate[value ? 'addClass' : 'removeClass'](element,NG_HIDE_CLASS, {
+ tempClasses: NG_HIDE_IN_PROGRESS_CLASS
+ });
+ });
+ }
+ };
+}];
+
+/**
+ * @ngdoc directive
+ * @name ngStyle
+ * @restrict AC
+ *
+ * @description
+ * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally.
+ *
+ * @element ANY
+ * @param {expression} ngStyle
+ *
+ * {@link guide/expression Expression} which evals to an
+ * object whose keys are CSS style names and values are corresponding values for those CSS
+ * keys.
+ *
+ * Since some CSS style names are not valid keys for an object, they must be quoted.
+ * See the 'background-color' style in the example below.
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <input type="button" value="set color" ng-click="myStyle={color:'red'}">
+ <input type="button" value="set background" ng-click="myStyle={'background-color':'blue'}">
+ <input type="button" value="clear" ng-click="myStyle={}">
+ <br/>
+ <span ng-style="myStyle">Sample Text</span>
+ <pre>myStyle={{myStyle}}</pre>
+ </file>
+ <file name="style.css">
+ span {
+ color: black;
+ }
+ </file>
+ <file name="protractor.js" type="protractor">
+ var colorSpan = element(by.css('span'));
+
+ it('should check ng-style', function() {
+ expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');
+ element(by.css('input[value=\'set color\']')).click();
+ expect(colorSpan.getCssValue('color')).toBe('rgba(255, 0, 0, 1)');
+ element(by.css('input[value=clear]')).click();
+ expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');
+ });
+ </file>
+ </example>
+ */
+var ngStyleDirective = ngDirective(function(scope, element, attr) {
+ scope.$watch(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) {
+ if (oldStyles && (newStyles !== oldStyles)) {
+ forEach(oldStyles, function(val, style) { element.css(style, '');});
+ }
+ if (newStyles) element.css(newStyles);
+ }, true);
+});
+
+/**
+ * @ngdoc directive
+ * @name ngSwitch
+ * @restrict EA
+ *
+ * @description
+ * The `ngSwitch` directive is used to conditionally swap DOM structure on your template based on a scope expression.
+ * Elements within `ngSwitch` but without `ngSwitchWhen` or `ngSwitchDefault` directives will be preserved at the location
+ * as specified in the template.
+ *
+ * The directive itself works similar to ngInclude, however, instead of downloading template code (or loading it
+ * from the template cache), `ngSwitch` simply chooses one of the nested elements and makes it visible based on which element
+ * matches the value obtained from the evaluated expression. In other words, you define a container element
+ * (where you place the directive), place an expression on the **`on="..."` attribute**
+ * (or the **`ng-switch="..."` attribute**), define any inner elements inside of the directive and place
+ * a when attribute per element. The when attribute is used to inform ngSwitch which element to display when the on
+ * expression is evaluated. If a matching expression is not found via a when attribute then an element with the default
+ * attribute is displayed.
+ *
+ * <div class="alert alert-info">
+ * Be aware that the attribute values to match against cannot be expressions. They are interpreted
+ * as literal string values to match against.
+ * For example, **`ng-switch-when="someVal"`** will match against the string `"someVal"` not against the
+ * value of the expression `$scope.someVal`.
+ * </div>
+
+ * @animations
+ * enter - happens after the ngSwitch contents change and the matched child element is placed inside the container
+ * leave - happens just after the ngSwitch contents change and just before the former contents are removed from the DOM
+ *
+ * @usage
+ *
+ * ```
+ * <ANY ng-switch="expression">
+ * <ANY ng-switch-when="matchValue1">...</ANY>
+ * <ANY ng-switch-when="matchValue2">...</ANY>
+ * <ANY ng-switch-default>...</ANY>
+ * </ANY>
+ * ```
+ *
+ *
+ * @scope
+ * @priority 1200
+ * @param {*} ngSwitch|on expression to match against <tt>ng-switch-when</tt>.
+ * On child elements add:
+ *
+ * * `ngSwitchWhen`: the case statement to match against. If match then this
+ * case will be displayed. If the same match appears multiple times, all the
+ * elements will be displayed.
+ * * `ngSwitchDefault`: the default case when no other case match. If there
+ * are multiple default cases, all of them will be displayed when no other
+ * case match.
+ *
+ *
+ * @example
+ <example module="switchExample" deps="angular-animate.js" animations="true">
+ <file name="index.html">
+ <div ng-controller="ExampleController">
+ <select ng-model="selection" ng-options="item for item in items">
+ </select>
+ <tt>selection={{selection}}</tt>
+ <hr/>
+ <div class="animate-switch-container"
+ ng-switch on="selection">
+ <div class="animate-switch" ng-switch-when="settings">Settings Div</div>
+ <div class="animate-switch" ng-switch-when="home">Home Span</div>
+ <div class="animate-switch" ng-switch-default>default</div>
+ </div>
+ </div>
+ </file>
+ <file name="script.js">
+ angular.module('switchExample', ['ngAnimate'])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.items = ['settings', 'home', 'other'];
+ $scope.selection = $scope.items[0];
+ }]);
+ </file>
+ <file name="animations.css">
+ .animate-switch-container {
+ position:relative;
+ background:white;
+ border:1px solid black;
+ height:40px;
+ overflow:hidden;
+ }
+
+ .animate-switch {
+ padding:10px;
+ }
+
+ .animate-switch.ng-animate {
+ -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
+ transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
+
+ position:absolute;
+ top:0;
+ left:0;
+ right:0;
+ bottom:0;
+ }
+
+ .animate-switch.ng-leave.ng-leave-active,
+ .animate-switch.ng-enter {
+ top:-50px;
+ }
+ .animate-switch.ng-leave,
+ .animate-switch.ng-enter.ng-enter-active {
+ top:0;
+ }
+ </file>
+ <file name="protractor.js" type="protractor">
+ var switchElem = element(by.css('[ng-switch]'));
+ var select = element(by.model('selection'));
+
+ it('should start in settings', function() {
+ expect(switchElem.getText()).toMatch(/Settings Div/);
+ });
+ it('should change to home', function() {
+ select.all(by.css('option')).get(1).click();
+ expect(switchElem.getText()).toMatch(/Home Span/);
+ });
+ it('should select default', function() {
+ select.all(by.css('option')).get(2).click();
+ expect(switchElem.getText()).toMatch(/default/);
+ });
+ </file>
+ </example>
+ */
+var ngSwitchDirective = ['$animate', function($animate) {
+ return {
+ restrict: 'EA',
+ require: 'ngSwitch',
+
+ // asks for $scope to fool the BC controller module
+ controller: ['$scope', function ngSwitchController() {
+ this.cases = {};
+ }],
+ link: function(scope, element, attr, ngSwitchController) {
+ var watchExpr = attr.ngSwitch || attr.on,
+ selectedTranscludes = [],
+ selectedElements = [],
+ previousLeaveAnimations = [],
+ selectedScopes = [];
+
+ var spliceFactory = function(array, index) {
+ return function() { array.splice(index, 1); };
+ };
+
+ scope.$watch(watchExpr, function ngSwitchWatchAction(value) {
+ var i, ii;
+ for (i = 0, ii = previousLeaveAnimations.length; i < ii; ++i) {
+ $animate.cancel(previousLeaveAnimations[i]);
+ }
+ previousLeaveAnimations.length = 0;
+
+ for (i = 0, ii = selectedScopes.length; i < ii; ++i) {
+ var selected = getBlockNodes(selectedElements[i].clone);
+ selectedScopes[i].$destroy();
+ var promise = previousLeaveAnimations[i] = $animate.leave(selected);
+ promise.then(spliceFactory(previousLeaveAnimations, i));
+ }
+
+ selectedElements.length = 0;
+ selectedScopes.length = 0;
+
+ if ((selectedTranscludes = ngSwitchController.cases['!' + value] || ngSwitchController.cases['?'])) {
+ forEach(selectedTranscludes, function(selectedTransclude) {
+ selectedTransclude.transclude(function(caseElement, selectedScope) {
+ selectedScopes.push(selectedScope);
+ var anchor = selectedTransclude.element;
+ caseElement[caseElement.length++] = document.createComment(' end ngSwitchWhen: ');
+ var block = { clone: caseElement };
+
+ selectedElements.push(block);
+ $animate.enter(caseElement, anchor.parent(), anchor);
+ });
+ });
+ }
+ });
+ }
+ };
+}];
+
+var ngSwitchWhenDirective = ngDirective({
+ transclude: 'element',
+ priority: 1200,
+ require: '^ngSwitch',
+ multiElement: true,
+ link: function(scope, element, attrs, ctrl, $transclude) {
+ ctrl.cases['!' + attrs.ngSwitchWhen] = (ctrl.cases['!' + attrs.ngSwitchWhen] || []);
+ ctrl.cases['!' + attrs.ngSwitchWhen].push({ transclude: $transclude, element: element });
+ }
+});
+
+var ngSwitchDefaultDirective = ngDirective({
+ transclude: 'element',
+ priority: 1200,
+ require: '^ngSwitch',
+ multiElement: true,
+ link: function(scope, element, attr, ctrl, $transclude) {
+ ctrl.cases['?'] = (ctrl.cases['?'] || []);
+ ctrl.cases['?'].push({ transclude: $transclude, element: element });
+ }
+});
+
+/**
+ * @ngdoc directive
+ * @name ngTransclude
+ * @restrict EAC
+ *
+ * @description
+ * Directive that marks the insertion point for the transcluded DOM of the nearest parent directive that uses transclusion.
+ *
+ * Any existing content of the element that this directive is placed on will be removed before the transcluded content is inserted.
+ *
+ * @element ANY
+ *
+ * @example
+ <example module="transcludeExample">
+ <file name="index.html">
+ <script>
+ angular.module('transcludeExample', [])
+ .directive('pane', function(){
+ return {
+ restrict: 'E',
+ transclude: true,
+ scope: { title:'@' },
+ template: '<div style="border: 1px solid black;">' +
+ '<div style="background-color: gray">{{title}}</div>' +
+ '<ng-transclude></ng-transclude>' +
+ '</div>'
+ };
+ })
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.title = 'Lorem Ipsum';
+ $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';
+ }]);
+ </script>
+ <div ng-controller="ExampleController">
+ <input ng-model="title"><br>
+ <textarea ng-model="text"></textarea> <br/>
+ <pane title="{{title}}">{{text}}</pane>
+ </div>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should have transcluded', function() {
+ var titleElement = element(by.model('title'));
+ titleElement.clear();
+ titleElement.sendKeys('TITLE');
+ var textElement = element(by.model('text'));
+ textElement.clear();
+ textElement.sendKeys('TEXT');
+ expect(element(by.binding('title')).getText()).toEqual('TITLE');
+ expect(element(by.binding('text')).getText()).toEqual('TEXT');
+ });
+ </file>
+ </example>
+ *
+ */
+var ngTranscludeDirective = ngDirective({
+ restrict: 'EAC',
+ link: function($scope, $element, $attrs, controller, $transclude) {
+ if (!$transclude) {
+ throw minErr('ngTransclude')('orphan',
+ 'Illegal use of ngTransclude directive in the template! ' +
+ 'No parent directive that requires a transclusion found. ' +
+ 'Element: {0}',
+ startingTag($element));
+ }
+
+ $transclude(function(clone) {
+ $element.empty();
+ $element.append(clone);
+ });
+ }
+});
+
+/**
+ * @ngdoc directive
+ * @name script
+ * @restrict E
+ *
+ * @description
+ * Load the content of a `<script>` element into {@link ng.$templateCache `$templateCache`}, so that the
+ * template can be used by {@link ng.directive:ngInclude `ngInclude`},
+ * {@link ngRoute.directive:ngView `ngView`}, or {@link guide/directive directives}. The type of the
+ * `<script>` element must be specified as `text/ng-template`, and a cache name for the template must be
+ * assigned through the element's `id`, which can then be used as a directive's `templateUrl`.
+ *
+ * @param {string} type Must be set to `'text/ng-template'`.
+ * @param {string} id Cache name of the template.
+ *
+ * @example
+ <example>
+ <file name="index.html">
+ <script type="text/ng-template" id="/tpl.html">
+ Content of the template.
+ </script>
+
+ <a ng-click="currentTpl='/tpl.html'" id="tpl-link">Load inlined template</a>
+ <div id="tpl-content" ng-include src="currentTpl"></div>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should load template defined inside script tag', function() {
+ element(by.css('#tpl-link')).click();
+ expect(element(by.css('#tpl-content')).getText()).toMatch(/Content of the template/);
+ });
+ </file>
+ </example>
+ */
+var scriptDirective = ['$templateCache', function($templateCache) {
+ return {
+ restrict: 'E',
+ terminal: true,
+ compile: function(element, attr) {
+ if (attr.type == 'text/ng-template') {
+ var templateUrl = attr.id,
+ text = element[0].text;
+
+ $templateCache.put(templateUrl, text);
+ }
+ }
+ };
+}];
+
+var ngOptionsMinErr = minErr('ngOptions');
+/**
+ * @ngdoc directive
+ * @name select
+ * @restrict E
+ *
+ * @description
+ * HTML `SELECT` element with angular data-binding.
+ *
+ * # `ngOptions`
+ *
+ * The `ngOptions` attribute can be used to dynamically generate a list of `<option>`
+ * elements for the `<select>` element using the array or object obtained by evaluating the
+ * `ngOptions` comprehension_expression.
+ *
+ * In many cases, `ngRepeat` can be used on `<option>` elements instead of `ngOptions` to achieve a
+ * similar result. However, the `ngOptions` provides some benefits such as reducing memory and
+ * increasing speed by not creating a new scope for each repeated instance, as well as providing
+ * more flexibility in how the `select`'s model is assigned via `select as`. `ngOptions` should be
+ * used when the `select` model needs to be bound to a non-string value. This is because an option
+ * element can only be bound to string values at present.
+ *
+ * When an item in the `<select>` menu is selected, the array element or object property
+ * represented by the selected option will be bound to the model identified by the `ngModel`
+ * directive.
+ *
+ * Optionally, a single hard-coded `<option>` element, with the value set to an empty string, can
+ * be nested into the `<select>` element. This element will then represent the `null` or "not selected"
+ * option. See example below for demonstration.
+ *
+ * <div class="alert alert-warning">
+ * **Note:** `ngModel` compares by reference, not value. This is important when binding to an
+ * array of objects. See an example [in this jsfiddle](http://jsfiddle.net/qWzTb/).
+ * </div>
+ *
+ * ## `select as`
+ *
+ * Using `select as` will bind the result of the `select as` expression to the model, but
+ * the value of the `<select>` and `<option>` html elements will be either the index (for array data sources)
+ * or property name (for object data sources) of the value within the collection. If a `track by` expression
+ * is used, the result of that expression will be set as the value of the `option` and `select` elements.
+ *
+ * ### `select as` with `trackexpr`
+ *
+ * Using `select as` together with `trackexpr` is not recommended. Reasoning:
+ *
+ * - Example: &lt;select ng-options="item.subItem as item.label for item in values track by item.id" ng-model="selected"&gt;
+ * values: [{id: 1, label: 'aLabel', subItem: {name: 'aSubItem'}}, {id: 2, label: 'bLabel', subItem: {name: 'bSubItem'}}],
+ * $scope.selected = {name: 'aSubItem'};
+ * - track by is always applied to `value`, with the purpose of preserving the selection,
+ * (to `item` in this case)
+ * - to calculate whether an item is selected we do the following:
+ * 1. apply `track by` to the values in the array, e.g.
+ * In the example: [1,2]
+ * 2. apply `track by` to the already selected value in `ngModel`:
+ * In the example: this is not possible, as `track by` refers to `item.id`, but the selected
+ * value from `ngModel` is `{name: aSubItem}`.
+ *
+ * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {string=} required The control is considered valid only if value is entered.
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+ * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+ * `required` when you want to data-bind to the `required` attribute.
+ * @param {comprehension_expression=} ngOptions in one of the following forms:
+ *
+ * * for array data sources:
+ * * `label` **`for`** `value` **`in`** `array`
+ * * `select` **`as`** `label` **`for`** `value` **`in`** `array`
+ * * `label` **`group by`** `group` **`for`** `value` **`in`** `array`
+ * * `select` **`as`** `label` **`group by`** `group` **`for`** `value` **`in`** `array` **`track by`** `trackexpr`
+ * * for object data sources:
+ * * `label` **`for (`**`key` **`,`** `value`**`) in`** `object`
+ * * `select` **`as`** `label` **`for (`**`key` **`,`** `value`**`) in`** `object`
+ * * `label` **`group by`** `group` **`for (`**`key`**`,`** `value`**`) in`** `object`
+ * * `select` **`as`** `label` **`group by`** `group`
+ * **`for` `(`**`key`**`,`** `value`**`) in`** `object`
+ *
+ * Where:
+ *
+ * * `array` / `object`: an expression which evaluates to an array / object to iterate over.
+ * * `value`: local variable which will refer to each item in the `array` or each property value
+ * of `object` during iteration.
+ * * `key`: local variable which will refer to a property name in `object` during iteration.
+ * * `label`: The result of this expression will be the label for `<option>` element. The
+ * `expression` will most likely refer to the `value` variable (e.g. `value.propertyName`).
+ * * `select`: The result of this expression will be bound to the model of the parent `<select>`
+ * element. If not specified, `select` expression will default to `value`.
+ * * `group`: The result of this expression will be used to group options using the `<optgroup>`
+ * DOM element.
+ * * `trackexpr`: Used when working with an array of objects. The result of this expression will be
+ * used to identify the objects in the array. The `trackexpr` will most likely refer to the
+ * `value` variable (e.g. `value.propertyName`). With this the selection is preserved
+ * even when the options are recreated (e.g. reloaded from the server).
+ *
+ * @example
+ <example module="selectExample">
+ <file name="index.html">
+ <script>
+ angular.module('selectExample', [])
+ .controller('ExampleController', ['$scope', function($scope) {
+ $scope.colors = [
+ {name:'black', shade:'dark'},
+ {name:'white', shade:'light'},
+ {name:'red', shade:'dark'},
+ {name:'blue', shade:'dark'},
+ {name:'yellow', shade:'light'}
+ ];
+ $scope.myColor = $scope.colors[2]; // red
+ }]);
+ </script>
+ <div ng-controller="ExampleController">
+ <ul>
+ <li ng-repeat="color in colors">
+ Name: <input ng-model="color.name">
+ [<a href ng-click="colors.splice($index, 1)">X</a>]
+ </li>
+ <li>
+ [<a href ng-click="colors.push({})">add</a>]
+ </li>
+ </ul>
+ <hr/>
+ Color (null not allowed):
+ <select ng-model="myColor" ng-options="color.name for color in colors"></select><br>
+
+ Color (null allowed):
+ <span class="nullable">
+ <select ng-model="myColor" ng-options="color.name for color in colors">
+ <option value="">-- choose color --</option>
+ </select>
+ </span><br/>
+
+ Color grouped by shade:
+ <select ng-model="myColor" ng-options="color.name group by color.shade for color in colors">
+ </select><br/>
+
+
+ Select <a href ng-click="myColor = { name:'not in list', shade: 'other' }">bogus</a>.<br>
+ <hr/>
+ Currently selected: {{ {selected_color:myColor} }}
+ <div style="border:solid 1px black; height:20px"
+ ng-style="{'background-color':myColor.name}">
+ </div>
+ </div>
+ </file>
+ <file name="protractor.js" type="protractor">
+ it('should check ng-options', function() {
+ expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('red');
+ element.all(by.model('myColor')).first().click();
+ element.all(by.css('select[ng-model="myColor"] option')).first().click();
+ expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('black');
+ element(by.css('.nullable select[ng-model="myColor"]')).click();
+ element.all(by.css('.nullable select[ng-model="myColor"] option')).first().click();
+ expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('null');
+ });
+ </file>
+ </example>
+ */
+
+var ngOptionsDirective = valueFn({
+ restrict: 'A',
+ terminal: true
+});
+
+// jshint maxlen: false
+var selectDirective = ['$compile', '$parse', function($compile, $parse) {
+ //000011111111110000000000022222222220000000000000000000003333333333000000000000004444444444444440000000005555555555555550000000666666666666666000000000000000777777777700000000000000000008888888888
+ var NG_OPTIONS_REGEXP = /^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,
+ nullModelCtrl = {$setViewValue: noop};
+// jshint maxlen: 100
+
+ return {
+ restrict: 'E',
+ require: ['select', '?ngModel'],
+ controller: ['$element', '$scope', '$attrs', function($element, $scope, $attrs) {
+ var self = this,
+ optionsMap = {},
+ ngModelCtrl = nullModelCtrl,
+ nullOption,
+ unknownOption;
+
+
+ self.databound = $attrs.ngModel;
+
+
+ self.init = function(ngModelCtrl_, nullOption_, unknownOption_) {
+ ngModelCtrl = ngModelCtrl_;
+ nullOption = nullOption_;
+ unknownOption = unknownOption_;
+ };
+
+
+ self.addOption = function(value, element) {
+ assertNotHasOwnProperty(value, '"option value"');
+ optionsMap[value] = true;
+
+ if (ngModelCtrl.$viewValue == value) {
+ $element.val(value);
+ if (unknownOption.parent()) unknownOption.remove();
+ }
+ // Workaround for https://code.google.com/p/chromium/issues/detail?id=381459
+ // Adding an <option selected="selected"> element to a <select required="required"> should
+ // automatically select the new element
+ if (element && element[0].hasAttribute('selected')) {
+ element[0].selected = true;
+ }
+ };
+
+
+ self.removeOption = function(value) {
+ if (this.hasOption(value)) {
+ delete optionsMap[value];
+ if (ngModelCtrl.$viewValue === value) {
+ this.renderUnknownOption(value);
+ }
+ }
+ };
+
+
+ self.renderUnknownOption = function(val) {
+ var unknownVal = '? ' + hashKey(val) + ' ?';
+ unknownOption.val(unknownVal);
+ $element.prepend(unknownOption);
+ $element.val(unknownVal);
+ unknownOption.prop('selected', true); // needed for IE
+ };
+
+
+ self.hasOption = function(value) {
+ return optionsMap.hasOwnProperty(value);
+ };
+
+ $scope.$on('$destroy', function() {
+ // disable unknown option so that we don't do work when the whole select is being destroyed
+ self.renderUnknownOption = noop;
+ });
+ }],
+
+ link: function(scope, element, attr, ctrls) {
+ // if ngModel is not defined, we don't need to do anything
+ if (!ctrls[1]) return;
+
+ var selectCtrl = ctrls[0],
+ ngModelCtrl = ctrls[1],
+ multiple = attr.multiple,
+ optionsExp = attr.ngOptions,
+ nullOption = false, // if false, user will not be able to select it (used by ngOptions)
+ emptyOption,
+ renderScheduled = false,
+ // we can't just jqLite('<option>') since jqLite is not smart enough
+ // to create it in <select> and IE barfs otherwise.
+ optionTemplate = jqLite(document.createElement('option')),
+ optGroupTemplate =jqLite(document.createElement('optgroup')),
+ unknownOption = optionTemplate.clone();
+
+ // find "null" option
+ for (var i = 0, children = element.children(), ii = children.length; i < ii; i++) {
+ if (children[i].value === '') {
+ emptyOption = nullOption = children.eq(i);
+ break;
+ }
+ }
+
+ selectCtrl.init(ngModelCtrl, nullOption, unknownOption);
+
+ // required validator
+ if (multiple) {
+ ngModelCtrl.$isEmpty = function(value) {
+ return !value || value.length === 0;
+ };
+ }
+
+ if (optionsExp) setupAsOptions(scope, element, ngModelCtrl);
+ else if (multiple) setupAsMultiple(scope, element, ngModelCtrl);
+ else setupAsSingle(scope, element, ngModelCtrl, selectCtrl);
+
+
+ ////////////////////////////
+
+
+
+ function setupAsSingle(scope, selectElement, ngModelCtrl, selectCtrl) {
+ ngModelCtrl.$render = function() {
+ var viewValue = ngModelCtrl.$viewValue;
+
+ if (selectCtrl.hasOption(viewValue)) {
+ if (unknownOption.parent()) unknownOption.remove();
+ selectElement.val(viewValue);
+ if (viewValue === '') emptyOption.prop('selected', true); // to make IE9 happy
+ } else {
+ if (isUndefined(viewValue) && emptyOption) {
+ selectElement.val('');
+ } else {
+ selectCtrl.renderUnknownOption(viewValue);
+ }
+ }
+ };
+
+ selectElement.on('change', function() {
+ scope.$apply(function() {
+ if (unknownOption.parent()) unknownOption.remove();
+ ngModelCtrl.$setViewValue(selectElement.val());
+ });
+ });
+ }
+
+ function setupAsMultiple(scope, selectElement, ctrl) {
+ var lastView;
+ ctrl.$render = function() {
+ var items = new HashMap(ctrl.$viewValue);
+ forEach(selectElement.find('option'), function(option) {
+ option.selected = isDefined(items.get(option.value));
+ });
+ };
+
+ // we have to do it on each watch since ngModel watches reference, but
+ // we need to work of an array, so we need to see if anything was inserted/removed
+ scope.$watch(function selectMultipleWatch() {
+ if (!equals(lastView, ctrl.$viewValue)) {
+ lastView = shallowCopy(ctrl.$viewValue);
+ ctrl.$render();
+ }
+ });
+
+ selectElement.on('change', function() {
+ scope.$apply(function() {
+ var array = [];
+ forEach(selectElement.find('option'), function(option) {
+ if (option.selected) {
+ array.push(option.value);
+ }
+ });
+ ctrl.$setViewValue(array);
+ });
+ });
+ }
+
+ function setupAsOptions(scope, selectElement, ctrl) {
+ var match;
+
+ if (!(match = optionsExp.match(NG_OPTIONS_REGEXP))) {
+ throw ngOptionsMinErr('iexp',
+ "Expected expression in form of " +
+ "'_select_ (as _label_)? for (_key_,)?_value_ in _collection_'" +
+ " but got '{0}'. Element: {1}",
+ optionsExp, startingTag(selectElement));
+ }
+
+ var displayFn = $parse(match[2] || match[1]),
+ valueName = match[4] || match[6],
+ selectAs = / as /.test(match[0]) && match[1],
+ selectAsFn = selectAs ? $parse(selectAs) : null,
+ keyName = match[5],
+ groupByFn = $parse(match[3] || ''),
+ valueFn = $parse(match[2] ? match[1] : valueName),
+ valuesFn = $parse(match[7]),
+ track = match[8],
+ trackFn = track ? $parse(match[8]) : null,
+ trackKeysCache = {},
+ // This is an array of array of existing option groups in DOM.
+ // We try to reuse these if possible
+ // - optionGroupsCache[0] is the options with no option group
+ // - optionGroupsCache[?][0] is the parent: either the SELECT or OPTGROUP element
+ optionGroupsCache = [[{element: selectElement, label:''}]],
+ //re-usable object to represent option's locals
+ locals = {};
+
+ if (nullOption) {
+ // compile the element since there might be bindings in it
+ $compile(nullOption)(scope);
+
+ // remove the class, which is added automatically because we recompile the element and it
+ // becomes the compilation root
+ nullOption.removeClass('ng-scope');
+
+ // we need to remove it before calling selectElement.empty() because otherwise IE will
+ // remove the label from the element. wtf?
+ nullOption.remove();
+ }
+
+ // clear contents, we'll add what's needed based on the model
+ selectElement.empty();
+
+ selectElement.on('change', selectionChanged);
+
+ ctrl.$render = render;
+
+ scope.$watchCollection(valuesFn, scheduleRendering);
+ scope.$watchCollection(getLabels, scheduleRendering);
+
+ if (multiple) {
+ scope.$watchCollection(function() { return ctrl.$modelValue; }, scheduleRendering);
+ }
+
+ // ------------------------------------------------------------------ //
+
+ function callExpression(exprFn, key, value) {
+ locals[valueName] = value;
+ if (keyName) locals[keyName] = key;
+ return exprFn(scope, locals);
+ }
+
+ function selectionChanged() {
+ scope.$apply(function() {
+ var collection = valuesFn(scope) || [];
+ var viewValue;
+ if (multiple) {
+ viewValue = [];
+ forEach(selectElement.val(), function(selectedKey) {
+ selectedKey = trackFn ? trackKeysCache[selectedKey] : selectedKey;
+ viewValue.push(getViewValue(selectedKey, collection[selectedKey]));
+ });
+ } else {
+ var selectedKey = trackFn ? trackKeysCache[selectElement.val()] : selectElement.val();
+ viewValue = getViewValue(selectedKey, collection[selectedKey]);
+ }
+ ctrl.$setViewValue(viewValue);
+ render();
+ });
+ }
+
+ function getViewValue(key, value) {
+ if (key === '?') {
+ return undefined;
+ } else if (key === '') {
+ return null;
+ } else {
+ var viewValueFn = selectAsFn ? selectAsFn : valueFn;
+ return callExpression(viewValueFn, key, value);
+ }
+ }
+
+ function getLabels() {
+ var values = valuesFn(scope);
+ var toDisplay;
+ if (values && isArray(values)) {
+ toDisplay = new Array(values.length);
+ for (var i = 0, ii = values.length; i < ii; i++) {
+ toDisplay[i] = callExpression(displayFn, i, values[i]);
+ }
+ return toDisplay;
+ } else if (values) {
+ // TODO: Add a test for this case
+ toDisplay = {};
+ for (var prop in values) {
+ if (values.hasOwnProperty(prop)) {
+ toDisplay[prop] = callExpression(displayFn, prop, values[prop]);
+ }
+ }
+ }
+ return toDisplay;
+ }
+
+ function createIsSelectedFn(viewValue) {
+ var selectedSet;
+ if (multiple) {
+ if (trackFn && isArray(viewValue)) {
+
+ selectedSet = new HashMap([]);
+ for (var trackIndex = 0; trackIndex < viewValue.length; trackIndex++) {
+ // tracking by key
+ selectedSet.put(callExpression(trackFn, null, viewValue[trackIndex]), true);
+ }
+ } else {
+ selectedSet = new HashMap(viewValue);
+ }
+ } else if (trackFn) {
+ viewValue = callExpression(trackFn, null, viewValue);
+ }
+
+ return function isSelected(key, value) {
+ var compareValueFn;
+ if (trackFn) {
+ compareValueFn = trackFn;
+ } else if (selectAsFn) {
+ compareValueFn = selectAsFn;
+ } else {
+ compareValueFn = valueFn;
+ }
+
+ if (multiple) {
+ return isDefined(selectedSet.remove(callExpression(compareValueFn, key, value)));
+ } else {
+ return viewValue === callExpression(compareValueFn, key, value);
+ }
+ };
+ }
+
+ function scheduleRendering() {
+ if (!renderScheduled) {
+ scope.$$postDigest(render);
+ renderScheduled = true;
+ }
+ }
+
+ /**
+ * A new labelMap is created with each render.
+ * This function is called for each existing option with added=false,
+ * and each new option with added=true.
+ * - Labels that are passed to this method twice,
+ * (once with added=true and once with added=false) will end up with a value of 0, and
+ * will cause no change to happen to the corresponding option.
+ * - Labels that are passed to this method only once with added=false will end up with a
+ * value of -1 and will eventually be passed to selectCtrl.removeOption()
+ * - Labels that are passed to this method only once with added=true will end up with a
+ * value of 1 and will eventually be passed to selectCtrl.addOption()
+ */
+ function updateLabelMap(labelMap, label, added) {
+ labelMap[label] = labelMap[label] || 0;
+ labelMap[label] += (added ? 1 : -1);
+ }
+
+ function render() {
+ renderScheduled = false;
+
+ // Temporary location for the option groups before we render them
+ var optionGroups = {'':[]},
+ optionGroupNames = [''],
+ optionGroupName,
+ optionGroup,
+ option,
+ existingParent, existingOptions, existingOption,
+ viewValue = ctrl.$viewValue,
+ values = valuesFn(scope) || [],
+ keys = keyName ? sortedKeys(values) : values,
+ key,
+ value,
+ groupLength, length,
+ groupIndex, index,
+ labelMap = {},
+ selected,
+ isSelected = createIsSelectedFn(viewValue),
+ anySelected = false,
+ lastElement,
+ element,
+ label,
+ optionId;
+
+ trackKeysCache = {};
+
+ // We now build up the list of options we need (we merge later)
+ for (index = 0; length = keys.length, index < length; index++) {
+ key = index;
+ if (keyName) {
+ key = keys[index];
+ if (key.charAt(0) === '$') continue;
+ }
+ value = values[key];
+
+ optionGroupName = callExpression(groupByFn, key, value) || '';
+ if (!(optionGroup = optionGroups[optionGroupName])) {
+ optionGroup = optionGroups[optionGroupName] = [];
+ optionGroupNames.push(optionGroupName);
+ }
+
+ selected = isSelected(key, value);
+ anySelected = anySelected || selected;
+
+ label = callExpression(displayFn, key, value); // what will be seen by the user
+
+ // doing displayFn(scope, locals) || '' overwrites zero values
+ label = isDefined(label) ? label : '';
+ optionId = trackFn ? trackFn(scope, locals) : (keyName ? keys[index] : index);
+ if (trackFn) {
+ trackKeysCache[optionId] = key;
+ }
+
+ optionGroup.push({
+ // either the index into array or key from object
+ id: optionId,
+ label: label,
+ selected: selected // determine if we should be selected
+ });
+ }
+ if (!multiple) {
+ if (nullOption || viewValue === null) {
+ // insert null option if we have a placeholder, or the model is null
+ optionGroups[''].unshift({id:'', label:'', selected:!anySelected});
+ } else if (!anySelected) {
+ // option could not be found, we have to insert the undefined item
+ optionGroups[''].unshift({id:'?', label:'', selected:true});
+ }
+ }
+
+ // Now we need to update the list of DOM nodes to match the optionGroups we computed above
+ for (groupIndex = 0, groupLength = optionGroupNames.length;
+ groupIndex < groupLength;
+ groupIndex++) {
+ // current option group name or '' if no group
+ optionGroupName = optionGroupNames[groupIndex];
+
+ // list of options for that group. (first item has the parent)
+ optionGroup = optionGroups[optionGroupName];
+
+ if (optionGroupsCache.length <= groupIndex) {
+ // we need to grow the optionGroups
+ existingParent = {
+ element: optGroupTemplate.clone().attr('label', optionGroupName),
+ label: optionGroup.label
+ };
+ existingOptions = [existingParent];
+ optionGroupsCache.push(existingOptions);
+ selectElement.append(existingParent.element);
+ } else {
+ existingOptions = optionGroupsCache[groupIndex];
+ existingParent = existingOptions[0]; // either SELECT (no group) or OPTGROUP element
+
+ // update the OPTGROUP label if not the same.
+ if (existingParent.label != optionGroupName) {
+ existingParent.element.attr('label', existingParent.label = optionGroupName);
+ }
+ }
+
+ lastElement = null; // start at the beginning
+ for (index = 0, length = optionGroup.length; index < length; index++) {
+ option = optionGroup[index];
+ if ((existingOption = existingOptions[index + 1])) {
+ // reuse elements
+ lastElement = existingOption.element;
+ if (existingOption.label !== option.label) {
+ updateLabelMap(labelMap, existingOption.label, false);
+ updateLabelMap(labelMap, option.label, true);
+ lastElement.text(existingOption.label = option.label);
+ lastElement.prop('label', existingOption.label);
+ }
+ if (existingOption.id !== option.id) {
+ lastElement.val(existingOption.id = option.id);
+ }
+ // lastElement.prop('selected') provided by jQuery has side-effects
+ if (lastElement[0].selected !== option.selected) {
+ lastElement.prop('selected', (existingOption.selected = option.selected));
+ if (msie) {
+ // See #7692
+ // The selected item wouldn't visually update on IE without this.
+ // Tested on Win7: IE9, IE10 and IE11. Future IEs should be tested as well
+ lastElement.prop('selected', existingOption.selected);
+ }
+ }
+ } else {
+ // grow elements
+
+ // if it's a null option
+ if (option.id === '' && nullOption) {
+ // put back the pre-compiled element
+ element = nullOption;
+ } else {
+ // jQuery(v1.4.2) Bug: We should be able to chain the method calls, but
+ // in this version of jQuery on some browser the .text() returns a string
+ // rather then the element.
+ (element = optionTemplate.clone())
+ .val(option.id)
+ .prop('selected', option.selected)
+ .attr('selected', option.selected)
+ .prop('label', option.label)
+ .text(option.label);
+ }
+
+ existingOptions.push(existingOption = {
+ element: element,
+ label: option.label,
+ id: option.id,
+ selected: option.selected
+ });
+ updateLabelMap(labelMap, option.label, true);
+ if (lastElement) {
+ lastElement.after(element);
+ } else {
+ existingParent.element.append(element);
+ }
+ lastElement = element;
+ }
+ }
+ // remove any excessive OPTIONs in a group
+ index++; // increment since the existingOptions[0] is parent element not OPTION
+ while (existingOptions.length > index) {
+ option = existingOptions.pop();
+ updateLabelMap(labelMap, option.label, false);
+ option.element.remove();
+ }
+ }
+ // remove any excessive OPTGROUPs from select
+ while (optionGroupsCache.length > groupIndex) {
+ // remove all the labels in the option group
+ optionGroup = optionGroupsCache.pop();
+ for (index = 1; index < optionGroup.length; ++index) {
+ updateLabelMap(labelMap, optionGroup[index].label, false);
+ }
+ optionGroup[0].element.remove();
+ }
+ forEach(labelMap, function(count, label) {
+ if (count > 0) {
+ selectCtrl.addOption(label);
+ } else if (count < 0) {
+ selectCtrl.removeOption(label);
+ }
+ });
+ }
+ }
+ }
+ };
+}];
+
+var optionDirective = ['$interpolate', function($interpolate) {
+ var nullSelectCtrl = {
+ addOption: noop,
+ removeOption: noop
+ };
+
+ return {
+ restrict: 'E',
+ priority: 100,
+ compile: function(element, attr) {
+ if (isUndefined(attr.value)) {
+ var interpolateFn = $interpolate(element.text(), true);
+ if (!interpolateFn) {
+ attr.$set('value', element.text());
+ }
+ }
+
+ return function(scope, element, attr) {
+ var selectCtrlName = '$selectController',
+ parent = element.parent(),
+ selectCtrl = parent.data(selectCtrlName) ||
+ parent.parent().data(selectCtrlName); // in case we are in optgroup
+
+ if (!selectCtrl || !selectCtrl.databound) {
+ selectCtrl = nullSelectCtrl;
+ }
+
+ if (interpolateFn) {
+ scope.$watch(interpolateFn, function interpolateWatchAction(newVal, oldVal) {
+ attr.$set('value', newVal);
+ if (oldVal !== newVal) {
+ selectCtrl.removeOption(oldVal);
+ }
+ selectCtrl.addOption(newVal, element);
+ });
+ } else {
+ selectCtrl.addOption(attr.value, element);
+ }
+
+ element.on('$destroy', function() {
+ selectCtrl.removeOption(attr.value);
+ });
+ };
+ }
+ };
+}];
+
+var styleDirective = valueFn({
+ restrict: 'E',
+ terminal: false
+});
+
+ if (window.angular.bootstrap) {
+ //AngularJS is already loaded, so we can return here...
+ console.log('WARNING: Tried to load angular more than once.');
+ return;
+ }
+
+ //try to bind to jquery now so that one can write jqLite(document).ready()
+ //but we will rebind on bootstrap again.
+ bindJQuery();
+
+ publishExternalAPI(angular);
+
+ jqLite(document).ready(function() {
+ angularInit(document, bootstrap);
+ });
+
+})(window, document);
+
+!window.angular.$$csp() && window.angular.element(document).find('head').prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}</style>'); \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/tp/angular.min.js b/framework/src/onos/web/gui/src/main/webapp/tp/angular.min.js
new file mode 100644
index 00000000..c5583b48
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tp/angular.min.js
@@ -0,0 +1,250 @@
+/*
+ AngularJS v1.3.5
+ (c) 2010-2014 Google, Inc. http://angularjs.org
+ License: MIT
+*/
+(function(U,V,u){'use strict';function A(b){return function(){var a=arguments[0],c;c="["+(b?b+":":"")+a+"] http://errors.angularjs.org/1.3.5/"+(b?b+"/":"")+a;for(a=1;a<arguments.length;a++){c=c+(1==a?"?":"&")+"p"+(a-1)+"=";var d=encodeURIComponent,e;e=arguments[a];e="function"==typeof e?e.toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof e?"undefined":"string"!=typeof e?JSON.stringify(e):e;c+=d(e)}return Error(c)}}function Ra(b){if(null==b||Sa(b))return!1;var a=b.length;return b.nodeType===
+na&&a?!0:I(b)||y(b)||0===a||"number"===typeof a&&0<a&&a-1 in b}function r(b,a,c){var d,e;if(b)if(F(b))for(d in b)"prototype"==d||"length"==d||"name"==d||b.hasOwnProperty&&!b.hasOwnProperty(d)||a.call(c,b[d],d,b);else if(y(b)||Ra(b)){var f="object"!==typeof b;d=0;for(e=b.length;d<e;d++)(f||d in b)&&a.call(c,b[d],d,b)}else if(b.forEach&&b.forEach!==r)b.forEach(a,c,b);else for(d in b)b.hasOwnProperty(d)&&a.call(c,b[d],d,b);return b}function Bd(b,a,c){for(var d=Object.keys(b).sort(),e=0;e<d.length;e++)a.call(c,
+b[d[e]],d[e]);return d}function kc(b){return function(a,c){b(c,a)}}function Cd(){return++kb}function lc(b,a){a?b.$$hashKey=a:delete b.$$hashKey}function D(b){for(var a=b.$$hashKey,c=1,d=arguments.length;c<d;c++){var e=arguments[c];if(e)for(var f=Object.keys(e),g=0,h=f.length;g<h;g++){var k=f[g];b[k]=e[k]}}lc(b,a);return b}function $(b){return parseInt(b,10)}function x(){}function oa(b){return b}function ca(b){return function(){return b}}function G(b){return"undefined"===typeof b}function z(b){return"undefined"!==
+typeof b}function K(b){return null!==b&&"object"===typeof b}function I(b){return"string"===typeof b}function X(b){return"number"===typeof b}function fa(b){return"[object Date]"===Ja.call(b)}function F(b){return"function"===typeof b}function lb(b){return"[object RegExp]"===Ja.call(b)}function Sa(b){return b&&b.window===b}function Ta(b){return b&&b.$evalAsync&&b.$watch}function Ua(b){return"boolean"===typeof b}function mc(b){return!(!b||!(b.nodeName||b.prop&&b.attr&&b.find))}function Dd(b){var a={};
+b=b.split(",");var c;for(c=0;c<b.length;c++)a[b[c]]=!0;return a}function ta(b){return R(b.nodeName||b[0]&&b[0].nodeName)}function Va(b,a){var c=b.indexOf(a);0<=c&&b.splice(c,1);return a}function Ca(b,a,c,d){if(Sa(b)||Ta(b))throw Wa("cpws");if(a){if(b===a)throw Wa("cpi");c=c||[];d=d||[];if(K(b)){var e=c.indexOf(b);if(-1!==e)return d[e];c.push(b);d.push(a)}if(y(b))for(var f=a.length=0;f<b.length;f++)e=Ca(b[f],null,c,d),K(b[f])&&(c.push(b[f]),d.push(e)),a.push(e);else{var g=a.$$hashKey;y(a)?a.length=
+0:r(a,function(b,c){delete a[c]});for(f in b)b.hasOwnProperty(f)&&(e=Ca(b[f],null,c,d),K(b[f])&&(c.push(b[f]),d.push(e)),a[f]=e);lc(a,g)}}else if(a=b)y(b)?a=Ca(b,[],c,d):fa(b)?a=new Date(b.getTime()):lb(b)?(a=new RegExp(b.source,b.toString().match(/[^\/]*$/)[0]),a.lastIndex=b.lastIndex):K(b)&&(e=Object.create(Object.getPrototypeOf(b)),a=Ca(b,e,c,d));return a}function ua(b,a){if(y(b)){a=a||[];for(var c=0,d=b.length;c<d;c++)a[c]=b[c]}else if(K(b))for(c in a=a||{},b)if("$"!==c.charAt(0)||"$"!==c.charAt(1))a[c]=
+b[c];return a||b}function pa(b,a){if(b===a)return!0;if(null===b||null===a)return!1;if(b!==b&&a!==a)return!0;var c=typeof b,d;if(c==typeof a&&"object"==c)if(y(b)){if(!y(a))return!1;if((c=b.length)==a.length){for(d=0;d<c;d++)if(!pa(b[d],a[d]))return!1;return!0}}else{if(fa(b))return fa(a)?pa(b.getTime(),a.getTime()):!1;if(lb(b)&&lb(a))return b.toString()==a.toString();if(Ta(b)||Ta(a)||Sa(b)||Sa(a)||y(a))return!1;c={};for(d in b)if("$"!==d.charAt(0)&&!F(b[d])){if(!pa(b[d],a[d]))return!1;c[d]=!0}for(d in a)if(!c.hasOwnProperty(d)&&
+"$"!==d.charAt(0)&&a[d]!==u&&!F(a[d]))return!1;return!0}return!1}function Xa(b,a,c){return b.concat(Ya.call(a,c))}function nc(b,a){var c=2<arguments.length?Ya.call(arguments,2):[];return!F(a)||a instanceof RegExp?a:c.length?function(){return arguments.length?a.apply(b,Xa(c,arguments,0)):a.apply(b,c)}:function(){return arguments.length?a.apply(b,arguments):a.call(b)}}function Ed(b,a){var c=a;"string"===typeof b&&"$"===b.charAt(0)&&"$"===b.charAt(1)?c=u:Sa(a)?c="$WINDOW":a&&V===a?c="$DOCUMENT":Ta(a)&&
+(c="$SCOPE");return c}function Za(b,a){return"undefined"===typeof b?u:JSON.stringify(b,Ed,a?" ":null)}function oc(b){return I(b)?JSON.parse(b):b}function va(b){b=B(b).clone();try{b.empty()}catch(a){}var c=B("<div>").append(b).html();try{return b[0].nodeType===mb?R(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+R(b)})}catch(d){return R(c)}}function pc(b){try{return decodeURIComponent(b)}catch(a){}}function qc(b){var a={},c,d;r((b||"").split("&"),function(b){b&&(c=b.replace(/\+/g,
+"%20").split("="),d=pc(c[0]),z(d)&&(b=z(c[1])?pc(c[1]):!0,Jb.call(a,d)?y(a[d])?a[d].push(b):a[d]=[a[d],b]:a[d]=b))});return a}function Kb(b){var a=[];r(b,function(b,d){y(b)?r(b,function(b){a.push(Da(d,!0)+(!0===b?"":"="+Da(b,!0)))}):a.push(Da(d,!0)+(!0===b?"":"="+Da(b,!0)))});return a.length?a.join("&"):""}function nb(b){return Da(b,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function Da(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,
+"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,a?"%20":"+")}function Fd(b,a){var c,d,e=ob.length;b=B(b);for(d=0;d<e;++d)if(c=ob[d]+a,I(c=b.attr(c)))return c;return null}function Gd(b,a){var c,d,e={};r(ob,function(a){a+="app";!c&&b.hasAttribute&&b.hasAttribute(a)&&(c=b,d=b.getAttribute(a))});r(ob,function(a){a+="app";var e;!c&&(e=b.querySelector("["+a.replace(":","\\:")+"]"))&&(c=e,d=e.getAttribute(a))});c&&(e.strictDi=null!==Fd(c,"strict-di"),a(c,d?[d]:[],e))}function rc(b,a,c){K(c)||
+(c={});c=D({strictDi:!1},c);var d=function(){b=B(b);if(b.injector()){var d=b[0]===V?"document":va(b);throw Wa("btstrpd",d.replace(/</,"&lt;").replace(/>/,"&gt;"));}a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);c.debugInfoEnabled&&a.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]);a.unshift("ng");d=Lb(a,c.strictDi);d.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return d},e=
+/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;U&&e.test(U.name)&&(c.debugInfoEnabled=!0,U.name=U.name.replace(e,""));if(U&&!f.test(U.name))return d();U.name=U.name.replace(f,"");ha.resumeBootstrap=function(b){r(b,function(b){a.push(b)});d()}}function Hd(){U.name="NG_ENABLE_DEBUG_INFO!"+U.name;U.location.reload()}function Id(b){return ha.element(b).injector().get("$$testability")}function Mb(b,a){a=a||"_";return b.replace(Jd,function(b,d){return(d?a:"")+b.toLowerCase()})}function Kd(){var b;sc||
+((qa=U.jQuery)&&qa.fn.on?(B=qa,D(qa.fn,{scope:Ka.scope,isolateScope:Ka.isolateScope,controller:Ka.controller,injector:Ka.injector,inheritedData:Ka.inheritedData}),b=qa.cleanData,qa.cleanData=function(a){var c;if(Nb)Nb=!1;else for(var d=0,e;null!=(e=a[d]);d++)(c=qa._data(e,"events"))&&c.$destroy&&qa(e).triggerHandler("$destroy");b(a)}):B=S,ha.element=B,sc=!0)}function Ob(b,a,c){if(!b)throw Wa("areq",a||"?",c||"required");return b}function pb(b,a,c){c&&y(b)&&(b=b[b.length-1]);Ob(F(b),a,"not a function, got "+
+(b&&"object"===typeof b?b.constructor.name||"Object":typeof b));return b}function La(b,a){if("hasOwnProperty"===b)throw Wa("badname",a);}function tc(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,f=a.length,g=0;g<f;g++)d=a[g],b&&(b=(e=b)[d]);return!c&&F(b)?nc(e,b):b}function qb(b){var a=b[0];b=b[b.length-1];var c=[a];do{a=a.nextSibling;if(!a)break;c.push(a)}while(a!==b);return B(c)}function ia(){return Object.create(null)}function Ld(b){function a(a,b,c){return a[b]||(a[b]=c())}var c=A("$injector"),
+d=A("ng");b=a(b,"angular",Object);b.$$minErr=b.$$minErr||A;return a(b,"module",function(){var b={};return function(f,g,h){if("hasOwnProperty"===f)throw d("badname","module");g&&b.hasOwnProperty(f)&&(b[f]=null);return a(b,f,function(){function a(c,d,e,f){f||(f=b);return function(){f[e||"push"]([c,d,arguments]);return t}}if(!g)throw c("nomod",f);var b=[],d=[],e=[],s=a("$injector","invoke","push",d),t={_invokeQueue:b,_configBlocks:d,_runBlocks:e,requires:g,name:f,provider:a("$provide","provider"),factory:a("$provide",
+"factory"),service:a("$provide","service"),value:a("$provide","value"),constant:a("$provide","constant","unshift"),animation:a("$animateProvider","register"),filter:a("$filterProvider","register"),controller:a("$controllerProvider","register"),directive:a("$compileProvider","directive"),config:s,run:function(a){e.push(a);return this}};h&&s(h);return t})}})}function Md(b){D(b,{bootstrap:rc,copy:Ca,extend:D,equals:pa,element:B,forEach:r,injector:Lb,noop:x,bind:nc,toJson:Za,fromJson:oc,identity:oa,isUndefined:G,
+isDefined:z,isString:I,isFunction:F,isObject:K,isNumber:X,isElement:mc,isArray:y,version:Nd,isDate:fa,lowercase:R,uppercase:rb,callbacks:{counter:0},getTestability:Id,$$minErr:A,$$csp:$a,reloadWithDebugInfo:Hd});ab=Ld(U);try{ab("ngLocale")}catch(a){ab("ngLocale",[]).provider("$locale",Od)}ab("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:Pd});a.provider("$compile",uc).directive({a:Qd,input:vc,textarea:vc,form:Rd,script:Sd,select:Td,style:Ud,option:Vd,ngBind:Wd,ngBindHtml:Xd,ngBindTemplate:Yd,
+ngClass:Zd,ngClassEven:$d,ngClassOdd:ae,ngCloak:be,ngController:ce,ngForm:de,ngHide:ee,ngIf:fe,ngInclude:ge,ngInit:he,ngNonBindable:ie,ngPluralize:je,ngRepeat:ke,ngShow:le,ngStyle:me,ngSwitch:ne,ngSwitchWhen:oe,ngSwitchDefault:pe,ngOptions:qe,ngTransclude:re,ngModel:se,ngList:te,ngChange:ue,pattern:wc,ngPattern:wc,required:xc,ngRequired:xc,minlength:yc,ngMinlength:yc,maxlength:zc,ngMaxlength:zc,ngValue:ve,ngModelOptions:we}).directive({ngInclude:xe}).directive(sb).directive(Ac);a.provider({$anchorScroll:ye,
+$animate:ze,$browser:Ae,$cacheFactory:Be,$controller:Ce,$document:De,$exceptionHandler:Ee,$filter:Bc,$interpolate:Fe,$interval:Ge,$http:He,$httpBackend:Ie,$location:Je,$log:Ke,$parse:Le,$rootScope:Me,$q:Ne,$$q:Oe,$sce:Pe,$sceDelegate:Qe,$sniffer:Re,$templateCache:Se,$templateRequest:Te,$$testability:Ue,$timeout:Ve,$window:We,$$rAF:Xe,$$asyncCallback:Ye})}])}function bb(b){return b.replace(Ze,function(a,b,d,e){return e?d.toUpperCase():d}).replace($e,"Moz$1")}function Cc(b){b=b.nodeType;return b===
+na||!b||9===b}function Dc(b,a){var c,d,e=a.createDocumentFragment(),f=[];if(Pb.test(b)){c=c||e.appendChild(a.createElement("div"));d=(af.exec(b)||["",""])[1].toLowerCase();d=ja[d]||ja._default;c.innerHTML=d[1]+b.replace(bf,"<$1></$2>")+d[2];for(d=d[0];d--;)c=c.lastChild;f=Xa(f,c.childNodes);c=e.firstChild;c.textContent=""}else f.push(a.createTextNode(b));e.textContent="";e.innerHTML="";r(f,function(a){e.appendChild(a)});return e}function S(b){if(b instanceof S)return b;var a;I(b)&&(b=P(b),a=!0);if(!(this instanceof
+S)){if(a&&"<"!=b.charAt(0))throw Qb("nosel");return new S(b)}if(a){a=V;var c;b=(c=cf.exec(b))?[a.createElement(c[1])]:(c=Dc(b,a))?c.childNodes:[]}Ec(this,b)}function Rb(b){return b.cloneNode(!0)}function tb(b,a){a||ub(b);if(b.querySelectorAll)for(var c=b.querySelectorAll("*"),d=0,e=c.length;d<e;d++)ub(c[d])}function Fc(b,a,c,d){if(z(d))throw Qb("offargs");var e=(d=vb(b))&&d.events,f=d&&d.handle;if(f)if(a)r(a.split(" "),function(a){if(z(c)){var d=e[a];Va(d||[],c);if(d&&0<d.length)return}b.removeEventListener(a,
+f,!1);delete e[a]});else for(a in e)"$destroy"!==a&&b.removeEventListener(a,f,!1),delete e[a]}function ub(b,a){var c=b.ng339,d=c&&wb[c];d&&(a?delete d.data[a]:(d.handle&&(d.events.$destroy&&d.handle({},"$destroy"),Fc(b)),delete wb[c],b.ng339=u))}function vb(b,a){var c=b.ng339,c=c&&wb[c];a&&!c&&(b.ng339=c=++df,c=wb[c]={events:{},data:{},handle:u});return c}function Sb(b,a,c){if(Cc(b)){var d=z(c),e=!d&&a&&!K(a),f=!a;b=(b=vb(b,!e))&&b.data;if(d)b[a]=c;else{if(f)return b;if(e)return b&&b[a];D(b,a)}}}
+function Tb(b,a){return b.getAttribute?-1<(" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+a+" "):!1}function Ub(b,a){a&&b.setAttribute&&r(a.split(" "),function(a){b.setAttribute("class",P((" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+P(a)+" "," ")))})}function Vb(b,a){if(a&&b.setAttribute){var c=(" "+(b.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");r(a.split(" "),function(a){a=P(a);-1===c.indexOf(" "+a+" ")&&(c+=a+" ")});b.setAttribute("class",
+P(c))}}function Ec(b,a){if(a)if(a.nodeType)b[b.length++]=a;else{var c=a.length;if("number"===typeof c&&a.window!==a){if(c)for(var d=0;d<c;d++)b[b.length++]=a[d]}else b[b.length++]=a}}function Gc(b,a){return xb(b,"$"+(a||"ngController")+"Controller")}function xb(b,a,c){9==b.nodeType&&(b=b.documentElement);for(a=y(a)?a:[a];b;){for(var d=0,e=a.length;d<e;d++)if((c=B.data(b,a[d]))!==u)return c;b=b.parentNode||11===b.nodeType&&b.host}}function Hc(b){for(tb(b,!0);b.firstChild;)b.removeChild(b.firstChild)}
+function Ic(b,a){a||tb(b);var c=b.parentNode;c&&c.removeChild(b)}function ef(b,a){a=a||U;if("complete"===a.document.readyState)a.setTimeout(b);else B(a).on("load",b)}function Jc(b,a){var c=yb[a.toLowerCase()];return c&&Kc[ta(b)]&&c}function ff(b,a){var c=b.nodeName;return("INPUT"===c||"TEXTAREA"===c)&&Lc[a]}function gf(b,a){var c=function(c,e){c.isDefaultPrevented=function(){return c.defaultPrevented};var f=a[e||c.type],g=f?f.length:0;if(g){if(G(c.immediatePropagationStopped)){var h=c.stopImmediatePropagation;
+c.stopImmediatePropagation=function(){c.immediatePropagationStopped=!0;c.stopPropagation&&c.stopPropagation();h&&h.call(c)}}c.isImmediatePropagationStopped=function(){return!0===c.immediatePropagationStopped};1<g&&(f=ua(f));for(var k=0;k<g;k++)c.isImmediatePropagationStopped()||f[k].call(b,c)}};c.elem=b;return c}function Ma(b,a){var c=b&&b.$$hashKey;if(c)return"function"===typeof c&&(c=b.$$hashKey()),c;c=typeof b;return c="function"==c||"object"==c&&null!==b?b.$$hashKey=c+":"+(a||Cd)():c+":"+b}function cb(b,
+a){if(a){var c=0;this.nextUid=function(){return++c}}r(b,this.put,this)}function hf(b){return(b=b.toString().replace(Mc,"").match(Nc))?"function("+(b[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function Wb(b,a,c){var d;if("function"===typeof b){if(!(d=b.$inject)){d=[];if(b.length){if(a)throw I(c)&&c||(c=b.name||hf(b)),Ea("strictdi",c);a=b.toString().replace(Mc,"");a=a.match(Nc);r(a[1].split(jf),function(a){a.replace(kf,function(a,b,c){d.push(c)})})}b.$inject=d}}else y(b)?(a=b.length-1,pb(b[a],"fn"),
+d=b.slice(0,a)):pb(b,"fn",!0);return d}function Lb(b,a){function c(a){return function(b,c){if(K(b))r(b,kc(a));else return a(b,c)}}function d(a,b){La(a,"service");if(F(b)||y(b))b=s.instantiate(b);if(!b.$get)throw Ea("pget",a);return p[a+"Provider"]=b}function e(a,b){return function(){var c=q.invoke(b,this,u,a);if(G(c))throw Ea("undef",a);return c}}function f(a,b,c){return d(a,{$get:!1!==c?e(a,b):b})}function g(a){var b=[],c;r(a,function(a){function d(a){var b,c;b=0;for(c=a.length;b<c;b++){var e=a[b],
+f=s.get(e[0]);f[e[1]].apply(f,e[2])}}if(!m.get(a)){m.put(a,!0);try{I(a)?(c=ab(a),b=b.concat(g(c.requires)).concat(c._runBlocks),d(c._invokeQueue),d(c._configBlocks)):F(a)?b.push(s.invoke(a)):y(a)?b.push(s.invoke(a)):pb(a,"module")}catch(e){throw y(a)&&(a=a[a.length-1]),e.message&&e.stack&&-1==e.stack.indexOf(e.message)&&(e=e.message+"\n"+e.stack),Ea("modulerr",a,e.stack||e.message||e);}}});return b}function h(b,c){function d(a){if(b.hasOwnProperty(a)){if(b[a]===k)throw Ea("cdep",a+" <- "+l.join(" <- "));
+return b[a]}try{return l.unshift(a),b[a]=k,b[a]=c(a)}catch(e){throw b[a]===k&&delete b[a],e;}finally{l.shift()}}function e(b,c,f,g){"string"===typeof f&&(g=f,f=null);var k=[];g=Wb(b,a,g);var h,l,q;l=0;for(h=g.length;l<h;l++){q=g[l];if("string"!==typeof q)throw Ea("itkn",q);k.push(f&&f.hasOwnProperty(q)?f[q]:d(q))}y(b)&&(b=b[h]);return b.apply(c,k)}return{invoke:e,instantiate:function(a,b,c){var d=Object.create((y(a)?a[a.length-1]:a).prototype);a=e(a,d,b,c);return K(a)||F(a)?a:d},get:d,annotate:Wb,
+has:function(a){return p.hasOwnProperty(a+"Provider")||b.hasOwnProperty(a)}}}a=!0===a;var k={},l=[],m=new cb([],!0),p={$provide:{provider:c(d),factory:c(f),service:c(function(a,b){return f(a,["$injector",function(a){return a.instantiate(b)}])}),value:c(function(a,b){return f(a,ca(b),!1)}),constant:c(function(a,b){La(a,"constant");p[a]=b;t[a]=b}),decorator:function(a,b){var c=s.get(a+"Provider"),d=c.$get;c.$get=function(){var a=q.invoke(d,c);return q.invoke(b,null,{$delegate:a})}}}},s=p.$injector=
+h(p,function(){throw Ea("unpr",l.join(" <- "));}),t={},q=t.$injector=h(t,function(a){var b=s.get(a+"Provider");return q.invoke(b.$get,b,u,a)});r(g(b),function(a){q.invoke(a||x)});return q}function ye(){var b=!0;this.disableAutoScrolling=function(){b=!1};this.$get=["$window","$location","$rootScope",function(a,c,d){function e(a){var b=null;Array.prototype.some.call(a,function(a){if("a"===ta(a))return b=a,!0});return b}function f(b){if(b){b.scrollIntoView();var c;c=g.yOffset;F(c)?c=c():mc(c)?(c=c[0],
+c="fixed"!==a.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):X(c)||(c=0);c&&(b=b.getBoundingClientRect().top,a.scrollBy(0,b-c))}else a.scrollTo(0,0)}function g(){var a=c.hash(),b;a?(b=h.getElementById(a))?f(b):(b=e(h.getElementsByName(a)))?f(b):"top"===a&&f(null):f(null)}var h=a.document;b&&d.$watch(function(){return c.hash()},function(a,b){a===b&&""===a||ef(function(){d.$evalAsync(g)})});return g}]}function Ye(){this.$get=["$$rAF","$timeout",function(b,a){return b.supported?function(a){return b(a)}:
+function(b){return a(b,0,!1)}}]}function lf(b,a,c,d){function e(a){try{a.apply(null,Ya.call(arguments,1))}finally{if(v--,0===v)for(;w.length;)try{w.pop()()}catch(b){c.error(b)}}}function f(a,b){(function ya(){r(O,function(a){a()});E=b(ya,a)})()}function g(){h();k()}function h(){H=b.history.state;H=G(H)?null:H;pa(H,Q)&&(H=Q);Q=H}function k(){if(C!==m.url()||M!==H)C=m.url(),M=H,r(W,function(a){a(m.url(),H)})}function l(a){try{return decodeURIComponent(a)}catch(b){return a}}var m=this,p=a[0],s=b.location,
+t=b.history,q=b.setTimeout,N=b.clearTimeout,n={};m.isMock=!1;var v=0,w=[];m.$$completeOutstandingRequest=e;m.$$incOutstandingRequestCount=function(){v++};m.notifyWhenNoOutstandingRequests=function(a){r(O,function(a){a()});0===v?a():w.push(a)};var O=[],E;m.addPollFn=function(a){G(E)&&f(100,q);O.push(a);return a};var H,M,C=s.href,ea=a.find("base"),L=null;h();M=H;m.url=function(a,c,e){G(e)&&(e=null);s!==b.location&&(s=b.location);t!==b.history&&(t=b.history);if(a){var f=M===e;if(C===a&&(!d.history||
+f))return m;var g=C&&Fa(C)===Fa(a);C=a;M=e;!d.history||g&&f?(g||(L=a),c?s.replace(a):s.href=a):(t[c?"replaceState":"pushState"](e,"",a),h(),M=H);return m}return L||s.href.replace(/%27/g,"'")};m.state=function(){return H};var W=[],ba=!1,Q=null;m.onUrlChange=function(a){if(!ba){if(d.history)B(b).on("popstate",g);B(b).on("hashchange",g);ba=!0}W.push(a);return a};m.$$checkUrlChange=k;m.baseHref=function(){var a=ea.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""};var aa={},z="",da=m.baseHref();
+m.cookies=function(a,b){var d,e,f,g;if(a)b===u?p.cookie=encodeURIComponent(a)+"=;path="+da+";expires=Thu, 01 Jan 1970 00:00:00 GMT":I(b)&&(d=(p.cookie=encodeURIComponent(a)+"="+encodeURIComponent(b)+";path="+da).length+1,4096<d&&c.warn("Cookie '"+a+"' possibly not set or overflowed because it was too large ("+d+" > 4096 bytes)!"));else{if(p.cookie!==z)for(z=p.cookie,d=z.split("; "),aa={},f=0;f<d.length;f++)e=d[f],g=e.indexOf("="),0<g&&(a=l(e.substring(0,g)),aa[a]===u&&(aa[a]=l(e.substring(g+1))));
+return aa}};m.defer=function(a,b){var c;v++;c=q(function(){delete n[c];e(a)},b||0);n[c]=!0;return c};m.defer.cancel=function(a){return n[a]?(delete n[a],N(a),e(x),!0):!1}}function Ae(){this.$get=["$window","$log","$sniffer","$document",function(b,a,c,d){return new lf(b,d,a,c)}]}function Be(){this.$get=function(){function b(b,d){function e(a){a!=p&&(s?s==a&&(s=a.n):s=a,f(a.n,a.p),f(a,p),p=a,p.n=null)}function f(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(b in a)throw A("$cacheFactory")("iid",b);var g=0,
+h=D({},d,{id:b}),k={},l=d&&d.capacity||Number.MAX_VALUE,m={},p=null,s=null;return a[b]={put:function(a,b){if(l<Number.MAX_VALUE){var c=m[a]||(m[a]={key:a});e(c)}if(!G(b))return a in k||g++,k[a]=b,g>l&&this.remove(s.key),b},get:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;e(b)}return k[a]},remove:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;b==p&&(p=b.p);b==s&&(s=b.n);f(b.n,b.p);delete m[a]}delete k[a];g--},removeAll:function(){k={};g=0;m={};p=s=null},destroy:function(){m=
+h=k=null;delete a[b]},info:function(){return D({},h,{size:g})}}}var a={};b.info=function(){var b={};r(a,function(a,e){b[e]=a.info()});return b};b.get=function(b){return a[b]};return b}}function Se(){this.$get=["$cacheFactory",function(b){return b("templates")}]}function uc(b,a){function c(a,b){var c=/^\s*([@&]|=(\*?))(\??)\s*(\w*)\s*$/,d={};r(a,function(a,e){var f=a.match(c);if(!f)throw ka("iscp",b,e,a);d[e]={mode:f[1][0],collection:"*"===f[2],optional:"?"===f[3],attrName:f[4]||e}});return d}var d=
+{},e=/^\s*directive\:\s*([\w\-]+)\s+(.*)$/,f=/(([\w\-]+)(?:\:([^;]+))?;?)/,g=Dd("ngSrc,ngSrcset,src,srcset"),h=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,k=/^(on[a-z]+|formaction)$/;this.directive=function p(a,e){La(a,"directive");I(a)?(Ob(e,"directiveFactory"),d.hasOwnProperty(a)||(d[a]=[],b.factory(a+"Directive",["$injector","$exceptionHandler",function(b,e){var f=[];r(d[a],function(d,g){try{var h=b.invoke(d);F(h)?h={compile:ca(h)}:!h.compile&&h.link&&(h.compile=ca(h.link));h.priority=h.priority||0;h.index=
+g;h.name=h.name||a;h.require=h.require||h.controller&&h.name;h.restrict=h.restrict||"EA";K(h.scope)&&(h.$$isolateBindings=c(h.scope,h.name));f.push(h)}catch(k){e(k)}});return f}])),d[a].push(e)):r(a,kc(p));return this};this.aHrefSanitizationWhitelist=function(b){return z(b)?(a.aHrefSanitizationWhitelist(b),this):a.aHrefSanitizationWhitelist()};this.imgSrcSanitizationWhitelist=function(b){return z(b)?(a.imgSrcSanitizationWhitelist(b),this):a.imgSrcSanitizationWhitelist()};var l=!0;this.debugInfoEnabled=
+function(a){return z(a)?(l=a,this):l};this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$document","$sce","$animate","$$sanitizeUri",function(a,b,c,q,N,n,v,w,O,E,H){function M(a,b){try{a.addClass(b)}catch(c){}}function C(a,b,c,d,e){a instanceof B||(a=B(a));r(a,function(b,c){b.nodeType==mb&&b.nodeValue.match(/\S+/)&&(a[c]=B(b).wrap("<span></span>").parent()[0])});var f=ea(a,b,a,c,d,e);C.$$addScopeClass(a);var g=null;return function(b,
+c,d){Ob(b,"scope");d=d||{};var e=d.parentBoundTranscludeFn,h=d.transcludeControllers;d=d.futureParentElement;e&&e.$$boundTransclude&&(e=e.$$boundTransclude);g||(g=(d=d&&d[0])?"foreignobject"!==ta(d)&&d.toString().match(/SVG/)?"svg":"html":"html");d="html"!==g?B(U(g,B("<div>").append(a).html())):c?Ka.clone.call(a):a;if(h)for(var k in h)d.data("$"+k+"Controller",h[k].instance);C.$$addScopeInfo(d,b);c&&c(d,b);f&&f(b,d,d,e);return d}}function ea(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,q,s,n,w;if(p)for(w=
+Array(c.length),q=0;q<h.length;q+=3)f=h[q],w[f]=c[f];else w=c;q=0;for(s=h.length;q<s;)k=w[h[q++]],c=h[q++],f=h[q++],c?(c.scope?(l=a.$new(),C.$$addScopeInfo(B(k),l)):l=a,n=c.transcludeOnThisElement?L(a,c.transclude,e,c.elementTranscludeOnThisElement):!c.templateOnThisElement&&e?e:!e&&b?L(a,b):null,c(f,l,k,d,n)):f&&f(a,k.childNodes,u,e)}for(var h=[],k,l,q,s,p,n=0;n<a.length;n++){k=new X;l=W(a[n],[],k,0===n?d:u,e);(f=l.length?aa(l,a[n],k,b,c,null,[],[],f):null)&&f.scope&&C.$$addScopeClass(k.$$element);
+k=f&&f.terminal||!(q=a[n].childNodes)||!q.length?null:ea(q,f?(f.transcludeOnThisElement||!f.templateOnThisElement)&&f.transclude:b);if(f||k)h.push(n,f,k),s=!0,p=p||f;f=null}return s?g:null}function L(a,b,c,d){return function(d,e,f,g,h){d||(d=a.$new(!1,h),d.$$transcluded=!0);return b(d,e,{parentBoundTranscludeFn:c,transcludeControllers:f,futureParentElement:g})}}function W(b,c,g,h,k){var l=g.$attr,q;switch(b.nodeType){case na:da(c,wa(ta(b)),"E",h,k);for(var s,n,w,N=b.attributes,t=0,O=N&&N.length;t<
+O;t++){var H=!1,v=!1;s=N[t];q=s.name;s=P(s.value);n=wa(q);if(w=Ga.test(n))q=Mb(n.substr(6),"-");var M=n.replace(/(Start|End)$/,""),E;a:{var C=M;if(d.hasOwnProperty(C)){E=void 0;for(var C=a.get(C+"Directive"),W=0,r=C.length;W<r;W++)if(E=C[W],E.multiElement){E=!0;break a}}E=!1}E&&n===M+"Start"&&(H=q,v=q.substr(0,q.length-5)+"end",q=q.substr(0,q.length-6));n=wa(q.toLowerCase());l[n]=q;if(w||!g.hasOwnProperty(n))g[n]=s,Jc(b,n)&&(g[n]=!0);S(b,c,s,n,w);da(c,n,"A",h,k,H,v)}b=b.className;if(I(b)&&""!==b)for(;q=
+f.exec(b);)n=wa(q[2]),da(c,n,"C",h,k)&&(g[n]=P(q[3])),b=b.substr(q.index+q[0].length);break;case mb:T(c,b.nodeValue);break;case 8:try{if(q=e.exec(b.nodeValue))n=wa(q[1]),da(c,n,"M",h,k)&&(g[n]=P(q[2]))}catch(Q){}}c.sort(A);return c}function ba(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ka("uterdir",b,c);a.nodeType==na&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--);d.push(a);a=a.nextSibling}while(0<e)}else d.push(a);return B(d)}function Q(a,b,c){return function(d,
+e,f,g,h){e=ba(e[0],b,c);return a(d,e,f,g,h)}}function aa(a,d,e,f,g,k,l,q,p){function w(a,b,c,d){if(a){c&&(a=Q(a,c,d));a.require=J.require;a.directiveName=ga;if(L===J||J.$$isolateScope)a=Y(a,{isolateScope:!0});l.push(a)}if(b){c&&(b=Q(b,c,d));b.require=J.require;b.directiveName=ga;if(L===J||J.$$isolateScope)b=Y(b,{isolateScope:!0});q.push(b)}}function O(a,b,c,d){var e,f="data",g=!1,k=c,l;if(I(b)){l=b.match(h);b=b.substring(l[0].length);l[3]&&(l[1]?l[3]=null:l[1]=l[3]);"^"===l[1]?f="inheritedData":"^^"===
+l[1]&&(f="inheritedData",k=c.parent());"?"===l[2]&&(g=!0);e=null;d&&"data"===f&&(e=d[b])&&(e=e.instance);e=e||k[f]("$"+b+"Controller");if(!e&&!g)throw ka("ctreq",b,a);return e||null}y(b)&&(e=[],r(b,function(b){e.push(O(a,b,c,d))}));return e}function H(a,c,f,g,h){function k(a,b,c){var d;Ta(a)||(c=b,b=a,a=u);D&&(d=M);c||(c=D?W.parent():W);return h(a,b,d,c,Xb)}var p,w,t,v,M,db,W,Q;d===f?(Q=e,W=e.$$element):(W=B(f),Q=new X(W,e));L&&(v=c.$new(!0));h&&(db=k,db.$$boundTransclude=h);E&&(ea={},M={},r(E,function(a){var b=
+{$scope:a===L||a.$$isolateScope?v:c,$element:W,$attrs:Q,$transclude:db};t=a.controller;"@"==t&&(t=Q[a.name]);b=n(t,b,!0,a.controllerAs);M[a.name]=b;D||W.data("$"+a.name+"Controller",b.instance);ea[a.name]=b}));if(L){C.$$addScopeInfo(W,v,!0,!(aa&&(aa===L||aa===L.$$originalDirective)));C.$$addScopeClass(W,!0);g=ea&&ea[L.name];var ba=v;g&&g.identifier&&!0===L.bindToController&&(ba=g.instance);r(v.$$isolateBindings=L.$$isolateBindings,function(a,d){var e=a.attrName,f=a.optional,g,h,k,l;switch(a.mode){case "@":Q.$observe(e,
+function(a){ba[d]=a});Q.$$observers[e].$$scope=c;Q[e]&&(ba[d]=b(Q[e])(c));break;case "=":if(f&&!Q[e])break;h=N(Q[e]);l=h.literal?pa:function(a,b){return a===b||a!==a&&b!==b};k=h.assign||function(){g=ba[d]=h(c);throw ka("nonassign",Q[e],L.name);};g=ba[d]=h(c);f=function(a){l(a,ba[d])||(l(a,g)?k(c,a=ba[d]):ba[d]=a);return g=a};f.$stateful=!0;f=a.collection?c.$watchCollection(Q[e],f):c.$watch(N(Q[e],f),null,h.literal);v.$on("$destroy",f);break;case "&":h=N(Q[e]),ba[d]=function(a){return h(c,a)}}})}ea&&
+(r(ea,function(a){a()}),ea=null);g=0;for(p=l.length;g<p;g++)w=l[g],Z(w,w.isolateScope?v:c,W,Q,w.require&&O(w.directiveName,w.require,W,M),db);var Xb=c;L&&(L.template||null===L.templateUrl)&&(Xb=v);a&&a(Xb,f.childNodes,u,h);for(g=q.length-1;0<=g;g--)w=q[g],Z(w,w.isolateScope?v:c,W,Q,w.require&&O(w.directiveName,w.require,W,M),db)}p=p||{};for(var v=-Number.MAX_VALUE,M,E=p.controllerDirectives,ea,L=p.newIsolateScopeDirective,aa=p.templateDirective,da=p.nonTlbTranscludeDirective,x=!1,Na=!1,D=p.hasElementTranscludeDirective,
+T=e.$$element=B(d),J,ga,A,Ga=f,za,R=0,S=a.length;R<S;R++){J=a[R];var zb=J.$$start,$=J.$$end;zb&&(T=ba(d,zb,$));A=u;if(v>J.priority)break;if(A=J.scope)J.templateUrl||(K(A)?(ya("new/isolated scope",L||M,J,T),L=J):ya("new/isolated scope",L,J,T)),M=M||J;ga=J.name;!J.templateUrl&&J.controller&&(A=J.controller,E=E||{},ya("'"+ga+"' controller",E[ga],J,T),E[ga]=J);if(A=J.transclude)x=!0,J.$$tlb||(ya("transclusion",da,J,T),da=J),"element"==A?(D=!0,v=J.priority,A=T,T=e.$$element=B(V.createComment(" "+ga+": "+
+e[ga]+" ")),d=T[0],Ab(g,Ya.call(A,0),d),Ga=C(A,f,v,k&&k.name,{nonTlbTranscludeDirective:da})):(A=B(Rb(d)).contents(),T.empty(),Ga=C(A,f));if(J.template)if(Na=!0,ya("template",aa,J,T),aa=J,A=F(J.template)?J.template(T,e):J.template,A=Pc(A),J.replace){k=J;A=Pb.test(A)?Qc(U(J.templateNamespace,P(A))):[];d=A[0];if(1!=A.length||d.nodeType!==na)throw ka("tplrt",ga,"");Ab(g,T,d);S={$attr:{}};A=W(d,[],S);var mf=a.splice(R+1,a.length-(R+1));L&&z(A);a=a.concat(A).concat(mf);Oc(e,S);S=a.length}else T.html(A);
+if(J.templateUrl)Na=!0,ya("template",aa,J,T),aa=J,J.replace&&(k=J),H=G(a.splice(R,a.length-R),T,e,g,x&&Ga,l,q,{controllerDirectives:E,newIsolateScopeDirective:L,templateDirective:aa,nonTlbTranscludeDirective:da}),S=a.length;else if(J.compile)try{za=J.compile(T,e,Ga),F(za)?w(null,za,zb,$):za&&w(za.pre,za.post,zb,$)}catch(ca){c(ca,va(T))}J.terminal&&(H.terminal=!0,v=Math.max(v,J.priority))}H.scope=M&&!0===M.scope;H.transcludeOnThisElement=x;H.elementTranscludeOnThisElement=D;H.templateOnThisElement=
+Na;H.transclude=Ga;p.hasElementTranscludeDirective=D;return H}function z(a){for(var b=0,c=a.length;b<c;b++){var d=b,e;e=D(Object.create(a[b]),{$$isolateScope:!0});a[d]=e}}function da(b,e,f,g,h,k,l){if(e===h)return null;h=null;if(d.hasOwnProperty(e)){var q;e=a.get(e+"Directive");for(var s=0,n=e.length;s<n;s++)try{if(q=e[s],(g===u||g>q.priority)&&-1!=q.restrict.indexOf(f)){if(k){var w={$$start:k,$$end:l};q=D(Object.create(q),w)}b.push(q);h=q}}catch(N){c(N)}}return h}function Oc(a,b){var c=b.$attr,d=
+a.$attr,e=a.$$element;r(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});r(b,function(b,f){"class"==f?(M(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):"style"==f?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+";":"")+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function G(a,b,c,d,e,f,g,h){var k=[],l,s,p=b[0],n=a.shift(),w=D({},n,{templateUrl:null,transclude:null,replace:null,$$originalDirective:n}),N=F(n.templateUrl)?
+n.templateUrl(b,c):n.templateUrl,t=n.templateNamespace;b.empty();q(O.getTrustedResourceUrl(N)).then(function(q){var v,O;q=Pc(q);if(n.replace){q=Pb.test(q)?Qc(U(t,P(q))):[];v=q[0];if(1!=q.length||v.nodeType!==na)throw ka("tplrt",n.name,N);q={$attr:{}};Ab(d,b,v);var H=W(v,[],q);K(n.scope)&&z(H);a=H.concat(a);Oc(c,q)}else v=p,b.html(q);a.unshift(w);l=aa(a,v,c,e,b,n,f,g,h);r(d,function(a,c){a==v&&(d[c]=b[0])});for(s=ea(b[0].childNodes,e);k.length;){q=k.shift();O=k.shift();var E=k.shift(),C=k.shift(),
+H=b[0];if(!q.$$destroyed){if(O!==p){var Q=O.className;h.hasElementTranscludeDirective&&n.replace||(H=Rb(v));Ab(E,B(O),H);M(B(H),Q)}O=l.transcludeOnThisElement?L(q,l.transclude,C):C;l(s,q,H,d,O)}}k=null});return function(a,b,c,d,e){a=e;b.$$destroyed||(k?k.push(b,c,d,a):(l.transcludeOnThisElement&&(a=L(b,l.transclude,e)),l(s,b,c,d,a)))}}function A(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.name<b.name?-1:1:a.index-b.index}function ya(a,b,c,d){if(b)throw ka("multidir",b.name,c.name,
+a,va(d));}function T(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:function(a){a=a.parent();var b=!!a.length;b&&C.$$addBindingClass(a);return function(a,c){var e=c.parent();b||C.$$addBindingClass(e);C.$$addBindingInfo(e,d.expressions);a.$watch(d,function(a){c[0].nodeValue=a})}}})}function U(a,b){a=R(a||"html");switch(a){case "svg":case "math":var c=V.createElement("div");c.innerHTML="<"+a+">"+b+"</"+a+">";return c.childNodes[0].childNodes;default:return b}}function za(a,b){if("srcdoc"==b)return O.HTML;
+var c=ta(a);if("xlinkHref"==b||"form"==c&&"action"==b||"img"!=c&&("src"==b||"ngSrc"==b))return O.RESOURCE_URL}function S(a,c,d,e,f){var h=b(d,!0);if(h){if("multiple"===e&&"select"===ta(a))throw ka("selmulti",va(a));c.push({priority:100,compile:function(){return{pre:function(c,d,l){d=l.$$observers||(l.$$observers={});if(k.test(e))throw ka("nodomevents");l[e]&&(h=b(l[e],!0,za(a,e),g[e]||f))&&(l[e]=h(c),(d[e]||(d[e]=[])).$$inter=!0,(l.$$observers&&l.$$observers[e].$$scope||c).$watch(h,function(a,b){"class"===
+e&&a!=b?l.$updateClass(a,b):l.$set(e,a)}))}}}})}}function Ab(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g<h;g++)if(a[g]==d){a[g++]=c;h=g+e-1;for(var k=a.length;g<k;g++,h++)h<k?a[g]=a[h]:delete a[g];a.length-=e-1;a.context===d&&(a.context=c);break}f&&f.replaceChild(c,d);a=V.createDocumentFragment();a.appendChild(d);B(c).data(B(d).data());qa?(Nb=!0,qa.cleanData([d])):delete B.cache[d[B.expando]];d=1;for(e=b.length;d<e;d++)f=b[d],B(f).remove(),a.appendChild(f),delete b[d];
+b[0]=c;b.length=1}function Y(a,b){return D(function(){return a.apply(null,arguments)},a,b)}function Z(a,b,d,e,f,g){try{a(b,d,e,f,g)}catch(h){c(h,va(d))}}var X=function(a,b){if(b){var c=Object.keys(b),d,e,f;d=0;for(e=c.length;d<e;d++)f=c[d],this[f]=b[f]}else this.$attr={};this.$$element=a};X.prototype={$normalize:wa,$addClass:function(a){a&&0<a.length&&E.addClass(this.$$element,a)},$removeClass:function(a){a&&0<a.length&&E.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=Rc(a,b);c&&
+c.length&&E.addClass(this.$$element,c);(c=Rc(b,a))&&c.length&&E.removeClass(this.$$element,c)},$set:function(a,b,d,e){var f=this.$$element[0],g=Jc(f,a),h=ff(f,a),f=a;g?(this.$$element.prop(a,b),e=g):h&&(this[h]=b,f=h);this[a]=b;e?this.$attr[a]=e:(e=this.$attr[a])||(this.$attr[a]=e=Mb(a,"-"));g=ta(this.$$element);if("a"===g&&"href"===a||"img"===g&&"src"===a)this[a]=b=H(b,"src"===a);else if("img"===g&&"srcset"===a){for(var g="",h=P(b),k=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,k=/\s/.test(h)?k:/(,)/,h=
+h.split(k),k=Math.floor(h.length/2),l=0;l<k;l++)var q=2*l,g=g+H(P(h[q]),!0),g=g+(" "+P(h[q+1]));h=P(h[2*l]).split(/\s/);g+=H(P(h[0]),!0);2===h.length&&(g+=" "+P(h[1]));this[a]=b=g}!1!==d&&(null===b||b===u?this.$$element.removeAttr(e):this.$$element.attr(e,b));(a=this.$$observers)&&r(a[f],function(a){try{a(b)}catch(d){c(d)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers=ia()),e=d[a]||(d[a]=[]);e.push(b);v.$evalAsync(function(){!e.$$inter&&c.hasOwnProperty(a)&&b(c[a])});return function(){Va(e,
+b)}}};var Na=b.startSymbol(),ga=b.endSymbol(),Pc="{{"==Na||"}}"==ga?oa:function(a){return a.replace(/\{\{/g,Na).replace(/}}/g,ga)},Ga=/^ngAttr[A-Z]/;C.$$addBindingInfo=l?function(a,b){var c=a.data("$binding")||[];y(b)?c=c.concat(b):c.push(b);a.data("$binding",c)}:x;C.$$addBindingClass=l?function(a){M(a,"ng-binding")}:x;C.$$addScopeInfo=l?function(a,b,c,d){a.data(c?d?"$isolateScopeNoTemplate":"$isolateScope":"$scope",b)}:x;C.$$addScopeClass=l?function(a,b){M(a,b?"ng-isolate-scope":"ng-scope")}:x;return C}]}
+function wa(b){return bb(b.replace(nf,""))}function Rc(b,a){var c="",d=b.split(/\s+/),e=a.split(/\s+/),f=0;a:for(;f<d.length;f++){for(var g=d[f],h=0;h<e.length;h++)if(g==e[h])continue a;c+=(0<c.length?" ":"")+g}return c}function Qc(b){b=B(b);var a=b.length;if(1>=a)return b;for(;a--;)8===b[a].nodeType&&of.call(b,a,1);return b}function Ce(){var b={},a=!1,c=/^(\S+)(\s+as\s+(\w+))?$/;this.register=function(a,c){La(a,"controller");K(a)?D(b,a):b[a]=c};this.allowGlobals=function(){a=!0};this.$get=["$injector",
+"$window",function(d,e){function f(a,b,c,d){if(!a||!K(a.$scope))throw A("$controller")("noscp",d,b);a.$scope[b]=c}return function(g,h,k,l){var m,p,s;k=!0===k;l&&I(l)&&(s=l);I(g)&&(l=g.match(c),p=l[1],s=s||l[3],g=b.hasOwnProperty(p)?b[p]:tc(h.$scope,p,!0)||(a?tc(e,p,!0):u),pb(g,p,!0));if(k)return k=(y(g)?g[g.length-1]:g).prototype,m=Object.create(k),s&&f(h,s,m,p||g.name),D(function(){d.invoke(g,m,h,p);return m},{instance:m,identifier:s});m=d.instantiate(g,h,p);s&&f(h,s,m,p||g.name);return m}}]}function De(){this.$get=
+["$window",function(b){return B(b.document)}]}function Ee(){this.$get=["$log",function(b){return function(a,c){b.error.apply(b,arguments)}}]}function Yb(b,a){if(I(b)){b=b.replace(pf,"");var c=a("Content-Type");if(c&&0===c.indexOf(Sc)&&b.trim()||qf.test(b)&&rf.test(b))b=oc(b)}return b}function Tc(b){var a=ia(),c,d,e;if(!b)return a;r(b.split("\n"),function(b){e=b.indexOf(":");c=R(P(b.substr(0,e)));d=P(b.substr(e+1));c&&(a[c]=a[c]?a[c]+", "+d:d)});return a}function Uc(b){var a=K(b)?b:u;return function(c){a||
+(a=Tc(b));return c?(c=a[R(c)],void 0===c&&(c=null),c):a}}function Vc(b,a,c){if(F(c))return c(b,a);r(c,function(c){b=c(b,a)});return b}function He(){var b=this.defaults={transformResponse:[Yb],transformRequest:[function(a){return K(a)&&"[object File]"!==Ja.call(a)&&"[object Blob]"!==Ja.call(a)?Za(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ua(Zb),put:ua(Zb),patch:ua(Zb)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN"},a=!1;this.useApplyAsync=function(b){return z(b)?
+(a=!!b,this):a};var c=this.interceptors=[];this.$get=["$httpBackend","$browser","$cacheFactory","$rootScope","$q","$injector",function(d,e,f,g,h,k){function l(a){function c(a){var b=D({},a);b.data=a.data?Vc(a.data,a.headers,d.transformResponse):a.data;a=a.status;return 200<=a&&300>a?b:h.reject(b)}var d={method:"get",transformRequest:b.transformRequest,transformResponse:b.transformResponse},e=function(a){var c=b.headers,d=D({},a.headers),e,f,c=D({},c.common,c[R(a.method)]);a:for(e in c){a=R(e);for(f in d)if(R(f)===
+a)continue a;d[e]=c[e]}(function(a){var b;r(a,function(c,d){F(c)&&(b=c(),null!=b?a[d]=b:delete a[d])})})(d);return d}(a);if(!ha.isObject(a))throw A("$http")("badreq",a);D(d,a);d.headers=e;d.method=rb(d.method);var f=[function(a){e=a.headers;var d=Vc(a.data,Uc(e),a.transformRequest);G(d)&&r(e,function(a,b){"content-type"===R(b)&&delete e[b]});G(a.withCredentials)&&!G(b.withCredentials)&&(a.withCredentials=b.withCredentials);return m(a,d,e).then(c,c)},u],g=h.when(d);for(r(t,function(a){(a.request||
+a.requestError)&&f.unshift(a.request,a.requestError);(a.response||a.responseError)&&f.push(a.response,a.responseError)});f.length;){a=f.shift();var k=f.shift(),g=g.then(a,k)}g.success=function(a){g.then(function(b){a(b.data,b.status,b.headers,d)});return g};g.error=function(a){g.then(null,function(b){a(b.data,b.status,b.headers,d)});return g};return g}function m(c,f,k){function m(b,c,d,e){function f(){w(c,b,d,e)}M&&(200<=b&&300>b?M.put(r,[b,c,Tc(d),e]):M.remove(r));a?g.$applyAsync(f):(f(),g.$$phase||
+g.$apply())}function w(a,b,d,e){b=Math.max(b,0);(200<=b&&300>b?E.resolve:E.reject)({data:a,status:b,headers:Uc(d),config:c,statusText:e})}function t(){var a=l.pendingRequests.indexOf(c);-1!==a&&l.pendingRequests.splice(a,1)}var E=h.defer(),H=E.promise,M,C,r=p(c.url,c.params);l.pendingRequests.push(c);H.then(t,t);!c.cache&&!b.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(M=K(c.cache)?c.cache:K(b.cache)?b.cache:s);if(M)if(C=M.get(r),z(C)){if(C&&F(C.then))return C.then(t,t),C;y(C)?w(C[1],
+C[0],ua(C[2]),C[3]):w(C,200,{},"OK")}else M.put(r,H);G(C)&&((C=Wc(c.url)?e.cookies()[c.xsrfCookieName||b.xsrfCookieName]:u)&&(k[c.xsrfHeaderName||b.xsrfHeaderName]=C),d(c.method,r,f,m,k,c.timeout,c.withCredentials,c.responseType));return H}function p(a,b){if(!b)return a;var c=[];Bd(b,function(a,b){null===a||G(a)||(y(a)||(a=[a]),r(a,function(a){K(a)&&(a=fa(a)?a.toISOString():Za(a));c.push(Da(b)+"="+Da(a))}))});0<c.length&&(a+=(-1==a.indexOf("?")?"?":"&")+c.join("&"));return a}var s=f("$http"),t=[];
+r(c,function(a){t.unshift(I(a)?k.get(a):k.invoke(a))});l.pendingRequests=[];(function(a){r(arguments,function(a){l[a]=function(b,c){return l(D(c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){r(arguments,function(a){l[a]=function(b,c,d){return l(D(d||{},{method:a,url:b,data:c}))}})})("post","put","patch");l.defaults=b;return l}]}function sf(){return new U.XMLHttpRequest}function Ie(){this.$get=["$browser","$window","$document",function(b,a,c){return tf(b,sf,b.defer,a.angular.callbacks,
+c[0])}]}function tf(b,a,c,d,e){function f(a,b,c){var f=e.createElement("script"),m=null;f.type="text/javascript";f.src=a;f.async=!0;m=function(a){f.removeEventListener("load",m,!1);f.removeEventListener("error",m,!1);e.body.removeChild(f);f=null;var g=-1,t="unknown";a&&("load"!==a.type||d[b].called||(a={type:"error"}),t=a.type,g="error"===a.type?404:200);c&&c(g,t)};f.addEventListener("load",m,!1);f.addEventListener("error",m,!1);e.body.appendChild(f);return m}return function(e,h,k,l,m,p,s,t){function q(){v&&
+v();w&&w.abort()}function N(a,d,e,f,g){E!==u&&c.cancel(E);v=w=null;a(d,e,f,g);b.$$completeOutstandingRequest(x)}b.$$incOutstandingRequestCount();h=h||b.url();if("jsonp"==R(e)){var n="_"+(d.counter++).toString(36);d[n]=function(a){d[n].data=a;d[n].called=!0};var v=f(h.replace("JSON_CALLBACK","angular.callbacks."+n),n,function(a,b){N(l,a,d[n].data,"",b);d[n]=x})}else{var w=a();w.open(e,h,!0);r(m,function(a,b){z(a)&&w.setRequestHeader(b,a)});w.onload=function(){var a=w.statusText||"",b="response"in w?
+w.response:w.responseText,c=1223===w.status?204:w.status;0===c&&(c=b?200:"file"==Aa(h).protocol?404:0);N(l,c,b,w.getAllResponseHeaders(),a)};e=function(){N(l,-1,null,null,"")};w.onerror=e;w.onabort=e;s&&(w.withCredentials=!0);if(t)try{w.responseType=t}catch(O){if("json"!==t)throw O;}w.send(k||null)}if(0<p)var E=c(q,p);else p&&F(p.then)&&p.then(q)}}function Fe(){var b="{{",a="}}";this.startSymbol=function(a){return a?(b=a,this):b};this.endSymbol=function(b){return b?(a=b,this):a};this.$get=["$parse",
+"$exceptionHandler","$sce",function(c,d,e){function f(a){return"\\\\\\"+a}function g(f,g,t,q){function N(c){return c.replace(l,b).replace(m,a)}function n(a){try{var b=a;a=t?e.getTrusted(t,b):e.valueOf(b);var c;if(q&&!z(a))c=a;else if(null==a)c="";else{switch(typeof a){case "string":break;case "number":a=""+a;break;default:a=Za(a)}c=a}return c}catch(g){c=$b("interr",f,g.toString()),d(c)}}q=!!q;for(var v,w,O=0,E=[],H=[],M=f.length,C=[],r=[];O<M;)if(-1!=(v=f.indexOf(b,O))&&-1!=(w=f.indexOf(a,v+h)))O!==
+v&&C.push(N(f.substring(O,v))),O=f.substring(v+h,w),E.push(O),H.push(c(O,n)),O=w+k,r.push(C.length),C.push("");else{O!==M&&C.push(N(f.substring(O)));break}if(t&&1<C.length)throw $b("noconcat",f);if(!g||E.length){var L=function(a){for(var b=0,c=E.length;b<c;b++){if(q&&G(a[b]))return;C[r[b]]=a[b]}return C.join("")};return D(function(a){var b=0,c=E.length,e=Array(c);try{for(;b<c;b++)e[b]=H[b](a);return L(e)}catch(g){a=$b("interr",f,g.toString()),d(a)}},{exp:f,expressions:E,$$watchDelegate:function(a,
+b,c){var d;return a.$watchGroup(H,function(c,e){var f=L(c);F(b)&&b.call(this,f,c!==e?d:f,a);d=f},c)}})}}var h=b.length,k=a.length,l=new RegExp(b.replace(/./g,f),"g"),m=new RegExp(a.replace(/./g,f),"g");g.startSymbol=function(){return b};g.endSymbol=function(){return a};return g}]}function Ge(){this.$get=["$rootScope","$window","$q","$$q",function(b,a,c,d){function e(e,h,k,l){var m=a.setInterval,p=a.clearInterval,s=0,t=z(l)&&!l,q=(t?d:c).defer(),N=q.promise;k=z(k)?k:0;N.then(null,null,e);N.$$intervalId=
+m(function(){q.notify(s++);0<k&&s>=k&&(q.resolve(s),p(N.$$intervalId),delete f[N.$$intervalId]);t||b.$apply()},h);f[N.$$intervalId]=q;return N}var f={};e.cancel=function(b){return b&&b.$$intervalId in f?(f[b.$$intervalId].reject("canceled"),a.clearInterval(b.$$intervalId),delete f[b.$$intervalId],!0):!1};return e}]}function Od(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,
+lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"\u00a4",posSuf:"",negPre:"(\u00a4",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January February March April May June July August September October November December".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",
+fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return 1===b?"one":"other"}}}}function ac(b){b=b.split("/");for(var a=b.length;a--;)b[a]=nb(b[a]);return b.join("/")}function Xc(b,a){var c=Aa(b);a.$$protocol=c.protocol;a.$$host=c.hostname;a.$$port=$(c.port)||uf[c.protocol]||null}function Yc(b,a){var c="/"!==b.charAt(0);c&&(b="/"+b);var d=Aa(b);a.$$path=decodeURIComponent(c&&"/"===d.pathname.charAt(0)?
+d.pathname.substring(1):d.pathname);a.$$search=qc(d.search);a.$$hash=decodeURIComponent(d.hash);a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function xa(b,a){if(0===a.indexOf(b))return a.substr(b.length)}function Fa(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function bc(b){return b.substr(0,Fa(b).lastIndexOf("/")+1)}function cc(b,a){this.$$html5=!0;a=a||"";var c=bc(b);Xc(b,this);this.$$parse=function(a){var b=xa(c,a);if(!I(b))throw eb("ipthprfx",a,c);Yc(b,this);this.$$path||
+(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Kb(this.$$search),b=this.$$hash?"#"+nb(this.$$hash):"";this.$$url=ac(this.$$path)+(a?"?"+a:"")+b;this.$$absUrl=c+this.$$url.substr(1)};this.$$parseLinkUrl=function(d,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;(f=xa(b,d))!==u?(g=f,g=(f=xa(a,f))!==u?c+(xa("/",f)||f):b+g):(f=xa(c,d))!==u?g=c+f:c==d+"/"&&(g=c);g&&this.$$parse(g);return!!g}}function dc(b,a){var c=bc(b);Xc(b,this);this.$$parse=function(d){var e=xa(b,d)||
+xa(c,d),e="#"==e.charAt(0)?xa(a,e):this.$$html5?e:"";if(!I(e))throw eb("ihshprfx",d,a);Yc(e,this);d=this.$$path;var f=/^\/[A-Z]:(\/.*)/;0===e.indexOf(b)&&(e=e.replace(b,""));f.exec(e)||(d=(e=f.exec(d))?e[1]:d);this.$$path=d;this.$$compose()};this.$$compose=function(){var c=Kb(this.$$search),e=this.$$hash?"#"+nb(this.$$hash):"";this.$$url=ac(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+(this.$$url?a+this.$$url:"")};this.$$parseLinkUrl=function(a,c){return Fa(b)==Fa(a)?(this.$$parse(a),!0):!1}}function Zc(b,
+a){this.$$html5=!0;dc.apply(this,arguments);var c=bc(b);this.$$parseLinkUrl=function(d,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;b==Fa(d)?f=d:(g=xa(c,d))?f=b+a+g:c===d+"/"&&(f=c);f&&this.$$parse(f);return!!f};this.$$compose=function(){var c=Kb(this.$$search),e=this.$$hash?"#"+nb(this.$$hash):"";this.$$url=ac(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+a+this.$$url}}function Bb(b){return function(){return this[b]}}function $c(b,a){return function(c){if(G(c))return this[b];this[b]=
+a(c);this.$$compose();return this}}function Je(){var b="",a={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(a){return z(a)?(b=a,this):b};this.html5Mode=function(b){return Ua(b)?(a.enabled=b,this):K(b)?(Ua(b.enabled)&&(a.enabled=b.enabled),Ua(b.requireBase)&&(a.requireBase=b.requireBase),Ua(b.rewriteLinks)&&(a.rewriteLinks=b.rewriteLinks),this):a};this.$get=["$rootScope","$browser","$sniffer","$rootElement",function(c,d,e,f){function g(a,b,c){var e=k.url(),f=k.$$state;try{d.url(a,
+b,c),k.$$state=d.state()}catch(g){throw k.url(e),k.$$state=f,g;}}function h(a,b){c.$broadcast("$locationChangeSuccess",k.absUrl(),a,k.$$state,b)}var k,l;l=d.baseHref();var m=d.url(),p;if(a.enabled){if(!l&&a.requireBase)throw eb("nobase");p=m.substring(0,m.indexOf("/",m.indexOf("//")+2))+(l||"/");l=e.history?cc:Zc}else p=Fa(m),l=dc;k=new l(p,"#"+b);k.$$parseLinkUrl(m,m);k.$$state=d.state();var s=/^\s*(javascript|mailto):/i;f.on("click",function(b){if(a.rewriteLinks&&!b.ctrlKey&&!b.metaKey&&2!=b.which){for(var e=
+B(b.target);"a"!==ta(e[0]);)if(e[0]===f[0]||!(e=e.parent())[0])return;var g=e.prop("href"),h=e.attr("href")||e.attr("xlink:href");K(g)&&"[object SVGAnimatedString]"===g.toString()&&(g=Aa(g.animVal).href);s.test(g)||!g||e.attr("target")||b.isDefaultPrevented()||!k.$$parseLinkUrl(g,h)||(b.preventDefault(),k.absUrl()!=d.url()&&(c.$apply(),U.angular["ff-684208-preventDefault"]=!0))}});k.absUrl()!=m&&d.url(k.absUrl(),!0);var t=!0;d.onUrlChange(function(a,b){c.$evalAsync(function(){var d=k.absUrl(),e=k.$$state,
+f;k.$$parse(a);k.$$state=b;f=c.$broadcast("$locationChangeStart",a,d,b,e).defaultPrevented;k.absUrl()===a&&(f?(k.$$parse(d),k.$$state=e,g(d,!1,e)):(t=!1,h(d,e)))});c.$$phase||c.$digest()});c.$watch(function(){var a=d.url(),b=d.state(),f=k.$$replace,l=a!==k.absUrl()||k.$$html5&&e.history&&b!==k.$$state;if(t||l)t=!1,c.$evalAsync(function(){var d=k.absUrl(),e=c.$broadcast("$locationChangeStart",d,a,k.$$state,b).defaultPrevented;k.absUrl()===d&&(e?(k.$$parse(a),k.$$state=b):(l&&g(d,f,b===k.$$state?null:
+k.$$state),h(a,b)))});k.$$replace=!1});return k}]}function Ke(){var b=!0,a=this;this.debugEnabled=function(a){return z(a)?(b=a,this):b};this.$get=["$window",function(c){function d(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=c.console||{},e=b[a]||b.log||x;a=!1;try{a=!!e.apply}catch(k){}return a?function(){var a=[];r(arguments,function(b){a.push(d(b))});
+return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function ra(b,a){if("__defineGetter__"===b||"__defineSetter__"===b||"__lookupGetter__"===b||"__lookupSetter__"===b||"__proto__"===b)throw la("isecfld",a);return b}function sa(b,a){if(b){if(b.constructor===b)throw la("isecfn",a);if(b.window===b)throw la("isecwindow",a);if(b.children&&(b.nodeName||
+b.prop&&b.attr&&b.find))throw la("isecdom",a);if(b===Object)throw la("isecobj",a);}return b}function ec(b){return b.constant}function Oa(b,a,c,d){sa(b,d);a=a.split(".");for(var e,f=0;1<a.length;f++){e=ra(a.shift(),d);var g=sa(b[e],d);g||(g={},b[e]=g);b=g}e=ra(a.shift(),d);sa(b[e],d);return b[e]=c}function Pa(b){return"constructor"==b}function ad(b,a,c,d,e,f,g){ra(b,f);ra(a,f);ra(c,f);ra(d,f);ra(e,f);var h=function(a){return sa(a,f)},k=g||Pa(b)?h:oa,l=g||Pa(a)?h:oa,m=g||Pa(c)?h:oa,p=g||Pa(d)?h:oa,
+s=g||Pa(e)?h:oa;return function(f,g){var h=g&&g.hasOwnProperty(b)?g:f;if(null==h)return h;h=k(h[b]);if(!a)return h;if(null==h)return u;h=l(h[a]);if(!c)return h;if(null==h)return u;h=m(h[c]);if(!d)return h;if(null==h)return u;h=p(h[d]);return e?null==h?u:h=s(h[e]):h}}function vf(b,a){return function(c,d){return b(c,d,sa,a)}}function bd(b,a,c){var d=a.expensiveChecks,e=d?wf:xf,f=e[b];if(f)return f;var g=b.split("."),h=g.length;if(a.csp)f=6>h?ad(g[0],g[1],g[2],g[3],g[4],c,d):function(a,b){var e=0,f;
+do f=ad(g[e++],g[e++],g[e++],g[e++],g[e++],c,d)(a,b),b=u,a=f;while(e<h);return f};else{var k="";d&&(k+="s = eso(s, fe);\nl = eso(l, fe);\n");var l=d;r(g,function(a,b){ra(a,c);var e=(b?"s":'((l&&l.hasOwnProperty("'+a+'"))?l:s)')+"."+a;if(d||Pa(a))e="eso("+e+", fe)",l=!0;k+="if(s == null) return undefined;\ns="+e+";\n"});k+="return s;";a=new Function("s","l","eso","fe",k);a.toString=ca(k);l&&(a=vf(a,c));f=a}f.sharedGetter=!0;f.assign=function(a,c){return Oa(a,b,c,b)};return e[b]=f}function fc(b){return F(b.valueOf)?
+b.valueOf():yf.call(b)}function Le(){var b=ia(),a=ia();this.$get=["$filter","$sniffer",function(c,d){function e(a){var b=a;a.sharedGetter&&(b=function(b,c){return a(b,c)},b.literal=a.literal,b.constant=a.constant,b.assign=a.assign);return b}function f(a,b){for(var c=0,d=a.length;c<d;c++){var e=a[c];e.constant||(e.inputs?f(e.inputs,b):-1===b.indexOf(e)&&b.push(e))}return b}function g(a,b){return null==a||null==b?a===b:"object"===typeof a&&(a=fc(a),"object"===typeof a)?!1:a===b||a!==a&&b!==b}function h(a,
+b,c,d){var e=d.$$inputs||(d.$$inputs=f(d.inputs,[])),h;if(1===e.length){var k=g,e=e[0];return a.$watch(function(a){var b=e(a);g(b,k)||(h=d(a),k=b&&fc(b));return h},b,c)}for(var l=[],s=0,m=e.length;s<m;s++)l[s]=g;return a.$watch(function(a){for(var b=!1,c=0,f=e.length;c<f;c++){var k=e[c](a);if(b||(b=!g(k,l[c])))l[c]=k&&fc(k)}b&&(h=d(a));return h},b,c)}function k(a,b,c,d){var e,f;return e=a.$watch(function(a){return d(a)},function(a,c,d){f=a;F(b)&&b.apply(this,arguments);z(a)&&d.$$postDigest(function(){z(f)&&
+e()})},c)}function l(a,b,c,d){function e(a){var b=!0;r(a,function(a){z(a)||(b=!1)});return b}var f,g;return f=a.$watch(function(a){return d(a)},function(a,c,d){g=a;F(b)&&b.call(this,a,c,d);e(a)&&d.$$postDigest(function(){e(g)&&f()})},c)}function m(a,b,c,d){var e;return e=a.$watch(function(a){return d(a)},function(a,c,d){F(b)&&b.apply(this,arguments);e()},c)}function p(a,b){if(!b)return a;var c=a.$$watchDelegate,c=c!==l&&c!==k?function(c,d){var e=a(c,d);return b(e,c,d)}:function(c,d){var e=a(c,d),
+f=b(e,c,d);return z(e)?f:e};a.$$watchDelegate&&a.$$watchDelegate!==h?c.$$watchDelegate=a.$$watchDelegate:b.$stateful||(c.$$watchDelegate=h,c.inputs=[a]);return c}var s={csp:d.csp,expensiveChecks:!1},t={csp:d.csp,expensiveChecks:!0};return function(d,f,g){var v,w,O;switch(typeof d){case "string":O=d=d.trim();var E=g?a:b;v=E[O];v||(":"===d.charAt(0)&&":"===d.charAt(1)&&(w=!0,d=d.substring(2)),g=g?t:s,v=new gc(g),v=(new fb(v,c,g)).parse(d),v.constant?v.$$watchDelegate=m:w?(v=e(v),v.$$watchDelegate=v.literal?
+l:k):v.inputs&&(v.$$watchDelegate=h),E[O]=v);return p(v,f);case "function":return p(d,f);default:return p(x,f)}}}]}function Ne(){this.$get=["$rootScope","$exceptionHandler",function(b,a){return cd(function(a){b.$evalAsync(a)},a)}]}function Oe(){this.$get=["$browser","$exceptionHandler",function(b,a){return cd(function(a){b.defer(a)},a)}]}function cd(b,a){function c(a,b,c){function d(b){return function(c){e||(e=!0,b.call(a,c))}}var e=!1;return[d(b),d(c)]}function d(){this.$$state={status:0}}function e(a,
+b){return function(c){b.call(a,c)}}function f(c){!c.processScheduled&&c.pending&&(c.processScheduled=!0,b(function(){var b,d,e;e=c.pending;c.processScheduled=!1;c.pending=u;for(var f=0,g=e.length;f<g;++f){d=e[f][0];b=e[f][c.status];try{F(b)?d.resolve(b(c.value)):1===c.status?d.resolve(c.value):d.reject(c.value)}catch(h){d.reject(h),a(h)}}}))}function g(){this.promise=new d;this.resolve=e(this,this.resolve);this.reject=e(this,this.reject);this.notify=e(this,this.notify)}var h=A("$q",TypeError);d.prototype=
+{then:function(a,b,c){var d=new g;this.$$state.pending=this.$$state.pending||[];this.$$state.pending.push([d,a,b,c]);0<this.$$state.status&&f(this.$$state);return d.promise},"catch":function(a){return this.then(null,a)},"finally":function(a,b){return this.then(function(b){return l(b,!0,a)},function(b){return l(b,!1,a)},b)}};g.prototype={resolve:function(a){this.promise.$$state.status||(a===this.promise?this.$$reject(h("qcycle",a)):this.$$resolve(a))},$$resolve:function(b){var d,e;e=c(this,this.$$resolve,
+this.$$reject);try{if(K(b)||F(b))d=b&&b.then;F(d)?(this.promise.$$state.status=-1,d.call(b,e[0],e[1],this.notify)):(this.promise.$$state.value=b,this.promise.$$state.status=1,f(this.promise.$$state))}catch(g){e[1](g),a(g)}},reject:function(a){this.promise.$$state.status||this.$$reject(a)},$$reject:function(a){this.promise.$$state.value=a;this.promise.$$state.status=2;f(this.promise.$$state)},notify:function(c){var d=this.promise.$$state.pending;0>=this.promise.$$state.status&&d&&d.length&&b(function(){for(var b,
+e,f=0,g=d.length;f<g;f++){e=d[f][0];b=d[f][3];try{e.notify(F(b)?b(c):c)}catch(h){a(h)}}})}};var k=function(a,b){var c=new g;b?c.resolve(a):c.reject(a);return c.promise},l=function(a,b,c){var d=null;try{F(c)&&(d=c())}catch(e){return k(e,!1)}return d&&F(d.then)?d.then(function(){return k(a,b)},function(a){return k(a,!1)}):k(a,b)},m=function(a,b,c,d){var e=new g;e.resolve(a);return e.promise.then(b,c,d)},p=function t(a){if(!F(a))throw h("norslvr",a);if(!(this instanceof t))return new t(a);var b=new g;
+a(function(a){b.resolve(a)},function(a){b.reject(a)});return b.promise};p.defer=function(){return new g};p.reject=function(a){var b=new g;b.reject(a);return b.promise};p.when=m;p.all=function(a){var b=new g,c=0,d=y(a)?[]:{};r(a,function(a,e){c++;m(a).then(function(a){d.hasOwnProperty(e)||(d[e]=a,--c||b.resolve(d))},function(a){d.hasOwnProperty(e)||b.reject(a)})});0===c&&b.resolve(d);return b.promise};return p}function Xe(){this.$get=["$window","$timeout",function(b,a){var c=b.requestAnimationFrame||
+b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame,d=b.cancelAnimationFrame||b.webkitCancelAnimationFrame||b.mozCancelAnimationFrame||b.webkitCancelRequestAnimationFrame,e=!!c,f=e?function(a){var b=c(a);return function(){d(b)}}:function(b){var c=a(b,16.66,!1);return function(){a.cancel(c)}};f.supported=e;return f}]}function Me(){var b=10,a=A("$rootScope"),c=null,d=null;this.digestTtl=function(a){arguments.length&&(b=a);return b};this.$get=["$injector","$exceptionHandler","$parse","$browser",
+function(e,f,g,h){function k(){this.$id=++kb;this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null;this.$root=this;this.$$destroyed=!1;this.$$listeners={};this.$$listenerCount={};this.$$isolateBindings=null}function l(b){if(q.$$phase)throw a("inprog",q.$$phase);q.$$phase=b}function m(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function p(){}function s(){for(;v.length;)try{v.shift()()}catch(a){f(a)}d=
+null}function t(){null===d&&(d=h.defer(function(){q.$apply(s)}))}k.prototype={constructor:k,$new:function(a,b){function c(){d.$$destroyed=!0}var d;b=b||this;a?(d=new k,d.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=function(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null;this.$$listeners={};this.$$listenerCount={};this.$id=++kb;this.$$ChildScope=null},this.$$ChildScope.prototype=this),d=new this.$$ChildScope);d.$parent=b;d.$$prevSibling=b.$$childTail;b.$$childHead?
+(b.$$childTail.$$nextSibling=d,b.$$childTail=d):b.$$childHead=b.$$childTail=d;(a||b!=this)&&d.$on("$destroy",c);return d},$watch:function(a,b,d){var e=g(a);if(e.$$watchDelegate)return e.$$watchDelegate(this,b,d,e);var f=this.$$watchers,h={fn:b,last:p,get:e,exp:a,eq:!!d};c=null;F(b)||(h.fn=x);f||(f=this.$$watchers=[]);f.unshift(h);return function(){Va(f,h);c=null}},$watchGroup:function(a,b){function c(){h=!1;k?(k=!1,b(e,e,g)):b(e,d,g)}var d=Array(a.length),e=Array(a.length),f=[],g=this,h=!1,k=!0;if(!a.length){var l=
+!0;g.$evalAsync(function(){l&&b(e,e,g)});return function(){l=!1}}if(1===a.length)return this.$watch(a[0],function(a,c,f){e[0]=a;d[0]=c;b(e,a===c?e:d,f)});r(a,function(a,b){var k=g.$watch(a,function(a,f){e[b]=a;d[b]=f;h||(h=!0,g.$evalAsync(c))});f.push(k)});return function(){for(;f.length;)f.shift()()}},$watchCollection:function(a,b){function c(a){e=a;var b,d,g,h;if(!G(e)){if(K(e))if(Ra(e))for(f!==p&&(f=p,n=f.length=0,l++),a=e.length,n!==a&&(l++,f.length=n=a),b=0;b<a;b++)h=f[b],g=e[b],d=h!==h&&g!==
+g,d||h===g||(l++,f[b]=g);else{f!==s&&(f=s={},n=0,l++);a=0;for(b in e)e.hasOwnProperty(b)&&(a++,g=e[b],h=f[b],b in f?(d=h!==h&&g!==g,d||h===g||(l++,f[b]=g)):(n++,f[b]=g,l++));if(n>a)for(b in l++,f)e.hasOwnProperty(b)||(n--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$stateful=!0;var d=this,e,f,h,k=1<b.length,l=0,m=g(a,c),p=[],s={},q=!0,n=0;return this.$watch(m,function(){q?(q=!1,b(e,e,d)):b(e,h,d);if(k)if(K(e))if(Ra(e)){h=Array(e.length);for(var a=0;a<e.length;a++)h[a]=e[a]}else for(a in h={},e)Jb.call(e,
+a)&&(h[a]=e[a]);else h=e})},$digest:function(){var e,g,k,m,t,v,r=b,L,u=[],z,Q;l("$digest");h.$$checkUrlChange();this===q&&null!==d&&(h.defer.cancel(d),s());c=null;do{v=!1;for(L=this;N.length;){try{Q=N.shift(),Q.scope.$eval(Q.expression)}catch(A){f(A)}c=null}a:do{if(m=L.$$watchers)for(t=m.length;t--;)try{if(e=m[t])if((g=e.get(L))!==(k=e.last)&&!(e.eq?pa(g,k):"number"===typeof g&&"number"===typeof k&&isNaN(g)&&isNaN(k)))v=!0,c=e,e.last=e.eq?Ca(g,null):g,e.fn(g,k===p?g:k,L),5>r&&(z=4-r,u[z]||(u[z]=[]),
+u[z].push({msg:F(e.exp)?"fn: "+(e.exp.name||e.exp.toString()):e.exp,newVal:g,oldVal:k}));else if(e===c){v=!1;break a}}catch(B){f(B)}if(!(m=L.$$childHead||L!==this&&L.$$nextSibling))for(;L!==this&&!(m=L.$$nextSibling);)L=L.$parent}while(L=m);if((v||N.length)&&!r--)throw q.$$phase=null,a("infdig",b,u);}while(v||N.length);for(q.$$phase=null;n.length;)try{n.shift()()}catch(da){f(da)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;if(this!==
+q){for(var b in this.$$listenerCount)m(this,this.$$listenerCount[b],b);a.$$childHead==this&&(a.$$childHead=this.$$nextSibling);a.$$childTail==this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=x;this.$on=this.$watch=this.$watchGroup=function(){return x};this.$$listeners={};this.$parent=this.$$nextSibling=
+this.$$prevSibling=this.$$childHead=this.$$childTail=this.$root=this.$$watchers=null}}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a){q.$$phase||N.length||h.defer(function(){N.length&&q.$digest()});N.push({scope:this,expression:a})},$$postDigest:function(a){n.push(a)},$apply:function(a){try{return l("$apply"),this.$eval(a)}catch(b){f(b)}finally{q.$$phase=null;try{q.$digest()}catch(c){throw f(c),c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&v.push(b);t()},$on:function(a,
+b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){var d=c.indexOf(b);-1!==d&&(c[d]=null,m(e,1,a))}},$emit:function(a,b){var c=[],d,e=this,g=!1,h={name:a,targetScope:e,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=Xa([h],arguments,1),l,m;do{d=e.$$listeners[a]||c;h.currentScope=e;l=0;for(m=d.length;l<
+m;l++)if(d[l])try{d[l].apply(null,k)}catch(p){f(p)}else d.splice(l,1),l--,m--;if(g)return h.currentScope=null,h;e=e.$parent}while(e);h.currentScope=null;return h},$broadcast:function(a,b){var c=this,d=this,e={name:a,targetScope:this,preventDefault:function(){e.defaultPrevented=!0},defaultPrevented:!1};if(!this.$$listenerCount[a])return e;for(var g=Xa([e],arguments,1),h,k;c=d;){e.currentScope=c;d=c.$$listeners[a]||[];h=0;for(k=d.length;h<k;h++)if(d[h])try{d[h].apply(null,g)}catch(l){f(l)}else d.splice(h,
+1),h--,k--;if(!(d=c.$$listenerCount[a]&&c.$$childHead||c!==this&&c.$$nextSibling))for(;c!==this&&!(d=c.$$nextSibling);)c=c.$parent}e.currentScope=null;return e}};var q=new k,N=q.$$asyncQueue=[],n=q.$$postDigestQueue=[],v=q.$$applyAsyncQueue=[];return q}]}function Pd(){var b=/^\s*(https?|ftp|mailto|tel|file):/,a=/^\s*((https?|ftp|file|blob):|data:image\/)/;this.aHrefSanitizationWhitelist=function(a){return z(a)?(b=a,this):b};this.imgSrcSanitizationWhitelist=function(b){return z(b)?(a=b,this):a};this.$get=
+function(){return function(c,d){var e=d?a:b,f;f=Aa(c).href;return""===f||f.match(e)?c:"unsafe:"+f}}}function zf(b){if("self"===b)return b;if(I(b)){if(-1<b.indexOf("***"))throw Ba("iwcard",b);b=dd(b).replace("\\*\\*",".*").replace("\\*","[^:/.?&;]*");return new RegExp("^"+b+"$")}if(lb(b))return new RegExp("^"+b.source+"$");throw Ba("imatcher");}function ed(b){var a=[];z(b)&&r(b,function(b){a.push(zf(b))});return a}function Qe(){this.SCE_CONTEXTS=ma;var b=["self"],a=[];this.resourceUrlWhitelist=function(a){arguments.length&&
+(b=ed(a));return b};this.resourceUrlBlacklist=function(b){arguments.length&&(a=ed(b));return a};this.$get=["$injector",function(c){function d(a,b){return"self"===a?Wc(b):!!a.exec(b.href)}function e(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};a&&(b.prototype=new a);b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()};b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()};return b}var f=function(a){throw Ba("unsafe");};c.has("$sanitize")&&
+(f=c.get("$sanitize"));var g=e(),h={};h[ma.HTML]=e(g);h[ma.CSS]=e(g);h[ma.URL]=e(g);h[ma.JS]=e(g);h[ma.RESOURCE_URL]=e(h[ma.URL]);return{trustAs:function(a,b){var c=h.hasOwnProperty(a)?h[a]:null;if(!c)throw Ba("icontext",a,b);if(null===b||b===u||""===b)return b;if("string"!==typeof b)throw Ba("itype",a);return new c(b)},getTrusted:function(c,e){if(null===e||e===u||""===e)return e;var g=h.hasOwnProperty(c)?h[c]:null;if(g&&e instanceof g)return e.$$unwrapTrustedValue();if(c===ma.RESOURCE_URL){var g=
+Aa(e.toString()),p,s,t=!1;p=0;for(s=b.length;p<s;p++)if(d(b[p],g)){t=!0;break}if(t)for(p=0,s=a.length;p<s;p++)if(d(a[p],g)){t=!1;break}if(t)return e;throw Ba("insecurl",e.toString());}if(c===ma.HTML)return f(e);throw Ba("unsafe");},valueOf:function(a){return a instanceof g?a.$$unwrapTrustedValue():a}}}]}function Pe(){var b=!0;this.enabled=function(a){arguments.length&&(b=!!a);return b};this.$get=["$parse","$sceDelegate",function(a,c){if(b&&8>Ha)throw Ba("iequirks");var d=ua(ma);d.isEnabled=function(){return b};
+d.trustAs=c.trustAs;d.getTrusted=c.getTrusted;d.valueOf=c.valueOf;b||(d.trustAs=d.getTrusted=function(a,b){return b},d.valueOf=oa);d.parseAs=function(b,c){var e=a(c);return e.literal&&e.constant?e:a(c,function(a){return d.getTrusted(b,a)})};var e=d.parseAs,f=d.getTrusted,g=d.trustAs;r(ma,function(a,b){var c=R(b);d[bb("parse_as_"+c)]=function(b){return e(a,b)};d[bb("get_trusted_"+c)]=function(b){return f(a,b)};d[bb("trust_as_"+c)]=function(b){return g(a,b)}});return d}]}function Re(){this.$get=["$window",
+"$document",function(b,a){var c={},d=$((/android (\d+)/.exec(R((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),f=a[0]||{},g,h=/^(Moz|webkit|ms)(?=[A-Z])/,k=f.body&&f.body.style,l=!1,m=!1;if(k){for(var p in k)if(l=h.exec(p)){g=l[0];g=g.substr(0,1).toUpperCase()+g.substr(1);break}g||(g="WebkitOpacity"in k&&"webkit");l=!!("transition"in k||g+"Transition"in k);m=!!("animation"in k||g+"Animation"in k);!d||l&&m||(l=I(f.body.style.webkitTransition),m=I(f.body.style.webkitAnimation))}return{history:!(!b.history||
+!b.history.pushState||4>d||e),hasEvent:function(a){if("input"==a&&9==Ha)return!1;if(G(c[a])){var b=f.createElement("div");c[a]="on"+a in b}return c[a]},csp:$a(),vendorPrefix:g,transitions:l,animations:m,android:d}}]}function Te(){this.$get=["$templateCache","$http","$q",function(b,a,c){function d(e,f){d.totalPendingRequests++;var g=a.defaults&&a.defaults.transformResponse;y(g)?g=g.filter(function(a){return a!==Yb}):g===Yb&&(g=null);return a.get(e,{cache:b,transformResponse:g}).then(function(a){a=
+a.data;d.totalPendingRequests--;b.put(e,a);return a},function(a){d.totalPendingRequests--;if(!f)throw ka("tpload",e);return c.reject(a)})}d.totalPendingRequests=0;return d}]}function Ue(){this.$get=["$rootScope","$browser","$location",function(b,a,c){return{findBindings:function(a,b,c){a=a.getElementsByClassName("ng-binding");var g=[];r(a,function(a){var d=ha.element(a).data("$binding");d&&r(d,function(d){c?(new RegExp("(^|\\s)"+dd(b)+"(\\s|\\||$)")).test(d)&&g.push(a):-1!=d.indexOf(b)&&g.push(a)})});
+return g},findModels:function(a,b,c){for(var g=["ng-","data-ng-","ng\\:"],h=0;h<g.length;++h){var k=a.querySelectorAll("["+g[h]+"model"+(c?"=":"*=")+'"'+b+'"]');if(k.length)return k}},getLocation:function(){return c.url()},setLocation:function(a){a!==c.url()&&(c.url(a),b.$digest())},whenStable:function(b){a.notifyWhenNoOutstandingRequests(b)}}}]}function Ve(){this.$get=["$rootScope","$browser","$q","$$q","$exceptionHandler",function(b,a,c,d,e){function f(f,k,l){var m=z(l)&&!l,p=(m?d:c).defer(),s=
+p.promise;k=a.defer(function(){try{p.resolve(f())}catch(a){p.reject(a),e(a)}finally{delete g[s.$$timeoutId]}m||b.$apply()},k);s.$$timeoutId=k;g[k]=p;return s}var g={};f.cancel=function(b){return b&&b.$$timeoutId in g?(g[b.$$timeoutId].reject("canceled"),delete g[b.$$timeoutId],a.defer.cancel(b.$$timeoutId)):!1};return f}]}function Aa(b){Ha&&(Y.setAttribute("href",b),b=Y.href);Y.setAttribute("href",b);return{href:Y.href,protocol:Y.protocol?Y.protocol.replace(/:$/,""):"",host:Y.host,search:Y.search?
+Y.search.replace(/^\?/,""):"",hash:Y.hash?Y.hash.replace(/^#/,""):"",hostname:Y.hostname,port:Y.port,pathname:"/"===Y.pathname.charAt(0)?Y.pathname:"/"+Y.pathname}}function Wc(b){b=I(b)?Aa(b):b;return b.protocol===fd.protocol&&b.host===fd.host}function We(){this.$get=ca(U)}function Bc(b){function a(c,d){if(K(c)){var e={};r(c,function(b,c){e[c]=a(c,b)});return e}return b.factory(c+"Filter",d)}this.register=a;this.$get=["$injector",function(a){return function(b){return a.get(b+"Filter")}}];a("currency",
+gd);a("date",hd);a("filter",Af);a("json",Bf);a("limitTo",Cf);a("lowercase",Df);a("number",id);a("orderBy",jd);a("uppercase",Ef)}function Af(){return function(b,a,c){if(!y(b))return b;var d=typeof c,e=[];e.check=function(a,b){for(var c=0;c<e.length;c++)if(!e[c](a,b))return!1;return!0};"function"!==d&&(c="boolean"===d&&c?function(a,b){return ha.equals(a,b)}:function(a,b){if(a&&b&&"object"===typeof a&&"object"===typeof b){for(var d in a)if("$"!==d.charAt(0)&&Jb.call(a,d)&&c(a[d],b[d]))return!0;return!1}b=
+(""+b).toLowerCase();return-1<(""+a).toLowerCase().indexOf(b)});var f=function(a,b){if("string"===typeof b&&"!"===b.charAt(0))return!f(a,b.substr(1));switch(typeof a){case "boolean":case "number":case "string":return c(a,b);case "object":switch(typeof b){case "object":return c(a,b);default:for(var d in a)if("$"!==d.charAt(0)&&f(a[d],b))return!0}return!1;case "array":for(d=0;d<a.length;d++)if(f(a[d],b))return!0;return!1;default:return!1}};switch(typeof a){case "boolean":case "number":case "string":a=
+{$:a};case "object":for(var g in a)(function(b){"undefined"!==typeof a[b]&&e.push(function(c){return f("$"==b?c:c&&c[b],a[b])})})(g);break;case "function":e.push(a);break;default:return b}d=[];for(g=0;g<b.length;g++){var h=b[g];e.check(h,g)&&d.push(h)}return d}}function gd(b){var a=b.NUMBER_FORMATS;return function(b,d,e){G(d)&&(d=a.CURRENCY_SYM);G(e)&&(e=a.PATTERNS[1].maxFrac);return null==b?b:kd(b,a.PATTERNS[1],a.GROUP_SEP,a.DECIMAL_SEP,e).replace(/\u00A4/g,d)}}function id(b){var a=b.NUMBER_FORMATS;
+return function(b,d){return null==b?b:kd(b,a.PATTERNS[0],a.GROUP_SEP,a.DECIMAL_SEP,d)}}function kd(b,a,c,d,e){if(!isFinite(b)||K(b))return"";var f=0>b;b=Math.abs(b);var g=b+"",h="",k=[],l=!1;if(-1!==g.indexOf("e")){var m=g.match(/([\d\.]+)e(-?)(\d+)/);m&&"-"==m[2]&&m[3]>e+1?(g="0",b=0):(h=g,l=!0)}if(l)0<e&&-1<b&&1>b&&(h=b.toFixed(e));else{g=(g.split(ld)[1]||"").length;G(e)&&(e=Math.min(Math.max(a.minFrac,g),a.maxFrac));b=+(Math.round(+(b.toString()+"e"+e)).toString()+"e"+-e);0===b&&(f=!1);b=(""+b).split(ld);
+g=b[0];b=b[1]||"";var m=0,p=a.lgSize,s=a.gSize;if(g.length>=p+s)for(m=g.length-p,l=0;l<m;l++)0===(m-l)%s&&0!==l&&(h+=c),h+=g.charAt(l);for(l=m;l<g.length;l++)0===(g.length-l)%p&&0!==l&&(h+=c),h+=g.charAt(l);for(;b.length<e;)b+="0";e&&"0"!==e&&(h+=d+b.substr(0,e))}k.push(f?a.negPre:a.posPre,h,f?a.negSuf:a.posSuf);return k.join("")}function Cb(b,a,c){var d="";0>b&&(d="-",b=-b);for(b=""+b;b.length<a;)b="0"+b;c&&(b=b.substr(b.length-a));return d+b}function Z(b,a,c,d){c=c||0;return function(e){e=e["get"+
+b]();if(0<c||e>-c)e+=c;0===e&&-12==c&&(e=12);return Cb(e,a,d)}}function Db(b,a){return function(c,d){var e=c["get"+b](),f=rb(a?"SHORT"+b:b);return d[f][e]}}function md(b){var a=(new Date(b,0,1)).getDay();return new Date(b,0,(4>=a?5:12)-a)}function nd(b){return function(a){var c=md(a.getFullYear());a=+new Date(a.getFullYear(),a.getMonth(),a.getDate()+(4-a.getDay()))-+c;a=1+Math.round(a/6048E5);return Cb(a,b)}}function hd(b){function a(a){var b;if(b=a.match(c)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:
+a.setFullYear,k=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=$(b[9]+b[10]),g=$(b[9]+b[11]));h.call(a,$(b[1]),$(b[2])-1,$(b[3]));f=$(b[4]||0)-f;g=$(b[5]||0)-g;h=$(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));k.call(a,f,g,h,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e,f){var g="",h=[],k,l;e=e||"mediumDate";e=b.DATETIME_FORMATS[e]||e;I(c)&&(c=Ff.test(c)?$(c):a(c));X(c)&&(c=new Date(c));if(!fa(c))return c;
+for(;e;)(l=Gf.exec(e))?(h=Xa(h,l,1),e=h.pop()):(h.push(e),e=null);f&&"UTC"===f&&(c=new Date(c.getTime()),c.setMinutes(c.getMinutes()+c.getTimezoneOffset()));r(h,function(a){k=Hf[a];g+=k?k(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function Bf(){return function(b){return Za(b,!0)}}function Cf(){return function(b,a){X(b)&&(b=b.toString());if(!y(b)&&!I(b))return b;a=Infinity===Math.abs(Number(a))?Number(a):$(a);if(I(b))return a?0<=a?b.slice(0,a):b.slice(a,b.length):
+"";var c=[],d,e;a>b.length?a=b.length:a<-b.length&&(a=-b.length);0<a?(d=0,e=a):(d=b.length+a,e=b.length);for(;d<e;d++)c.push(b[d]);return c}}function jd(b){return function(a,c,d){function e(a,b){return b?function(b,c){return a(c,b)}:a}function f(a,b){var c=typeof a,d=typeof b;return c==d?(fa(a)&&fa(b)&&(a=a.valueOf(),b=b.valueOf()),"string"==c&&(a=a.toLowerCase(),b=b.toLowerCase()),a===b?0:a<b?-1:1):c<d?-1:1}if(!Ra(a))return a;c=y(c)?c:[c];0===c.length&&(c=["+"]);c=c.map(function(a){var c=!1,d=a||
+oa;if(I(a)){if("+"==a.charAt(0)||"-"==a.charAt(0))c="-"==a.charAt(0),a=a.substring(1);if(""===a)return e(function(a,b){return f(a,b)},c);d=b(a);if(d.constant){var l=d();return e(function(a,b){return f(a[l],b[l])},c)}}return e(function(a,b){return f(d(a),d(b))},c)});return Ya.call(a).sort(e(function(a,b){for(var d=0;d<c.length;d++){var e=c[d](a,b);if(0!==e)return e}return 0},d))}}function Ia(b){F(b)&&(b={link:b});b.restrict=b.restrict||"AC";return ca(b)}function od(b,a,c,d,e){var f=this,g=[],h=f.$$parentForm=
+b.parent().controller("form")||Eb;f.$error={};f.$$success={};f.$pending=u;f.$name=e(a.name||a.ngForm||"")(c);f.$dirty=!1;f.$pristine=!0;f.$valid=!0;f.$invalid=!1;f.$submitted=!1;h.$addControl(f);f.$rollbackViewValue=function(){r(g,function(a){a.$rollbackViewValue()})};f.$commitViewValue=function(){r(g,function(a){a.$commitViewValue()})};f.$addControl=function(a){La(a.$name,"input");g.push(a);a.$name&&(f[a.$name]=a)};f.$$renameControl=function(a,b){var c=a.$name;f[c]===a&&delete f[c];f[b]=a;a.$name=
+b};f.$removeControl=function(a){a.$name&&f[a.$name]===a&&delete f[a.$name];r(f.$pending,function(b,c){f.$setValidity(c,null,a)});r(f.$error,function(b,c){f.$setValidity(c,null,a)});Va(g,a)};pd({ctrl:this,$element:b,set:function(a,b,c){var d=a[b];d?-1===d.indexOf(c)&&d.push(c):a[b]=[c]},unset:function(a,b,c){var d=a[b];d&&(Va(d,c),0===d.length&&delete a[b])},parentForm:h,$animate:d});f.$setDirty=function(){d.removeClass(b,Qa);d.addClass(b,Fb);f.$dirty=!0;f.$pristine=!1;h.$setDirty()};f.$setPristine=
+function(){d.setClass(b,Qa,Fb+" ng-submitted");f.$dirty=!1;f.$pristine=!0;f.$submitted=!1;r(g,function(a){a.$setPristine()})};f.$setUntouched=function(){r(g,function(a){a.$setUntouched()})};f.$setSubmitted=function(){d.addClass(b,"ng-submitted");f.$submitted=!0;h.$setSubmitted()}}function hc(b){b.$formatters.push(function(a){return b.$isEmpty(a)?a:a.toString()})}function gb(b,a,c,d,e,f){var g=a[0].placeholder,h={},k=R(a[0].type);if(!e.android){var l=!1;a.on("compositionstart",function(a){l=!0});a.on("compositionend",
+function(){l=!1;m()})}var m=function(b){if(!l){var e=a.val(),f=b&&b.type;Ha&&"input"===(b||h).type&&a[0].placeholder!==g?g=a[0].placeholder:("password"===k||c.ngTrim&&"false"===c.ngTrim||(e=P(e)),(d.$viewValue!==e||""===e&&d.$$hasNativeValidators)&&d.$setViewValue(e,f))}};if(e.hasEvent("input"))a.on("input",m);else{var p,s=function(a){p||(p=f.defer(function(){m(a);p=null}))};a.on("keydown",function(a){var b=a.keyCode;91===b||15<b&&19>b||37<=b&&40>=b||s(a)});if(e.hasEvent("paste"))a.on("paste cut",
+s)}a.on("change",m);d.$render=function(){a.val(d.$isEmpty(d.$viewValue)?"":d.$viewValue)}}function Gb(b,a){return function(c,d){var e,f;if(fa(c))return c;if(I(c)){'"'==c.charAt(0)&&'"'==c.charAt(c.length-1)&&(c=c.substring(1,c.length-1));if(If.test(c))return new Date(c);b.lastIndex=0;if(e=b.exec(c))return e.shift(),f=d?{yyyy:d.getFullYear(),MM:d.getMonth()+1,dd:d.getDate(),HH:d.getHours(),mm:d.getMinutes(),ss:d.getSeconds(),sss:d.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},r(e,
+function(b,c){c<a.length&&(f[a[c]]=+b)}),new Date(f.yyyy,f.MM-1,f.dd,f.HH,f.mm,f.ss||0,1E3*f.sss||0)}return NaN}}function hb(b,a,c,d){return function(e,f,g,h,k,l,m){function p(a){return a&&!(a.getTime&&a.getTime()!==a.getTime())}function s(a){return z(a)?fa(a)?a:c(a):u}qd(e,f,g,h);gb(e,f,g,h,k,l);var t=h&&h.$options&&h.$options.timezone,q;h.$$parserName=b;h.$parsers.push(function(b){return h.$isEmpty(b)?null:a.test(b)?(b=c(b,q),"UTC"===t&&b.setMinutes(b.getMinutes()-b.getTimezoneOffset()),b):u});
+h.$formatters.push(function(a){if(a&&!fa(a))throw Hb("datefmt",a);if(p(a)){if((q=a)&&"UTC"===t){var b=6E4*q.getTimezoneOffset();q=new Date(q.getTime()+b)}return m("date")(a,d,t)}q=null;return""});if(z(g.min)||g.ngMin){var r;h.$validators.min=function(a){return!p(a)||G(r)||c(a)>=r};g.$observe("min",function(a){r=s(a);h.$validate()})}if(z(g.max)||g.ngMax){var n;h.$validators.max=function(a){return!p(a)||G(n)||c(a)<=n};g.$observe("max",function(a){n=s(a);h.$validate()})}}}function qd(b,a,c,d){(d.$$hasNativeValidators=
+K(a[0].validity))&&d.$parsers.push(function(b){var c=a.prop("validity")||{};return c.badInput&&!c.typeMismatch?u:b})}function rd(b,a,c,d,e){if(z(d)){b=b(d);if(!b.constant)throw A("ngModel")("constexpr",c,d);return b(a)}return e}function pd(b){function a(a,b){b&&!f[a]?(l.addClass(e,a),f[a]=!0):!b&&f[a]&&(l.removeClass(e,a),f[a]=!1)}function c(b,c){b=b?"-"+Mb(b,"-"):"";a(ib+b,!0===c);a(sd+b,!1===c)}var d=b.ctrl,e=b.$element,f={},g=b.set,h=b.unset,k=b.parentForm,l=b.$animate;f[sd]=!(f[ib]=e.hasClass(ib));
+d.$setValidity=function(b,e,f){e===u?(d.$pending||(d.$pending={}),g(d.$pending,b,f)):(d.$pending&&h(d.$pending,b,f),td(d.$pending)&&(d.$pending=u));Ua(e)?e?(h(d.$error,b,f),g(d.$$success,b,f)):(g(d.$error,b,f),h(d.$$success,b,f)):(h(d.$error,b,f),h(d.$$success,b,f));d.$pending?(a(ud,!0),d.$valid=d.$invalid=u,c("",null)):(a(ud,!1),d.$valid=td(d.$error),d.$invalid=!d.$valid,c("",d.$valid));e=d.$pending&&d.$pending[b]?u:d.$error[b]?!1:d.$$success[b]?!0:null;c(b,e);k.$setValidity(b,e,d)}}function td(b){if(b)for(var a in b)return!1;
+return!0}function ic(b,a){b="ngClass"+b;return["$animate",function(c){function d(a,b){var c=[],d=0;a:for(;d<a.length;d++){for(var e=a[d],m=0;m<b.length;m++)if(e==b[m])continue a;c.push(e)}return c}function e(a){if(!y(a)){if(I(a))return a.split(" ");if(K(a)){var b=[];r(a,function(a,c){a&&(b=b.concat(c.split(" ")))});return b}}return a}return{restrict:"AC",link:function(f,g,h){function k(a,b){var c=g.data("$classCounts")||{},d=[];r(a,function(a){if(0<b||c[a])c[a]=(c[a]||0)+b,c[a]===+(0<b)&&d.push(a)});
+g.data("$classCounts",c);return d.join(" ")}function l(b){if(!0===a||f.$index%2===a){var l=e(b||[]);if(!m){var t=k(l,1);h.$addClass(t)}else if(!pa(b,m)){var q=e(m),t=d(l,q),l=d(q,l),t=k(t,1),l=k(l,-1);t&&t.length&&c.addClass(g,t);l&&l.length&&c.removeClass(g,l)}}m=ua(b)}var m;f.$watch(h[b],l,!0);h.$observe("class",function(a){l(f.$eval(h[b]))});"ngClass"!==b&&f.$watch("$index",function(c,d){var g=c&1;if(g!==(d&1)){var l=e(f.$eval(h[b]));g===a?(g=k(l,1),h.$addClass(g)):(g=k(l,-1),h.$removeClass(g))}})}}}]}
+var Jf=/^\/(.+)\/([a-z]*)$/,R=function(b){return I(b)?b.toLowerCase():b},Jb=Object.prototype.hasOwnProperty,rb=function(b){return I(b)?b.toUpperCase():b},Ha,B,qa,Ya=[].slice,of=[].splice,Kf=[].push,Ja=Object.prototype.toString,Wa=A("ng"),ha=U.angular||(U.angular={}),ab,kb=0;Ha=V.documentMode;x.$inject=[];oa.$inject=[];var y=Array.isArray,P=function(b){return I(b)?b.trim():b},dd=function(b){return b.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08")},$a=function(){if(z($a.isActive_))return $a.isActive_;
+var b=!(!V.querySelector("[ng-csp]")&&!V.querySelector("[data-ng-csp]"));if(!b)try{new Function("")}catch(a){b=!0}return $a.isActive_=b},ob=["ng-","data-ng-","ng:","x-ng-"],Jd=/[A-Z]/g,sc=!1,Nb,na=1,mb=3,Nd={full:"1.3.5",major:1,minor:3,dot:5,codeName:"cybernetic-mercantilism"};S.expando="ng339";var wb=S.cache={},df=1;S._data=function(b){return this.cache[b[this.expando]]||{}};var Ze=/([\:\-\_]+(.))/g,$e=/^moz([A-Z])/,Lf={mouseleave:"mouseout",mouseenter:"mouseover"},Qb=A("jqLite"),cf=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+Pb=/<|&#?\w+;/,af=/<([\w:]+)/,bf=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja={option:[1,'<select multiple="multiple">',"</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ja.optgroup=ja.option;ja.tbody=ja.tfoot=ja.colgroup=ja.caption=ja.thead;ja.th=ja.td;var Ka=S.prototype={ready:function(b){function a(){c||(c=
+!0,b())}var c=!1;"complete"===V.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),S(U).on("load",a))},toString:function(){var b=[];r(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return 0<=b?B(this[b]):B(this[this.length+b])},length:0,push:Kf,sort:[].sort,splice:[].splice},yb={};r("multiple selected checked disabled readOnly required open".split(" "),function(b){yb[R(b)]=b});var Kc={};r("input select option textarea button form details".split(" "),function(b){Kc[b]=
+!0});var Lc={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern"};r({data:Sb,removeData:ub},function(b,a){S[a]=b});r({data:Sb,inheritedData:xb,scope:function(b){return B.data(b,"$scope")||xb(b.parentNode||b,["$isolateScope","$scope"])},isolateScope:function(b){return B.data(b,"$isolateScope")||B.data(b,"$isolateScopeNoTemplate")},controller:Gc,injector:function(b){return xb(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Tb,css:function(b,
+a,c){a=bb(a);if(z(c))b.style[a]=c;else return b.style[a]},attr:function(b,a,c){var d=R(a);if(yb[d])if(z(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||x).specified?d:u;else if(z(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?u:b},prop:function(b,a,c){if(z(c))b[a]=c;else return b[a]},text:function(){function b(a,b){if(G(b)){var d=a.nodeType;return d===na||d===mb?a.textContent:""}a.textContent=b}
+b.$dv="";return b}(),val:function(b,a){if(G(a)){if(b.multiple&&"select"===ta(b)){var c=[];r(b.options,function(a){a.selected&&c.push(a.value||a.text)});return 0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(G(a))return b.innerHTML;tb(b,!0);b.innerHTML=a},empty:Hc},function(b,a){S.prototype[a]=function(a,d){var e,f,g=this.length;if(b!==Hc&&(2==b.length&&b!==Tb&&b!==Gc?a:d)===u){if(K(a)){for(e=0;e<g;e++)if(b===Sb)b(this[e],a);else for(f in a)b(this[e],f,a[f]);return this}e=b.$dv;
+g=e===u?Math.min(g,1):g;for(f=0;f<g;f++){var h=b(this[f],a,d);e=e?e+h:h}return e}for(e=0;e<g;e++)b(this[e],a,d);return this}});r({removeData:ub,on:function a(c,d,e,f){if(z(f))throw Qb("onargs");if(Cc(c)){var g=vb(c,!0);f=g.events;var h=g.handle;h||(h=g.handle=gf(c,f));for(var g=0<=d.indexOf(" ")?d.split(" "):[d],k=g.length;k--;){d=g[k];var l=f[d];l||(f[d]=[],"mouseenter"===d||"mouseleave"===d?a(c,Lf[d],function(a){var c=a.relatedTarget;c&&(c===this||this.contains(c))||h(a,d)}):"$destroy"!==d&&c.addEventListener(d,
+h,!1),l=f[d]);l.push(e)}}},off:Fc,one:function(a,c,d){a=B(a);a.on(c,function f(){a.off(c,d);a.off(c,f)});a.on(c,d)},replaceWith:function(a,c){var d,e=a.parentNode;tb(a);r(new S(c),function(c){d?e.insertBefore(c,d.nextSibling):e.replaceChild(c,a);d=c})},children:function(a){var c=[];r(a.childNodes,function(a){a.nodeType===na&&c.push(a)});return c},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,c){var d=a.nodeType;if(d===na||11===d){c=new S(c);for(var d=0,e=c.length;d<
+e;d++)a.appendChild(c[d])}},prepend:function(a,c){if(a.nodeType===na){var d=a.firstChild;r(new S(c),function(c){a.insertBefore(c,d)})}},wrap:function(a,c){c=B(c).eq(0).clone()[0];var d=a.parentNode;d&&d.replaceChild(c,a);c.appendChild(a)},remove:Ic,detach:function(a){Ic(a,!0)},after:function(a,c){var d=a,e=a.parentNode;c=new S(c);for(var f=0,g=c.length;f<g;f++){var h=c[f];e.insertBefore(h,d.nextSibling);d=h}},addClass:Vb,removeClass:Ub,toggleClass:function(a,c,d){c&&r(c.split(" "),function(c){var f=
+d;G(f)&&(f=!Tb(a,c));(f?Vb:Ub)(a,c)})},parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},next:function(a){return a.nextElementSibling},find:function(a,c){return a.getElementsByTagName?a.getElementsByTagName(c):[]},clone:Rb,triggerHandler:function(a,c,d){var e,f,g=c.type||c,h=vb(a);if(h=(h=h&&h.events)&&h[g])e={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return!0===this.defaultPrevented},stopImmediatePropagation:function(){this.immediatePropagationStopped=
+!0},isImmediatePropagationStopped:function(){return!0===this.immediatePropagationStopped},stopPropagation:x,type:g,target:a},c.type&&(e=D(e,c)),c=ua(h),f=d?[e].concat(d):[e],r(c,function(c){e.isImmediatePropagationStopped()||c.apply(a,f)})}},function(a,c){S.prototype[c]=function(c,e,f){for(var g,h=0,k=this.length;h<k;h++)G(g)?(g=a(this[h],c,e,f),z(g)&&(g=B(g))):Ec(g,a(this[h],c,e,f));return z(g)?g:this};S.prototype.bind=S.prototype.on;S.prototype.unbind=S.prototype.off});cb.prototype={put:function(a,
+c){this[Ma(a,this.nextUid)]=c},get:function(a){return this[Ma(a,this.nextUid)]},remove:function(a){var c=this[a=Ma(a,this.nextUid)];delete this[a];return c}};var Nc=/^function\s*[^\(]*\(\s*([^\)]*)\)/m,jf=/,/,kf=/^\s*(_?)(\S+?)\1\s*$/,Mc=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ea=A("$injector");Lb.$$annotate=Wb;var Mf=A("$animate"),ze=["$provide",function(a){this.$$selectors={};this.register=function(c,d){var e=c+"-animation";if(c&&"."!=c.charAt(0))throw Mf("notcsel",c);this.$$selectors[c.substr(1)]=e;
+a.factory(e,d)};this.classNameFilter=function(a){1===arguments.length&&(this.$$classNameFilter=a instanceof RegExp?a:null);return this.$$classNameFilter};this.$get=["$$q","$$asyncCallback","$rootScope",function(a,d,e){function f(d){var f,g=a.defer();g.promise.$$cancelFn=function(){f&&f()};e.$$postDigest(function(){f=d(function(){g.resolve()})});return g.promise}function g(a,c){var d=[],e=[],f=ia();r((a.attr("class")||"").split(/\s+/),function(a){f[a]=!0});r(c,function(a,c){var g=f[c];!1===a&&g?e.push(c):
+!0!==a||g||d.push(c)});return 0<d.length+e.length&&[d.length?d:null,e.length?e:null]}function h(a,c,d){for(var e=0,f=c.length;e<f;++e)a[c[e]]=d}function k(){m||(m=a.defer(),d(function(){m.resolve();m=null}));return m.promise}function l(a,c){if(ha.isObject(c)){var d=D(c.from||{},c.to||{});a.css(d)}}var m;return{animate:function(a,c,d){l(a,{from:c,to:d});return k()},enter:function(a,c,d,e){l(a,e);d?d.after(a):c.prepend(a);return k()},leave:function(a,c){a.remove();return k()},move:function(a,c,d,e){return this.enter(a,
+c,d,e)},addClass:function(a,c,d){return this.setClass(a,c,[],d)},$$addClassImmediately:function(a,c,d){a=B(a);c=I(c)?c:y(c)?c.join(" "):"";r(a,function(a){Vb(a,c)});l(a,d);return k()},removeClass:function(a,c,d){return this.setClass(a,[],c,d)},$$removeClassImmediately:function(a,c,d){a=B(a);c=I(c)?c:y(c)?c.join(" "):"";r(a,function(a){Ub(a,c)});l(a,d);return k()},setClass:function(a,c,d,e){var k=this,l=!1;a=B(a);var m=a.data("$$animateClasses");m?e&&m.options&&(m.options=ha.extend(m.options||{},e)):
+(m={classes:{},options:e},l=!0);e=m.classes;c=y(c)?c:c.split(" ");d=y(d)?d:d.split(" ");h(e,c,!0);h(e,d,!1);l&&(m.promise=f(function(c){var d=a.data("$$animateClasses");a.removeData("$$animateClasses");if(d){var e=g(a,d.classes);e&&k.$$setClassImmediately(a,e[0],e[1],d.options)}c()}),a.data("$$animateClasses",m));return m.promise},$$setClassImmediately:function(a,c,d,e){c&&this.$$addClassImmediately(a,c);d&&this.$$removeClassImmediately(a,d);l(a,e);return k()},enabled:x,cancel:x}}]}],ka=A("$compile");
+uc.$inject=["$provide","$$sanitizeUriProvider"];var nf=/^((?:x|data)[\:\-_])/i,Sc="application/json",Zb={"Content-Type":Sc+";charset=utf-8"},qf=/^\s*(\[|\{[^\{])/,rf=/[\}\]]\s*$/,pf=/^\)\]\}',?\n/,$b=A("$interpolate"),Nf=/^([^\?#]*)(\?([^#]*))?(#(.*))?$/,uf={http:80,https:443,ftp:21},eb=A("$location"),Of={$$html5:!1,$$replace:!1,absUrl:Bb("$$absUrl"),url:function(a){if(G(a))return this.$$url;var c=Nf.exec(a);(c[1]||""===a)&&this.path(decodeURIComponent(c[1]));(c[2]||c[1]||""===a)&&this.search(c[3]||
+"");this.hash(c[5]||"");return this},protocol:Bb("$$protocol"),host:Bb("$$host"),port:Bb("$$port"),path:$c("$$path",function(a){a=null!==a?a.toString():"";return"/"==a.charAt(0)?a:"/"+a}),search:function(a,c){switch(arguments.length){case 0:return this.$$search;case 1:if(I(a)||X(a))a=a.toString(),this.$$search=qc(a);else if(K(a))a=Ca(a,{}),r(a,function(c,e){null==c&&delete a[e]}),this.$$search=a;else throw eb("isrcharg");break;default:G(c)||null===c?delete this.$$search[a]:this.$$search[a]=c}this.$$compose();
+return this},hash:$c("$$hash",function(a){return null!==a?a.toString():""}),replace:function(){this.$$replace=!0;return this}};r([Zc,dc,cc],function(a){a.prototype=Object.create(Of);a.prototype.state=function(c){if(!arguments.length)return this.$$state;if(a!==cc||!this.$$html5)throw eb("nostate");this.$$state=G(c)?null:c;return this}});var la=A("$parse"),Pf=Function.prototype.call,Qf=Function.prototype.apply,Rf=Function.prototype.bind,Ib=ia();r({"null":function(){return null},"true":function(){return!0},
+"false":function(){return!1},undefined:function(){}},function(a,c){a.constant=a.literal=a.sharedGetter=!0;Ib[c]=a});Ib["this"]=function(a){return a};Ib["this"].sharedGetter=!0;var jb=D(ia(),{"+":function(a,c,d,e){d=d(a,c);e=e(a,c);return z(d)?z(e)?d+e:d:z(e)?e:u},"-":function(a,c,d,e){d=d(a,c);e=e(a,c);return(z(d)?d:0)-(z(e)?e:0)},"*":function(a,c,d,e){return d(a,c)*e(a,c)},"/":function(a,c,d,e){return d(a,c)/e(a,c)},"%":function(a,c,d,e){return d(a,c)%e(a,c)},"===":function(a,c,d,e){return d(a,c)===
+e(a,c)},"!==":function(a,c,d,e){return d(a,c)!==e(a,c)},"==":function(a,c,d,e){return d(a,c)==e(a,c)},"!=":function(a,c,d,e){return d(a,c)!=e(a,c)},"<":function(a,c,d,e){return d(a,c)<e(a,c)},">":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"!":function(a,c,d){return!d(a,c)},"=":!0,"|":!0}),Sf={n:"\n",f:"\f",r:"\r",t:"\t",
+v:"\v","'":"'",'"':'"'},gc=function(a){this.options=a};gc.prototype={constructor:gc,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index<this.text.length;)if(a=this.text.charAt(this.index),'"'===a||"'"===a)this.readString(a);else if(this.isNumber(a)||"."===a&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdent(a))this.readIdent();else if(this.is(a,"(){}[].,;:?"))this.tokens.push({index:this.index,text:a}),this.index++;else if(this.isWhitespace(a))this.index++;else{var c=
+a+this.peek(),d=c+this.peek(2),e=jb[c],f=jb[d];jb[a]||e||f?(a=f?d:e?c:a,this.tokens.push({index:this.index,text:a,operator:!0}),this.index+=a.length):this.throwError("Unexpected next character ",this.index,this.index+1)}return this.tokens},is:function(a,c){return-1!==c.indexOf(a)},peek:function(a){a=a||1;return this.index+a<this.text.length?this.text.charAt(this.index+a):!1},isNumber:function(a){return"0"<=a&&"9">=a&&"string"===typeof a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||
+"\n"===a||"\v"===a||"\u00a0"===a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){d=d||this.index;c=z(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,d)+"]":" "+d;throw la("lexerr",a,c,this.text);},readNumber:function(){for(var a="",c=this.index;this.index<this.text.length;){var d=R(this.text.charAt(this.index));if("."==d||this.isNumber(d))a+=d;else{var e=this.peek();if("e"==
+d&&this.isExpOperator(e))a+=d;else if(this.isExpOperator(d)&&e&&this.isNumber(e)&&"e"==a.charAt(a.length-1))a+=d;else if(!this.isExpOperator(d)||e&&this.isNumber(e)||"e"!=a.charAt(a.length-1))break;else this.throwError("Invalid exponent")}this.index++}this.tokens.push({index:c,text:a,constant:!0,value:Number(a)})},readIdent:function(){for(var a=this.index;this.index<this.text.length;){var c=this.text.charAt(this.index);if(!this.isIdent(c)&&!this.isNumber(c))break;this.index++}this.tokens.push({index:a,
+text:this.text.slice(a,this.index),identifier:!0})},readString:function(a){var c=this.index;this.index++;for(var d="",e=a,f=!1;this.index<this.text.length;){var g=this.text.charAt(this.index),e=e+g;if(f)"u"===g?(f=this.text.substring(this.index+1,this.index+5),f.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+f+"]"),this.index+=4,d+=String.fromCharCode(parseInt(f,16))):d+=Sf[g]||g,f=!1;else if("\\"===g)f=!0;else{if(g===a){this.index++;this.tokens.push({index:c,text:e,constant:!0,
+value:d});return}d+=g}this.index++}this.throwError("Unterminated quote",c)}};var fb=function(a,c,d){this.lexer=a;this.$filter=c;this.options=d};fb.ZERO=D(function(){return 0},{sharedGetter:!0,constant:!0});fb.prototype={constructor:fb,parse:function(a){this.text=a;this.tokens=this.lexer.lex(a);a=this.statements();0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]);a.literal=!!a.literal;a.constant=!!a.constant;return a},primary:function(){var a;this.expect("(")?(a=this.filterChain(),
+this.consume(")")):this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant():this.throwError("not a primary expression",this.peek());for(var c,d;c=this.expect("(","[",".");)"("===c.text?(a=this.functionCall(a,d),d=null):"["===c.text?(d=a,a=this.objectIndex(a)):"."===c.text?(d=a,a=this.fieldAccess(a)):this.throwError("IMPOSSIBLE");return a},throwError:function(a,c){throw la("syntax",c.text,a,c.index+
+1,this.text,this.text.substring(c.index));},peekToken:function(){if(0===this.tokens.length)throw la("ueoe",this.text);return this.tokens[0]},peek:function(a,c,d,e){return this.peekAhead(0,a,c,d,e)},peekAhead:function(a,c,d,e,f){if(this.tokens.length>a){a=this.tokens[a];var g=a.text;if(g===c||g===d||g===e||g===f||!(c||d||e||f))return a}return!1},expect:function(a,c,d,e){return(a=this.peek(a,c,d,e))?(this.tokens.shift(),a):!1},consume:function(a){if(0===this.tokens.length)throw la("ueoe",this.text);
+var c=this.expect(a);c||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return c},unaryFn:function(a,c){var d=jb[a];return D(function(a,f){return d(a,f,c)},{constant:c.constant,inputs:[c]})},binaryFn:function(a,c,d,e){var f=jb[c];return D(function(c,e){return f(c,e,a,d)},{constant:a.constant&&d.constant,inputs:!e&&[a,d]})},identifier:function(){for(var a=this.consume().text;this.peek(".")&&this.peekAhead(1).identifier&&!this.peekAhead(2,"(");)a+=this.consume().text+this.consume().text;
+return Ib[a]||bd(a,this.options,this.text)},constant:function(){var a=this.consume().value;return D(function(){return a},{constant:!0,literal:!0})},statements:function(){for(var a=[];;)if(0<this.tokens.length&&!this.peek("}",")",";","]")&&a.push(this.filterChain()),!this.expect(";"))return 1===a.length?a[0]:function(c,d){for(var e,f=0,g=a.length;f<g;f++)e=a[f](c,d);return e}},filterChain:function(){for(var a=this.expression();this.expect("|");)a=this.filter(a);return a},filter:function(a){var c=this.$filter(this.consume().text),
+d,e;if(this.peek(":"))for(d=[],e=[];this.expect(":");)d.push(this.expression());var f=[a].concat(d||[]);return D(function(f,h){var k=a(f,h);if(e){e[0]=k;for(k=d.length;k--;)e[k+1]=d[k](f,h);return c.apply(u,e)}return c(k)},{constant:!c.$stateful&&f.every(ec),inputs:!c.$stateful&&f})},expression:function(){return this.assignment()},assignment:function(){var a=this.ternary(),c,d;return(d=this.expect("="))?(a.assign||this.throwError("implies assignment but ["+this.text.substring(0,d.index)+"] can not be assigned to",
+d),c=this.ternary(),D(function(d,f){return a.assign(d,c(d,f),f)},{inputs:[a,c]})):a},ternary:function(){var a=this.logicalOR(),c;if(this.expect("?")&&(c=this.assignment(),this.consume(":"))){var d=this.assignment();return D(function(e,f){return a(e,f)?c(e,f):d(e,f)},{constant:a.constant&&c.constant&&d.constant})}return a},logicalOR:function(){for(var a=this.logicalAND(),c;c=this.expect("||");)a=this.binaryFn(a,c.text,this.logicalAND(),!0);return a},logicalAND:function(){var a=this.equality(),c;if(c=
+this.expect("&&"))a=this.binaryFn(a,c.text,this.logicalAND(),!0);return a},equality:function(){var a=this.relational(),c;if(c=this.expect("==","!=","===","!=="))a=this.binaryFn(a,c.text,this.equality());return a},relational:function(){var a=this.additive(),c;if(c=this.expect("<",">","<=",">="))a=this.binaryFn(a,c.text,this.relational());return a},additive:function(){for(var a=this.multiplicative(),c;c=this.expect("+","-");)a=this.binaryFn(a,c.text,this.multiplicative());return a},multiplicative:function(){for(var a=
+this.unary(),c;c=this.expect("*","/","%");)a=this.binaryFn(a,c.text,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn(fb.ZERO,a.text,this.unary()):(a=this.expect("!"))?this.unaryFn(a.text,this.unary()):this.primary()},fieldAccess:function(a){var c=this.text,d=this.consume().text,e=bd(d,this.options,c);return D(function(c,d,h){return e(h||a(c,d))},{assign:function(e,g,h){(h=a(e,h))||a.assign(e,h={});return Oa(h,d,g,c)}})},objectIndex:function(a){var c=
+this.text,d=this.expression();this.consume("]");return D(function(e,f){var g=a(e,f),h=d(e,f);ra(h,c);return g?sa(g[h],c):u},{assign:function(e,f,g){var h=ra(d(e,g),c);(g=sa(a(e,g),c))||a.assign(e,g={});return g[h]=f}})},functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text){do d.push(this.expression());while(this.expect(","))}this.consume(")");var e=this.text,f=d.length?[]:null;return function(g,h){var k=c?c(g,h):g,l=a(g,h,k)||x;if(f)for(var m=d.length;m--;)f[m]=sa(d[m](g,h),e);sa(k,
+e);if(l){if(l.constructor===l)throw la("isecfn",e);if(l===Pf||l===Qf||l===Rf)throw la("isecff",e);}k=l.apply?l.apply(k,f):l(f[0],f[1],f[2],f[3],f[4]);return sa(k,e)}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(","))}this.consume("]");return D(function(c,d){for(var e=[],f=0,g=a.length;f<g;f++)e.push(a[f](c,d));return e},{literal:!0,constant:a.every(ec),inputs:a})},object:function(){var a=[],c=[];if("}"!==
+this.peekToken().text){do{if(this.peek("}"))break;var d=this.consume();d.constant?a.push(d.value):d.identifier?a.push(d.text):this.throwError("invalid key",d);this.consume(":");c.push(this.expression())}while(this.expect(","))}this.consume("}");return D(function(d,f){for(var g={},h=0,k=c.length;h<k;h++)g[a[h]]=c[h](d,f);return g},{literal:!0,constant:c.every(ec),inputs:c})}};var xf=ia(),wf=ia(),yf=Object.prototype.valueOf,Ba=A("$sce"),ma={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",
+JS:"js"},ka=A("$compile"),Y=V.createElement("a"),fd=Aa(U.location.href);Bc.$inject=["$provide"];gd.$inject=["$locale"];id.$inject=["$locale"];var ld=".",Hf={yyyy:Z("FullYear",4),yy:Z("FullYear",2,0,!0),y:Z("FullYear",1),MMMM:Db("Month"),MMM:Db("Month",!0),MM:Z("Month",2,1),M:Z("Month",1,1),dd:Z("Date",2),d:Z("Date",1),HH:Z("Hours",2),H:Z("Hours",1),hh:Z("Hours",2,-12),h:Z("Hours",1,-12),mm:Z("Minutes",2),m:Z("Minutes",1),ss:Z("Seconds",2),s:Z("Seconds",1),sss:Z("Milliseconds",3),EEEE:Db("Day"),EEE:Db("Day",
+!0),a:function(a,c){return 12>a.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){a=-1*a.getTimezoneOffset();return a=(0<=a?"+":"")+(Cb(Math[0<a?"floor":"ceil"](a/60),2)+Cb(Math.abs(a%60),2))},ww:nd(2),w:nd(1)},Gf=/((?:[^yMdHhmsaZEw']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|w+))(.*)/,Ff=/^\-?\d+$/;hd.$inject=["$locale"];var Df=ca(R),Ef=ca(rb);jd.$inject=["$parse"];var Qd=ca({restrict:"E",compile:function(a,c){if(!c.href&&!c.xlinkHref&&!c.name)return function(a,c){var f="[object SVGAnimatedString]"===
+Ja.call(c.prop("href"))?"xlink:href":"href";c.on("click",function(a){c.attr(f)||a.preventDefault()})}}}),sb={};r(yb,function(a,c){if("multiple"!=a){var d=wa("ng-"+c);sb[d]=function(){return{restrict:"A",priority:100,link:function(a,f,g){a.$watch(g[d],function(a){g.$set(c,!!a)})}}}}});r(Lc,function(a,c){sb[c]=function(){return{priority:100,link:function(a,e,f){if("ngPattern"===c&&"/"==f.ngPattern.charAt(0)&&(e=f.ngPattern.match(Jf))){f.$set("ngPattern",new RegExp(e[1],e[2]));return}a.$watch(f[c],function(a){f.$set(c,
+a)})}}}});r(["src","srcset","href"],function(a){var c=wa("ng-"+a);sb[c]=function(){return{priority:99,link:function(d,e,f){var g=a,h=a;"href"===a&&"[object SVGAnimatedString]"===Ja.call(e.prop("href"))&&(h="xlinkHref",f.$attr[h]="xlink:href",g=null);f.$observe(c,function(c){c?(f.$set(h,c),Ha&&g&&e.prop(g,f[h])):"href"===a&&f.$set(h,null)})}}}});var Eb={$addControl:x,$$renameControl:function(a,c){a.$name=c},$removeControl:x,$setValidity:x,$setDirty:x,$setPristine:x,$setSubmitted:x};od.$inject=["$element",
+"$attrs","$scope","$animate","$interpolate"];var vd=function(a){return["$timeout",function(c){return{name:"form",restrict:a?"EAC":"E",controller:od,compile:function(a){a.addClass(Qa).addClass(ib);return{pre:function(a,d,g,h){if(!("action"in g)){var k=function(c){a.$apply(function(){h.$commitViewValue();h.$setSubmitted()});c.preventDefault()};d[0].addEventListener("submit",k,!1);d.on("$destroy",function(){c(function(){d[0].removeEventListener("submit",k,!1)},0,!1)})}var l=h.$$parentForm,m=h.$name;
+m&&(Oa(a,m,h,m),g.$observe(g.name?"name":"ngForm",function(c){m!==c&&(Oa(a,m,u,m),m=c,Oa(a,m,h,m),l.$$renameControl(h,m))}));d.on("$destroy",function(){l.$removeControl(h);m&&Oa(a,m,u,m);D(h,Eb)})}}}}}]},Rd=vd(),de=vd(!0),If=/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/,Tf=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,Uf=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,Vf=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,
+wd=/^(\d{4})-(\d{2})-(\d{2})$/,xd=/^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,jc=/^(\d{4})-W(\d\d)$/,yd=/^(\d{4})-(\d\d)$/,zd=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Wf=/(\s+|^)default(\s+|$)/,Hb=new A("ngModel"),Ad={text:function(a,c,d,e,f,g){gb(a,c,d,e,f,g);hc(e)},date:hb("date",wd,Gb(wd,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":hb("datetimelocal",xd,Gb(xd,"yyyy MM dd HH mm ss sss".split(" ")),"yyyy-MM-ddTHH:mm:ss.sss"),time:hb("time",zd,Gb(zd,["HH","mm","ss","sss"]),
+"HH:mm:ss.sss"),week:hb("week",jc,function(a,c){if(fa(a))return a;if(I(a)){jc.lastIndex=0;var d=jc.exec(a);if(d){var e=+d[1],f=+d[2],g=d=0,h=0,k=0,l=md(e),f=7*(f-1);c&&(d=c.getHours(),g=c.getMinutes(),h=c.getSeconds(),k=c.getMilliseconds());return new Date(e,0,l.getDate()+f,d,g,h,k)}}return NaN},"yyyy-Www"),month:hb("month",yd,Gb(yd,["yyyy","MM"]),"yyyy-MM"),number:function(a,c,d,e,f,g){qd(a,c,d,e);gb(a,c,d,e,f,g);e.$$parserName="number";e.$parsers.push(function(a){return e.$isEmpty(a)?null:Vf.test(a)?
+parseFloat(a):u});e.$formatters.push(function(a){if(!e.$isEmpty(a)){if(!X(a))throw Hb("numfmt",a);a=a.toString()}return a});if(d.min||d.ngMin){var h;e.$validators.min=function(a){return e.$isEmpty(a)||G(h)||a>=h};d.$observe("min",function(a){z(a)&&!X(a)&&(a=parseFloat(a,10));h=X(a)&&!isNaN(a)?a:u;e.$validate()})}if(d.max||d.ngMax){var k;e.$validators.max=function(a){return e.$isEmpty(a)||G(k)||a<=k};d.$observe("max",function(a){z(a)&&!X(a)&&(a=parseFloat(a,10));k=X(a)&&!isNaN(a)?a:u;e.$validate()})}},
+url:function(a,c,d,e,f,g){gb(a,c,d,e,f,g);hc(e);e.$$parserName="url";e.$validators.url=function(a,c){var d=a||c;return e.$isEmpty(d)||Tf.test(d)}},email:function(a,c,d,e,f,g){gb(a,c,d,e,f,g);hc(e);e.$$parserName="email";e.$validators.email=function(a,c){var d=a||c;return e.$isEmpty(d)||Uf.test(d)}},radio:function(a,c,d,e){G(d.name)&&c.attr("name",++kb);c.on("click",function(a){c[0].checked&&e.$setViewValue(d.value,a&&a.type)});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe("value",
+e.$render)},checkbox:function(a,c,d,e,f,g,h,k){var l=rd(k,a,"ngTrueValue",d.ngTrueValue,!0),m=rd(k,a,"ngFalseValue",d.ngFalseValue,!1);c.on("click",function(a){e.$setViewValue(c[0].checked,a&&a.type)});e.$render=function(){c[0].checked=e.$viewValue};e.$isEmpty=function(a){return!1===a};e.$formatters.push(function(a){return pa(a,l)});e.$parsers.push(function(a){return a?l:m})},hidden:x,button:x,submit:x,reset:x,file:x},vc=["$browser","$sniffer","$filter","$parse",function(a,c,d,e){return{restrict:"E",
+require:["?ngModel"],link:{pre:function(f,g,h,k){k[0]&&(Ad[R(h.type)]||Ad.text)(f,g,h,k[0],c,a,d,e)}}}}],ib="ng-valid",sd="ng-invalid",Qa="ng-pristine",Fb="ng-dirty",ud="ng-pending",Xf=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,c,d,e,f,g,h,k,l,m){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=u;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=
+[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success={};this.$pending=u;this.$name=m(d.name||"",!1)(a);var p=f(d.ngModel),s=p.assign,t=p,q=s,N=null,n=this;this.$$setOptions=function(a){if((n.$options=a)&&a.getterSetter){var c=f(d.ngModel+"()"),g=f(d.ngModel+"($$$p)");t=function(a){var d=p(a);F(d)&&(d=c(a));return d};q=function(a,c){F(p(a))?g(a,{$$$p:n.$modelValue}):s(a,n.$modelValue)}}else if(!p.assign)throw Hb("nonassign",
+d.ngModel,va(e));};this.$render=x;this.$isEmpty=function(a){return G(a)||""===a||null===a||a!==a};var v=e.inheritedData("$formController")||Eb,w=0;pd({ctrl:this,$element:e,set:function(a,c){a[c]=!0},unset:function(a,c){delete a[c]},parentForm:v,$animate:g});this.$setPristine=function(){n.$dirty=!1;n.$pristine=!0;g.removeClass(e,Fb);g.addClass(e,Qa)};this.$setDirty=function(){n.$dirty=!0;n.$pristine=!1;g.removeClass(e,Qa);g.addClass(e,Fb);v.$setDirty()};this.$setUntouched=function(){n.$touched=!1;
+n.$untouched=!0;g.setClass(e,"ng-untouched","ng-touched")};this.$setTouched=function(){n.$touched=!0;n.$untouched=!1;g.setClass(e,"ng-touched","ng-untouched")};this.$rollbackViewValue=function(){h.cancel(N);n.$viewValue=n.$$lastCommittedViewValue;n.$render()};this.$validate=function(){if(!X(n.$modelValue)||!isNaN(n.$modelValue)){var a=n.$$rawModelValue,c=n.$valid,d=n.$modelValue,e=n.$options&&n.$options.allowInvalid;n.$$runValidators(n.$error[n.$$parserName||"parse"]?!1:u,a,n.$$lastCommittedViewValue,
+function(f){e||c===f||(n.$modelValue=f?a:u,n.$modelValue!==d&&n.$$writeModelToScope())})}};this.$$runValidators=function(a,c,d,e){function f(){var a=!0;r(n.$validators,function(e,f){var g=e(c,d);a=a&&g;h(f,g)});return a?!0:(r(n.$asyncValidators,function(a,c){h(c,null)}),!1)}function g(){var a=[],e=!0;r(n.$asyncValidators,function(f,g){var k=f(c,d);if(!k||!F(k.then))throw Hb("$asyncValidators",k);h(g,u);a.push(k.then(function(){h(g,!0)},function(a){e=!1;h(g,!1)}))});a.length?l.all(a).then(function(){k(e)},
+x):k(!0)}function h(a,c){m===w&&n.$setValidity(a,c)}function k(a){m===w&&e(a)}w++;var m=w;(function(a){var c=n.$$parserName||"parse";if(a===u)h(c,null);else if(h(c,a),!a)return r(n.$validators,function(a,c){h(c,null)}),r(n.$asyncValidators,function(a,c){h(c,null)}),!1;return!0})(a)?f()?g():k(!1):k(!1)};this.$commitViewValue=function(){var a=n.$viewValue;h.cancel(N);if(n.$$lastCommittedViewValue!==a||""===a&&n.$$hasNativeValidators)n.$$lastCommittedViewValue=a,n.$pristine&&this.$setDirty(),this.$$parseAndValidate()};
+this.$$parseAndValidate=function(){var c=n.$$lastCommittedViewValue,d=c,e=G(d)?u:!0;if(e)for(var f=0;f<n.$parsers.length;f++)if(d=n.$parsers[f](d),G(d)){e=!1;break}X(n.$modelValue)&&isNaN(n.$modelValue)&&(n.$modelValue=t(a));var g=n.$modelValue,h=n.$options&&n.$options.allowInvalid;n.$$rawModelValue=d;h&&(n.$modelValue=d,n.$modelValue!==g&&n.$$writeModelToScope());n.$$runValidators(e,d,c,function(a){h||(n.$modelValue=a?d:u,n.$modelValue!==g&&n.$$writeModelToScope())})};this.$$writeModelToScope=function(){q(a,
+n.$modelValue);r(n.$viewChangeListeners,function(a){try{a()}catch(d){c(d)}})};this.$setViewValue=function(a,c){n.$viewValue=a;n.$options&&!n.$options.updateOnDefault||n.$$debounceViewValueCommit(c)};this.$$debounceViewValueCommit=function(c){var d=0,e=n.$options;e&&z(e.debounce)&&(e=e.debounce,X(e)?d=e:X(e[c])?d=e[c]:X(e["default"])&&(d=e["default"]));h.cancel(N);d?N=h(function(){n.$commitViewValue()},d):k.$$phase?n.$commitViewValue():a.$apply(function(){n.$commitViewValue()})};a.$watch(function(){var c=
+t(a);if(c!==n.$modelValue){n.$modelValue=n.$$rawModelValue=c;for(var d=n.$formatters,e=d.length,f=c;e--;)f=d[e](f);n.$viewValue!==f&&(n.$viewValue=n.$$lastCommittedViewValue=f,n.$render(),n.$$runValidators(u,c,f,x))}return c})}],se=["$rootScope",function(a){return{restrict:"A",require:["ngModel","^?form","^?ngModelOptions"],controller:Xf,priority:1,compile:function(c){c.addClass(Qa).addClass("ng-untouched").addClass(ib);return{pre:function(a,c,f,g){var h=g[0],k=g[1]||Eb;h.$$setOptions(g[2]&&g[2].$options);
+k.$addControl(h);f.$observe("name",function(a){h.$name!==a&&k.$$renameControl(h,a)});a.$on("$destroy",function(){k.$removeControl(h)})},post:function(c,e,f,g){var h=g[0];if(h.$options&&h.$options.updateOn)e.on(h.$options.updateOn,function(a){h.$$debounceViewValueCommit(a&&a.type)});e.on("blur",function(e){h.$touched||(a.$$phase?c.$evalAsync(h.$setTouched):c.$apply(h.$setTouched))})}}}}}],ue=ca({restrict:"A",require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),
+xc=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){e&&(d.required=!0,e.$validators.required=function(a,c){return!d.required||!e.$isEmpty(c)},d.$observe("required",function(){e.$validate()}))}}},wc=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f,g=d.ngPattern||d.pattern;d.$observe("pattern",function(a){I(a)&&0<a.length&&(a=new RegExp("^"+a+"$"));if(a&&!a.test)throw A("ngPattern")("noregexp",g,a,va(c));f=a||u;e.$validate()});e.$validators.pattern=
+function(a){return e.$isEmpty(a)||G(f)||f.test(a)}}}}},zc=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f=-1;d.$observe("maxlength",function(a){a=$(a);f=isNaN(a)?-1:a;e.$validate()});e.$validators.maxlength=function(a,c){return 0>f||e.$isEmpty(a)||c.length<=f}}}}},yc=function(){return{restrict:"A",require:"?ngModel",link:function(a,c,d,e){if(e){var f=0;d.$observe("minlength",function(a){f=$(a)||0;e.$validate()});e.$validators.minlength=function(a,c){return e.$isEmpty(c)||
+c.length>=f}}}}},te=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,c,d,e){var f=c.attr(d.$attr.ngList)||", ",g="false"!==d.ngTrim,h=g?P(f):f;e.$parsers.push(function(a){if(!G(a)){var c=[];a&&r(a.split(h),function(a){a&&c.push(g?P(a):a)});return c}});e.$formatters.push(function(a){return y(a)?a.join(f):u});e.$isEmpty=function(a){return!a||!a.length}}}},Yf=/^(true|false|\d+)$/,ve=function(){return{restrict:"A",priority:100,compile:function(a,c){return Yf.test(c.ngValue)?
+function(a,c,f){f.$set("value",a.$eval(f.ngValue))}:function(a,c,f){a.$watch(f.ngValue,function(a){f.$set("value",a)})}}}},we=function(){return{restrict:"A",controller:["$scope","$attrs",function(a,c){var d=this;this.$options=a.$eval(c.ngModelOptions);this.$options.updateOn!==u?(this.$options.updateOnDefault=!1,this.$options.updateOn=P(this.$options.updateOn.replace(Wf,function(){d.$options.updateOnDefault=!0;return" "}))):this.$options.updateOnDefault=!0}]}},Wd=["$compile",function(a){return{restrict:"AC",
+compile:function(c){a.$$addBindingClass(c);return function(c,e,f){a.$$addBindingInfo(e,f.ngBind);e=e[0];c.$watch(f.ngBind,function(a){e.textContent=a===u?"":a})}}}}],Yd=["$interpolate","$compile",function(a,c){return{compile:function(d){c.$$addBindingClass(d);return function(d,f,g){d=a(f.attr(g.$attr.ngBindTemplate));c.$$addBindingInfo(f,d.expressions);f=f[0];g.$observe("ngBindTemplate",function(a){f.textContent=a===u?"":a})}}}}],Xd=["$sce","$parse","$compile",function(a,c,d){return{restrict:"A",
+compile:function(e,f){var g=c(f.ngBindHtml),h=c(f.ngBindHtml,function(a){return(a||"").toString()});d.$$addBindingClass(e);return function(c,e,f){d.$$addBindingInfo(e,f.ngBindHtml);c.$watch(h,function(){e.html(a.getTrustedHtml(g(c))||"")})}}}}],Zd=ic("",!0),ae=ic("Odd",0),$d=ic("Even",1),be=Ia({compile:function(a,c){c.$set("ngCloak",u);a.removeClass("ng-cloak")}}),ce=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],Ac={},Zf={blur:!0,focus:!0};r("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),
+function(a){var c=wa("ng-"+a);Ac[c]=["$parse","$rootScope",function(d,e){return{restrict:"A",compile:function(f,g){var h=d(g[c],null,!0);return function(c,d){d.on(a,function(d){var f=function(){h(c,{$event:d})};Zf[a]&&e.$$phase?c.$evalAsync(f):c.$apply(f)})}}}}]});var fe=["$animate",function(a){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,f,g){var h,k,l;c.$watch(e.ngIf,function(c){c?k||g(function(c,f){k=f;c[c.length++]=V.createComment(" end ngIf: "+
+e.ngIf+" ");h={clone:c};a.enter(c,d.parent(),d)}):(l&&(l.remove(),l=null),k&&(k.$destroy(),k=null),h&&(l=qb(h.clone),a.leave(l).then(function(){l=null}),h=null))})}}}],ge=["$templateRequest","$anchorScroll","$animate","$sce",function(a,c,d,e){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:ha.noop,compile:function(f,g){var h=g.ngInclude||g.src,k=g.onload||"",l=g.autoscroll;return function(f,g,s,r,q){var u=0,n,v,w,O=function(){v&&(v.remove(),v=null);n&&(n.$destroy(),
+n=null);w&&(d.leave(w).then(function(){v=null}),v=w,w=null)};f.$watch(e.parseAsResourceUrl(h),function(e){var h=function(){!z(l)||l&&!f.$eval(l)||c()},s=++u;e?(a(e,!0).then(function(a){if(s===u){var c=f.$new();r.template=a;a=q(c,function(a){O();d.enter(a,null,g).then(h)});n=c;w=a;n.$emit("$includeContentLoaded",e);f.$eval(k)}},function(){s===u&&(O(),f.$emit("$includeContentError",e))}),f.$emit("$includeContentRequested",e)):(O(),r.template=null)})}}}}],xe=["$compile",function(a){return{restrict:"ECA",
+priority:-400,require:"ngInclude",link:function(c,d,e,f){/SVG/.test(d[0].toString())?(d.empty(),a(Dc(f.template,V).childNodes)(c,function(a){d.append(a)},{futureParentElement:d})):(d.html(f.template),a(d.contents())(c))}}}],he=Ia({priority:450,compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),ie=Ia({terminal:!0,priority:1E3}),je=["$locale","$interpolate",function(a,c){var d=/{}/g,e=/^when(Minus)?(.+)$/;return{restrict:"EA",link:function(f,g,h){function k(a){g.text(a||"")}var l=
+h.count,m=h.$attr.when&&g.attr(h.$attr.when),p=h.offset||0,s=f.$eval(m)||{},t={},m=c.startSymbol(),q=c.endSymbol(),u=m+l+"-"+p+q,n=ha.noop,v;r(h,function(a,c){var d=e.exec(c);d&&(d=(d[1]?"-":"")+R(d[2]),s[d]=g.attr(h.$attr[c]))});r(s,function(a,e){t[e]=c(a.replace(d,u))});f.$watch(l,function(c){c=parseFloat(c);var d=isNaN(c);d||c in s||(c=a.pluralCat(c-p));c===v||d&&isNaN(v)||(n(),n=f.$watch(t[c],k),v=c)})}}}],ke=["$parse","$animate",function(a,c){var d=A("ngRepeat"),e=function(a,c,d,e,l,m,p){a[d]=
+e;l&&(a[l]=m);a.$index=c;a.$first=0===c;a.$last=c===p-1;a.$middle=!(a.$first||a.$last);a.$odd=!(a.$even=0===(c&1))};return{restrict:"A",multiElement:!0,transclude:"element",priority:1E3,terminal:!0,$$tlb:!0,compile:function(f,g){var h=g.ngRepeat,k=V.createComment(" end ngRepeat: "+h+" "),l=h.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);if(!l)throw d("iexp",h);var m=l[1],p=l[2],s=l[3],t=l[4],l=m.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);
+if(!l)throw d("iidexp",m);var q=l[3]||l[1],z=l[2];if(s&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(s)||/^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent)$/.test(s)))throw d("badident",s);var n,v,w,A,E={$id:Ma};t?n=a(t):(w=function(a,c){return Ma(c)},A=function(a){return a});return function(a,f,g,l,m){n&&(v=function(c,d,e){z&&(E[z]=c);E[q]=d;E.$index=e;return n(a,E)});var t=ia();a.$watchCollection(p,function(g){var l,n,p=f[0],C,E=ia(),D,x,G,T,y,F,I;s&&(a[s]=g);if(Ra(g))y=g,n=v||
+w;else{n=v||A;y=[];for(I in g)g.hasOwnProperty(I)&&"$"!=I.charAt(0)&&y.push(I);y.sort()}D=y.length;I=Array(D);for(l=0;l<D;l++)if(x=g===y?l:y[l],G=g[x],T=n(x,G,l),t[T])F=t[T],delete t[T],E[T]=F,I[l]=F;else{if(E[T])throw r(I,function(a){a&&a.scope&&(t[a.id]=a)}),d("dupes",h,T,G);I[l]={id:T,scope:u,clone:u};E[T]=!0}for(C in t){F=t[C];T=qb(F.clone);c.leave(T);if(T[0].parentNode)for(l=0,n=T.length;l<n;l++)T[l].$$NG_REMOVED=!0;F.scope.$destroy()}for(l=0;l<D;l++)if(x=g===y?l:y[l],G=g[x],F=I[l],F.scope){C=
+p;do C=C.nextSibling;while(C&&C.$$NG_REMOVED);F.clone[0]!=C&&c.move(qb(F.clone),null,B(p));p=F.clone[F.clone.length-1];e(F.scope,l,q,G,z,x,D)}else m(function(a,d){F.scope=d;var f=k.cloneNode(!1);a[a.length++]=f;c.enter(a,null,B(p));p=f;F.clone=a;E[F.id]=F;e(F.scope,l,q,G,z,x,D)});t=E})}}}}],le=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(c,d,e){c.$watch(e.ngShow,function(c){a[c?"removeClass":"addClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],ee=["$animate",
+function(a){return{restrict:"A",multiElement:!0,link:function(c,d,e){c.$watch(e.ngHide,function(c){a[c?"addClass":"removeClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],me=Ia(function(a,c,d){a.$watch(d.ngStyle,function(a,d){d&&a!==d&&r(d,function(a,d){c.css(d,"")});a&&c.css(a)},!0)}),ne=["$animate",function(a){return{restrict:"EA",require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(c,d,e,f){var g=[],h=[],k=[],l=[],m=function(a,c){return function(){a.splice(c,
+1)}};c.$watch(e.ngSwitch||e.on,function(c){var d,e;d=0;for(e=k.length;d<e;++d)a.cancel(k[d]);d=k.length=0;for(e=l.length;d<e;++d){var q=qb(h[d].clone);l[d].$destroy();(k[d]=a.leave(q)).then(m(k,d))}h.length=0;l.length=0;(g=f.cases["!"+c]||f.cases["?"])&&r(g,function(c){c.transclude(function(d,e){l.push(e);var f=c.element;d[d.length++]=V.createComment(" end ngSwitchWhen: ");h.push({clone:d});a.enter(d,f.parent(),f)})})})}}}],oe=Ia({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,
+link:function(a,c,d,e,f){e.cases["!"+d.ngSwitchWhen]=e.cases["!"+d.ngSwitchWhen]||[];e.cases["!"+d.ngSwitchWhen].push({transclude:f,element:c})}}),pe=Ia({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,c,d,e,f){e.cases["?"]=e.cases["?"]||[];e.cases["?"].push({transclude:f,element:c})}}),re=Ia({restrict:"EAC",link:function(a,c,d,e,f){if(!f)throw A("ngTransclude")("orphan",va(c));f(function(a){c.empty();c.append(a)})}}),Sd=["$templateCache",function(a){return{restrict:"E",
+terminal:!0,compile:function(c,d){"text/ng-template"==d.type&&a.put(d.id,c[0].text)}}}],$f=A("ngOptions"),qe=ca({restrict:"A",terminal:!0}),Td=["$compile","$parse",function(a,c){var d=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,e={$setViewValue:x};return{restrict:"E",require:["select","?ngModel"],controller:["$element","$scope","$attrs",function(a,
+c,d){var k=this,l={},m=e,p;k.databound=d.ngModel;k.init=function(a,c,d){m=a;p=d};k.addOption=function(c,d){La(c,'"option value"');l[c]=!0;m.$viewValue==c&&(a.val(c),p.parent()&&p.remove());d&&d[0].hasAttribute("selected")&&(d[0].selected=!0)};k.removeOption=function(a){this.hasOption(a)&&(delete l[a],m.$viewValue===a&&this.renderUnknownOption(a))};k.renderUnknownOption=function(c){c="? "+Ma(c)+" ?";p.val(c);a.prepend(p);a.val(c);p.prop("selected",!0)};k.hasOption=function(a){return l.hasOwnProperty(a)};
+c.$on("$destroy",function(){k.renderUnknownOption=x})}],link:function(e,g,h,k){function l(a,c,d,e){d.$render=function(){var a=d.$viewValue;e.hasOption(a)?(E.parent()&&E.remove(),c.val(a),""===a&&n.prop("selected",!0)):G(a)&&n?c.val(""):e.renderUnknownOption(a)};c.on("change",function(){a.$apply(function(){E.parent()&&E.remove();d.$setViewValue(c.val())})})}function m(a,c,d){var e;d.$render=function(){var a=new cb(d.$viewValue);r(c.find("option"),function(c){c.selected=z(a.get(c.value))})};a.$watch(function(){pa(e,
+d.$viewValue)||(e=ua(d.$viewValue),d.$render())});c.on("change",function(){a.$apply(function(){var a=[];r(c.find("option"),function(c){c.selected&&a.push(c.value)});d.$setViewValue(a)})})}function p(e,f,g){function h(a,c,d){U[x]=d;G&&(U[G]=c);return a(e,U)}function k(a){var c;if(t)if(K&&y(a)){c=new cb([]);for(var d=0;d<a.length;d++)c.put(h(K,null,a[d]),!0)}else c=new cb(a);else K&&(a=h(K,null,a));return function(d,e){var f;f=K?K:D?D:H;return t?z(c.remove(h(f,d,e))):a===h(f,d,e)}}function l(){v||(e.$$postDigest(n),
+v=!0)}function m(a,c,d){a[c]=a[c]||0;a[c]+=d?1:-1}function n(){v=!1;var a={"":[]},c=[""],d,l,p,q,u;p=g.$viewValue;q=M(e)||[];var D=G?Object.keys(q).sort():q,x,B,H,y,Q={};u=k(p);var P=!1,V,X;R={};for(y=0;H=D.length,y<H;y++){x=y;if(G&&(x=D[y],"$"===x.charAt(0)))continue;B=q[x];d=h(I,x,B)||"";(l=a[d])||(l=a[d]=[],c.push(d));d=u(x,B);P=P||d;B=h(E,x,B);B=z(B)?B:"";X=K?K(e,U):G?D[y]:y;K&&(R[X]=x);l.push({id:X,label:B,selected:d})}t||(A||null===p?a[""].unshift({id:"",label:"",selected:!P}):P||a[""].unshift({id:"?",
+label:"",selected:!0}));x=0;for(D=c.length;x<D;x++){d=c[x];l=a[d];S.length<=x?(p={element:F.clone().attr("label",d),label:l.label},q=[p],S.push(q),f.append(p.element)):(q=S[x],p=q[0],p.label!=d&&p.element.attr("label",p.label=d));P=null;y=0;for(H=l.length;y<H;y++)d=l[y],(u=q[y+1])?(P=u.element,u.label!==d.label&&(m(Q,u.label,!1),m(Q,d.label,!0),P.text(u.label=d.label),P.prop("label",u.label)),u.id!==d.id&&P.val(u.id=d.id),P[0].selected!==d.selected&&(P.prop("selected",u.selected=d.selected),Ha&&P.prop("selected",
+u.selected))):(""===d.id&&A?V=A:(V=w.clone()).val(d.id).prop("selected",d.selected).attr("selected",d.selected).prop("label",d.label).text(d.label),q.push(u={element:V,label:d.label,id:d.id,selected:d.selected}),m(Q,d.label,!0),P?P.after(V):p.element.append(V),P=V);for(y++;q.length>y;)d=q.pop(),m(Q,d.label,!1),d.element.remove()}for(;S.length>x;){l=S.pop();for(y=1;y<l.length;++y)m(Q,l[y].label,!1);l[0].element.remove()}r(Q,function(a,c){0<a?s.addOption(c):0>a&&s.removeOption(c)})}var p;if(!(p=q.match(d)))throw $f("iexp",
+q,va(f));var E=c(p[2]||p[1]),x=p[4]||p[6],B=/ as /.test(p[0])&&p[1],D=B?c(B):null,G=p[5],I=c(p[3]||""),H=c(p[2]?p[1]:x),M=c(p[7]),K=p[8]?c(p[8]):null,R={},S=[[{element:f,label:""}]],U={};A&&(a(A)(e),A.removeClass("ng-scope"),A.remove());f.empty();f.on("change",function(){e.$apply(function(){var a=M(e)||[],c;if(t)c=[],r(f.val(),function(d){d=K?R[d]:d;c.push("?"===d?u:""===d?null:h(D?D:H,d,a[d]))});else{var d=K?R[f.val()]:f.val();c="?"===d?u:""===d?null:h(D?D:H,d,a[d])}g.$setViewValue(c);n()})});g.$render=
+n;e.$watchCollection(M,l);e.$watchCollection(function(){var a=M(e),c;if(a&&y(a)){c=Array(a.length);for(var d=0,f=a.length;d<f;d++)c[d]=h(E,d,a[d])}else if(a)for(d in c={},a)a.hasOwnProperty(d)&&(c[d]=h(E,d,a[d]));return c},l);t&&e.$watchCollection(function(){return g.$modelValue},l)}if(k[1]){var s=k[0];k=k[1];var t=h.multiple,q=h.ngOptions,A=!1,n,v=!1,w=B(V.createElement("option")),F=B(V.createElement("optgroup")),E=w.clone();h=0;for(var x=g.children(),D=x.length;h<D;h++)if(""===x[h].value){n=A=x.eq(h);
+break}s.init(k,A,E);t&&(k.$isEmpty=function(a){return!a||0===a.length});q?p(e,g,k):t?m(e,g,k):l(e,g,k,s)}}}}],Vd=["$interpolate",function(a){var c={addOption:x,removeOption:x};return{restrict:"E",priority:100,compile:function(d,e){if(G(e.value)){var f=a(d.text(),!0);f||e.$set("value",d.text())}return function(a,d,e){var l=d.parent(),m=l.data("$selectController")||l.parent().data("$selectController");m&&m.databound||(m=c);f?a.$watch(f,function(a,c){e.$set("value",a);c!==a&&m.removeOption(c);m.addOption(a,
+d)}):m.addOption(e.value,d);d.on("$destroy",function(){m.removeOption(e.value)})}}}}],Ud=ca({restrict:"E",terminal:!1});U.angular.bootstrap?console.log("WARNING: Tried to load angular more than once."):(Kd(),Md(ha),B(V).ready(function(){Gd(V,rc)}))})(window,document);!window.angular.$$csp()&&window.angular.element(document).find("head").prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}</style>');
+//# sourceMappingURL=angular.min.js.map
diff --git a/framework/src/onos/web/gui/src/main/webapp/tp/d3.js b/framework/src/onos/web/gui/src/main/webapp/tp/d3.js
new file mode 100644
index 00000000..fa4d7fa9
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tp/d3.js
@@ -0,0 +1,9243 @@
+!function() {
+ var d3 = {
+ version: "3.4.12"
+ };
+ if (!Date.now) Date.now = function() {
+ return +new Date();
+ };
+ var d3_arraySlice = [].slice, d3_array = function(list) {
+ return d3_arraySlice.call(list);
+ };
+ var d3_document = document, d3_documentElement = d3_document.documentElement, d3_window = window;
+ try {
+ d3_array(d3_documentElement.childNodes)[0].nodeType;
+ } catch (e) {
+ d3_array = function(list) {
+ var i = list.length, array = new Array(i);
+ while (i--) array[i] = list[i];
+ return array;
+ };
+ }
+ try {
+ d3_document.createElement("div").style.setProperty("opacity", 0, "");
+ } catch (error) {
+ var d3_element_prototype = d3_window.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = d3_window.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;
+ d3_element_prototype.setAttribute = function(name, value) {
+ d3_element_setAttribute.call(this, name, value + "");
+ };
+ d3_element_prototype.setAttributeNS = function(space, local, value) {
+ d3_element_setAttributeNS.call(this, space, local, value + "");
+ };
+ d3_style_prototype.setProperty = function(name, value, priority) {
+ d3_style_setProperty.call(this, name, value + "", priority);
+ };
+ }
+ d3.ascending = d3_ascending;
+ function d3_ascending(a, b) {
+ return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
+ }
+ d3.descending = function(a, b) {
+ return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
+ };
+ d3.min = function(array, f) {
+ var i = -1, n = array.length, a, b;
+ if (arguments.length === 1) {
+ while (++i < n && !((a = array[i]) != null && a <= a)) a = undefined;
+ while (++i < n) if ((b = array[i]) != null && a > b) a = b;
+ } else {
+ while (++i < n && !((a = f.call(array, array[i], i)) != null && a <= a)) a = undefined;
+ while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;
+ }
+ return a;
+ };
+ d3.max = function(array, f) {
+ var i = -1, n = array.length, a, b;
+ if (arguments.length === 1) {
+ while (++i < n && !((a = array[i]) != null && a <= a)) a = undefined;
+ while (++i < n) if ((b = array[i]) != null && b > a) a = b;
+ } else {
+ while (++i < n && !((a = f.call(array, array[i], i)) != null && a <= a)) a = undefined;
+ while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;
+ }
+ return a;
+ };
+ d3.extent = function(array, f) {
+ var i = -1, n = array.length, a, b, c;
+ if (arguments.length === 1) {
+ while (++i < n && !((a = c = array[i]) != null && a <= a)) a = c = undefined;
+ while (++i < n) if ((b = array[i]) != null) {
+ if (a > b) a = b;
+ if (c < b) c = b;
+ }
+ } else {
+ while (++i < n && !((a = c = f.call(array, array[i], i)) != null && a <= a)) a = undefined;
+ while (++i < n) if ((b = f.call(array, array[i], i)) != null) {
+ if (a > b) a = b;
+ if (c < b) c = b;
+ }
+ }
+ return [ a, c ];
+ };
+ d3.sum = function(array, f) {
+ var s = 0, n = array.length, a, i = -1;
+ if (arguments.length === 1) {
+ while (++i < n) if (!isNaN(a = +array[i])) s += a;
+ } else {
+ while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a;
+ }
+ return s;
+ };
+ function d3_number(x) {
+ return x != null && !isNaN(x);
+ }
+ d3.mean = function(array, f) {
+ var s = 0, n = array.length, a, i = -1, j = n;
+ if (arguments.length === 1) {
+ while (++i < n) if (d3_number(a = array[i])) s += a; else --j;
+ } else {
+ while (++i < n) if (d3_number(a = f.call(array, array[i], i))) s += a; else --j;
+ }
+ return j ? s / j : undefined;
+ };
+ d3.quantile = function(values, p) {
+ var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h;
+ return e ? v + e * (values[h] - v) : v;
+ };
+ d3.median = function(array, f) {
+ if (arguments.length > 1) array = array.map(f);
+ array = array.filter(d3_number);
+ return array.length ? d3.quantile(array.sort(d3_ascending), .5) : undefined;
+ };
+ function d3_bisector(compare) {
+ return {
+ left: function(a, x, lo, hi) {
+ if (arguments.length < 3) lo = 0;
+ if (arguments.length < 4) hi = a.length;
+ while (lo < hi) {
+ var mid = lo + hi >>> 1;
+ if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid;
+ }
+ return lo;
+ },
+ right: function(a, x, lo, hi) {
+ if (arguments.length < 3) lo = 0;
+ if (arguments.length < 4) hi = a.length;
+ while (lo < hi) {
+ var mid = lo + hi >>> 1;
+ if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1;
+ }
+ return lo;
+ }
+ };
+ }
+ var d3_bisect = d3_bisector(d3_ascending);
+ d3.bisectLeft = d3_bisect.left;
+ d3.bisect = d3.bisectRight = d3_bisect.right;
+ d3.bisector = function(f) {
+ return d3_bisector(f.length === 1 ? function(d, x) {
+ return d3_ascending(f(d), x);
+ } : f);
+ };
+ d3.shuffle = function(array) {
+ var m = array.length, t, i;
+ while (m) {
+ i = Math.random() * m-- | 0;
+ t = array[m], array[m] = array[i], array[i] = t;
+ }
+ return array;
+ };
+ d3.permute = function(array, indexes) {
+ var i = indexes.length, permutes = new Array(i);
+ while (i--) permutes[i] = array[indexes[i]];
+ return permutes;
+ };
+ d3.pairs = function(array) {
+ var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n);
+ while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ];
+ return pairs;
+ };
+ d3.zip = function() {
+ if (!(n = arguments.length)) return [];
+ for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m; ) {
+ for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n; ) {
+ zip[j] = arguments[j][i];
+ }
+ }
+ return zips;
+ };
+ function d3_zipLength(d) {
+ return d.length;
+ }
+ d3.transpose = function(matrix) {
+ return d3.zip.apply(d3, matrix);
+ };
+ d3.keys = function(map) {
+ var keys = [];
+ for (var key in map) keys.push(key);
+ return keys;
+ };
+ d3.values = function(map) {
+ var values = [];
+ for (var key in map) values.push(map[key]);
+ return values;
+ };
+ d3.entries = function(map) {
+ var entries = [];
+ for (var key in map) entries.push({
+ key: key,
+ value: map[key]
+ });
+ return entries;
+ };
+ d3.merge = function(arrays) {
+ var n = arrays.length, m, i = -1, j = 0, merged, array;
+ while (++i < n) j += arrays[i].length;
+ merged = new Array(j);
+ while (--n >= 0) {
+ array = arrays[n];
+ m = array.length;
+ while (--m >= 0) {
+ merged[--j] = array[m];
+ }
+ }
+ return merged;
+ };
+ var abs = Math.abs;
+ d3.range = function(start, stop, step) {
+ if (arguments.length < 3) {
+ step = 1;
+ if (arguments.length < 2) {
+ stop = start;
+ start = 0;
+ }
+ }
+ if ((stop - start) / step === Infinity) throw new Error("infinite range");
+ var range = [], k = d3_range_integerScale(abs(step)), i = -1, j;
+ start *= k, stop *= k, step *= k;
+ if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);
+ return range;
+ };
+ function d3_range_integerScale(x) {
+ var k = 1;
+ while (x * k % 1) k *= 10;
+ return k;
+ }
+ function d3_class(ctor, properties) {
+ try {
+ for (var key in properties) {
+ Object.defineProperty(ctor.prototype, key, {
+ value: properties[key],
+ enumerable: false
+ });
+ }
+ } catch (e) {
+ ctor.prototype = properties;
+ }
+ }
+ d3.map = function(object) {
+ var map = new d3_Map();
+ if (object instanceof d3_Map) object.forEach(function(key, value) {
+ map.set(key, value);
+ }); else for (var key in object) map.set(key, object[key]);
+ return map;
+ };
+ function d3_Map() {}
+ d3_class(d3_Map, {
+ has: d3_map_has,
+ get: function(key) {
+ return this[d3_map_prefix + key];
+ },
+ set: function(key, value) {
+ return this[d3_map_prefix + key] = value;
+ },
+ remove: d3_map_remove,
+ keys: d3_map_keys,
+ values: function() {
+ var values = [];
+ this.forEach(function(key, value) {
+ values.push(value);
+ });
+ return values;
+ },
+ entries: function() {
+ var entries = [];
+ this.forEach(function(key, value) {
+ entries.push({
+ key: key,
+ value: value
+ });
+ });
+ return entries;
+ },
+ size: d3_map_size,
+ empty: d3_map_empty,
+ forEach: function(f) {
+ for (var key in this) if (key.charCodeAt(0) === d3_map_prefixCode) f.call(this, key.slice(1), this[key]);
+ }
+ });
+ var d3_map_prefix = "\x00", d3_map_prefixCode = d3_map_prefix.charCodeAt(0);
+ function d3_map_has(key) {
+ return d3_map_prefix + key in this;
+ }
+ function d3_map_remove(key) {
+ key = d3_map_prefix + key;
+ return key in this && delete this[key];
+ }
+ function d3_map_keys() {
+ var keys = [];
+ this.forEach(function(key) {
+ keys.push(key);
+ });
+ return keys;
+ }
+ function d3_map_size() {
+ var size = 0;
+ for (var key in this) if (key.charCodeAt(0) === d3_map_prefixCode) ++size;
+ return size;
+ }
+ function d3_map_empty() {
+ for (var key in this) if (key.charCodeAt(0) === d3_map_prefixCode) return false;
+ return true;
+ }
+ d3.nest = function() {
+ var nest = {}, keys = [], sortKeys = [], sortValues, rollup;
+ function map(mapType, array, depth) {
+ if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array;
+ var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values;
+ while (++i < n) {
+ if (values = valuesByKey.get(keyValue = key(object = array[i]))) {
+ values.push(object);
+ } else {
+ valuesByKey.set(keyValue, [ object ]);
+ }
+ }
+ if (mapType) {
+ object = mapType();
+ setter = function(keyValue, values) {
+ object.set(keyValue, map(mapType, values, depth));
+ };
+ } else {
+ object = {};
+ setter = function(keyValue, values) {
+ object[keyValue] = map(mapType, values, depth);
+ };
+ }
+ valuesByKey.forEach(setter);
+ return object;
+ }
+ function entries(map, depth) {
+ if (depth >= keys.length) return map;
+ var array = [], sortKey = sortKeys[depth++];
+ map.forEach(function(key, keyMap) {
+ array.push({
+ key: key,
+ values: entries(keyMap, depth)
+ });
+ });
+ return sortKey ? array.sort(function(a, b) {
+ return sortKey(a.key, b.key);
+ }) : array;
+ }
+ nest.map = function(array, mapType) {
+ return map(mapType, array, 0);
+ };
+ nest.entries = function(array) {
+ return entries(map(d3.map, array, 0), 0);
+ };
+ nest.key = function(d) {
+ keys.push(d);
+ return nest;
+ };
+ nest.sortKeys = function(order) {
+ sortKeys[keys.length - 1] = order;
+ return nest;
+ };
+ nest.sortValues = function(order) {
+ sortValues = order;
+ return nest;
+ };
+ nest.rollup = function(f) {
+ rollup = f;
+ return nest;
+ };
+ return nest;
+ };
+ d3.set = function(array) {
+ var set = new d3_Set();
+ if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]);
+ return set;
+ };
+ function d3_Set() {}
+ d3_class(d3_Set, {
+ has: d3_map_has,
+ add: function(value) {
+ this[d3_map_prefix + value] = true;
+ return value;
+ },
+ remove: function(value) {
+ value = d3_map_prefix + value;
+ return value in this && delete this[value];
+ },
+ values: d3_map_keys,
+ size: d3_map_size,
+ empty: d3_map_empty,
+ forEach: function(f) {
+ for (var value in this) if (value.charCodeAt(0) === d3_map_prefixCode) f.call(this, value.slice(1));
+ }
+ });
+ d3.behavior = {};
+ d3.rebind = function(target, source) {
+ var i = 1, n = arguments.length, method;
+ while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);
+ return target;
+ };
+ function d3_rebind(target, source, method) {
+ return function() {
+ var value = method.apply(source, arguments);
+ return value === source ? target : value;
+ };
+ }
+ function d3_vendorSymbol(object, name) {
+ if (name in object) return name;
+ name = name.charAt(0).toUpperCase() + name.slice(1);
+ for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) {
+ var prefixName = d3_vendorPrefixes[i] + name;
+ if (prefixName in object) return prefixName;
+ }
+ }
+ var d3_vendorPrefixes = [ "webkit", "ms", "moz", "Moz", "o", "O" ];
+ function d3_noop() {}
+ d3.dispatch = function() {
+ var dispatch = new d3_dispatch(), i = -1, n = arguments.length;
+ while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
+ return dispatch;
+ };
+ function d3_dispatch() {}
+ d3_dispatch.prototype.on = function(type, listener) {
+ var i = type.indexOf("."), name = "";
+ if (i >= 0) {
+ name = type.slice(i + 1);
+ type = type.slice(0, i);
+ }
+ if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener);
+ if (arguments.length === 2) {
+ if (listener == null) for (type in this) {
+ if (this.hasOwnProperty(type)) this[type].on(name, null);
+ }
+ return this;
+ }
+ };
+ function d3_dispatch_event(dispatch) {
+ var listeners = [], listenerByName = new d3_Map();
+ function event() {
+ var z = listeners, i = -1, n = z.length, l;
+ while (++i < n) if (l = z[i].on) l.apply(this, arguments);
+ return dispatch;
+ }
+ event.on = function(name, listener) {
+ var l = listenerByName.get(name), i;
+ if (arguments.length < 2) return l && l.on;
+ if (l) {
+ l.on = null;
+ listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));
+ listenerByName.remove(name);
+ }
+ if (listener) listeners.push(listenerByName.set(name, {
+ on: listener
+ }));
+ return dispatch;
+ };
+ return event;
+ }
+ d3.event = null;
+ function d3_eventPreventDefault() {
+ d3.event.preventDefault();
+ }
+ function d3_eventSource() {
+ var e = d3.event, s;
+ while (s = e.sourceEvent) e = s;
+ return e;
+ }
+ function d3_eventDispatch(target) {
+ var dispatch = new d3_dispatch(), i = 0, n = arguments.length;
+ while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
+ dispatch.of = function(thiz, argumentz) {
+ return function(e1) {
+ try {
+ var e0 = e1.sourceEvent = d3.event;
+ e1.target = target;
+ d3.event = e1;
+ dispatch[e1.type].apply(thiz, argumentz);
+ } finally {
+ d3.event = e0;
+ }
+ };
+ };
+ return dispatch;
+ }
+ d3.requote = function(s) {
+ return s.replace(d3_requote_re, "\\$&");
+ };
+ var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;
+ var d3_subclass = {}.__proto__ ? function(object, prototype) {
+ object.__proto__ = prototype;
+ } : function(object, prototype) {
+ for (var property in prototype) object[property] = prototype[property];
+ };
+ function d3_selection(groups) {
+ d3_subclass(groups, d3_selectionPrototype);
+ return groups;
+ }
+ var d3_select = function(s, n) {
+ return n.querySelector(s);
+ }, d3_selectAll = function(s, n) {
+ return n.querySelectorAll(s);
+ }, d3_selectMatcher = d3_documentElement.matches || d3_documentElement[d3_vendorSymbol(d3_documentElement, "matchesSelector")], d3_selectMatches = function(n, s) {
+ return d3_selectMatcher.call(n, s);
+ };
+ if (typeof Sizzle === "function") {
+ d3_select = function(s, n) {
+ return Sizzle(s, n)[0] || null;
+ };
+ d3_selectAll = Sizzle;
+ d3_selectMatches = Sizzle.matchesSelector;
+ }
+ d3.selection = function() {
+ return d3_selectionRoot;
+ };
+ var d3_selectionPrototype = d3.selection.prototype = [];
+ d3_selectionPrototype.select = function(selector) {
+ var subgroups = [], subgroup, subnode, group, node;
+ selector = d3_selection_selector(selector);
+ for (var j = -1, m = this.length; ++j < m; ) {
+ subgroups.push(subgroup = []);
+ subgroup.parentNode = (group = this[j]).parentNode;
+ for (var i = -1, n = group.length; ++i < n; ) {
+ if (node = group[i]) {
+ subgroup.push(subnode = selector.call(node, node.__data__, i, j));
+ if (subnode && "__data__" in node) subnode.__data__ = node.__data__;
+ } else {
+ subgroup.push(null);
+ }
+ }
+ }
+ return d3_selection(subgroups);
+ };
+ function d3_selection_selector(selector) {
+ return typeof selector === "function" ? selector : function() {
+ return d3_select(selector, this);
+ };
+ }
+ d3_selectionPrototype.selectAll = function(selector) {
+ var subgroups = [], subgroup, node;
+ selector = d3_selection_selectorAll(selector);
+ for (var j = -1, m = this.length; ++j < m; ) {
+ for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
+ if (node = group[i]) {
+ subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j)));
+ subgroup.parentNode = node;
+ }
+ }
+ }
+ return d3_selection(subgroups);
+ };
+ function d3_selection_selectorAll(selector) {
+ return typeof selector === "function" ? selector : function() {
+ return d3_selectAll(selector, this);
+ };
+ }
+ var d3_nsPrefix = {
+ svg: "http://www.w3.org/2000/svg",
+ xhtml: "http://www.w3.org/1999/xhtml",
+ xlink: "http://www.w3.org/1999/xlink",
+ xml: "http://www.w3.org/XML/1998/namespace",
+ xmlns: "http://www.w3.org/2000/xmlns/"
+ };
+ d3.ns = {
+ prefix: d3_nsPrefix,
+ qualify: function(name) {
+ var i = name.indexOf(":"), prefix = name;
+ if (i >= 0) {
+ prefix = name.slice(0, i);
+ name = name.slice(i + 1);
+ }
+ return d3_nsPrefix.hasOwnProperty(prefix) ? {
+ space: d3_nsPrefix[prefix],
+ local: name
+ } : name;
+ }
+ };
+ d3_selectionPrototype.attr = function(name, value) {
+ if (arguments.length < 2) {
+ if (typeof name === "string") {
+ var node = this.node();
+ name = d3.ns.qualify(name);
+ return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name);
+ }
+ for (value in name) this.each(d3_selection_attr(value, name[value]));
+ return this;
+ }
+ return this.each(d3_selection_attr(name, value));
+ };
+ function d3_selection_attr(name, value) {
+ name = d3.ns.qualify(name);
+ function attrNull() {
+ this.removeAttribute(name);
+ }
+ function attrNullNS() {
+ this.removeAttributeNS(name.space, name.local);
+ }
+ function attrConstant() {
+ this.setAttribute(name, value);
+ }
+ function attrConstantNS() {
+ this.setAttributeNS(name.space, name.local, value);
+ }
+ function attrFunction() {
+ var x = value.apply(this, arguments);
+ if (x == null) this.removeAttribute(name); else this.setAttribute(name, x);
+ }
+ function attrFunctionNS() {
+ var x = value.apply(this, arguments);
+ if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x);
+ }
+ return value == null ? name.local ? attrNullNS : attrNull : typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;
+ }
+ function d3_collapse(s) {
+ return s.trim().replace(/\s+/g, " ");
+ }
+ d3_selectionPrototype.classed = function(name, value) {
+ if (arguments.length < 2) {
+ if (typeof name === "string") {
+ var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1;
+ if (value = node.classList) {
+ while (++i < n) if (!value.contains(name[i])) return false;
+ } else {
+ value = node.getAttribute("class");
+ while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;
+ }
+ return true;
+ }
+ for (value in name) this.each(d3_selection_classed(value, name[value]));
+ return this;
+ }
+ return this.each(d3_selection_classed(name, value));
+ };
+ function d3_selection_classedRe(name) {
+ return new RegExp("(?:^|\\s+)" + d3.requote(name) + "(?:\\s+|$)", "g");
+ }
+ function d3_selection_classes(name) {
+ return (name + "").trim().split(/^|\s+/);
+ }
+ function d3_selection_classed(name, value) {
+ name = d3_selection_classes(name).map(d3_selection_classedName);
+ var n = name.length;
+ function classedConstant() {
+ var i = -1;
+ while (++i < n) name[i](this, value);
+ }
+ function classedFunction() {
+ var i = -1, x = value.apply(this, arguments);
+ while (++i < n) name[i](this, x);
+ }
+ return typeof value === "function" ? classedFunction : classedConstant;
+ }
+ function d3_selection_classedName(name) {
+ var re = d3_selection_classedRe(name);
+ return function(node, value) {
+ if (c = node.classList) return value ? c.add(name) : c.remove(name);
+ var c = node.getAttribute("class") || "";
+ if (value) {
+ re.lastIndex = 0;
+ if (!re.test(c)) node.setAttribute("class", d3_collapse(c + " " + name));
+ } else {
+ node.setAttribute("class", d3_collapse(c.replace(re, " ")));
+ }
+ };
+ }
+ d3_selectionPrototype.style = function(name, value, priority) {
+ var n = arguments.length;
+ if (n < 3) {
+ if (typeof name !== "string") {
+ if (n < 2) value = "";
+ for (priority in name) this.each(d3_selection_style(priority, name[priority], value));
+ return this;
+ }
+ if (n < 2) return d3_window.getComputedStyle(this.node(), null).getPropertyValue(name);
+ priority = "";
+ }
+ return this.each(d3_selection_style(name, value, priority));
+ };
+ function d3_selection_style(name, value, priority) {
+ function styleNull() {
+ this.style.removeProperty(name);
+ }
+ function styleConstant() {
+ this.style.setProperty(name, value, priority);
+ }
+ function styleFunction() {
+ var x = value.apply(this, arguments);
+ if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority);
+ }
+ return value == null ? styleNull : typeof value === "function" ? styleFunction : styleConstant;
+ }
+ d3_selectionPrototype.property = function(name, value) {
+ if (arguments.length < 2) {
+ if (typeof name === "string") return this.node()[name];
+ for (value in name) this.each(d3_selection_property(value, name[value]));
+ return this;
+ }
+ return this.each(d3_selection_property(name, value));
+ };
+ function d3_selection_property(name, value) {
+ function propertyNull() {
+ delete this[name];
+ }
+ function propertyConstant() {
+ this[name] = value;
+ }
+ function propertyFunction() {
+ var x = value.apply(this, arguments);
+ if (x == null) delete this[name]; else this[name] = x;
+ }
+ return value == null ? propertyNull : typeof value === "function" ? propertyFunction : propertyConstant;
+ }
+ d3_selectionPrototype.text = function(value) {
+ return arguments.length ? this.each(typeof value === "function" ? function() {
+ var v = value.apply(this, arguments);
+ this.textContent = v == null ? "" : v;
+ } : value == null ? function() {
+ this.textContent = "";
+ } : function() {
+ this.textContent = value;
+ }) : this.node().textContent;
+ };
+ d3_selectionPrototype.html = function(value) {
+ return arguments.length ? this.each(typeof value === "function" ? function() {
+ var v = value.apply(this, arguments);
+ this.innerHTML = v == null ? "" : v;
+ } : value == null ? function() {
+ this.innerHTML = "";
+ } : function() {
+ this.innerHTML = value;
+ }) : this.node().innerHTML;
+ };
+ d3_selectionPrototype.append = function(name) {
+ name = d3_selection_creator(name);
+ return this.select(function() {
+ return this.appendChild(name.apply(this, arguments));
+ });
+ };
+ function d3_selection_creator(name) {
+ return typeof name === "function" ? name : (name = d3.ns.qualify(name)).local ? function() {
+ return this.ownerDocument.createElementNS(name.space, name.local);
+ } : function() {
+ return this.ownerDocument.createElementNS(this.namespaceURI, name);
+ };
+ }
+ d3_selectionPrototype.insert = function(name, before) {
+ name = d3_selection_creator(name);
+ before = d3_selection_selector(before);
+ return this.select(function() {
+ return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null);
+ });
+ };
+ d3_selectionPrototype.remove = function() {
+ return this.each(function() {
+ var parent = this.parentNode;
+ if (parent) parent.removeChild(this);
+ });
+ };
+ d3_selectionPrototype.data = function(value, key) {
+ var i = -1, n = this.length, group, node;
+ if (!arguments.length) {
+ value = new Array(n = (group = this[0]).length);
+ while (++i < n) {
+ if (node = group[i]) {
+ value[i] = node.__data__;
+ }
+ }
+ return value;
+ }
+ function bind(group, groupData) {
+ var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData;
+ if (key) {
+ var nodeByKeyValue = new d3_Map(), dataByKeyValue = new d3_Map(), keyValues = [], keyValue;
+ for (i = -1; ++i < n; ) {
+ keyValue = key.call(node = group[i], node.__data__, i);
+ if (nodeByKeyValue.has(keyValue)) {
+ exitNodes[i] = node;
+ } else {
+ nodeByKeyValue.set(keyValue, node);
+ }
+ keyValues.push(keyValue);
+ }
+ for (i = -1; ++i < m; ) {
+ keyValue = key.call(groupData, nodeData = groupData[i], i);
+ if (node = nodeByKeyValue.get(keyValue)) {
+ updateNodes[i] = node;
+ node.__data__ = nodeData;
+ } else if (!dataByKeyValue.has(keyValue)) {
+ enterNodes[i] = d3_selection_dataNode(nodeData);
+ }
+ dataByKeyValue.set(keyValue, nodeData);
+ nodeByKeyValue.remove(keyValue);
+ }
+ for (i = -1; ++i < n; ) {
+ if (nodeByKeyValue.has(keyValues[i])) {
+ exitNodes[i] = group[i];
+ }
+ }
+ } else {
+ for (i = -1; ++i < n0; ) {
+ node = group[i];
+ nodeData = groupData[i];
+ if (node) {
+ node.__data__ = nodeData;
+ updateNodes[i] = node;
+ } else {
+ enterNodes[i] = d3_selection_dataNode(nodeData);
+ }
+ }
+ for (;i < m; ++i) {
+ enterNodes[i] = d3_selection_dataNode(groupData[i]);
+ }
+ for (;i < n; ++i) {
+ exitNodes[i] = group[i];
+ }
+ }
+ enterNodes.update = updateNodes;
+ enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode;
+ enter.push(enterNodes);
+ update.push(updateNodes);
+ exit.push(exitNodes);
+ }
+ var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]);
+ if (typeof value === "function") {
+ while (++i < n) {
+ bind(group = this[i], value.call(group, group.parentNode.__data__, i));
+ }
+ } else {
+ while (++i < n) {
+ bind(group = this[i], value);
+ }
+ }
+ update.enter = function() {
+ return enter;
+ };
+ update.exit = function() {
+ return exit;
+ };
+ return update;
+ };
+ function d3_selection_dataNode(data) {
+ return {
+ __data__: data
+ };
+ }
+ d3_selectionPrototype.datum = function(value) {
+ return arguments.length ? this.property("__data__", value) : this.property("__data__");
+ };
+ d3_selectionPrototype.filter = function(filter) {
+ var subgroups = [], subgroup, group, node;
+ if (typeof filter !== "function") filter = d3_selection_filter(filter);
+ for (var j = 0, m = this.length; j < m; j++) {
+ subgroups.push(subgroup = []);
+ subgroup.parentNode = (group = this[j]).parentNode;
+ for (var i = 0, n = group.length; i < n; i++) {
+ if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {
+ subgroup.push(node);
+ }
+ }
+ }
+ return d3_selection(subgroups);
+ };
+ function d3_selection_filter(selector) {
+ return function() {
+ return d3_selectMatches(this, selector);
+ };
+ }
+ d3_selectionPrototype.order = function() {
+ for (var j = -1, m = this.length; ++j < m; ) {
+ for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {
+ if (node = group[i]) {
+ if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
+ next = node;
+ }
+ }
+ }
+ return this;
+ };
+ d3_selectionPrototype.sort = function(comparator) {
+ comparator = d3_selection_sortComparator.apply(this, arguments);
+ for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator);
+ return this.order();
+ };
+ function d3_selection_sortComparator(comparator) {
+ if (!arguments.length) comparator = d3_ascending;
+ return function(a, b) {
+ return a && b ? comparator(a.__data__, b.__data__) : !a - !b;
+ };
+ }
+ d3_selectionPrototype.each = function(callback) {
+ return d3_selection_each(this, function(node, i, j) {
+ callback.call(node, node.__data__, i, j);
+ });
+ };
+ function d3_selection_each(groups, callback) {
+ for (var j = 0, m = groups.length; j < m; j++) {
+ for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {
+ if (node = group[i]) callback(node, i, j);
+ }
+ }
+ return groups;
+ }
+ d3_selectionPrototype.call = function(callback) {
+ var args = d3_array(arguments);
+ callback.apply(args[0] = this, args);
+ return this;
+ };
+ d3_selectionPrototype.empty = function() {
+ return !this.node();
+ };
+ d3_selectionPrototype.node = function() {
+ for (var j = 0, m = this.length; j < m; j++) {
+ for (var group = this[j], i = 0, n = group.length; i < n; i++) {
+ var node = group[i];
+ if (node) return node;
+ }
+ }
+ return null;
+ };
+ d3_selectionPrototype.size = function() {
+ var n = 0;
+ d3_selection_each(this, function() {
+ ++n;
+ });
+ return n;
+ };
+ function d3_selection_enter(selection) {
+ d3_subclass(selection, d3_selection_enterPrototype);
+ return selection;
+ }
+ var d3_selection_enterPrototype = [];
+ d3.selection.enter = d3_selection_enter;
+ d3.selection.enter.prototype = d3_selection_enterPrototype;
+ d3_selection_enterPrototype.append = d3_selectionPrototype.append;
+ d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;
+ d3_selection_enterPrototype.node = d3_selectionPrototype.node;
+ d3_selection_enterPrototype.call = d3_selectionPrototype.call;
+ d3_selection_enterPrototype.size = d3_selectionPrototype.size;
+ d3_selection_enterPrototype.select = function(selector) {
+ var subgroups = [], subgroup, subnode, upgroup, group, node;
+ for (var j = -1, m = this.length; ++j < m; ) {
+ upgroup = (group = this[j]).update;
+ subgroups.push(subgroup = []);
+ subgroup.parentNode = group.parentNode;
+ for (var i = -1, n = group.length; ++i < n; ) {
+ if (node = group[i]) {
+ subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j));
+ subnode.__data__ = node.__data__;
+ } else {
+ subgroup.push(null);
+ }
+ }
+ }
+ return d3_selection(subgroups);
+ };
+ d3_selection_enterPrototype.insert = function(name, before) {
+ if (arguments.length < 2) before = d3_selection_enterInsertBefore(this);
+ return d3_selectionPrototype.insert.call(this, name, before);
+ };
+ function d3_selection_enterInsertBefore(enter) {
+ var i0, j0;
+ return function(d, i, j) {
+ var group = enter[j].update, n = group.length, node;
+ if (j != j0) j0 = j, i0 = 0;
+ if (i >= i0) i0 = i + 1;
+ while (!(node = group[i0]) && ++i0 < n) ;
+ return node;
+ };
+ }
+ d3_selectionPrototype.transition = function() {
+ var id = d3_transitionInheritId || ++d3_transitionId, subgroups = [], subgroup, node, transition = d3_transitionInherit || {
+ time: Date.now(),
+ ease: d3_ease_cubicInOut,
+ delay: 0,
+ duration: 250
+ };
+ for (var j = -1, m = this.length; ++j < m; ) {
+ subgroups.push(subgroup = []);
+ for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
+ if (node = group[i]) d3_transitionNode(node, i, id, transition);
+ subgroup.push(node);
+ }
+ }
+ return d3_transition(subgroups, id);
+ };
+ d3_selectionPrototype.interrupt = function() {
+ return this.each(d3_selection_interrupt);
+ };
+ function d3_selection_interrupt() {
+ var lock = this.__transition__;
+ if (lock) ++lock.active;
+ }
+ d3.select = function(node) {
+ var group = [ typeof node === "string" ? d3_select(node, d3_document) : node ];
+ group.parentNode = d3_documentElement;
+ return d3_selection([ group ]);
+ };
+ d3.selectAll = function(nodes) {
+ var group = d3_array(typeof nodes === "string" ? d3_selectAll(nodes, d3_document) : nodes);
+ group.parentNode = d3_documentElement;
+ return d3_selection([ group ]);
+ };
+ var d3_selectionRoot = d3.select(d3_documentElement);
+ d3_selectionPrototype.on = function(type, listener, capture) {
+ var n = arguments.length;
+ if (n < 3) {
+ if (typeof type !== "string") {
+ if (n < 2) listener = false;
+ for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));
+ return this;
+ }
+ if (n < 2) return (n = this.node()["__on" + type]) && n._;
+ capture = false;
+ }
+ return this.each(d3_selection_on(type, listener, capture));
+ };
+ function d3_selection_on(type, listener, capture) {
+ var name = "__on" + type, i = type.indexOf("."), wrap = d3_selection_onListener;
+ if (i > 0) type = type.slice(0, i);
+ var filter = d3_selection_onFilters.get(type);
+ if (filter) type = filter, wrap = d3_selection_onFilter;
+ function onRemove() {
+ var l = this[name];
+ if (l) {
+ this.removeEventListener(type, l, l.$);
+ delete this[name];
+ }
+ }
+ function onAdd() {
+ var l = wrap(listener, d3_array(arguments));
+ onRemove.call(this);
+ this.addEventListener(type, this[name] = l, l.$ = capture);
+ l._ = listener;
+ }
+ function removeAll() {
+ var re = new RegExp("^__on([^.]+)" + d3.requote(type) + "$"), match;
+ for (var name in this) {
+ if (match = name.match(re)) {
+ var l = this[name];
+ this.removeEventListener(match[1], l, l.$);
+ delete this[name];
+ }
+ }
+ }
+ return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll;
+ }
+ var d3_selection_onFilters = d3.map({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout"
+ });
+ d3_selection_onFilters.forEach(function(k) {
+ if ("on" + k in d3_document) d3_selection_onFilters.remove(k);
+ });
+ function d3_selection_onListener(listener, argumentz) {
+ return function(e) {
+ var o = d3.event;
+ d3.event = e;
+ argumentz[0] = this.__data__;
+ try {
+ listener.apply(this, argumentz);
+ } finally {
+ d3.event = o;
+ }
+ };
+ }
+ function d3_selection_onFilter(listener, argumentz) {
+ var l = d3_selection_onListener(listener, argumentz);
+ return function(e) {
+ var target = this, related = e.relatedTarget;
+ if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) {
+ l.call(target, e);
+ }
+ };
+ }
+ var d3_event_dragSelect = "onselectstart" in d3_document ? null : d3_vendorSymbol(d3_documentElement.style, "userSelect"), d3_event_dragId = 0;
+ function d3_event_dragSuppress() {
+ var name = ".dragsuppress-" + ++d3_event_dragId, click = "click" + name, w = d3.select(d3_window).on("touchmove" + name, d3_eventPreventDefault).on("dragstart" + name, d3_eventPreventDefault).on("selectstart" + name, d3_eventPreventDefault);
+ if (d3_event_dragSelect) {
+ var style = d3_documentElement.style, select = style[d3_event_dragSelect];
+ style[d3_event_dragSelect] = "none";
+ }
+ return function(suppressClick) {
+ w.on(name, null);
+ if (d3_event_dragSelect) style[d3_event_dragSelect] = select;
+ if (suppressClick) {
+ function off() {
+ w.on(click, null);
+ }
+ w.on(click, function() {
+ d3_eventPreventDefault();
+ off();
+ }, true);
+ setTimeout(off, 0);
+ }
+ };
+ }
+ d3.mouse = function(container) {
+ return d3_mousePoint(container, d3_eventSource());
+ };
+ var d3_mouse_bug44083 = /WebKit/.test(d3_window.navigator.userAgent) ? -1 : 0;
+ function d3_mousePoint(container, e) {
+ if (e.changedTouches) e = e.changedTouches[0];
+ var svg = container.ownerSVGElement || container;
+ if (svg.createSVGPoint) {
+ var point = svg.createSVGPoint();
+ if (d3_mouse_bug44083 < 0 && (d3_window.scrollX || d3_window.scrollY)) {
+ svg = d3.select("body").append("svg").style({
+ position: "absolute",
+ top: 0,
+ left: 0,
+ margin: 0,
+ padding: 0,
+ border: "none"
+ }, "important");
+ var ctm = svg[0][0].getScreenCTM();
+ d3_mouse_bug44083 = !(ctm.f || ctm.e);
+ svg.remove();
+ }
+ if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX,
+ point.y = e.clientY;
+ point = point.matrixTransform(container.getScreenCTM().inverse());
+ return [ point.x, point.y ];
+ }
+ var rect = container.getBoundingClientRect();
+ return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ];
+ }
+ d3.touch = function(container, touches, identifier) {
+ if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches;
+ if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) {
+ if ((touch = touches[i]).identifier === identifier) {
+ return d3_mousePoint(container, touch);
+ }
+ }
+ };
+ d3.behavior.drag = function() {
+ var event = d3_eventDispatch(drag, "drag", "dragstart", "dragend"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_behavior_dragMouseSubject, "mousemove", "mouseup"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_behavior_dragTouchSubject, "touchmove", "touchend");
+ function drag() {
+ this.on("mousedown.drag", mousedown).on("touchstart.drag", touchstart);
+ }
+ function dragstart(id, position, subject, move, end) {
+ return function() {
+ var that = this, target = d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = ".drag" + (dragId == null ? "" : "-" + dragId), dragOffset, dragSubject = d3.select(subject()).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(), position0 = position(parent, dragId);
+ if (origin) {
+ dragOffset = origin.apply(that, arguments);
+ dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ];
+ } else {
+ dragOffset = [ 0, 0 ];
+ }
+ dispatch({
+ type: "dragstart"
+ });
+ function moved() {
+ var position1 = position(parent, dragId), dx, dy;
+ if (!position1) return;
+ dx = position1[0] - position0[0];
+ dy = position1[1] - position0[1];
+ dragged |= dx | dy;
+ position0 = position1;
+ dispatch({
+ type: "drag",
+ x: position1[0] + dragOffset[0],
+ y: position1[1] + dragOffset[1],
+ dx: dx,
+ dy: dy
+ });
+ }
+ function ended() {
+ if (!position(parent, dragId)) return;
+ dragSubject.on(move + dragName, null).on(end + dragName, null);
+ dragRestore(dragged && d3.event.target === target);
+ dispatch({
+ type: "dragend"
+ });
+ }
+ };
+ }
+ drag.origin = function(x) {
+ if (!arguments.length) return origin;
+ origin = x;
+ return drag;
+ };
+ return d3.rebind(drag, event, "on");
+ };
+ function d3_behavior_dragTouchId() {
+ return d3.event.changedTouches[0].identifier;
+ }
+ function d3_behavior_dragTouchSubject() {
+ return d3.event.target;
+ }
+ function d3_behavior_dragMouseSubject() {
+ return d3_window;
+ }
+ d3.touches = function(container, touches) {
+ if (arguments.length < 2) touches = d3_eventSource().touches;
+ return touches ? d3_array(touches).map(function(touch) {
+ var point = d3_mousePoint(container, touch);
+ point.identifier = touch.identifier;
+ return point;
+ }) : [];
+ };
+ var π = Math.PI, τ = 2 * π, halfπ = π / 2, ε = 1e-6, ε2 = ε * ε, d3_radians = π / 180, d3_degrees = 180 / π;
+ function d3_sgn(x) {
+ return x > 0 ? 1 : x < 0 ? -1 : 0;
+ }
+ function d3_cross2d(a, b, c) {
+ return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
+ }
+ function d3_acos(x) {
+ return x > 1 ? 0 : x < -1 ? π : Math.acos(x);
+ }
+ function d3_asin(x) {
+ return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x);
+ }
+ function d3_sinh(x) {
+ return ((x = Math.exp(x)) - 1 / x) / 2;
+ }
+ function d3_cosh(x) {
+ return ((x = Math.exp(x)) + 1 / x) / 2;
+ }
+ function d3_tanh(x) {
+ return ((x = Math.exp(2 * x)) - 1) / (x + 1);
+ }
+ function d3_haversin(x) {
+ return (x = Math.sin(x / 2)) * x;
+ }
+ var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4;
+ d3.interpolateZoom = function(p0, p1) {
+ var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2];
+ var dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1), dr = r1 - r0, S = (dr || Math.log(w1 / w0)) / ρ;
+ function interpolate(t) {
+ var s = t * S;
+ if (dr) {
+ var coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0));
+ return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ];
+ }
+ return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * s) ];
+ }
+ interpolate.duration = S * 1e3;
+ return interpolate;
+ };
+ d3.behavior.zoom = function() {
+ var view = {
+ x: 0,
+ y: 0,
+ k: 1
+ }, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, mousedown = "mousedown.zoom", mousemove = "mousemove.zoom", mouseup = "mouseup.zoom", mousewheelTimer, touchstart = "touchstart.zoom", touchtime, event = d3_eventDispatch(zoom, "zoomstart", "zoom", "zoomend"), x0, x1, y0, y1;
+ function zoom(g) {
+ g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + ".zoom", mousewheeled).on("dblclick.zoom", dblclicked).on(touchstart, touchstarted);
+ }
+ zoom.event = function(g) {
+ g.each(function() {
+ var dispatch = event.of(this, arguments), view1 = view;
+ if (d3_transitionInheritId) {
+ d3.select(this).transition().each("start.zoom", function() {
+ view = this.__chart__ || {
+ x: 0,
+ y: 0,
+ k: 1
+ };
+ zoomstarted(dispatch);
+ }).tween("zoom:zoom", function() {
+ var dx = size[0], dy = size[1], cx = dx / 2, cy = dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]);
+ return function(t) {
+ var l = i(t), k = dx / l[2];
+ this.__chart__ = view = {
+ x: cx - l[0] * k,
+ y: cy - l[1] * k,
+ k: k
+ };
+ zoomed(dispatch);
+ };
+ }).each("end.zoom", function() {
+ zoomended(dispatch);
+ });
+ } else {
+ this.__chart__ = view;
+ zoomstarted(dispatch);
+ zoomed(dispatch);
+ zoomended(dispatch);
+ }
+ });
+ };
+ zoom.translate = function(_) {
+ if (!arguments.length) return [ view.x, view.y ];
+ view = {
+ x: +_[0],
+ y: +_[1],
+ k: view.k
+ };
+ rescale();
+ return zoom;
+ };
+ zoom.scale = function(_) {
+ if (!arguments.length) return view.k;
+ view = {
+ x: view.x,
+ y: view.y,
+ k: +_
+ };
+ rescale();
+ return zoom;
+ };
+ zoom.scaleExtent = function(_) {
+ if (!arguments.length) return scaleExtent;
+ scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ];
+ return zoom;
+ };
+ zoom.center = function(_) {
+ if (!arguments.length) return center;
+ center = _ && [ +_[0], +_[1] ];
+ return zoom;
+ };
+ zoom.size = function(_) {
+ if (!arguments.length) return size;
+ size = _ && [ +_[0], +_[1] ];
+ return zoom;
+ };
+ zoom.x = function(z) {
+ if (!arguments.length) return x1;
+ x1 = z;
+ x0 = z.copy();
+ view = {
+ x: 0,
+ y: 0,
+ k: 1
+ };
+ return zoom;
+ };
+ zoom.y = function(z) {
+ if (!arguments.length) return y1;
+ y1 = z;
+ y0 = z.copy();
+ view = {
+ x: 0,
+ y: 0,
+ k: 1
+ };
+ return zoom;
+ };
+ function location(p) {
+ return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ];
+ }
+ function point(l) {
+ return [ l[0] * view.k + view.x, l[1] * view.k + view.y ];
+ }
+ function scaleTo(s) {
+ view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));
+ }
+ function translateTo(p, l) {
+ l = point(l);
+ view.x += p[0] - l[0];
+ view.y += p[1] - l[1];
+ }
+ function rescale() {
+ if (x1) x1.domain(x0.range().map(function(x) {
+ return (x - view.x) / view.k;
+ }).map(x0.invert));
+ if (y1) y1.domain(y0.range().map(function(y) {
+ return (y - view.y) / view.k;
+ }).map(y0.invert));
+ }
+ function zoomstarted(dispatch) {
+ dispatch({
+ type: "zoomstart"
+ });
+ }
+ function zoomed(dispatch) {
+ rescale();
+ dispatch({
+ type: "zoom",
+ scale: view.k,
+ translate: [ view.x, view.y ]
+ });
+ }
+ function zoomended(dispatch) {
+ dispatch({
+ type: "zoomend"
+ });
+ }
+ function mousedowned() {
+ var that = this, target = d3.event.target, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress();
+ d3_selection_interrupt.call(that);
+ zoomstarted(dispatch);
+ function moved() {
+ dragged = 1;
+ translateTo(d3.mouse(that), location0);
+ zoomed(dispatch);
+ }
+ function ended() {
+ subject.on(mousemove, null).on(mouseup, null);
+ dragRestore(dragged && d3.event.target === target);
+ zoomended(dispatch);
+ }
+ }
+ function touchstarted() {
+ var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = ".zoom-" + d3.event.changedTouches[0].identifier, touchmove = "touchmove" + zoomName, touchend = "touchend" + zoomName, targets = [], subject = d3.select(that), dragRestore = d3_event_dragSuppress();
+ d3_selection_interrupt.call(that);
+ started();
+ zoomstarted(dispatch);
+ subject.on(mousedown, null).on(touchstart, started);
+ function relocate() {
+ var touches = d3.touches(that);
+ scale0 = view.k;
+ touches.forEach(function(t) {
+ if (t.identifier in locations0) locations0[t.identifier] = location(t);
+ });
+ return touches;
+ }
+ function started() {
+ var target = d3.event.target;
+ d3.select(target).on(touchmove, moved).on(touchend, ended);
+ targets.push(target);
+ var changed = d3.event.changedTouches;
+ for (var i = 0, n = changed.length; i < n; ++i) {
+ locations0[changed[i].identifier] = null;
+ }
+ var touches = relocate(), now = Date.now();
+ if (touches.length === 1) {
+ if (now - touchtime < 500) {
+ var p = touches[0], l = locations0[p.identifier];
+ scaleTo(view.k * 2);
+ translateTo(p, l);
+ d3_eventPreventDefault();
+ zoomed(dispatch);
+ }
+ touchtime = now;
+ } else if (touches.length > 1) {
+ var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1];
+ distance0 = dx * dx + dy * dy;
+ }
+ }
+ function moved() {
+ var touches = d3.touches(that), p0, l0, p1, l1;
+ for (var i = 0, n = touches.length; i < n; ++i, l1 = null) {
+ p1 = touches[i];
+ if (l1 = locations0[p1.identifier]) {
+ if (l0) break;
+ p0 = p1, l0 = l1;
+ }
+ }
+ if (l1) {
+ var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0);
+ p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];
+ l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];
+ scaleTo(scale1 * scale0);
+ }
+ touchtime = null;
+ translateTo(p0, l0);
+ zoomed(dispatch);
+ }
+ function ended() {
+ if (d3.event.touches.length) {
+ var changed = d3.event.changedTouches;
+ for (var i = 0, n = changed.length; i < n; ++i) {
+ delete locations0[changed[i].identifier];
+ }
+ for (var identifier in locations0) {
+ return void relocate();
+ }
+ }
+ d3.selectAll(targets).on(zoomName, null);
+ subject.on(mousedown, mousedowned).on(touchstart, touchstarted);
+ dragRestore();
+ zoomended(dispatch);
+ }
+ }
+ function mousewheeled() {
+ var dispatch = event.of(this, arguments);
+ if (mousewheelTimer) clearTimeout(mousewheelTimer); else translate0 = location(center0 = center || d3.mouse(this)),
+ d3_selection_interrupt.call(this), zoomstarted(dispatch);
+ mousewheelTimer = setTimeout(function() {
+ mousewheelTimer = null;
+ zoomended(dispatch);
+ }, 50);
+ d3_eventPreventDefault();
+ scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k);
+ translateTo(center0, translate0);
+ zoomed(dispatch);
+ }
+ function dblclicked() {
+ var dispatch = event.of(this, arguments), p = d3.mouse(this), l = location(p), k = Math.log(view.k) / Math.LN2;
+ zoomstarted(dispatch);
+ scaleTo(Math.pow(2, d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1));
+ translateTo(p, l);
+ zoomed(dispatch);
+ zoomended(dispatch);
+ }
+ return d3.rebind(zoom, event, "on");
+ };
+ var d3_behavior_zoomInfinity = [ 0, Infinity ];
+ var d3_behavior_zoomDelta, d3_behavior_zoomWheel = "onwheel" in d3_document ? (d3_behavior_zoomDelta = function() {
+ return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1);
+ }, "wheel") : "onmousewheel" in d3_document ? (d3_behavior_zoomDelta = function() {
+ return d3.event.wheelDelta;
+ }, "mousewheel") : (d3_behavior_zoomDelta = function() {
+ return -d3.event.detail;
+ }, "MozMousePixelScroll");
+ d3.color = d3_color;
+ function d3_color() {}
+ d3_color.prototype.toString = function() {
+ return this.rgb() + "";
+ };
+ d3.hsl = d3_hsl;
+ function d3_hsl(h, s, l) {
+ return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l);
+ }
+ var d3_hslPrototype = d3_hsl.prototype = new d3_color();
+ d3_hslPrototype.brighter = function(k) {
+ k = Math.pow(.7, arguments.length ? k : 1);
+ return new d3_hsl(this.h, this.s, this.l / k);
+ };
+ d3_hslPrototype.darker = function(k) {
+ k = Math.pow(.7, arguments.length ? k : 1);
+ return new d3_hsl(this.h, this.s, k * this.l);
+ };
+ d3_hslPrototype.rgb = function() {
+ return d3_hsl_rgb(this.h, this.s, this.l);
+ };
+ function d3_hsl_rgb(h, s, l) {
+ var m1, m2;
+ h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h;
+ s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s;
+ l = l < 0 ? 0 : l > 1 ? 1 : l;
+ m2 = l <= .5 ? l * (1 + s) : l + s - l * s;
+ m1 = 2 * l - m2;
+ function v(h) {
+ if (h > 360) h -= 360; else if (h < 0) h += 360;
+ if (h < 60) return m1 + (m2 - m1) * h / 60;
+ if (h < 180) return m2;
+ if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;
+ return m1;
+ }
+ function vv(h) {
+ return Math.round(v(h) * 255);
+ }
+ return new d3_rgb(vv(h + 120), vv(h), vv(h - 120));
+ }
+ d3.hcl = d3_hcl;
+ function d3_hcl(h, c, l) {
+ return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l);
+ }
+ var d3_hclPrototype = d3_hcl.prototype = new d3_color();
+ d3_hclPrototype.brighter = function(k) {
+ return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));
+ };
+ d3_hclPrototype.darker = function(k) {
+ return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));
+ };
+ d3_hclPrototype.rgb = function() {
+ return d3_hcl_lab(this.h, this.c, this.l).rgb();
+ };
+ function d3_hcl_lab(h, c, l) {
+ if (isNaN(h)) h = 0;
+ if (isNaN(c)) c = 0;
+ return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);
+ }
+ d3.lab = d3_lab;
+ function d3_lab(l, a, b) {
+ return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.l, l.c, l.h) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b);
+ }
+ var d3_lab_K = 18;
+ var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;
+ var d3_labPrototype = d3_lab.prototype = new d3_color();
+ d3_labPrototype.brighter = function(k) {
+ return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);
+ };
+ d3_labPrototype.darker = function(k) {
+ return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);
+ };
+ d3_labPrototype.rgb = function() {
+ return d3_lab_rgb(this.l, this.a, this.b);
+ };
+ function d3_lab_rgb(l, a, b) {
+ var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;
+ x = d3_lab_xyz(x) * d3_lab_X;
+ y = d3_lab_xyz(y) * d3_lab_Y;
+ z = d3_lab_xyz(z) * d3_lab_Z;
+ return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));
+ }
+ function d3_lab_hcl(l, a, b) {
+ return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l);
+ }
+ function d3_lab_xyz(x) {
+ return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;
+ }
+ function d3_xyz_lab(x) {
+ return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;
+ }
+ function d3_xyz_rgb(r) {
+ return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));
+ }
+ d3.rgb = d3_rgb;
+ function d3_rgb(r, g, b) {
+ return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b);
+ }
+ function d3_rgbNumber(value) {
+ return new d3_rgb(value >> 16, value >> 8 & 255, value & 255);
+ }
+ function d3_rgbString(value) {
+ return d3_rgbNumber(value) + "";
+ }
+ var d3_rgbPrototype = d3_rgb.prototype = new d3_color();
+ d3_rgbPrototype.brighter = function(k) {
+ k = Math.pow(.7, arguments.length ? k : 1);
+ var r = this.r, g = this.g, b = this.b, i = 30;
+ if (!r && !g && !b) return new d3_rgb(i, i, i);
+ if (r && r < i) r = i;
+ if (g && g < i) g = i;
+ if (b && b < i) b = i;
+ return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k));
+ };
+ d3_rgbPrototype.darker = function(k) {
+ k = Math.pow(.7, arguments.length ? k : 1);
+ return new d3_rgb(k * this.r, k * this.g, k * this.b);
+ };
+ d3_rgbPrototype.hsl = function() {
+ return d3_rgb_hsl(this.r, this.g, this.b);
+ };
+ d3_rgbPrototype.toString = function() {
+ return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);
+ };
+ function d3_rgb_hex(v) {
+ return v < 16 ? "0" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);
+ }
+ function d3_rgb_parse(format, rgb, hsl) {
+ var r = 0, g = 0, b = 0, m1, m2, color;
+ m1 = /([a-z]+)\((.*)\)/i.exec(format);
+ if (m1) {
+ m2 = m1[2].split(",");
+ switch (m1[1]) {
+ case "hsl":
+ {
+ return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);
+ }
+
+ case "rgb":
+ {
+ return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));
+ }
+ }
+ }
+ if (color = d3_rgb_names.get(format)) return rgb(color.r, color.g, color.b);
+ if (format != null && format.charAt(0) === "#" && !isNaN(color = parseInt(format.slice(1), 16))) {
+ if (format.length === 4) {
+ r = (color & 3840) >> 4;
+ r = r >> 4 | r;
+ g = color & 240;
+ g = g >> 4 | g;
+ b = color & 15;
+ b = b << 4 | b;
+ } else if (format.length === 7) {
+ r = (color & 16711680) >> 16;
+ g = (color & 65280) >> 8;
+ b = color & 255;
+ }
+ }
+ return rgb(r, g, b);
+ }
+ function d3_rgb_hsl(r, g, b) {
+ var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;
+ if (d) {
+ s = l < .5 ? d / (max + min) : d / (2 - max - min);
+ if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;
+ h *= 60;
+ } else {
+ h = NaN;
+ s = l > 0 && l < 1 ? 0 : h;
+ }
+ return new d3_hsl(h, s, l);
+ }
+ function d3_rgb_lab(r, g, b) {
+ r = d3_rgb_xyz(r);
+ g = d3_rgb_xyz(g);
+ b = d3_rgb_xyz(b);
+ var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);
+ return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));
+ }
+ function d3_rgb_xyz(r) {
+ return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);
+ }
+ function d3_rgb_parseNumber(c) {
+ var f = parseFloat(c);
+ return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f;
+ }
+ var d3_rgb_names = d3.map({
+ aliceblue: 15792383,
+ antiquewhite: 16444375,
+ aqua: 65535,
+ aquamarine: 8388564,
+ azure: 15794175,
+ beige: 16119260,
+ bisque: 16770244,
+ black: 0,
+ blanchedalmond: 16772045,
+ blue: 255,
+ blueviolet: 9055202,
+ brown: 10824234,
+ burlywood: 14596231,
+ cadetblue: 6266528,
+ chartreuse: 8388352,
+ chocolate: 13789470,
+ coral: 16744272,
+ cornflowerblue: 6591981,
+ cornsilk: 16775388,
+ crimson: 14423100,
+ cyan: 65535,
+ darkblue: 139,
+ darkcyan: 35723,
+ darkgoldenrod: 12092939,
+ darkgray: 11119017,
+ darkgreen: 25600,
+ darkgrey: 11119017,
+ darkkhaki: 12433259,
+ darkmagenta: 9109643,
+ darkolivegreen: 5597999,
+ darkorange: 16747520,
+ darkorchid: 10040012,
+ darkred: 9109504,
+ darksalmon: 15308410,
+ darkseagreen: 9419919,
+ darkslateblue: 4734347,
+ darkslategray: 3100495,
+ darkslategrey: 3100495,
+ darkturquoise: 52945,
+ darkviolet: 9699539,
+ deeppink: 16716947,
+ deepskyblue: 49151,
+ dimgray: 6908265,
+ dimgrey: 6908265,
+ dodgerblue: 2003199,
+ firebrick: 11674146,
+ floralwhite: 16775920,
+ forestgreen: 2263842,
+ fuchsia: 16711935,
+ gainsboro: 14474460,
+ ghostwhite: 16316671,
+ gold: 16766720,
+ goldenrod: 14329120,
+ gray: 8421504,
+ green: 32768,
+ greenyellow: 11403055,
+ grey: 8421504,
+ honeydew: 15794160,
+ hotpink: 16738740,
+ indianred: 13458524,
+ indigo: 4915330,
+ ivory: 16777200,
+ khaki: 15787660,
+ lavender: 15132410,
+ lavenderblush: 16773365,
+ lawngreen: 8190976,
+ lemonchiffon: 16775885,
+ lightblue: 11393254,
+ lightcoral: 15761536,
+ lightcyan: 14745599,
+ lightgoldenrodyellow: 16448210,
+ lightgray: 13882323,
+ lightgreen: 9498256,
+ lightgrey: 13882323,
+ lightpink: 16758465,
+ lightsalmon: 16752762,
+ lightseagreen: 2142890,
+ lightskyblue: 8900346,
+ lightslategray: 7833753,
+ lightslategrey: 7833753,
+ lightsteelblue: 11584734,
+ lightyellow: 16777184,
+ lime: 65280,
+ limegreen: 3329330,
+ linen: 16445670,
+ magenta: 16711935,
+ maroon: 8388608,
+ mediumaquamarine: 6737322,
+ mediumblue: 205,
+ mediumorchid: 12211667,
+ mediumpurple: 9662683,
+ mediumseagreen: 3978097,
+ mediumslateblue: 8087790,
+ mediumspringgreen: 64154,
+ mediumturquoise: 4772300,
+ mediumvioletred: 13047173,
+ midnightblue: 1644912,
+ mintcream: 16121850,
+ mistyrose: 16770273,
+ moccasin: 16770229,
+ navajowhite: 16768685,
+ navy: 128,
+ oldlace: 16643558,
+ olive: 8421376,
+ olivedrab: 7048739,
+ orange: 16753920,
+ orangered: 16729344,
+ orchid: 14315734,
+ palegoldenrod: 15657130,
+ palegreen: 10025880,
+ paleturquoise: 11529966,
+ palevioletred: 14381203,
+ papayawhip: 16773077,
+ peachpuff: 16767673,
+ peru: 13468991,
+ pink: 16761035,
+ plum: 14524637,
+ powderblue: 11591910,
+ purple: 8388736,
+ red: 16711680,
+ rosybrown: 12357519,
+ royalblue: 4286945,
+ saddlebrown: 9127187,
+ salmon: 16416882,
+ sandybrown: 16032864,
+ seagreen: 3050327,
+ seashell: 16774638,
+ sienna: 10506797,
+ silver: 12632256,
+ skyblue: 8900331,
+ slateblue: 6970061,
+ slategray: 7372944,
+ slategrey: 7372944,
+ snow: 16775930,
+ springgreen: 65407,
+ steelblue: 4620980,
+ tan: 13808780,
+ teal: 32896,
+ thistle: 14204888,
+ tomato: 16737095,
+ turquoise: 4251856,
+ violet: 15631086,
+ wheat: 16113331,
+ white: 16777215,
+ whitesmoke: 16119285,
+ yellow: 16776960,
+ yellowgreen: 10145074
+ });
+ d3_rgb_names.forEach(function(key, value) {
+ d3_rgb_names.set(key, d3_rgbNumber(value));
+ });
+ function d3_functor(v) {
+ return typeof v === "function" ? v : function() {
+ return v;
+ };
+ }
+ d3.functor = d3_functor;
+ function d3_identity(d) {
+ return d;
+ }
+ d3.xhr = d3_xhrType(d3_identity);
+ function d3_xhrType(response) {
+ return function(url, mimeType, callback) {
+ if (arguments.length === 2 && typeof mimeType === "function") callback = mimeType,
+ mimeType = null;
+ return d3_xhr(url, mimeType, response, callback);
+ };
+ }
+ function d3_xhr(url, mimeType, response, callback) {
+ var xhr = {}, dispatch = d3.dispatch("beforesend", "progress", "load", "error"), headers = {}, request = new XMLHttpRequest(), responseType = null;
+ if (d3_window.XDomainRequest && !("withCredentials" in request) && /^(http(s)?:)?\/\//.test(url)) request = new XDomainRequest();
+ "onload" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() {
+ request.readyState > 3 && respond();
+ };
+ function respond() {
+ var status = request.status, result;
+ if (!status && d3_xhrHasResponse(request) || status >= 200 && status < 300 || status === 304) {
+ try {
+ result = response.call(xhr, request);
+ } catch (e) {
+ dispatch.error.call(xhr, e);
+ return;
+ }
+ dispatch.load.call(xhr, result);
+ } else {
+ dispatch.error.call(xhr, request);
+ }
+ }
+ request.onprogress = function(event) {
+ var o = d3.event;
+ d3.event = event;
+ try {
+ dispatch.progress.call(xhr, request);
+ } finally {
+ d3.event = o;
+ }
+ };
+ xhr.header = function(name, value) {
+ name = (name + "").toLowerCase();
+ if (arguments.length < 2) return headers[name];
+ if (value == null) delete headers[name]; else headers[name] = value + "";
+ return xhr;
+ };
+ xhr.mimeType = function(value) {
+ if (!arguments.length) return mimeType;
+ mimeType = value == null ? null : value + "";
+ return xhr;
+ };
+ xhr.responseType = function(value) {
+ if (!arguments.length) return responseType;
+ responseType = value;
+ return xhr;
+ };
+ xhr.response = function(value) {
+ response = value;
+ return xhr;
+ };
+ [ "get", "post" ].forEach(function(method) {
+ xhr[method] = function() {
+ return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments)));
+ };
+ });
+ xhr.send = function(method, data, callback) {
+ if (arguments.length === 2 && typeof data === "function") callback = data, data = null;
+ request.open(method, url, true);
+ if (mimeType != null && !("accept" in headers)) headers["accept"] = mimeType + ",*/*";
+ if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);
+ if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);
+ if (responseType != null) request.responseType = responseType;
+ if (callback != null) xhr.on("error", callback).on("load", function(request) {
+ callback(null, request);
+ });
+ dispatch.beforesend.call(xhr, request);
+ request.send(data == null ? null : data);
+ return xhr;
+ };
+ xhr.abort = function() {
+ request.abort();
+ return xhr;
+ };
+ d3.rebind(xhr, dispatch, "on");
+ return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));
+ }
+ function d3_xhr_fixCallback(callback) {
+ return callback.length === 1 ? function(error, request) {
+ callback(error == null ? request : null);
+ } : callback;
+ }
+ function d3_xhrHasResponse(request) {
+ var type = request.responseType;
+ return type && type !== "text" ? request.response : request.responseText;
+ }
+ d3.dsv = function(delimiter, mimeType) {
+ var reFormat = new RegExp('["' + delimiter + "\n]"), delimiterCode = delimiter.charCodeAt(0);
+ function dsv(url, row, callback) {
+ if (arguments.length < 3) callback = row, row = null;
+ var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback);
+ xhr.row = function(_) {
+ return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row;
+ };
+ return xhr;
+ }
+ function response(request) {
+ return dsv.parse(request.responseText);
+ }
+ function typedResponse(f) {
+ return function(request) {
+ return dsv.parse(request.responseText, f);
+ };
+ }
+ dsv.parse = function(text, f) {
+ var o;
+ return dsv.parseRows(text, function(row, i) {
+ if (o) return o(row, i - 1);
+ var a = new Function("d", "return {" + row.map(function(name, i) {
+ return JSON.stringify(name) + ": d[" + i + "]";
+ }).join(",") + "}");
+ o = f ? function(row, i) {
+ return f(a(row), i);
+ } : a;
+ });
+ };
+ dsv.parseRows = function(text, f) {
+ var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol;
+ function token() {
+ if (I >= N) return EOF;
+ if (eol) return eol = false, EOL;
+ var j = I;
+ if (text.charCodeAt(j) === 34) {
+ var i = j;
+ while (i++ < N) {
+ if (text.charCodeAt(i) === 34) {
+ if (text.charCodeAt(i + 1) !== 34) break;
+ ++i;
+ }
+ }
+ I = i + 2;
+ var c = text.charCodeAt(i + 1);
+ if (c === 13) {
+ eol = true;
+ if (text.charCodeAt(i + 2) === 10) ++I;
+ } else if (c === 10) {
+ eol = true;
+ }
+ return text.slice(j + 1, i).replace(/""/g, '"');
+ }
+ while (I < N) {
+ var c = text.charCodeAt(I++), k = 1;
+ if (c === 10) eol = true; else if (c === 13) {
+ eol = true;
+ if (text.charCodeAt(I) === 10) ++I, ++k;
+ } else if (c !== delimiterCode) continue;
+ return text.slice(j, I - k);
+ }
+ return text.slice(j);
+ }
+ while ((t = token()) !== EOF) {
+ var a = [];
+ while (t !== EOL && t !== EOF) {
+ a.push(t);
+ t = token();
+ }
+ if (f && !(a = f(a, n++))) continue;
+ rows.push(a);
+ }
+ return rows;
+ };
+ dsv.format = function(rows) {
+ if (Array.isArray(rows[0])) return dsv.formatRows(rows);
+ var fieldSet = new d3_Set(), fields = [];
+ rows.forEach(function(row) {
+ for (var field in row) {
+ if (!fieldSet.has(field)) {
+ fields.push(fieldSet.add(field));
+ }
+ }
+ });
+ return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) {
+ return fields.map(function(field) {
+ return formatValue(row[field]);
+ }).join(delimiter);
+ })).join("\n");
+ };
+ dsv.formatRows = function(rows) {
+ return rows.map(formatRow).join("\n");
+ };
+ function formatRow(row) {
+ return row.map(formatValue).join(delimiter);
+ }
+ function formatValue(text) {
+ return reFormat.test(text) ? '"' + text.replace(/\"/g, '""') + '"' : text;
+ }
+ return dsv;
+ };
+ d3.csv = d3.dsv(",", "text/csv");
+ d3.tsv = d3.dsv(" ", "text/tab-separated-values");
+ var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_active, d3_timer_frame = d3_window[d3_vendorSymbol(d3_window, "requestAnimationFrame")] || function(callback) {
+ setTimeout(callback, 17);
+ };
+ d3.timer = function(callback, delay, then) {
+ var n = arguments.length;
+ if (n < 2) delay = 0;
+ if (n < 3) then = Date.now();
+ var time = then + delay, timer = {
+ c: callback,
+ t: time,
+ f: false,
+ n: null
+ };
+ if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer;
+ d3_timer_queueTail = timer;
+ if (!d3_timer_interval) {
+ d3_timer_timeout = clearTimeout(d3_timer_timeout);
+ d3_timer_interval = 1;
+ d3_timer_frame(d3_timer_step);
+ }
+ };
+ function d3_timer_step() {
+ var now = d3_timer_mark(), delay = d3_timer_sweep() - now;
+ if (delay > 24) {
+ if (isFinite(delay)) {
+ clearTimeout(d3_timer_timeout);
+ d3_timer_timeout = setTimeout(d3_timer_step, delay);
+ }
+ d3_timer_interval = 0;
+ } else {
+ d3_timer_interval = 1;
+ d3_timer_frame(d3_timer_step);
+ }
+ }
+ d3.timer.flush = function() {
+ d3_timer_mark();
+ d3_timer_sweep();
+ };
+ function d3_timer_mark() {
+ var now = Date.now();
+ d3_timer_active = d3_timer_queueHead;
+ while (d3_timer_active) {
+ if (now >= d3_timer_active.t) d3_timer_active.f = d3_timer_active.c(now - d3_timer_active.t);
+ d3_timer_active = d3_timer_active.n;
+ }
+ return now;
+ }
+ function d3_timer_sweep() {
+ var t0, t1 = d3_timer_queueHead, time = Infinity;
+ while (t1) {
+ if (t1.f) {
+ t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n;
+ } else {
+ if (t1.t < time) time = t1.t;
+ t1 = (t0 = t1).n;
+ }
+ }
+ d3_timer_queueTail = t0;
+ return time;
+ }
+ function d3_format_precision(x, p) {
+ return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);
+ }
+ d3.round = function(x, n) {
+ return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);
+ };
+ var d3_formatPrefixes = [ "y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y" ].map(d3_formatPrefix);
+ d3.formatPrefix = function(value, precision) {
+ var i = 0;
+ if (value) {
+ if (value < 0) value *= -1;
+ if (precision) value = d3.round(value, d3_format_precision(value, precision));
+ i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);
+ i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3));
+ }
+ return d3_formatPrefixes[8 + i / 3];
+ };
+ function d3_formatPrefix(d, i) {
+ var k = Math.pow(10, abs(8 - i) * 3);
+ return {
+ scale: i > 8 ? function(d) {
+ return d / k;
+ } : function(d) {
+ return d * k;
+ },
+ symbol: d
+ };
+ }
+ function d3_locale_numberFormat(locale) {
+ var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping ? function(value) {
+ var i = value.length, t = [], j = 0, g = locale_grouping[0];
+ while (g > 0 && i > 0) {
+ t.push(value.substring(i -= g, i + g));
+ g = locale_grouping[j = (j + 1) % locale_grouping.length];
+ }
+ return t.reverse().join(locale_thousands);
+ } : d3_identity;
+ return function(specifier) {
+ var match = d3_format_re.exec(specifier), fill = match[1] || " ", align = match[2] || ">", sign = match[3] || "", symbol = match[4] || "", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = "", suffix = "", integer = false;
+ if (precision) precision = +precision.substring(1);
+ if (zfill || fill === "0" && align === "=") {
+ zfill = fill = "0";
+ align = "=";
+ if (comma) width -= Math.floor((width - 1) / 4);
+ }
+ switch (type) {
+ case "n":
+ comma = true;
+ type = "g";
+ break;
+
+ case "%":
+ scale = 100;
+ suffix = "%";
+ type = "f";
+ break;
+
+ case "p":
+ scale = 100;
+ suffix = "%";
+ type = "r";
+ break;
+
+ case "b":
+ case "o":
+ case "x":
+ case "X":
+ if (symbol === "#") prefix = "0" + type.toLowerCase();
+
+ case "c":
+ case "d":
+ integer = true;
+ precision = 0;
+ break;
+
+ case "s":
+ scale = -1;
+ type = "r";
+ break;
+ }
+ if (symbol === "$") prefix = locale_currency[0], suffix = locale_currency[1];
+ if (type == "r" && !precision) type = "g";
+ if (precision != null) {
+ if (type == "g") precision = Math.max(1, Math.min(21, precision)); else if (type == "e" || type == "f") precision = Math.max(0, Math.min(20, precision));
+ }
+ type = d3_format_types.get(type) || d3_format_typeDefault;
+ var zcomma = zfill && comma;
+ return function(value) {
+ var fullSuffix = suffix;
+ if (integer && value % 1) return "";
+ var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, "-") : sign;
+ if (scale < 0) {
+ var unit = d3.formatPrefix(value, precision);
+ value = unit.scale(value);
+ fullSuffix = unit.symbol + suffix;
+ } else {
+ value *= scale;
+ }
+ value = type(value, precision);
+ var i = value.lastIndexOf("."), before = i < 0 ? value : value.substring(0, i), after = i < 0 ? "" : locale_decimal + value.substring(i + 1);
+ if (!zfill && comma) before = formatGroup(before);
+ var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : "";
+ if (zcomma) before = formatGroup(padding + before);
+ negative += prefix;
+ value = before + after;
+ return (align === "<" ? negative + value + padding : align === ">" ? padding + negative + value : align === "^" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix;
+ };
+ };
+ }
+ var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i;
+ var d3_format_types = d3.map({
+ b: function(x) {
+ return x.toString(2);
+ },
+ c: function(x) {
+ return String.fromCharCode(x);
+ },
+ o: function(x) {
+ return x.toString(8);
+ },
+ x: function(x) {
+ return x.toString(16);
+ },
+ X: function(x) {
+ return x.toString(16).toUpperCase();
+ },
+ g: function(x, p) {
+ return x.toPrecision(p);
+ },
+ e: function(x, p) {
+ return x.toExponential(p);
+ },
+ f: function(x, p) {
+ return x.toFixed(p);
+ },
+ r: function(x, p) {
+ return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p))));
+ }
+ });
+ function d3_format_typeDefault(x) {
+ return x + "";
+ }
+ var d3_time = d3.time = {}, d3_date = Date;
+ function d3_date_utc() {
+ this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);
+ }
+ d3_date_utc.prototype = {
+ getDate: function() {
+ return this._.getUTCDate();
+ },
+ getDay: function() {
+ return this._.getUTCDay();
+ },
+ getFullYear: function() {
+ return this._.getUTCFullYear();
+ },
+ getHours: function() {
+ return this._.getUTCHours();
+ },
+ getMilliseconds: function() {
+ return this._.getUTCMilliseconds();
+ },
+ getMinutes: function() {
+ return this._.getUTCMinutes();
+ },
+ getMonth: function() {
+ return this._.getUTCMonth();
+ },
+ getSeconds: function() {
+ return this._.getUTCSeconds();
+ },
+ getTime: function() {
+ return this._.getTime();
+ },
+ getTimezoneOffset: function() {
+ return 0;
+ },
+ valueOf: function() {
+ return this._.valueOf();
+ },
+ setDate: function() {
+ d3_time_prototype.setUTCDate.apply(this._, arguments);
+ },
+ setDay: function() {
+ d3_time_prototype.setUTCDay.apply(this._, arguments);
+ },
+ setFullYear: function() {
+ d3_time_prototype.setUTCFullYear.apply(this._, arguments);
+ },
+ setHours: function() {
+ d3_time_prototype.setUTCHours.apply(this._, arguments);
+ },
+ setMilliseconds: function() {
+ d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);
+ },
+ setMinutes: function() {
+ d3_time_prototype.setUTCMinutes.apply(this._, arguments);
+ },
+ setMonth: function() {
+ d3_time_prototype.setUTCMonth.apply(this._, arguments);
+ },
+ setSeconds: function() {
+ d3_time_prototype.setUTCSeconds.apply(this._, arguments);
+ },
+ setTime: function() {
+ d3_time_prototype.setTime.apply(this._, arguments);
+ }
+ };
+ var d3_time_prototype = Date.prototype;
+ function d3_time_interval(local, step, number) {
+ function round(date) {
+ var d0 = local(date), d1 = offset(d0, 1);
+ return date - d0 < d1 - date ? d0 : d1;
+ }
+ function ceil(date) {
+ step(date = local(new d3_date(date - 1)), 1);
+ return date;
+ }
+ function offset(date, k) {
+ step(date = new d3_date(+date), k);
+ return date;
+ }
+ function range(t0, t1, dt) {
+ var time = ceil(t0), times = [];
+ if (dt > 1) {
+ while (time < t1) {
+ if (!(number(time) % dt)) times.push(new Date(+time));
+ step(time, 1);
+ }
+ } else {
+ while (time < t1) times.push(new Date(+time)), step(time, 1);
+ }
+ return times;
+ }
+ function range_utc(t0, t1, dt) {
+ try {
+ d3_date = d3_date_utc;
+ var utc = new d3_date_utc();
+ utc._ = t0;
+ return range(utc, t1, dt);
+ } finally {
+ d3_date = Date;
+ }
+ }
+ local.floor = local;
+ local.round = round;
+ local.ceil = ceil;
+ local.offset = offset;
+ local.range = range;
+ var utc = local.utc = d3_time_interval_utc(local);
+ utc.floor = utc;
+ utc.round = d3_time_interval_utc(round);
+ utc.ceil = d3_time_interval_utc(ceil);
+ utc.offset = d3_time_interval_utc(offset);
+ utc.range = range_utc;
+ return local;
+ }
+ function d3_time_interval_utc(method) {
+ return function(date, k) {
+ try {
+ d3_date = d3_date_utc;
+ var utc = new d3_date_utc();
+ utc._ = date;
+ return method(utc, k)._;
+ } finally {
+ d3_date = Date;
+ }
+ };
+ }
+ d3_time.year = d3_time_interval(function(date) {
+ date = d3_time.day(date);
+ date.setMonth(0, 1);
+ return date;
+ }, function(date, offset) {
+ date.setFullYear(date.getFullYear() + offset);
+ }, function(date) {
+ return date.getFullYear();
+ });
+ d3_time.years = d3_time.year.range;
+ d3_time.years.utc = d3_time.year.utc.range;
+ d3_time.day = d3_time_interval(function(date) {
+ var day = new d3_date(2e3, 0);
+ day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());
+ return day;
+ }, function(date, offset) {
+ date.setDate(date.getDate() + offset);
+ }, function(date) {
+ return date.getDate() - 1;
+ });
+ d3_time.days = d3_time.day.range;
+ d3_time.days.utc = d3_time.day.utc.range;
+ d3_time.dayOfYear = function(date) {
+ var year = d3_time.year(date);
+ return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);
+ };
+ [ "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" ].forEach(function(day, i) {
+ i = 7 - i;
+ var interval = d3_time[day] = d3_time_interval(function(date) {
+ (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);
+ return date;
+ }, function(date, offset) {
+ date.setDate(date.getDate() + Math.floor(offset) * 7);
+ }, function(date) {
+ var day = d3_time.year(date).getDay();
+ return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);
+ });
+ d3_time[day + "s"] = interval.range;
+ d3_time[day + "s"].utc = interval.utc.range;
+ d3_time[day + "OfYear"] = function(date) {
+ var day = d3_time.year(date).getDay();
+ return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7);
+ };
+ });
+ d3_time.week = d3_time.sunday;
+ d3_time.weeks = d3_time.sunday.range;
+ d3_time.weeks.utc = d3_time.sunday.utc.range;
+ d3_time.weekOfYear = d3_time.sundayOfYear;
+ function d3_locale_timeFormat(locale) {
+ var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths;
+ function d3_time_format(template) {
+ var n = template.length;
+ function format(date) {
+ var string = [], i = -1, j = 0, c, p, f;
+ while (++i < n) {
+ if (template.charCodeAt(i) === 37) {
+ string.push(template.slice(j, i));
+ if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);
+ if (f = d3_time_formats[c]) c = f(date, p == null ? c === "e" ? " " : "0" : p);
+ string.push(c);
+ j = i + 1;
+ }
+ }
+ string.push(template.slice(j, i));
+ return string.join("");
+ }
+ format.parse = function(string) {
+ var d = {
+ y: 1900,
+ m: 0,
+ d: 1,
+ H: 0,
+ M: 0,
+ S: 0,
+ L: 0,
+ Z: null
+ }, i = d3_time_parse(d, template, string, 0);
+ if (i != string.length) return null;
+ if ("p" in d) d.H = d.H % 12 + d.p * 12;
+ var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)();
+ if ("j" in d) date.setFullYear(d.y, 0, d.j); else if ("w" in d && ("W" in d || "U" in d)) {
+ date.setFullYear(d.y, 0, 1);
+ date.setFullYear(d.y, 0, "W" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7);
+ } else date.setFullYear(d.y, d.m, d.d);
+ date.setHours(d.H + (d.Z / 100 | 0), d.M + d.Z % 100, d.S, d.L);
+ return localZ ? date._ : date;
+ };
+ format.toString = function() {
+ return template;
+ };
+ return format;
+ }
+ function d3_time_parse(date, template, string, j) {
+ var c, p, t, i = 0, n = template.length, m = string.length;
+ while (i < n) {
+ if (j >= m) return -1;
+ c = template.charCodeAt(i++);
+ if (c === 37) {
+ t = template.charAt(i++);
+ p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];
+ if (!p || (j = p(date, string, j)) < 0) return -1;
+ } else if (c != string.charCodeAt(j++)) {
+ return -1;
+ }
+ }
+ return j;
+ }
+ d3_time_format.utc = function(template) {
+ var local = d3_time_format(template);
+ function format(date) {
+ try {
+ d3_date = d3_date_utc;
+ var utc = new d3_date();
+ utc._ = date;
+ return local(utc);
+ } finally {
+ d3_date = Date;
+ }
+ }
+ format.parse = function(string) {
+ try {
+ d3_date = d3_date_utc;
+ var date = local.parse(string);
+ return date && date._;
+ } finally {
+ d3_date = Date;
+ }
+ };
+ format.toString = local.toString;
+ return format;
+ };
+ d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti;
+ var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths);
+ locale_periods.forEach(function(p, i) {
+ d3_time_periodLookup.set(p.toLowerCase(), i);
+ });
+ var d3_time_formats = {
+ a: function(d) {
+ return locale_shortDays[d.getDay()];
+ },
+ A: function(d) {
+ return locale_days[d.getDay()];
+ },
+ b: function(d) {
+ return locale_shortMonths[d.getMonth()];
+ },
+ B: function(d) {
+ return locale_months[d.getMonth()];
+ },
+ c: d3_time_format(locale_dateTime),
+ d: function(d, p) {
+ return d3_time_formatPad(d.getDate(), p, 2);
+ },
+ e: function(d, p) {
+ return d3_time_formatPad(d.getDate(), p, 2);
+ },
+ H: function(d, p) {
+ return d3_time_formatPad(d.getHours(), p, 2);
+ },
+ I: function(d, p) {
+ return d3_time_formatPad(d.getHours() % 12 || 12, p, 2);
+ },
+ j: function(d, p) {
+ return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3);
+ },
+ L: function(d, p) {
+ return d3_time_formatPad(d.getMilliseconds(), p, 3);
+ },
+ m: function(d, p) {
+ return d3_time_formatPad(d.getMonth() + 1, p, 2);
+ },
+ M: function(d, p) {
+ return d3_time_formatPad(d.getMinutes(), p, 2);
+ },
+ p: function(d) {
+ return locale_periods[+(d.getHours() >= 12)];
+ },
+ S: function(d, p) {
+ return d3_time_formatPad(d.getSeconds(), p, 2);
+ },
+ U: function(d, p) {
+ return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2);
+ },
+ w: function(d) {
+ return d.getDay();
+ },
+ W: function(d, p) {
+ return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2);
+ },
+ x: d3_time_format(locale_date),
+ X: d3_time_format(locale_time),
+ y: function(d, p) {
+ return d3_time_formatPad(d.getFullYear() % 100, p, 2);
+ },
+ Y: function(d, p) {
+ return d3_time_formatPad(d.getFullYear() % 1e4, p, 4);
+ },
+ Z: d3_time_zone,
+ "%": function() {
+ return "%";
+ }
+ };
+ var d3_time_parsers = {
+ a: d3_time_parseWeekdayAbbrev,
+ A: d3_time_parseWeekday,
+ b: d3_time_parseMonthAbbrev,
+ B: d3_time_parseMonth,
+ c: d3_time_parseLocaleFull,
+ d: d3_time_parseDay,
+ e: d3_time_parseDay,
+ H: d3_time_parseHour24,
+ I: d3_time_parseHour24,
+ j: d3_time_parseDayOfYear,
+ L: d3_time_parseMilliseconds,
+ m: d3_time_parseMonthNumber,
+ M: d3_time_parseMinutes,
+ p: d3_time_parseAmPm,
+ S: d3_time_parseSeconds,
+ U: d3_time_parseWeekNumberSunday,
+ w: d3_time_parseWeekdayNumber,
+ W: d3_time_parseWeekNumberMonday,
+ x: d3_time_parseLocaleDate,
+ X: d3_time_parseLocaleTime,
+ y: d3_time_parseYear,
+ Y: d3_time_parseFullYear,
+ Z: d3_time_parseZone,
+ "%": d3_time_parseLiteralPercent
+ };
+ function d3_time_parseWeekdayAbbrev(date, string, i) {
+ d3_time_dayAbbrevRe.lastIndex = 0;
+ var n = d3_time_dayAbbrevRe.exec(string.slice(i));
+ return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
+ }
+ function d3_time_parseWeekday(date, string, i) {
+ d3_time_dayRe.lastIndex = 0;
+ var n = d3_time_dayRe.exec(string.slice(i));
+ return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
+ }
+ function d3_time_parseMonthAbbrev(date, string, i) {
+ d3_time_monthAbbrevRe.lastIndex = 0;
+ var n = d3_time_monthAbbrevRe.exec(string.slice(i));
+ return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
+ }
+ function d3_time_parseMonth(date, string, i) {
+ d3_time_monthRe.lastIndex = 0;
+ var n = d3_time_monthRe.exec(string.slice(i));
+ return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
+ }
+ function d3_time_parseLocaleFull(date, string, i) {
+ return d3_time_parse(date, d3_time_formats.c.toString(), string, i);
+ }
+ function d3_time_parseLocaleDate(date, string, i) {
+ return d3_time_parse(date, d3_time_formats.x.toString(), string, i);
+ }
+ function d3_time_parseLocaleTime(date, string, i) {
+ return d3_time_parse(date, d3_time_formats.X.toString(), string, i);
+ }
+ function d3_time_parseAmPm(date, string, i) {
+ var n = d3_time_periodLookup.get(string.slice(i, i += 2).toLowerCase());
+ return n == null ? -1 : (date.p = n, i);
+ }
+ return d3_time_format;
+ }
+ var d3_time_formatPads = {
+ "-": "",
+ _: " ",
+ "0": "0"
+ }, d3_time_numberRe = /^\s*\d+/, d3_time_percentRe = /^%/;
+ function d3_time_formatPad(value, fill, width) {
+ var sign = value < 0 ? "-" : "", string = (sign ? -value : value) + "", length = string.length;
+ return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
+ }
+ function d3_time_formatRe(names) {
+ return new RegExp("^(?:" + names.map(d3.requote).join("|") + ")", "i");
+ }
+ function d3_time_formatLookup(names) {
+ var map = new d3_Map(), i = -1, n = names.length;
+ while (++i < n) map.set(names[i].toLowerCase(), i);
+ return map;
+ }
+ function d3_time_parseWeekdayNumber(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i, i + 1));
+ return n ? (date.w = +n[0], i + n[0].length) : -1;
+ }
+ function d3_time_parseWeekNumberSunday(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i));
+ return n ? (date.U = +n[0], i + n[0].length) : -1;
+ }
+ function d3_time_parseWeekNumberMonday(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i));
+ return n ? (date.W = +n[0], i + n[0].length) : -1;
+ }
+ function d3_time_parseFullYear(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i, i + 4));
+ return n ? (date.y = +n[0], i + n[0].length) : -1;
+ }
+ function d3_time_parseYear(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i, i + 2));
+ return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;
+ }
+ function d3_time_parseZone(date, string, i) {
+ return /^[+-]\d{4}$/.test(string = string.slice(i, i + 5)) ? (date.Z = -string,
+ i + 5) : -1;
+ }
+ function d3_time_expandYear(d) {
+ return d + (d > 68 ? 1900 : 2e3);
+ }
+ function d3_time_parseMonthNumber(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i, i + 2));
+ return n ? (date.m = n[0] - 1, i + n[0].length) : -1;
+ }
+ function d3_time_parseDay(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i, i + 2));
+ return n ? (date.d = +n[0], i + n[0].length) : -1;
+ }
+ function d3_time_parseDayOfYear(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i, i + 3));
+ return n ? (date.j = +n[0], i + n[0].length) : -1;
+ }
+ function d3_time_parseHour24(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i, i + 2));
+ return n ? (date.H = +n[0], i + n[0].length) : -1;
+ }
+ function d3_time_parseMinutes(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i, i + 2));
+ return n ? (date.M = +n[0], i + n[0].length) : -1;
+ }
+ function d3_time_parseSeconds(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i, i + 2));
+ return n ? (date.S = +n[0], i + n[0].length) : -1;
+ }
+ function d3_time_parseMilliseconds(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i, i + 3));
+ return n ? (date.L = +n[0], i + n[0].length) : -1;
+ }
+ function d3_time_zone(d) {
+ var z = d.getTimezoneOffset(), zs = z > 0 ? "-" : "+", zh = abs(z) / 60 | 0, zm = abs(z) % 60;
+ return zs + d3_time_formatPad(zh, "0", 2) + d3_time_formatPad(zm, "0", 2);
+ }
+ function d3_time_parseLiteralPercent(date, string, i) {
+ d3_time_percentRe.lastIndex = 0;
+ var n = d3_time_percentRe.exec(string.slice(i, i + 1));
+ return n ? i + n[0].length : -1;
+ }
+ function d3_time_formatMulti(formats) {
+ var n = formats.length, i = -1;
+ while (++i < n) formats[i][0] = this(formats[i][0]);
+ return function(date) {
+ var i = 0, f = formats[i];
+ while (!f[1](date)) f = formats[++i];
+ return f[0](date);
+ };
+ }
+ d3.locale = function(locale) {
+ return {
+ numberFormat: d3_locale_numberFormat(locale),
+ timeFormat: d3_locale_timeFormat(locale)
+ };
+ };
+ var d3_locale_enUS = d3.locale({
+ decimal: ".",
+ thousands: ",",
+ grouping: [ 3 ],
+ currency: [ "$", "" ],
+ dateTime: "%a %b %e %X %Y",
+ date: "%m/%d/%Y",
+ time: "%H:%M:%S",
+ periods: [ "AM", "PM" ],
+ days: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ],
+ shortDays: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ],
+ months: [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ],
+ shortMonths: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ]
+ });
+ d3.format = d3_locale_enUS.numberFormat;
+ d3.geo = {};
+ function d3_adder() {}
+ d3_adder.prototype = {
+ s: 0,
+ t: 0,
+ add: function(y) {
+ d3_adderSum(y, this.t, d3_adderTemp);
+ d3_adderSum(d3_adderTemp.s, this.s, this);
+ if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t;
+ },
+ reset: function() {
+ this.s = this.t = 0;
+ },
+ valueOf: function() {
+ return this.s;
+ }
+ };
+ var d3_adderTemp = new d3_adder();
+ function d3_adderSum(a, b, o) {
+ var x = o.s = a + b, bv = x - a, av = x - bv;
+ o.t = a - av + (b - bv);
+ }
+ d3.geo.stream = function(object, listener) {
+ if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) {
+ d3_geo_streamObjectType[object.type](object, listener);
+ } else {
+ d3_geo_streamGeometry(object, listener);
+ }
+ };
+ function d3_geo_streamGeometry(geometry, listener) {
+ if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {
+ d3_geo_streamGeometryType[geometry.type](geometry, listener);
+ }
+ }
+ var d3_geo_streamObjectType = {
+ Feature: function(feature, listener) {
+ d3_geo_streamGeometry(feature.geometry, listener);
+ },
+ FeatureCollection: function(object, listener) {
+ var features = object.features, i = -1, n = features.length;
+ while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);
+ }
+ };
+ var d3_geo_streamGeometryType = {
+ Sphere: function(object, listener) {
+ listener.sphere();
+ },
+ Point: function(object, listener) {
+ object = object.coordinates;
+ listener.point(object[0], object[1], object[2]);
+ },
+ MultiPoint: function(object, listener) {
+ var coordinates = object.coordinates, i = -1, n = coordinates.length;
+ while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]);
+ },
+ LineString: function(object, listener) {
+ d3_geo_streamLine(object.coordinates, listener, 0);
+ },
+ MultiLineString: function(object, listener) {
+ var coordinates = object.coordinates, i = -1, n = coordinates.length;
+ while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);
+ },
+ Polygon: function(object, listener) {
+ d3_geo_streamPolygon(object.coordinates, listener);
+ },
+ MultiPolygon: function(object, listener) {
+ var coordinates = object.coordinates, i = -1, n = coordinates.length;
+ while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);
+ },
+ GeometryCollection: function(object, listener) {
+ var geometries = object.geometries, i = -1, n = geometries.length;
+ while (++i < n) d3_geo_streamGeometry(geometries[i], listener);
+ }
+ };
+ function d3_geo_streamLine(coordinates, listener, closed) {
+ var i = -1, n = coordinates.length - closed, coordinate;
+ listener.lineStart();
+ while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]);
+ listener.lineEnd();
+ }
+ function d3_geo_streamPolygon(coordinates, listener) {
+ var i = -1, n = coordinates.length;
+ listener.polygonStart();
+ while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);
+ listener.polygonEnd();
+ }
+ d3.geo.area = function(object) {
+ d3_geo_areaSum = 0;
+ d3.geo.stream(object, d3_geo_area);
+ return d3_geo_areaSum;
+ };
+ var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder();
+ var d3_geo_area = {
+ sphere: function() {
+ d3_geo_areaSum += 4 * π;
+ },
+ point: d3_noop,
+ lineStart: d3_noop,
+ lineEnd: d3_noop,
+ polygonStart: function() {
+ d3_geo_areaRingSum.reset();
+ d3_geo_area.lineStart = d3_geo_areaRingStart;
+ },
+ polygonEnd: function() {
+ var area = 2 * d3_geo_areaRingSum;
+ d3_geo_areaSum += area < 0 ? 4 * π + area : area;
+ d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;
+ }
+ };
+ function d3_geo_areaRingStart() {
+ var λ00, φ00, λ0, cosφ0, sinφ0;
+ d3_geo_area.point = function(λ, φ) {
+ d3_geo_area.point = nextPoint;
+ λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4),
+ sinφ0 = Math.sin(φ);
+ };
+ function nextPoint(λ, φ) {
+ λ *= d3_radians;
+ φ = φ * d3_radians / 2 + π / 4;
+ var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ);
+ d3_geo_areaRingSum.add(Math.atan2(v, u));
+ λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;
+ }
+ d3_geo_area.lineEnd = function() {
+ nextPoint(λ00, φ00);
+ };
+ }
+ function d3_geo_cartesian(spherical) {
+ var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ);
+ return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ];
+ }
+ function d3_geo_cartesianDot(a, b) {
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
+ }
+ function d3_geo_cartesianCross(a, b) {
+ return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ];
+ }
+ function d3_geo_cartesianAdd(a, b) {
+ a[0] += b[0];
+ a[1] += b[1];
+ a[2] += b[2];
+ }
+ function d3_geo_cartesianScale(vector, k) {
+ return [ vector[0] * k, vector[1] * k, vector[2] * k ];
+ }
+ function d3_geo_cartesianNormalize(d) {
+ var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
+ d[0] /= l;
+ d[1] /= l;
+ d[2] /= l;
+ }
+ function d3_geo_spherical(cartesian) {
+ return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ];
+ }
+ function d3_geo_sphericalEqual(a, b) {
+ return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε;
+ }
+ d3.geo.bounds = function() {
+ var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range;
+ var bound = {
+ point: point,
+ lineStart: lineStart,
+ lineEnd: lineEnd,
+ polygonStart: function() {
+ bound.point = ringPoint;
+ bound.lineStart = ringStart;
+ bound.lineEnd = ringEnd;
+ dλSum = 0;
+ d3_geo_area.polygonStart();
+ },
+ polygonEnd: function() {
+ d3_geo_area.polygonEnd();
+ bound.point = point;
+ bound.lineStart = lineStart;
+ bound.lineEnd = lineEnd;
+ if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90;
+ range[0] = λ0, range[1] = λ1;
+ }
+ };
+ function point(λ, φ) {
+ ranges.push(range = [ λ0 = λ, λ1 = λ ]);
+ if (φ < φ0) φ0 = φ;
+ if (φ > φ1) φ1 = φ;
+ }
+ function linePoint(λ, φ) {
+ var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]);
+ if (p0) {
+ var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal);
+ d3_geo_cartesianNormalize(inflection);
+ inflection = d3_geo_spherical(inflection);
+ var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180;
+ if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) {
+ var φi = inflection[1] * d3_degrees;
+ if (φi > φ1) φ1 = φi;
+ } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) {
+ var φi = -inflection[1] * d3_degrees;
+ if (φi < φ0) φ0 = φi;
+ } else {
+ if (φ < φ0) φ0 = φ;
+ if (φ > φ1) φ1 = φ;
+ }
+ if (antimeridian) {
+ if (λ < λ_) {
+ if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;
+ } else {
+ if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;
+ }
+ } else {
+ if (λ1 >= λ0) {
+ if (λ < λ0) λ0 = λ;
+ if (λ > λ1) λ1 = λ;
+ } else {
+ if (λ > λ_) {
+ if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;
+ } else {
+ if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;
+ }
+ }
+ }
+ } else {
+ point(λ, φ);
+ }
+ p0 = p, λ_ = λ;
+ }
+ function lineStart() {
+ bound.point = linePoint;
+ }
+ function lineEnd() {
+ range[0] = λ0, range[1] = λ1;
+ bound.point = point;
+ p0 = null;
+ }
+ function ringPoint(λ, φ) {
+ if (p0) {
+ var dλ = λ - λ_;
+ dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ;
+ } else λ__ = λ, φ__ = φ;
+ d3_geo_area.point(λ, φ);
+ linePoint(λ, φ);
+ }
+ function ringStart() {
+ d3_geo_area.lineStart();
+ }
+ function ringEnd() {
+ ringPoint(λ__, φ__);
+ d3_geo_area.lineEnd();
+ if (abs(dλSum) > ε) λ0 = -(λ1 = 180);
+ range[0] = λ0, range[1] = λ1;
+ p0 = null;
+ }
+ function angle(λ0, λ1) {
+ return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1;
+ }
+ function compareRanges(a, b) {
+ return a[0] - b[0];
+ }
+ function withinRange(x, range) {
+ return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
+ }
+ return function(feature) {
+ φ1 = λ1 = -(λ0 = φ0 = Infinity);
+ ranges = [];
+ d3.geo.stream(feature, bound);
+ var n = ranges.length;
+ if (n) {
+ ranges.sort(compareRanges);
+ for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) {
+ b = ranges[i];
+ if (withinRange(b[0], a) || withinRange(b[1], a)) {
+ if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
+ if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
+ } else {
+ merged.push(a = b);
+ }
+ }
+ var best = -Infinity, dλ;
+ for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {
+ b = merged[i];
+ if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];
+ }
+ }
+ ranges = range = null;
+ return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ];
+ };
+ }();
+ d3.geo.centroid = function(object) {
+ d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;
+ d3.geo.stream(object, d3_geo_centroid);
+ var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z;
+ if (m < ε2) {
+ x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1;
+ if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0;
+ m = x * x + y * y + z * z;
+ if (m < ε2) return [ NaN, NaN ];
+ }
+ return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ];
+ };
+ var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2;
+ var d3_geo_centroid = {
+ sphere: d3_noop,
+ point: d3_geo_centroidPoint,
+ lineStart: d3_geo_centroidLineStart,
+ lineEnd: d3_geo_centroidLineEnd,
+ polygonStart: function() {
+ d3_geo_centroid.lineStart = d3_geo_centroidRingStart;
+ },
+ polygonEnd: function() {
+ d3_geo_centroid.lineStart = d3_geo_centroidLineStart;
+ }
+ };
+ function d3_geo_centroidPoint(λ, φ) {
+ λ *= d3_radians;
+ var cosφ = Math.cos(φ *= d3_radians);
+ d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ));
+ }
+ function d3_geo_centroidPointXYZ(x, y, z) {
+ ++d3_geo_centroidW0;
+ d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0;
+ d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0;
+ d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0;
+ }
+ function d3_geo_centroidLineStart() {
+ var x0, y0, z0;
+ d3_geo_centroid.point = function(λ, φ) {
+ λ *= d3_radians;
+ var cosφ = Math.cos(φ *= d3_radians);
+ x0 = cosφ * Math.cos(λ);
+ y0 = cosφ * Math.sin(λ);
+ z0 = Math.sin(φ);
+ d3_geo_centroid.point = nextPoint;
+ d3_geo_centroidPointXYZ(x0, y0, z0);
+ };
+ function nextPoint(λ, φ) {
+ λ *= d3_radians;
+ var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);
+ d3_geo_centroidW1 += w;
+ d3_geo_centroidX1 += w * (x0 + (x0 = x));
+ d3_geo_centroidY1 += w * (y0 + (y0 = y));
+ d3_geo_centroidZ1 += w * (z0 + (z0 = z));
+ d3_geo_centroidPointXYZ(x0, y0, z0);
+ }
+ }
+ function d3_geo_centroidLineEnd() {
+ d3_geo_centroid.point = d3_geo_centroidPoint;
+ }
+ function d3_geo_centroidRingStart() {
+ var λ00, φ00, x0, y0, z0;
+ d3_geo_centroid.point = function(λ, φ) {
+ λ00 = λ, φ00 = φ;
+ d3_geo_centroid.point = nextPoint;
+ λ *= d3_radians;
+ var cosφ = Math.cos(φ *= d3_radians);
+ x0 = cosφ * Math.cos(λ);
+ y0 = cosφ * Math.sin(λ);
+ z0 = Math.sin(φ);
+ d3_geo_centroidPointXYZ(x0, y0, z0);
+ };
+ d3_geo_centroid.lineEnd = function() {
+ nextPoint(λ00, φ00);
+ d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;
+ d3_geo_centroid.point = d3_geo_centroidPoint;
+ };
+ function nextPoint(λ, φ) {
+ λ *= d3_radians;
+ var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u);
+ d3_geo_centroidX2 += v * cx;
+ d3_geo_centroidY2 += v * cy;
+ d3_geo_centroidZ2 += v * cz;
+ d3_geo_centroidW1 += w;
+ d3_geo_centroidX1 += w * (x0 + (x0 = x));
+ d3_geo_centroidY1 += w * (y0 + (y0 = y));
+ d3_geo_centroidZ1 += w * (z0 + (z0 = z));
+ d3_geo_centroidPointXYZ(x0, y0, z0);
+ }
+ }
+ function d3_true() {
+ return true;
+ }
+ function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) {
+ var subject = [], clip = [];
+ segments.forEach(function(segment) {
+ if ((n = segment.length - 1) <= 0) return;
+ var n, p0 = segment[0], p1 = segment[n];
+ if (d3_geo_sphericalEqual(p0, p1)) {
+ listener.lineStart();
+ for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);
+ listener.lineEnd();
+ return;
+ }
+ var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false);
+ a.o = b;
+ subject.push(a);
+ clip.push(b);
+ a = new d3_geo_clipPolygonIntersection(p1, segment, null, false);
+ b = new d3_geo_clipPolygonIntersection(p1, null, a, true);
+ a.o = b;
+ subject.push(a);
+ clip.push(b);
+ });
+ clip.sort(compare);
+ d3_geo_clipPolygonLinkCircular(subject);
+ d3_geo_clipPolygonLinkCircular(clip);
+ if (!subject.length) return;
+ for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) {
+ clip[i].e = entry = !entry;
+ }
+ var start = subject[0], points, point;
+ while (1) {
+ var current = start, isSubject = true;
+ while (current.v) if ((current = current.n) === start) return;
+ points = current.z;
+ listener.lineStart();
+ do {
+ current.v = current.o.v = true;
+ if (current.e) {
+ if (isSubject) {
+ for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]);
+ } else {
+ interpolate(current.x, current.n.x, 1, listener);
+ }
+ current = current.n;
+ } else {
+ if (isSubject) {
+ points = current.p.z;
+ for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]);
+ } else {
+ interpolate(current.x, current.p.x, -1, listener);
+ }
+ current = current.p;
+ }
+ current = current.o;
+ points = current.z;
+ isSubject = !isSubject;
+ } while (!current.v);
+ listener.lineEnd();
+ }
+ }
+ function d3_geo_clipPolygonLinkCircular(array) {
+ if (!(n = array.length)) return;
+ var n, i = 0, a = array[0], b;
+ while (++i < n) {
+ a.n = b = array[i];
+ b.p = a;
+ a = b;
+ }
+ a.n = b = array[0];
+ b.p = a;
+ }
+ function d3_geo_clipPolygonIntersection(point, points, other, entry) {
+ this.x = point;
+ this.z = points;
+ this.o = other;
+ this.e = entry;
+ this.v = false;
+ this.n = this.p = null;
+ }
+ function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {
+ return function(rotate, listener) {
+ var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]);
+ var clip = {
+ point: point,
+ lineStart: lineStart,
+ lineEnd: lineEnd,
+ polygonStart: function() {
+ clip.point = pointRing;
+ clip.lineStart = ringStart;
+ clip.lineEnd = ringEnd;
+ segments = [];
+ polygon = [];
+ },
+ polygonEnd: function() {
+ clip.point = point;
+ clip.lineStart = lineStart;
+ clip.lineEnd = lineEnd;
+ segments = d3.merge(segments);
+ var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon);
+ if (segments.length) {
+ if (!polygonStarted) listener.polygonStart(), polygonStarted = true;
+ d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener);
+ } else if (clipStartInside) {
+ if (!polygonStarted) listener.polygonStart(), polygonStarted = true;
+ listener.lineStart();
+ interpolate(null, null, 1, listener);
+ listener.lineEnd();
+ }
+ if (polygonStarted) listener.polygonEnd(), polygonStarted = false;
+ segments = polygon = null;
+ },
+ sphere: function() {
+ listener.polygonStart();
+ listener.lineStart();
+ interpolate(null, null, 1, listener);
+ listener.lineEnd();
+ listener.polygonEnd();
+ }
+ };
+ function point(λ, φ) {
+ var point = rotate(λ, φ);
+ if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ);
+ }
+ function pointLine(λ, φ) {
+ var point = rotate(λ, φ);
+ line.point(point[0], point[1]);
+ }
+ function lineStart() {
+ clip.point = pointLine;
+ line.lineStart();
+ }
+ function lineEnd() {
+ clip.point = point;
+ line.lineEnd();
+ }
+ var segments;
+ var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring;
+ function pointRing(λ, φ) {
+ ring.push([ λ, φ ]);
+ var point = rotate(λ, φ);
+ ringListener.point(point[0], point[1]);
+ }
+ function ringStart() {
+ ringListener.lineStart();
+ ring = [];
+ }
+ function ringEnd() {
+ pointRing(ring[0][0], ring[0][1]);
+ ringListener.lineEnd();
+ var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length;
+ ring.pop();
+ polygon.push(ring);
+ ring = null;
+ if (!n) return;
+ if (clean & 1) {
+ segment = ringSegments[0];
+ var n = segment.length - 1, i = -1, point;
+ if (n > 0) {
+ if (!polygonStarted) listener.polygonStart(), polygonStarted = true;
+ listener.lineStart();
+ while (++i < n) listener.point((point = segment[i])[0], point[1]);
+ listener.lineEnd();
+ }
+ return;
+ }
+ if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
+ segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));
+ }
+ return clip;
+ };
+ }
+ function d3_geo_clipSegmentLength1(segment) {
+ return segment.length > 1;
+ }
+ function d3_geo_clipBufferListener() {
+ var lines = [], line;
+ return {
+ lineStart: function() {
+ lines.push(line = []);
+ },
+ point: function(λ, φ) {
+ line.push([ λ, φ ]);
+ },
+ lineEnd: d3_noop,
+ buffer: function() {
+ var buffer = lines;
+ lines = [];
+ line = null;
+ return buffer;
+ },
+ rejoin: function() {
+ if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
+ }
+ };
+ }
+ function d3_geo_clipSort(a, b) {
+ return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]);
+ }
+ var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]);
+ function d3_geo_clipAntimeridianLine(listener) {
+ var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean;
+ return {
+ lineStart: function() {
+ listener.lineStart();
+ clean = 1;
+ },
+ point: function(λ1, φ1) {
+ var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0);
+ if (abs(dλ - π) < ε) {
+ listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ);
+ listener.point(sλ0, φ0);
+ listener.lineEnd();
+ listener.lineStart();
+ listener.point(sλ1, φ0);
+ listener.point(λ1, φ0);
+ clean = 0;
+ } else if (sλ0 !== sλ1 && dλ >= π) {
+ if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;
+ if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;
+ φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);
+ listener.point(sλ0, φ0);
+ listener.lineEnd();
+ listener.lineStart();
+ listener.point(sλ1, φ0);
+ clean = 0;
+ }
+ listener.point(λ0 = λ1, φ0 = φ1);
+ sλ0 = sλ1;
+ },
+ lineEnd: function() {
+ listener.lineEnd();
+ λ0 = φ0 = NaN;
+ },
+ clean: function() {
+ return 2 - clean;
+ }
+ };
+ }
+ function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {
+ var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1);
+ return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2;
+ }
+ function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {
+ var φ;
+ if (from == null) {
+ φ = direction * halfπ;
+ listener.point(-π, φ);
+ listener.point(0, φ);
+ listener.point(π, φ);
+ listener.point(π, 0);
+ listener.point(π, -φ);
+ listener.point(0, -φ);
+ listener.point(-π, -φ);
+ listener.point(-π, 0);
+ listener.point(-π, φ);
+ } else if (abs(from[0] - to[0]) > ε) {
+ var s = from[0] < to[0] ? π : -π;
+ φ = direction * s / 2;
+ listener.point(-s, φ);
+ listener.point(0, φ);
+ listener.point(s, φ);
+ } else {
+ listener.point(to[0], to[1]);
+ }
+ }
+ function d3_geo_pointInPolygon(point, polygon) {
+ var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0;
+ d3_geo_areaRingSum.reset();
+ for (var i = 0, n = polygon.length; i < n; ++i) {
+ var ring = polygon[i], m = ring.length;
+ if (!m) continue;
+ var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1;
+ while (true) {
+ if (j === m) j = 0;
+ point = ring[j];
+ var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ;
+ d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ)));
+ polarAngle += antimeridian ? dλ + sdλ * τ : dλ;
+ if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) {
+ var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point));
+ d3_geo_cartesianNormalize(arc);
+ var intersection = d3_geo_cartesianCross(meridianNormal, arc);
+ d3_geo_cartesianNormalize(intersection);
+ var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]);
+ if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) {
+ winding += antimeridian ^ dλ >= 0 ? 1 : -1;
+ }
+ }
+ if (!j++) break;
+ λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point;
+ }
+ }
+ return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < 0) ^ winding & 1;
+ }
+ function d3_geo_clipCircle(radius) {
+ var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);
+ return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]);
+ function visible(λ, φ) {
+ return Math.cos(λ) * Math.cos(φ) > cr;
+ }
+ function clipLine(listener) {
+ var point0, c0, v0, v00, clean;
+ return {
+ lineStart: function() {
+ v00 = v0 = false;
+ clean = 1;
+ },
+ point: function(λ, φ) {
+ var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0;
+ if (!point0 && (v00 = v0 = v)) listener.lineStart();
+ if (v !== v0) {
+ point2 = intersect(point0, point1);
+ if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {
+ point1[0] += ε;
+ point1[1] += ε;
+ v = visible(point1[0], point1[1]);
+ }
+ }
+ if (v !== v0) {
+ clean = 0;
+ if (v) {
+ listener.lineStart();
+ point2 = intersect(point1, point0);
+ listener.point(point2[0], point2[1]);
+ } else {
+ point2 = intersect(point0, point1);
+ listener.point(point2[0], point2[1]);
+ listener.lineEnd();
+ }
+ point0 = point2;
+ } else if (notHemisphere && point0 && smallRadius ^ v) {
+ var t;
+ if (!(c & c0) && (t = intersect(point1, point0, true))) {
+ clean = 0;
+ if (smallRadius) {
+ listener.lineStart();
+ listener.point(t[0][0], t[0][1]);
+ listener.point(t[1][0], t[1][1]);
+ listener.lineEnd();
+ } else {
+ listener.point(t[1][0], t[1][1]);
+ listener.lineEnd();
+ listener.lineStart();
+ listener.point(t[0][0], t[0][1]);
+ }
+ }
+ }
+ if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) {
+ listener.point(point1[0], point1[1]);
+ }
+ point0 = point1, v0 = v, c0 = c;
+ },
+ lineEnd: function() {
+ if (v0) listener.lineEnd();
+ point0 = null;
+ },
+ clean: function() {
+ return clean | (v00 && v0) << 1;
+ }
+ };
+ }
+ function intersect(a, b, two) {
+ var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b);
+ var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;
+ if (!determinant) return !two && a;
+ var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2);
+ d3_geo_cartesianAdd(A, B);
+ var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1);
+ if (t2 < 0) return;
+ var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu);
+ d3_geo_cartesianAdd(q, A);
+ q = d3_geo_spherical(q);
+ if (!two) return q;
+ var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z;
+ if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;
+ var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε;
+ if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;
+ if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {
+ var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);
+ d3_geo_cartesianAdd(q1, A);
+ return [ q, d3_geo_spherical(q1) ];
+ }
+ }
+ function code(λ, φ) {
+ var r = smallRadius ? radius : π - radius, code = 0;
+ if (λ < -r) code |= 1; else if (λ > r) code |= 2;
+ if (φ < -r) code |= 4; else if (φ > r) code |= 8;
+ return code;
+ }
+ }
+ function d3_geom_clipLine(x0, y0, x1, y1) {
+ return function(line) {
+ var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;
+ r = x0 - ax;
+ if (!dx && r > 0) return;
+ r /= dx;
+ if (dx < 0) {
+ if (r < t0) return;
+ if (r < t1) t1 = r;
+ } else if (dx > 0) {
+ if (r > t1) return;
+ if (r > t0) t0 = r;
+ }
+ r = x1 - ax;
+ if (!dx && r < 0) return;
+ r /= dx;
+ if (dx < 0) {
+ if (r > t1) return;
+ if (r > t0) t0 = r;
+ } else if (dx > 0) {
+ if (r < t0) return;
+ if (r < t1) t1 = r;
+ }
+ r = y0 - ay;
+ if (!dy && r > 0) return;
+ r /= dy;
+ if (dy < 0) {
+ if (r < t0) return;
+ if (r < t1) t1 = r;
+ } else if (dy > 0) {
+ if (r > t1) return;
+ if (r > t0) t0 = r;
+ }
+ r = y1 - ay;
+ if (!dy && r < 0) return;
+ r /= dy;
+ if (dy < 0) {
+ if (r > t1) return;
+ if (r > t0) t0 = r;
+ } else if (dy > 0) {
+ if (r < t0) return;
+ if (r < t1) t1 = r;
+ }
+ if (t0 > 0) line.a = {
+ x: ax + t0 * dx,
+ y: ay + t0 * dy
+ };
+ if (t1 < 1) line.b = {
+ x: ax + t1 * dx,
+ y: ay + t1 * dy
+ };
+ return line;
+ };
+ }
+ var d3_geo_clipExtentMAX = 1e9;
+ d3.geo.clipExtent = function() {
+ var x0, y0, x1, y1, stream, clip, clipExtent = {
+ stream: function(output) {
+ if (stream) stream.valid = false;
+ stream = clip(output);
+ stream.valid = true;
+ return stream;
+ },
+ extent: function(_) {
+ if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];
+ clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]);
+ if (stream) stream.valid = false, stream = null;
+ return clipExtent;
+ }
+ };
+ return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]);
+ };
+ function d3_geo_clipExtent(x0, y0, x1, y1) {
+ return function(listener) {
+ var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring;
+ var clip = {
+ point: point,
+ lineStart: lineStart,
+ lineEnd: lineEnd,
+ polygonStart: function() {
+ listener = bufferListener;
+ segments = [];
+ polygon = [];
+ clean = true;
+ },
+ polygonEnd: function() {
+ listener = listener_;
+ segments = d3.merge(segments);
+ var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length;
+ if (inside || visible) {
+ listener.polygonStart();
+ if (inside) {
+ listener.lineStart();
+ interpolate(null, null, 1, listener);
+ listener.lineEnd();
+ }
+ if (visible) {
+ d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener);
+ }
+ listener.polygonEnd();
+ }
+ segments = polygon = ring = null;
+ }
+ };
+ function insidePolygon(p) {
+ var wn = 0, n = polygon.length, y = p[1];
+ for (var i = 0; i < n; ++i) {
+ for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) {
+ b = v[j];
+ if (a[1] <= y) {
+ if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn;
+ } else {
+ if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn;
+ }
+ a = b;
+ }
+ }
+ return wn !== 0;
+ }
+ function interpolate(from, to, direction, listener) {
+ var a = 0, a1 = 0;
+ if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) {
+ do {
+ listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
+ } while ((a = (a + direction + 4) % 4) !== a1);
+ } else {
+ listener.point(to[0], to[1]);
+ }
+ }
+ function pointVisible(x, y) {
+ return x0 <= x && x <= x1 && y0 <= y && y <= y1;
+ }
+ function point(x, y) {
+ if (pointVisible(x, y)) listener.point(x, y);
+ }
+ var x__, y__, v__, x_, y_, v_, first, clean;
+ function lineStart() {
+ clip.point = linePoint;
+ if (polygon) polygon.push(ring = []);
+ first = true;
+ v_ = false;
+ x_ = y_ = NaN;
+ }
+ function lineEnd() {
+ if (segments) {
+ linePoint(x__, y__);
+ if (v__ && v_) bufferListener.rejoin();
+ segments.push(bufferListener.buffer());
+ }
+ clip.point = point;
+ if (v_) listener.lineEnd();
+ }
+ function linePoint(x, y) {
+ x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x));
+ y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y));
+ var v = pointVisible(x, y);
+ if (polygon) ring.push([ x, y ]);
+ if (first) {
+ x__ = x, y__ = y, v__ = v;
+ first = false;
+ if (v) {
+ listener.lineStart();
+ listener.point(x, y);
+ }
+ } else {
+ if (v && v_) listener.point(x, y); else {
+ var l = {
+ a: {
+ x: x_,
+ y: y_
+ },
+ b: {
+ x: x,
+ y: y
+ }
+ };
+ if (clipLine(l)) {
+ if (!v_) {
+ listener.lineStart();
+ listener.point(l.a.x, l.a.y);
+ }
+ listener.point(l.b.x, l.b.y);
+ if (!v) listener.lineEnd();
+ clean = false;
+ } else if (v) {
+ listener.lineStart();
+ listener.point(x, y);
+ clean = false;
+ }
+ }
+ }
+ x_ = x, y_ = y, v_ = v;
+ }
+ return clip;
+ };
+ function corner(p, direction) {
+ return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;
+ }
+ function compare(a, b) {
+ return comparePoints(a.x, b.x);
+ }
+ function comparePoints(a, b) {
+ var ca = corner(a, 1), cb = corner(b, 1);
+ return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];
+ }
+ }
+ function d3_geo_compose(a, b) {
+ function compose(x, y) {
+ return x = a(x, y), b(x[0], x[1]);
+ }
+ if (a.invert && b.invert) compose.invert = function(x, y) {
+ return x = b.invert(x, y), x && a.invert(x[0], x[1]);
+ };
+ return compose;
+ }
+ function d3_geo_conic(projectAt) {
+ var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1);
+ p.parallels = function(_) {
+ if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ];
+ return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180);
+ };
+ return p;
+ }
+ function d3_geo_conicEqualArea(φ0, φ1) {
+ var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n;
+ function forward(λ, φ) {
+ var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;
+ return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ];
+ }
+ forward.invert = function(x, y) {
+ var ρ0_y = ρ0 - y;
+ return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ];
+ };
+ return forward;
+ }
+ (d3.geo.conicEqualArea = function() {
+ return d3_geo_conic(d3_geo_conicEqualArea);
+ }).raw = d3_geo_conicEqualArea;
+ d3.geo.albers = function() {
+ return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070);
+ };
+ d3.geo.albersUsa = function() {
+ var lower48 = d3.geo.albers();
+ var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]);
+ var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]);
+ var point, pointStream = {
+ point: function(x, y) {
+ point = [ x, y ];
+ }
+ }, lower48Point, alaskaPoint, hawaiiPoint;
+ function albersUsa(coordinates) {
+ var x = coordinates[0], y = coordinates[1];
+ point = null;
+ (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y);
+ return point;
+ }
+ albersUsa.invert = function(coordinates) {
+ var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;
+ return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates);
+ };
+ albersUsa.stream = function(stream) {
+ var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream);
+ return {
+ point: function(x, y) {
+ lower48Stream.point(x, y);
+ alaskaStream.point(x, y);
+ hawaiiStream.point(x, y);
+ },
+ sphere: function() {
+ lower48Stream.sphere();
+ alaskaStream.sphere();
+ hawaiiStream.sphere();
+ },
+ lineStart: function() {
+ lower48Stream.lineStart();
+ alaskaStream.lineStart();
+ hawaiiStream.lineStart();
+ },
+ lineEnd: function() {
+ lower48Stream.lineEnd();
+ alaskaStream.lineEnd();
+ hawaiiStream.lineEnd();
+ },
+ polygonStart: function() {
+ lower48Stream.polygonStart();
+ alaskaStream.polygonStart();
+ hawaiiStream.polygonStart();
+ },
+ polygonEnd: function() {
+ lower48Stream.polygonEnd();
+ alaskaStream.polygonEnd();
+ hawaiiStream.polygonEnd();
+ }
+ };
+ };
+ albersUsa.precision = function(_) {
+ if (!arguments.length) return lower48.precision();
+ lower48.precision(_);
+ alaska.precision(_);
+ hawaii.precision(_);
+ return albersUsa;
+ };
+ albersUsa.scale = function(_) {
+ if (!arguments.length) return lower48.scale();
+ lower48.scale(_);
+ alaska.scale(_ * .35);
+ hawaii.scale(_);
+ return albersUsa.translate(lower48.translate());
+ };
+ albersUsa.translate = function(_) {
+ if (!arguments.length) return lower48.translate();
+ var k = lower48.scale(), x = +_[0], y = +_[1];
+ lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point;
+ alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;
+ hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;
+ return albersUsa;
+ };
+ return albersUsa.scale(1070);
+ };
+ var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {
+ point: d3_noop,
+ lineStart: d3_noop,
+ lineEnd: d3_noop,
+ polygonStart: function() {
+ d3_geo_pathAreaPolygon = 0;
+ d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;
+ },
+ polygonEnd: function() {
+ d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;
+ d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);
+ }
+ };
+ function d3_geo_pathAreaRingStart() {
+ var x00, y00, x0, y0;
+ d3_geo_pathArea.point = function(x, y) {
+ d3_geo_pathArea.point = nextPoint;
+ x00 = x0 = x, y00 = y0 = y;
+ };
+ function nextPoint(x, y) {
+ d3_geo_pathAreaPolygon += y0 * x - x0 * y;
+ x0 = x, y0 = y;
+ }
+ d3_geo_pathArea.lineEnd = function() {
+ nextPoint(x00, y00);
+ };
+ }
+ var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1;
+ var d3_geo_pathBounds = {
+ point: d3_geo_pathBoundsPoint,
+ lineStart: d3_noop,
+ lineEnd: d3_noop,
+ polygonStart: d3_noop,
+ polygonEnd: d3_noop
+ };
+ function d3_geo_pathBoundsPoint(x, y) {
+ if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x;
+ if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x;
+ if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y;
+ if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y;
+ }
+ function d3_geo_pathBuffer() {
+ var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = [];
+ var stream = {
+ point: point,
+ lineStart: function() {
+ stream.point = pointLineStart;
+ },
+ lineEnd: lineEnd,
+ polygonStart: function() {
+ stream.lineEnd = lineEndPolygon;
+ },
+ polygonEnd: function() {
+ stream.lineEnd = lineEnd;
+ stream.point = point;
+ },
+ pointRadius: function(_) {
+ pointCircle = d3_geo_pathBufferCircle(_);
+ return stream;
+ },
+ result: function() {
+ if (buffer.length) {
+ var result = buffer.join("");
+ buffer = [];
+ return result;
+ }
+ }
+ };
+ function point(x, y) {
+ buffer.push("M", x, ",", y, pointCircle);
+ }
+ function pointLineStart(x, y) {
+ buffer.push("M", x, ",", y);
+ stream.point = pointLine;
+ }
+ function pointLine(x, y) {
+ buffer.push("L", x, ",", y);
+ }
+ function lineEnd() {
+ stream.point = point;
+ }
+ function lineEndPolygon() {
+ buffer.push("Z");
+ }
+ return stream;
+ }
+ function d3_geo_pathBufferCircle(radius) {
+ return "m0," + radius + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + "z";
+ }
+ var d3_geo_pathCentroid = {
+ point: d3_geo_pathCentroidPoint,
+ lineStart: d3_geo_pathCentroidLineStart,
+ lineEnd: d3_geo_pathCentroidLineEnd,
+ polygonStart: function() {
+ d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;
+ },
+ polygonEnd: function() {
+ d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;
+ d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;
+ d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;
+ }
+ };
+ function d3_geo_pathCentroidPoint(x, y) {
+ d3_geo_centroidX0 += x;
+ d3_geo_centroidY0 += y;
+ ++d3_geo_centroidZ0;
+ }
+ function d3_geo_pathCentroidLineStart() {
+ var x0, y0;
+ d3_geo_pathCentroid.point = function(x, y) {
+ d3_geo_pathCentroid.point = nextPoint;
+ d3_geo_pathCentroidPoint(x0 = x, y0 = y);
+ };
+ function nextPoint(x, y) {
+ var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);
+ d3_geo_centroidX1 += z * (x0 + x) / 2;
+ d3_geo_centroidY1 += z * (y0 + y) / 2;
+ d3_geo_centroidZ1 += z;
+ d3_geo_pathCentroidPoint(x0 = x, y0 = y);
+ }
+ }
+ function d3_geo_pathCentroidLineEnd() {
+ d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;
+ }
+ function d3_geo_pathCentroidRingStart() {
+ var x00, y00, x0, y0;
+ d3_geo_pathCentroid.point = function(x, y) {
+ d3_geo_pathCentroid.point = nextPoint;
+ d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y);
+ };
+ function nextPoint(x, y) {
+ var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);
+ d3_geo_centroidX1 += z * (x0 + x) / 2;
+ d3_geo_centroidY1 += z * (y0 + y) / 2;
+ d3_geo_centroidZ1 += z;
+ z = y0 * x - x0 * y;
+ d3_geo_centroidX2 += z * (x0 + x);
+ d3_geo_centroidY2 += z * (y0 + y);
+ d3_geo_centroidZ2 += z * 3;
+ d3_geo_pathCentroidPoint(x0 = x, y0 = y);
+ }
+ d3_geo_pathCentroid.lineEnd = function() {
+ nextPoint(x00, y00);
+ };
+ }
+ function d3_geo_pathContext(context) {
+ var pointRadius = 4.5;
+ var stream = {
+ point: point,
+ lineStart: function() {
+ stream.point = pointLineStart;
+ },
+ lineEnd: lineEnd,
+ polygonStart: function() {
+ stream.lineEnd = lineEndPolygon;
+ },
+ polygonEnd: function() {
+ stream.lineEnd = lineEnd;
+ stream.point = point;
+ },
+ pointRadius: function(_) {
+ pointRadius = _;
+ return stream;
+ },
+ result: d3_noop
+ };
+ function point(x, y) {
+ context.moveTo(x, y);
+ context.arc(x, y, pointRadius, 0, τ);
+ }
+ function pointLineStart(x, y) {
+ context.moveTo(x, y);
+ stream.point = pointLine;
+ }
+ function pointLine(x, y) {
+ context.lineTo(x, y);
+ }
+ function lineEnd() {
+ stream.point = point;
+ }
+ function lineEndPolygon() {
+ context.closePath();
+ }
+ return stream;
+ }
+ function d3_geo_resample(project) {
+ var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16;
+ function resample(stream) {
+ return (maxDepth ? resampleRecursive : resampleNone)(stream);
+ }
+ function resampleNone(stream) {
+ return d3_geo_transformPoint(stream, function(x, y) {
+ x = project(x, y);
+ stream.point(x[0], x[1]);
+ });
+ }
+ function resampleRecursive(stream) {
+ var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0;
+ var resample = {
+ point: point,
+ lineStart: lineStart,
+ lineEnd: lineEnd,
+ polygonStart: function() {
+ stream.polygonStart();
+ resample.lineStart = ringStart;
+ },
+ polygonEnd: function() {
+ stream.polygonEnd();
+ resample.lineStart = lineStart;
+ }
+ };
+ function point(x, y) {
+ x = project(x, y);
+ stream.point(x[0], x[1]);
+ }
+ function lineStart() {
+ x0 = NaN;
+ resample.point = linePoint;
+ stream.lineStart();
+ }
+ function linePoint(λ, φ) {
+ var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ);
+ resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);
+ stream.point(x0, y0);
+ }
+ function lineEnd() {
+ resample.point = point;
+ stream.lineEnd();
+ }
+ function ringStart() {
+ lineStart();
+ resample.point = ringPoint;
+ resample.lineEnd = ringEnd;
+ }
+ function ringPoint(λ, φ) {
+ linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
+ resample.point = linePoint;
+ }
+ function ringEnd() {
+ resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);
+ resample.lineEnd = lineEnd;
+ lineEnd();
+ }
+ return resample;
+ }
+ function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {
+ var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;
+ if (d2 > 4 * δ2 && depth--) {
+ var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;
+ if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {
+ resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);
+ stream.point(x2, y2);
+ resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);
+ }
+ }
+ }
+ resample.precision = function(_) {
+ if (!arguments.length) return Math.sqrt(δ2);
+ maxDepth = (δ2 = _ * _) > 0 && 16;
+ return resample;
+ };
+ return resample;
+ }
+ d3.geo.path = function() {
+ var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream;
+ function path(object) {
+ if (object) {
+ if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
+ if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream);
+ d3.geo.stream(object, cacheStream);
+ }
+ return contextStream.result();
+ }
+ path.area = function(object) {
+ d3_geo_pathAreaSum = 0;
+ d3.geo.stream(object, projectStream(d3_geo_pathArea));
+ return d3_geo_pathAreaSum;
+ };
+ path.centroid = function(object) {
+ d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;
+ d3.geo.stream(object, projectStream(d3_geo_pathCentroid));
+ return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ];
+ };
+ path.bounds = function(object) {
+ d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity);
+ d3.geo.stream(object, projectStream(d3_geo_pathBounds));
+ return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ];
+ };
+ path.projection = function(_) {
+ if (!arguments.length) return projection;
+ projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;
+ return reset();
+ };
+ path.context = function(_) {
+ if (!arguments.length) return context;
+ contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_);
+ if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
+ return reset();
+ };
+ path.pointRadius = function(_) {
+ if (!arguments.length) return pointRadius;
+ pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
+ return path;
+ };
+ function reset() {
+ cacheStream = null;
+ return path;
+ }
+ return path.projection(d3.geo.albersUsa()).context(null);
+ };
+ function d3_geo_pathProjectStream(project) {
+ var resample = d3_geo_resample(function(x, y) {
+ return project([ x * d3_degrees, y * d3_degrees ]);
+ });
+ return function(stream) {
+ return d3_geo_projectionRadians(resample(stream));
+ };
+ }
+ d3.geo.transform = function(methods) {
+ return {
+ stream: function(stream) {
+ var transform = new d3_geo_transform(stream);
+ for (var k in methods) transform[k] = methods[k];
+ return transform;
+ }
+ };
+ };
+ function d3_geo_transform(stream) {
+ this.stream = stream;
+ }
+ d3_geo_transform.prototype = {
+ point: function(x, y) {
+ this.stream.point(x, y);
+ },
+ sphere: function() {
+ this.stream.sphere();
+ },
+ lineStart: function() {
+ this.stream.lineStart();
+ },
+ lineEnd: function() {
+ this.stream.lineEnd();
+ },
+ polygonStart: function() {
+ this.stream.polygonStart();
+ },
+ polygonEnd: function() {
+ this.stream.polygonEnd();
+ }
+ };
+ function d3_geo_transformPoint(stream, point) {
+ return {
+ point: point,
+ sphere: function() {
+ stream.sphere();
+ },
+ lineStart: function() {
+ stream.lineStart();
+ },
+ lineEnd: function() {
+ stream.lineEnd();
+ },
+ polygonStart: function() {
+ stream.polygonStart();
+ },
+ polygonEnd: function() {
+ stream.polygonEnd();
+ }
+ };
+ }
+ d3.geo.projection = d3_geo_projection;
+ d3.geo.projectionMutator = d3_geo_projectionMutator;
+ function d3_geo_projection(project) {
+ return d3_geo_projectionMutator(function() {
+ return project;
+ })();
+ }
+ function d3_geo_projectionMutator(projectAt) {
+ var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) {
+ x = project(x, y);
+ return [ x[0] * k + δx, δy - x[1] * k ];
+ }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream;
+ function projection(point) {
+ point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);
+ return [ point[0] * k + δx, δy - point[1] * k ];
+ }
+ function invert(point) {
+ point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);
+ return point && [ point[0] * d3_degrees, point[1] * d3_degrees ];
+ }
+ projection.stream = function(output) {
+ if (stream) stream.valid = false;
+ stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output))));
+ stream.valid = true;
+ return stream;
+ };
+ projection.clipAngle = function(_) {
+ if (!arguments.length) return clipAngle;
+ preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians);
+ return invalidate();
+ };
+ projection.clipExtent = function(_) {
+ if (!arguments.length) return clipExtent;
+ clipExtent = _;
+ postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity;
+ return invalidate();
+ };
+ projection.scale = function(_) {
+ if (!arguments.length) return k;
+ k = +_;
+ return reset();
+ };
+ projection.translate = function(_) {
+ if (!arguments.length) return [ x, y ];
+ x = +_[0];
+ y = +_[1];
+ return reset();
+ };
+ projection.center = function(_) {
+ if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ];
+ λ = _[0] % 360 * d3_radians;
+ φ = _[1] % 360 * d3_radians;
+ return reset();
+ };
+ projection.rotate = function(_) {
+ if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ];
+ δλ = _[0] % 360 * d3_radians;
+ δφ = _[1] % 360 * d3_radians;
+ δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;
+ return reset();
+ };
+ d3.rebind(projection, projectResample, "precision");
+ function reset() {
+ projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);
+ var center = project(λ, φ);
+ δx = x - center[0] * k;
+ δy = y + center[1] * k;
+ return invalidate();
+ }
+ function invalidate() {
+ if (stream) stream.valid = false, stream = null;
+ return projection;
+ }
+ return function() {
+ project = projectAt.apply(this, arguments);
+ projection.invert = project.invert && invert;
+ return reset();
+ };
+ }
+ function d3_geo_projectionRadians(stream) {
+ return d3_geo_transformPoint(stream, function(x, y) {
+ stream.point(x * d3_radians, y * d3_radians);
+ });
+ }
+ function d3_geo_equirectangular(λ, φ) {
+ return [ λ, φ ];
+ }
+ (d3.geo.equirectangular = function() {
+ return d3_geo_projection(d3_geo_equirectangular);
+ }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;
+ d3.geo.rotation = function(rotate) {
+ rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0);
+ function forward(coordinates) {
+ coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians);
+ return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;
+ }
+ forward.invert = function(coordinates) {
+ coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians);
+ return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;
+ };
+ return forward;
+ };
+ function d3_geo_identityRotation(λ, φ) {
+ return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];
+ }
+ d3_geo_identityRotation.invert = d3_geo_equirectangular;
+ function d3_geo_rotation(δλ, δφ, δγ) {
+ return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation;
+ }
+ function d3_geo_forwardRotationλ(δλ) {
+ return function(λ, φ) {
+ return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];
+ };
+ }
+ function d3_geo_rotationλ(δλ) {
+ var rotation = d3_geo_forwardRotationλ(δλ);
+ rotation.invert = d3_geo_forwardRotationλ(-δλ);
+ return rotation;
+ }
+ function d3_geo_rotationφγ(δφ, δγ) {
+ var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ);
+ function rotation(λ, φ) {
+ var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ;
+ return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ];
+ }
+ rotation.invert = function(λ, φ) {
+ var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ;
+ return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ];
+ };
+ return rotation;
+ }
+ d3.geo.circle = function() {
+ var origin = [ 0, 0 ], angle, precision = 6, interpolate;
+ function circle() {
+ var center = typeof origin === "function" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = [];
+ interpolate(null, null, 1, {
+ point: function(x, y) {
+ ring.push(x = rotate(x, y));
+ x[0] *= d3_degrees, x[1] *= d3_degrees;
+ }
+ });
+ return {
+ type: "Polygon",
+ coordinates: [ ring ]
+ };
+ }
+ circle.origin = function(x) {
+ if (!arguments.length) return origin;
+ origin = x;
+ return circle;
+ };
+ circle.angle = function(x) {
+ if (!arguments.length) return angle;
+ interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);
+ return circle;
+ };
+ circle.precision = function(_) {
+ if (!arguments.length) return precision;
+ interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);
+ return circle;
+ };
+ return circle.angle(90);
+ };
+ function d3_geo_circleInterpolate(radius, precision) {
+ var cr = Math.cos(radius), sr = Math.sin(radius);
+ return function(from, to, direction, listener) {
+ var step = direction * precision;
+ if (from != null) {
+ from = d3_geo_circleAngle(cr, from);
+ to = d3_geo_circleAngle(cr, to);
+ if (direction > 0 ? from < to : from > to) from += direction * τ;
+ } else {
+ from = radius + direction * τ;
+ to = radius - .5 * step;
+ }
+ for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) {
+ listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]);
+ }
+ };
+ }
+ function d3_geo_circleAngle(cr, point) {
+ var a = d3_geo_cartesian(point);
+ a[0] -= cr;
+ d3_geo_cartesianNormalize(a);
+ var angle = d3_acos(-a[1]);
+ return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);
+ }
+ d3.geo.distance = function(a, b) {
+ var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t;
+ return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ);
+ };
+ d3.geo.graticule = function() {
+ var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5;
+ function graticule() {
+ return {
+ type: "MultiLineString",
+ coordinates: lines()
+ };
+ }
+ function lines() {
+ return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {
+ return abs(x % DX) > ε;
+ }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {
+ return abs(y % DY) > ε;
+ }).map(y));
+ }
+ graticule.lines = function() {
+ return lines().map(function(coordinates) {
+ return {
+ type: "LineString",
+ coordinates: coordinates
+ };
+ });
+ };
+ graticule.outline = function() {
+ return {
+ type: "Polygon",
+ coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ]
+ };
+ };
+ graticule.extent = function(_) {
+ if (!arguments.length) return graticule.minorExtent();
+ return graticule.majorExtent(_).minorExtent(_);
+ };
+ graticule.majorExtent = function(_) {
+ if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ];
+ X0 = +_[0][0], X1 = +_[1][0];
+ Y0 = +_[0][1], Y1 = +_[1][1];
+ if (X0 > X1) _ = X0, X0 = X1, X1 = _;
+ if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;
+ return graticule.precision(precision);
+ };
+ graticule.minorExtent = function(_) {
+ if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];
+ x0 = +_[0][0], x1 = +_[1][0];
+ y0 = +_[0][1], y1 = +_[1][1];
+ if (x0 > x1) _ = x0, x0 = x1, x1 = _;
+ if (y0 > y1) _ = y0, y0 = y1, y1 = _;
+ return graticule.precision(precision);
+ };
+ graticule.step = function(_) {
+ if (!arguments.length) return graticule.minorStep();
+ return graticule.majorStep(_).minorStep(_);
+ };
+ graticule.majorStep = function(_) {
+ if (!arguments.length) return [ DX, DY ];
+ DX = +_[0], DY = +_[1];
+ return graticule;
+ };
+ graticule.minorStep = function(_) {
+ if (!arguments.length) return [ dx, dy ];
+ dx = +_[0], dy = +_[1];
+ return graticule;
+ };
+ graticule.precision = function(_) {
+ if (!arguments.length) return precision;
+ precision = +_;
+ x = d3_geo_graticuleX(y0, y1, 90);
+ y = d3_geo_graticuleY(x0, x1, precision);
+ X = d3_geo_graticuleX(Y0, Y1, 90);
+ Y = d3_geo_graticuleY(X0, X1, precision);
+ return graticule;
+ };
+ return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]);
+ };
+ function d3_geo_graticuleX(y0, y1, dy) {
+ var y = d3.range(y0, y1 - ε, dy).concat(y1);
+ return function(x) {
+ return y.map(function(y) {
+ return [ x, y ];
+ });
+ };
+ }
+ function d3_geo_graticuleY(x0, x1, dx) {
+ var x = d3.range(x0, x1 - ε, dx).concat(x1);
+ return function(y) {
+ return x.map(function(x) {
+ return [ x, y ];
+ });
+ };
+ }
+ function d3_source(d) {
+ return d.source;
+ }
+ function d3_target(d) {
+ return d.target;
+ }
+ d3.geo.greatArc = function() {
+ var source = d3_source, source_, target = d3_target, target_;
+ function greatArc() {
+ return {
+ type: "LineString",
+ coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ]
+ };
+ }
+ greatArc.distance = function() {
+ return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments));
+ };
+ greatArc.source = function(_) {
+ if (!arguments.length) return source;
+ source = _, source_ = typeof _ === "function" ? null : _;
+ return greatArc;
+ };
+ greatArc.target = function(_) {
+ if (!arguments.length) return target;
+ target = _, target_ = typeof _ === "function" ? null : _;
+ return greatArc;
+ };
+ greatArc.precision = function() {
+ return arguments.length ? greatArc : 0;
+ };
+ return greatArc;
+ };
+ d3.geo.interpolate = function(source, target) {
+ return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians);
+ };
+ function d3_geo_interpolate(x0, y0, x1, y1) {
+ var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d);
+ var interpolate = d ? function(t) {
+ var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1;
+ return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ];
+ } : function() {
+ return [ x0 * d3_degrees, y0 * d3_degrees ];
+ };
+ interpolate.distance = d;
+ return interpolate;
+ }
+ d3.geo.length = function(object) {
+ d3_geo_lengthSum = 0;
+ d3.geo.stream(object, d3_geo_length);
+ return d3_geo_lengthSum;
+ };
+ var d3_geo_lengthSum;
+ var d3_geo_length = {
+ sphere: d3_noop,
+ point: d3_noop,
+ lineStart: d3_geo_lengthLineStart,
+ lineEnd: d3_noop,
+ polygonStart: d3_noop,
+ polygonEnd: d3_noop
+ };
+ function d3_geo_lengthLineStart() {
+ var λ0, sinφ0, cosφ0;
+ d3_geo_length.point = function(λ, φ) {
+ λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ);
+ d3_geo_length.point = nextPoint;
+ };
+ d3_geo_length.lineEnd = function() {
+ d3_geo_length.point = d3_geo_length.lineEnd = d3_noop;
+ };
+ function nextPoint(λ, φ) {
+ var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t);
+ d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ);
+ λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ;
+ }
+ }
+ function d3_geo_azimuthal(scale, angle) {
+ function azimuthal(λ, φ) {
+ var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ);
+ return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ];
+ }
+ azimuthal.invert = function(x, y) {
+ var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c);
+ return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ];
+ };
+ return azimuthal;
+ }
+ var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {
+ return Math.sqrt(2 / (1 + cosλcosφ));
+ }, function(ρ) {
+ return 2 * Math.asin(ρ / 2);
+ });
+ (d3.geo.azimuthalEqualArea = function() {
+ return d3_geo_projection(d3_geo_azimuthalEqualArea);
+ }).raw = d3_geo_azimuthalEqualArea;
+ var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) {
+ var c = Math.acos(cosλcosφ);
+ return c && c / Math.sin(c);
+ }, d3_identity);
+ (d3.geo.azimuthalEquidistant = function() {
+ return d3_geo_projection(d3_geo_azimuthalEquidistant);
+ }).raw = d3_geo_azimuthalEquidistant;
+ function d3_geo_conicConformal(φ0, φ1) {
+ var cosφ0 = Math.cos(φ0), t = function(φ) {
+ return Math.tan(π / 4 + φ / 2);
+ }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n;
+ if (!n) return d3_geo_mercator;
+ function forward(λ, φ) {
+ if (F > 0) {
+ if (φ < -halfπ + ε) φ = -halfπ + ε;
+ } else {
+ if (φ > halfπ - ε) φ = halfπ - ε;
+ }
+ var ρ = F / Math.pow(t(φ), n);
+ return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ];
+ }
+ forward.invert = function(x, y) {
+ var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y);
+ return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ];
+ };
+ return forward;
+ }
+ (d3.geo.conicConformal = function() {
+ return d3_geo_conic(d3_geo_conicConformal);
+ }).raw = d3_geo_conicConformal;
+ function d3_geo_conicEquidistant(φ0, φ1) {
+ var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0;
+ if (abs(n) < ε) return d3_geo_equirectangular;
+ function forward(λ, φ) {
+ var ρ = G - φ;
+ return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ];
+ }
+ forward.invert = function(x, y) {
+ var ρ0_y = G - y;
+ return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ];
+ };
+ return forward;
+ }
+ (d3.geo.conicEquidistant = function() {
+ return d3_geo_conic(d3_geo_conicEquidistant);
+ }).raw = d3_geo_conicEquidistant;
+ var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) {
+ return 1 / cosλcosφ;
+ }, Math.atan);
+ (d3.geo.gnomonic = function() {
+ return d3_geo_projection(d3_geo_gnomonic);
+ }).raw = d3_geo_gnomonic;
+ function d3_geo_mercator(λ, φ) {
+ return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ];
+ }
+ d3_geo_mercator.invert = function(x, y) {
+ return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ];
+ };
+ function d3_geo_mercatorProjection(project) {
+ var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto;
+ m.scale = function() {
+ var v = scale.apply(m, arguments);
+ return v === m ? clipAuto ? m.clipExtent(null) : m : v;
+ };
+ m.translate = function() {
+ var v = translate.apply(m, arguments);
+ return v === m ? clipAuto ? m.clipExtent(null) : m : v;
+ };
+ m.clipExtent = function(_) {
+ var v = clipExtent.apply(m, arguments);
+ if (v === m) {
+ if (clipAuto = _ == null) {
+ var k = π * scale(), t = translate();
+ clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]);
+ }
+ } else if (clipAuto) {
+ v = null;
+ }
+ return v;
+ };
+ return m.clipExtent(null);
+ }
+ (d3.geo.mercator = function() {
+ return d3_geo_mercatorProjection(d3_geo_mercator);
+ }).raw = d3_geo_mercator;
+ var d3_geo_orthographic = d3_geo_azimuthal(function() {
+ return 1;
+ }, Math.asin);
+ (d3.geo.orthographic = function() {
+ return d3_geo_projection(d3_geo_orthographic);
+ }).raw = d3_geo_orthographic;
+ var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) {
+ return 1 / (1 + cosλcosφ);
+ }, function(ρ) {
+ return 2 * Math.atan(ρ);
+ });
+ (d3.geo.stereographic = function() {
+ return d3_geo_projection(d3_geo_stereographic);
+ }).raw = d3_geo_stereographic;
+ function d3_geo_transverseMercator(λ, φ) {
+ return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ];
+ }
+ d3_geo_transverseMercator.invert = function(x, y) {
+ return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ];
+ };
+ (d3.geo.transverseMercator = function() {
+ var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate;
+ projection.center = function(_) {
+ return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]);
+ };
+ projection.rotate = function(_) {
+ return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(),
+ [ _[0], _[1], _[2] - 90 ]);
+ };
+ return rotate([ 0, 0, 90 ]);
+ }).raw = d3_geo_transverseMercator;
+ d3.geom = {};
+ function d3_geom_pointX(d) {
+ return d[0];
+ }
+ function d3_geom_pointY(d) {
+ return d[1];
+ }
+ d3.geom.hull = function(vertices) {
+ var x = d3_geom_pointX, y = d3_geom_pointY;
+ if (arguments.length) return hull(vertices);
+ function hull(data) {
+ if (data.length < 3) return [];
+ var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = [];
+ for (i = 0; i < n; i++) {
+ points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]);
+ }
+ points.sort(d3_geom_hullOrder);
+ for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]);
+ var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints);
+ var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = [];
+ for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]);
+ for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]);
+ return polygon;
+ }
+ hull.x = function(_) {
+ return arguments.length ? (x = _, hull) : x;
+ };
+ hull.y = function(_) {
+ return arguments.length ? (y = _, hull) : y;
+ };
+ return hull;
+ };
+ function d3_geom_hullUpper(points) {
+ var n = points.length, hull = [ 0, 1 ], hs = 2;
+ for (var i = 2; i < n; i++) {
+ while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs;
+ hull[hs++] = i;
+ }
+ return hull.slice(0, hs);
+ }
+ function d3_geom_hullOrder(a, b) {
+ return a[0] - b[0] || a[1] - b[1];
+ }
+ d3.geom.polygon = function(coordinates) {
+ d3_subclass(coordinates, d3_geom_polygonPrototype);
+ return coordinates;
+ };
+ var d3_geom_polygonPrototype = d3.geom.polygon.prototype = [];
+ d3_geom_polygonPrototype.area = function() {
+ var i = -1, n = this.length, a, b = this[n - 1], area = 0;
+ while (++i < n) {
+ a = b;
+ b = this[i];
+ area += a[1] * b[0] - a[0] * b[1];
+ }
+ return area * .5;
+ };
+ d3_geom_polygonPrototype.centroid = function(k) {
+ var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c;
+ if (!arguments.length) k = -1 / (6 * this.area());
+ while (++i < n) {
+ a = b;
+ b = this[i];
+ c = a[0] * b[1] - b[0] * a[1];
+ x += (a[0] + b[0]) * c;
+ y += (a[1] + b[1]) * c;
+ }
+ return [ x * k, y * k ];
+ };
+ d3_geom_polygonPrototype.clip = function(subject) {
+ var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d;
+ while (++i < n) {
+ input = subject.slice();
+ subject.length = 0;
+ b = this[i];
+ c = input[(m = input.length - closed) - 1];
+ j = -1;
+ while (++j < m) {
+ d = input[j];
+ if (d3_geom_polygonInside(d, a, b)) {
+ if (!d3_geom_polygonInside(c, a, b)) {
+ subject.push(d3_geom_polygonIntersect(c, d, a, b));
+ }
+ subject.push(d);
+ } else if (d3_geom_polygonInside(c, a, b)) {
+ subject.push(d3_geom_polygonIntersect(c, d, a, b));
+ }
+ c = d;
+ }
+ if (closed) subject.push(subject[0]);
+ a = b;
+ }
+ return subject;
+ };
+ function d3_geom_polygonInside(p, a, b) {
+ return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);
+ }
+ function d3_geom_polygonIntersect(c, d, a, b) {
+ var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);
+ return [ x1 + ua * x21, y1 + ua * y21 ];
+ }
+ function d3_geom_polygonClosed(coordinates) {
+ var a = coordinates[0], b = coordinates[coordinates.length - 1];
+ return !(a[0] - b[0] || a[1] - b[1]);
+ }
+ var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = [];
+ function d3_geom_voronoiBeach() {
+ d3_geom_voronoiRedBlackNode(this);
+ this.edge = this.site = this.circle = null;
+ }
+ function d3_geom_voronoiCreateBeach(site) {
+ var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach();
+ beach.site = site;
+ return beach;
+ }
+ function d3_geom_voronoiDetachBeach(beach) {
+ d3_geom_voronoiDetachCircle(beach);
+ d3_geom_voronoiBeaches.remove(beach);
+ d3_geom_voronoiBeachPool.push(beach);
+ d3_geom_voronoiRedBlackNode(beach);
+ }
+ function d3_geom_voronoiRemoveBeach(beach) {
+ var circle = beach.circle, x = circle.x, y = circle.cy, vertex = {
+ x: x,
+ y: y
+ }, previous = beach.P, next = beach.N, disappearing = [ beach ];
+ d3_geom_voronoiDetachBeach(beach);
+ var lArc = previous;
+ while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) {
+ previous = lArc.P;
+ disappearing.unshift(lArc);
+ d3_geom_voronoiDetachBeach(lArc);
+ lArc = previous;
+ }
+ disappearing.unshift(lArc);
+ d3_geom_voronoiDetachCircle(lArc);
+ var rArc = next;
+ while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) {
+ next = rArc.N;
+ disappearing.push(rArc);
+ d3_geom_voronoiDetachBeach(rArc);
+ rArc = next;
+ }
+ disappearing.push(rArc);
+ d3_geom_voronoiDetachCircle(rArc);
+ var nArcs = disappearing.length, iArc;
+ for (iArc = 1; iArc < nArcs; ++iArc) {
+ rArc = disappearing[iArc];
+ lArc = disappearing[iArc - 1];
+ d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
+ }
+ lArc = disappearing[0];
+ rArc = disappearing[nArcs - 1];
+ rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex);
+ d3_geom_voronoiAttachCircle(lArc);
+ d3_geom_voronoiAttachCircle(rArc);
+ }
+ function d3_geom_voronoiAddBeach(site) {
+ var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._;
+ while (node) {
+ dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x;
+ if (dxl > ε) node = node.L; else {
+ dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix);
+ if (dxr > ε) {
+ if (!node.R) {
+ lArc = node;
+ break;
+ }
+ node = node.R;
+ } else {
+ if (dxl > -ε) {
+ lArc = node.P;
+ rArc = node;
+ } else if (dxr > -ε) {
+ lArc = node;
+ rArc = node.N;
+ } else {
+ lArc = rArc = node;
+ }
+ break;
+ }
+ }
+ }
+ var newArc = d3_geom_voronoiCreateBeach(site);
+ d3_geom_voronoiBeaches.insert(lArc, newArc);
+ if (!lArc && !rArc) return;
+ if (lArc === rArc) {
+ d3_geom_voronoiDetachCircle(lArc);
+ rArc = d3_geom_voronoiCreateBeach(lArc.site);
+ d3_geom_voronoiBeaches.insert(newArc, rArc);
+ newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);
+ d3_geom_voronoiAttachCircle(lArc);
+ d3_geom_voronoiAttachCircle(rArc);
+ return;
+ }
+ if (!rArc) {
+ newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);
+ return;
+ }
+ d3_geom_voronoiDetachCircle(lArc);
+ d3_geom_voronoiDetachCircle(rArc);
+ var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = {
+ x: (cy * hb - by * hc) / d + ax,
+ y: (bx * hc - cx * hb) / d + ay
+ };
+ d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex);
+ newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex);
+ rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex);
+ d3_geom_voronoiAttachCircle(lArc);
+ d3_geom_voronoiAttachCircle(rArc);
+ }
+ function d3_geom_voronoiLeftBreakPoint(arc, directrix) {
+ var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix;
+ if (!pby2) return rfocx;
+ var lArc = arc.P;
+ if (!lArc) return -Infinity;
+ site = lArc.site;
+ var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix;
+ if (!plby2) return lfocx;
+ var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2;
+ if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
+ return (rfocx + lfocx) / 2;
+ }
+ function d3_geom_voronoiRightBreakPoint(arc, directrix) {
+ var rArc = arc.N;
+ if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix);
+ var site = arc.site;
+ return site.y === directrix ? site.x : Infinity;
+ }
+ function d3_geom_voronoiCell(site) {
+ this.site = site;
+ this.edges = [];
+ }
+ d3_geom_voronoiCell.prototype.prepare = function() {
+ var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge;
+ while (iHalfEdge--) {
+ edge = halfEdges[iHalfEdge].edge;
+ if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1);
+ }
+ halfEdges.sort(d3_geom_voronoiHalfEdgeOrder);
+ return halfEdges.length;
+ };
+ function d3_geom_voronoiCloseCells(extent) {
+ var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end;
+ while (iCell--) {
+ cell = cells[iCell];
+ if (!cell || !cell.prepare()) continue;
+ halfEdges = cell.edges;
+ nHalfEdges = halfEdges.length;
+ iHalfEdge = 0;
+ while (iHalfEdge < nHalfEdges) {
+ end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y;
+ start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y;
+ if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) {
+ halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? {
+ x: x0,
+ y: abs(x2 - x0) < ε ? y2 : y1
+ } : abs(y3 - y1) < ε && x1 - x3 > ε ? {
+ x: abs(y2 - y1) < ε ? x2 : x1,
+ y: y1
+ } : abs(x3 - x1) < ε && y3 - y0 > ε ? {
+ x: x1,
+ y: abs(x2 - x1) < ε ? y2 : y0
+ } : abs(y3 - y0) < ε && x3 - x0 > ε ? {
+ x: abs(y2 - y0) < ε ? x2 : x0,
+ y: y0
+ } : null), cell.site, null));
+ ++nHalfEdges;
+ }
+ }
+ }
+ }
+ function d3_geom_voronoiHalfEdgeOrder(a, b) {
+ return b.angle - a.angle;
+ }
+ function d3_geom_voronoiCircle() {
+ d3_geom_voronoiRedBlackNode(this);
+ this.x = this.y = this.arc = this.site = this.cy = null;
+ }
+ function d3_geom_voronoiAttachCircle(arc) {
+ var lArc = arc.P, rArc = arc.N;
+ if (!lArc || !rArc) return;
+ var lSite = lArc.site, cSite = arc.site, rSite = rArc.site;
+ if (lSite === rSite) return;
+ var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by;
+ var d = 2 * (ax * cy - ay * cx);
+ if (d >= -ε2) return;
+ var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by;
+ var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle();
+ circle.arc = arc;
+ circle.site = cSite;
+ circle.x = x + bx;
+ circle.y = cy + Math.sqrt(x * x + y * y);
+ circle.cy = cy;
+ arc.circle = circle;
+ var before = null, node = d3_geom_voronoiCircles._;
+ while (node) {
+ if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) {
+ if (node.L) node = node.L; else {
+ before = node.P;
+ break;
+ }
+ } else {
+ if (node.R) node = node.R; else {
+ before = node;
+ break;
+ }
+ }
+ }
+ d3_geom_voronoiCircles.insert(before, circle);
+ if (!before) d3_geom_voronoiFirstCircle = circle;
+ }
+ function d3_geom_voronoiDetachCircle(arc) {
+ var circle = arc.circle;
+ if (circle) {
+ if (!circle.P) d3_geom_voronoiFirstCircle = circle.N;
+ d3_geom_voronoiCircles.remove(circle);
+ d3_geom_voronoiCirclePool.push(circle);
+ d3_geom_voronoiRedBlackNode(circle);
+ arc.circle = null;
+ }
+ }
+ function d3_geom_voronoiClipEdges(extent) {
+ var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e;
+ while (i--) {
+ e = edges[i];
+ if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) {
+ e.a = e.b = null;
+ edges.splice(i, 1);
+ }
+ }
+ }
+ function d3_geom_voronoiConnectEdge(edge, extent) {
+ var vb = edge.b;
+ if (vb) return true;
+ var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb;
+ if (ry === ly) {
+ if (fx < x0 || fx >= x1) return;
+ if (lx > rx) {
+ if (!va) va = {
+ x: fx,
+ y: y0
+ }; else if (va.y >= y1) return;
+ vb = {
+ x: fx,
+ y: y1
+ };
+ } else {
+ if (!va) va = {
+ x: fx,
+ y: y1
+ }; else if (va.y < y0) return;
+ vb = {
+ x: fx,
+ y: y0
+ };
+ }
+ } else {
+ fm = (lx - rx) / (ry - ly);
+ fb = fy - fm * fx;
+ if (fm < -1 || fm > 1) {
+ if (lx > rx) {
+ if (!va) va = {
+ x: (y0 - fb) / fm,
+ y: y0
+ }; else if (va.y >= y1) return;
+ vb = {
+ x: (y1 - fb) / fm,
+ y: y1
+ };
+ } else {
+ if (!va) va = {
+ x: (y1 - fb) / fm,
+ y: y1
+ }; else if (va.y < y0) return;
+ vb = {
+ x: (y0 - fb) / fm,
+ y: y0
+ };
+ }
+ } else {
+ if (ly < ry) {
+ if (!va) va = {
+ x: x0,
+ y: fm * x0 + fb
+ }; else if (va.x >= x1) return;
+ vb = {
+ x: x1,
+ y: fm * x1 + fb
+ };
+ } else {
+ if (!va) va = {
+ x: x1,
+ y: fm * x1 + fb
+ }; else if (va.x < x0) return;
+ vb = {
+ x: x0,
+ y: fm * x0 + fb
+ };
+ }
+ }
+ }
+ edge.a = va;
+ edge.b = vb;
+ return true;
+ }
+ function d3_geom_voronoiEdge(lSite, rSite) {
+ this.l = lSite;
+ this.r = rSite;
+ this.a = this.b = null;
+ }
+ function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) {
+ var edge = new d3_geom_voronoiEdge(lSite, rSite);
+ d3_geom_voronoiEdges.push(edge);
+ if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va);
+ if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb);
+ d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite));
+ d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite));
+ return edge;
+ }
+ function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) {
+ var edge = new d3_geom_voronoiEdge(lSite, null);
+ edge.a = va;
+ edge.b = vb;
+ d3_geom_voronoiEdges.push(edge);
+ return edge;
+ }
+ function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) {
+ if (!edge.a && !edge.b) {
+ edge.a = vertex;
+ edge.l = lSite;
+ edge.r = rSite;
+ } else if (edge.l === rSite) {
+ edge.b = vertex;
+ } else {
+ edge.a = vertex;
+ }
+ }
+ function d3_geom_voronoiHalfEdge(edge, lSite, rSite) {
+ var va = edge.a, vb = edge.b;
+ this.edge = edge;
+ this.site = lSite;
+ this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y);
+ }
+ d3_geom_voronoiHalfEdge.prototype = {
+ start: function() {
+ return this.edge.l === this.site ? this.edge.a : this.edge.b;
+ },
+ end: function() {
+ return this.edge.l === this.site ? this.edge.b : this.edge.a;
+ }
+ };
+ function d3_geom_voronoiRedBlackTree() {
+ this._ = null;
+ }
+ function d3_geom_voronoiRedBlackNode(node) {
+ node.U = node.C = node.L = node.R = node.P = node.N = null;
+ }
+ d3_geom_voronoiRedBlackTree.prototype = {
+ insert: function(after, node) {
+ var parent, grandpa, uncle;
+ if (after) {
+ node.P = after;
+ node.N = after.N;
+ if (after.N) after.N.P = node;
+ after.N = node;
+ if (after.R) {
+ after = after.R;
+ while (after.L) after = after.L;
+ after.L = node;
+ } else {
+ after.R = node;
+ }
+ parent = after;
+ } else if (this._) {
+ after = d3_geom_voronoiRedBlackFirst(this._);
+ node.P = null;
+ node.N = after;
+ after.P = after.L = node;
+ parent = after;
+ } else {
+ node.P = node.N = null;
+ this._ = node;
+ parent = null;
+ }
+ node.L = node.R = null;
+ node.U = parent;
+ node.C = true;
+ after = node;
+ while (parent && parent.C) {
+ grandpa = parent.U;
+ if (parent === grandpa.L) {
+ uncle = grandpa.R;
+ if (uncle && uncle.C) {
+ parent.C = uncle.C = false;
+ grandpa.C = true;
+ after = grandpa;
+ } else {
+ if (after === parent.R) {
+ d3_geom_voronoiRedBlackRotateLeft(this, parent);
+ after = parent;
+ parent = after.U;
+ }
+ parent.C = false;
+ grandpa.C = true;
+ d3_geom_voronoiRedBlackRotateRight(this, grandpa);
+ }
+ } else {
+ uncle = grandpa.L;
+ if (uncle && uncle.C) {
+ parent.C = uncle.C = false;
+ grandpa.C = true;
+ after = grandpa;
+ } else {
+ if (after === parent.L) {
+ d3_geom_voronoiRedBlackRotateRight(this, parent);
+ after = parent;
+ parent = after.U;
+ }
+ parent.C = false;
+ grandpa.C = true;
+ d3_geom_voronoiRedBlackRotateLeft(this, grandpa);
+ }
+ }
+ parent = after.U;
+ }
+ this._.C = false;
+ },
+ remove: function(node) {
+ if (node.N) node.N.P = node.P;
+ if (node.P) node.P.N = node.N;
+ node.N = node.P = null;
+ var parent = node.U, sibling, left = node.L, right = node.R, next, red;
+ if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right);
+ if (parent) {
+ if (parent.L === node) parent.L = next; else parent.R = next;
+ } else {
+ this._ = next;
+ }
+ if (left && right) {
+ red = next.C;
+ next.C = node.C;
+ next.L = left;
+ left.U = next;
+ if (next !== right) {
+ parent = next.U;
+ next.U = node.U;
+ node = next.R;
+ parent.L = node;
+ next.R = right;
+ right.U = next;
+ } else {
+ next.U = parent;
+ parent = next;
+ node = next.R;
+ }
+ } else {
+ red = node.C;
+ node = next;
+ }
+ if (node) node.U = parent;
+ if (red) return;
+ if (node && node.C) {
+ node.C = false;
+ return;
+ }
+ do {
+ if (node === this._) break;
+ if (node === parent.L) {
+ sibling = parent.R;
+ if (sibling.C) {
+ sibling.C = false;
+ parent.C = true;
+ d3_geom_voronoiRedBlackRotateLeft(this, parent);
+ sibling = parent.R;
+ }
+ if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {
+ if (!sibling.R || !sibling.R.C) {
+ sibling.L.C = false;
+ sibling.C = true;
+ d3_geom_voronoiRedBlackRotateRight(this, sibling);
+ sibling = parent.R;
+ }
+ sibling.C = parent.C;
+ parent.C = sibling.R.C = false;
+ d3_geom_voronoiRedBlackRotateLeft(this, parent);
+ node = this._;
+ break;
+ }
+ } else {
+ sibling = parent.L;
+ if (sibling.C) {
+ sibling.C = false;
+ parent.C = true;
+ d3_geom_voronoiRedBlackRotateRight(this, parent);
+ sibling = parent.L;
+ }
+ if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {
+ if (!sibling.L || !sibling.L.C) {
+ sibling.R.C = false;
+ sibling.C = true;
+ d3_geom_voronoiRedBlackRotateLeft(this, sibling);
+ sibling = parent.L;
+ }
+ sibling.C = parent.C;
+ parent.C = sibling.L.C = false;
+ d3_geom_voronoiRedBlackRotateRight(this, parent);
+ node = this._;
+ break;
+ }
+ }
+ sibling.C = true;
+ node = parent;
+ parent = parent.U;
+ } while (!node.C);
+ if (node) node.C = false;
+ }
+ };
+ function d3_geom_voronoiRedBlackRotateLeft(tree, node) {
+ var p = node, q = node.R, parent = p.U;
+ if (parent) {
+ if (parent.L === p) parent.L = q; else parent.R = q;
+ } else {
+ tree._ = q;
+ }
+ q.U = parent;
+ p.U = q;
+ p.R = q.L;
+ if (p.R) p.R.U = p;
+ q.L = p;
+ }
+ function d3_geom_voronoiRedBlackRotateRight(tree, node) {
+ var p = node, q = node.L, parent = p.U;
+ if (parent) {
+ if (parent.L === p) parent.L = q; else parent.R = q;
+ } else {
+ tree._ = q;
+ }
+ q.U = parent;
+ p.U = q;
+ p.L = q.R;
+ if (p.L) p.L.U = p;
+ q.R = p;
+ }
+ function d3_geom_voronoiRedBlackFirst(node) {
+ while (node.L) node = node.L;
+ return node;
+ }
+ function d3_geom_voronoi(sites, bbox) {
+ var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle;
+ d3_geom_voronoiEdges = [];
+ d3_geom_voronoiCells = new Array(sites.length);
+ d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree();
+ d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree();
+ while (true) {
+ circle = d3_geom_voronoiFirstCircle;
+ if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) {
+ if (site.x !== x0 || site.y !== y0) {
+ d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site);
+ d3_geom_voronoiAddBeach(site);
+ x0 = site.x, y0 = site.y;
+ }
+ site = sites.pop();
+ } else if (circle) {
+ d3_geom_voronoiRemoveBeach(circle.arc);
+ } else {
+ break;
+ }
+ }
+ if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox);
+ var diagram = {
+ cells: d3_geom_voronoiCells,
+ edges: d3_geom_voronoiEdges
+ };
+ d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null;
+ return diagram;
+ }
+ function d3_geom_voronoiVertexOrder(a, b) {
+ return b.y - a.y || b.x - a.x;
+ }
+ d3.geom.voronoi = function(points) {
+ var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent;
+ if (points) return voronoi(points);
+ function voronoi(data) {
+ var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1];
+ d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) {
+ var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) {
+ var s = e.start();
+ return [ s.x, s.y ];
+ }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : [];
+ polygon.point = data[i];
+ });
+ return polygons;
+ }
+ function sites(data) {
+ return data.map(function(d, i) {
+ return {
+ x: Math.round(fx(d, i) / ε) * ε,
+ y: Math.round(fy(d, i) / ε) * ε,
+ i: i
+ };
+ });
+ }
+ voronoi.links = function(data) {
+ return d3_geom_voronoi(sites(data)).edges.filter(function(edge) {
+ return edge.l && edge.r;
+ }).map(function(edge) {
+ return {
+ source: data[edge.l.i],
+ target: data[edge.r.i]
+ };
+ });
+ };
+ voronoi.triangles = function(data) {
+ var triangles = [];
+ d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {
+ var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l;
+ while (++j < m) {
+ e0 = e1;
+ s0 = s1;
+ e1 = edges[j].edge;
+ s1 = e1.l === site ? e1.r : e1.l;
+ if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {
+ triangles.push([ data[i], data[s0.i], data[s1.i] ]);
+ }
+ }
+ });
+ return triangles;
+ };
+ voronoi.x = function(_) {
+ return arguments.length ? (fx = d3_functor(x = _), voronoi) : x;
+ };
+ voronoi.y = function(_) {
+ return arguments.length ? (fy = d3_functor(y = _), voronoi) : y;
+ };
+ voronoi.clipExtent = function(_) {
+ if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent;
+ clipExtent = _ == null ? d3_geom_voronoiClipExtent : _;
+ return voronoi;
+ };
+ voronoi.size = function(_) {
+ if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1];
+ return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]);
+ };
+ return voronoi;
+ };
+ var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ];
+ function d3_geom_voronoiTriangleArea(a, b, c) {
+ return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y);
+ }
+ d3.geom.delaunay = function(vertices) {
+ return d3.geom.voronoi().triangles(vertices);
+ };
+ d3.geom.quadtree = function(points, x1, y1, x2, y2) {
+ var x = d3_geom_pointX, y = d3_geom_pointY, compat;
+ if (compat = arguments.length) {
+ x = d3_geom_quadtreeCompatX;
+ y = d3_geom_quadtreeCompatY;
+ if (compat === 3) {
+ y2 = y1;
+ x2 = x1;
+ y1 = x1 = 0;
+ }
+ return quadtree(points);
+ }
+ function quadtree(data) {
+ var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_;
+ if (x1 != null) {
+ x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2;
+ } else {
+ x2_ = y2_ = -(x1_ = y1_ = Infinity);
+ xs = [], ys = [];
+ n = data.length;
+ if (compat) for (i = 0; i < n; ++i) {
+ d = data[i];
+ if (d.x < x1_) x1_ = d.x;
+ if (d.y < y1_) y1_ = d.y;
+ if (d.x > x2_) x2_ = d.x;
+ if (d.y > y2_) y2_ = d.y;
+ xs.push(d.x);
+ ys.push(d.y);
+ } else for (i = 0; i < n; ++i) {
+ var x_ = +fx(d = data[i], i), y_ = +fy(d, i);
+ if (x_ < x1_) x1_ = x_;
+ if (y_ < y1_) y1_ = y_;
+ if (x_ > x2_) x2_ = x_;
+ if (y_ > y2_) y2_ = y_;
+ xs.push(x_);
+ ys.push(y_);
+ }
+ }
+ var dx = x2_ - x1_, dy = y2_ - y1_;
+ if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy;
+ function insert(n, d, x, y, x1, y1, x2, y2) {
+ if (isNaN(x) || isNaN(y)) return;
+ if (n.leaf) {
+ var nx = n.x, ny = n.y;
+ if (nx != null) {
+ if (abs(nx - x) + abs(ny - y) < .01) {
+ insertChild(n, d, x, y, x1, y1, x2, y2);
+ } else {
+ var nPoint = n.point;
+ n.x = n.y = n.point = null;
+ insertChild(n, nPoint, nx, ny, x1, y1, x2, y2);
+ insertChild(n, d, x, y, x1, y1, x2, y2);
+ }
+ } else {
+ n.x = x, n.y = y, n.point = d;
+ }
+ } else {
+ insertChild(n, d, x, y, x1, y1, x2, y2);
+ }
+ }
+ function insertChild(n, d, x, y, x1, y1, x2, y2) {
+ var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, right = x >= sx, bottom = y >= sy, i = (bottom << 1) + right;
+ n.leaf = false;
+ n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());
+ if (right) x1 = sx; else x2 = sx;
+ if (bottom) y1 = sy; else y2 = sy;
+ insert(n, d, x, y, x1, y1, x2, y2);
+ }
+ var root = d3_geom_quadtreeNode();
+ root.add = function(d) {
+ insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_);
+ };
+ root.visit = function(f) {
+ d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_);
+ };
+ i = -1;
+ if (x1 == null) {
+ while (++i < n) {
+ insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_);
+ }
+ --i;
+ } else data.forEach(root.add);
+ xs = ys = data = d = null;
+ return root;
+ }
+ quadtree.x = function(_) {
+ return arguments.length ? (x = _, quadtree) : x;
+ };
+ quadtree.y = function(_) {
+ return arguments.length ? (y = _, quadtree) : y;
+ };
+ quadtree.extent = function(_) {
+ if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ];
+ if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0],
+ y2 = +_[1][1];
+ return quadtree;
+ };
+ quadtree.size = function(_) {
+ if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ];
+ if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1];
+ return quadtree;
+ };
+ return quadtree;
+ };
+ function d3_geom_quadtreeCompatX(d) {
+ return d.x;
+ }
+ function d3_geom_quadtreeCompatY(d) {
+ return d.y;
+ }
+ function d3_geom_quadtreeNode() {
+ return {
+ leaf: true,
+ nodes: [],
+ point: null,
+ x: null,
+ y: null
+ };
+ }
+ function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {
+ if (!f(node, x1, y1, x2, y2)) {
+ var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes;
+ if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);
+ if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);
+ if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);
+ if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);
+ }
+ }
+ d3.interpolateRgb = d3_interpolateRgb;
+ function d3_interpolateRgb(a, b) {
+ a = d3.rgb(a);
+ b = d3.rgb(b);
+ var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;
+ return function(t) {
+ return "#" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));
+ };
+ }
+ d3.interpolateObject = d3_interpolateObject;
+ function d3_interpolateObject(a, b) {
+ var i = {}, c = {}, k;
+ for (k in a) {
+ if (k in b) {
+ i[k] = d3_interpolate(a[k], b[k]);
+ } else {
+ c[k] = a[k];
+ }
+ }
+ for (k in b) {
+ if (!(k in a)) {
+ c[k] = b[k];
+ }
+ }
+ return function(t) {
+ for (k in i) c[k] = i[k](t);
+ return c;
+ };
+ }
+ d3.interpolateNumber = d3_interpolateNumber;
+ function d3_interpolateNumber(a, b) {
+ b -= a = +a;
+ return function(t) {
+ return a + b * t;
+ };
+ }
+ d3.interpolateString = d3_interpolateString;
+ function d3_interpolateString(a, b) {
+ var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];
+ a = a + "", b = b + "";
+ while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) {
+ if ((bs = bm.index) > bi) {
+ bs = b.slice(bi, bs);
+ if (s[i]) s[i] += bs; else s[++i] = bs;
+ }
+ if ((am = am[0]) === (bm = bm[0])) {
+ if (s[i]) s[i] += bm; else s[++i] = bm;
+ } else {
+ s[++i] = null;
+ q.push({
+ i: i,
+ x: d3_interpolateNumber(am, bm)
+ });
+ }
+ bi = d3_interpolate_numberB.lastIndex;
+ }
+ if (bi < b.length) {
+ bs = b.slice(bi);
+ if (s[i]) s[i] += bs; else s[++i] = bs;
+ }
+ return s.length < 2 ? q[0] ? (b = q[0].x, function(t) {
+ return b(t) + "";
+ }) : function() {
+ return b;
+ } : (b = q.length, function(t) {
+ for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
+ return s.join("");
+ });
+ }
+ var d3_interpolate_numberA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, "g");
+ d3.interpolate = d3_interpolate;
+ function d3_interpolate(a, b) {
+ var i = d3.interpolators.length, f;
+ while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;
+ return f;
+ }
+ d3.interpolators = [ function(a, b) {
+ var t = typeof b;
+ return (t === "string" ? d3_rgb_names.has(b) || /^(#|rgb\(|hsl\()/.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === "object" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b);
+ } ];
+ d3.interpolateArray = d3_interpolateArray;
+ function d3_interpolateArray(a, b) {
+ var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;
+ for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));
+ for (;i < na; ++i) c[i] = a[i];
+ for (;i < nb; ++i) c[i] = b[i];
+ return function(t) {
+ for (i = 0; i < n0; ++i) c[i] = x[i](t);
+ return c;
+ };
+ }
+ var d3_ease_default = function() {
+ return d3_identity;
+ };
+ var d3_ease = d3.map({
+ linear: d3_ease_default,
+ poly: d3_ease_poly,
+ quad: function() {
+ return d3_ease_quad;
+ },
+ cubic: function() {
+ return d3_ease_cubic;
+ },
+ sin: function() {
+ return d3_ease_sin;
+ },
+ exp: function() {
+ return d3_ease_exp;
+ },
+ circle: function() {
+ return d3_ease_circle;
+ },
+ elastic: d3_ease_elastic,
+ back: d3_ease_back,
+ bounce: function() {
+ return d3_ease_bounce;
+ }
+ });
+ var d3_ease_mode = d3.map({
+ "in": d3_identity,
+ out: d3_ease_reverse,
+ "in-out": d3_ease_reflect,
+ "out-in": function(f) {
+ return d3_ease_reflect(d3_ease_reverse(f));
+ }
+ });
+ d3.ease = function(name) {
+ var i = name.indexOf("-"), t = i >= 0 ? name.slice(0, i) : name, m = i >= 0 ? name.slice(i + 1) : "in";
+ t = d3_ease.get(t) || d3_ease_default;
+ m = d3_ease_mode.get(m) || d3_identity;
+ return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1))));
+ };
+ function d3_ease_clamp(f) {
+ return function(t) {
+ return t <= 0 ? 0 : t >= 1 ? 1 : f(t);
+ };
+ }
+ function d3_ease_reverse(f) {
+ return function(t) {
+ return 1 - f(1 - t);
+ };
+ }
+ function d3_ease_reflect(f) {
+ return function(t) {
+ return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t));
+ };
+ }
+ function d3_ease_quad(t) {
+ return t * t;
+ }
+ function d3_ease_cubic(t) {
+ return t * t * t;
+ }
+ function d3_ease_cubicInOut(t) {
+ if (t <= 0) return 0;
+ if (t >= 1) return 1;
+ var t2 = t * t, t3 = t2 * t;
+ return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);
+ }
+ function d3_ease_poly(e) {
+ return function(t) {
+ return Math.pow(t, e);
+ };
+ }
+ function d3_ease_sin(t) {
+ return 1 - Math.cos(t * halfπ);
+ }
+ function d3_ease_exp(t) {
+ return Math.pow(2, 10 * (t - 1));
+ }
+ function d3_ease_circle(t) {
+ return 1 - Math.sqrt(1 - t * t);
+ }
+ function d3_ease_elastic(a, p) {
+ var s;
+ if (arguments.length < 2) p = .45;
+ if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4;
+ return function(t) {
+ return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p);
+ };
+ }
+ function d3_ease_back(s) {
+ if (!s) s = 1.70158;
+ return function(t) {
+ return t * t * ((s + 1) * t - s);
+ };
+ }
+ function d3_ease_bounce(t) {
+ return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;
+ }
+ d3.interpolateHcl = d3_interpolateHcl;
+ function d3_interpolateHcl(a, b) {
+ a = d3.hcl(a);
+ b = d3.hcl(b);
+ var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al;
+ if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac;
+ if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;
+ return function(t) {
+ return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + "";
+ };
+ }
+ d3.interpolateHsl = d3_interpolateHsl;
+ function d3_interpolateHsl(a, b) {
+ a = d3.hsl(a);
+ b = d3.hsl(b);
+ var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al;
+ if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as;
+ if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;
+ return function(t) {
+ return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + "";
+ };
+ }
+ d3.interpolateLab = d3_interpolateLab;
+ function d3_interpolateLab(a, b) {
+ a = d3.lab(a);
+ b = d3.lab(b);
+ var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab;
+ return function(t) {
+ return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + "";
+ };
+ }
+ d3.interpolateRound = d3_interpolateRound;
+ function d3_interpolateRound(a, b) {
+ b -= a;
+ return function(t) {
+ return Math.round(a + b * t);
+ };
+ }
+ d3.transform = function(string) {
+ var g = d3_document.createElementNS(d3.ns.prefix.svg, "g");
+ return (d3.transform = function(string) {
+ if (string != null) {
+ g.setAttribute("transform", string);
+ var t = g.transform.baseVal.consolidate();
+ }
+ return new d3_transform(t ? t.matrix : d3_transformIdentity);
+ })(string);
+ };
+ function d3_transform(m) {
+ var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;
+ if (r0[0] * r1[1] < r1[0] * r0[1]) {
+ r0[0] *= -1;
+ r0[1] *= -1;
+ kx *= -1;
+ kz *= -1;
+ }
+ this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;
+ this.translate = [ m.e, m.f ];
+ this.scale = [ kx, ky ];
+ this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;
+ }
+ d3_transform.prototype.toString = function() {
+ return "translate(" + this.translate + ")rotate(" + this.rotate + ")skewX(" + this.skew + ")scale(" + this.scale + ")";
+ };
+ function d3_transformDot(a, b) {
+ return a[0] * b[0] + a[1] * b[1];
+ }
+ function d3_transformNormalize(a) {
+ var k = Math.sqrt(d3_transformDot(a, a));
+ if (k) {
+ a[0] /= k;
+ a[1] /= k;
+ }
+ return k;
+ }
+ function d3_transformCombine(a, b, k) {
+ a[0] += k * b[0];
+ a[1] += k * b[1];
+ return a;
+ }
+ var d3_transformIdentity = {
+ a: 1,
+ b: 0,
+ c: 0,
+ d: 1,
+ e: 0,
+ f: 0
+ };
+ d3.interpolateTransform = d3_interpolateTransform;
+ function d3_interpolateTransform(a, b) {
+ var s = [], q = [], n, A = d3.transform(a), B = d3.transform(b), ta = A.translate, tb = B.translate, ra = A.rotate, rb = B.rotate, wa = A.skew, wb = B.skew, ka = A.scale, kb = B.scale;
+ if (ta[0] != tb[0] || ta[1] != tb[1]) {
+ s.push("translate(", null, ",", null, ")");
+ q.push({
+ i: 1,
+ x: d3_interpolateNumber(ta[0], tb[0])
+ }, {
+ i: 3,
+ x: d3_interpolateNumber(ta[1], tb[1])
+ });
+ } else if (tb[0] || tb[1]) {
+ s.push("translate(" + tb + ")");
+ } else {
+ s.push("");
+ }
+ if (ra != rb) {
+ if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360;
+ q.push({
+ i: s.push(s.pop() + "rotate(", null, ")") - 2,
+ x: d3_interpolateNumber(ra, rb)
+ });
+ } else if (rb) {
+ s.push(s.pop() + "rotate(" + rb + ")");
+ }
+ if (wa != wb) {
+ q.push({
+ i: s.push(s.pop() + "skewX(", null, ")") - 2,
+ x: d3_interpolateNumber(wa, wb)
+ });
+ } else if (wb) {
+ s.push(s.pop() + "skewX(" + wb + ")");
+ }
+ if (ka[0] != kb[0] || ka[1] != kb[1]) {
+ n = s.push(s.pop() + "scale(", null, ",", null, ")");
+ q.push({
+ i: n - 4,
+ x: d3_interpolateNumber(ka[0], kb[0])
+ }, {
+ i: n - 2,
+ x: d3_interpolateNumber(ka[1], kb[1])
+ });
+ } else if (kb[0] != 1 || kb[1] != 1) {
+ s.push(s.pop() + "scale(" + kb + ")");
+ }
+ n = q.length;
+ return function(t) {
+ var i = -1, o;
+ while (++i < n) s[(o = q[i]).i] = o.x(t);
+ return s.join("");
+ };
+ }
+ function d3_uninterpolateNumber(a, b) {
+ b = b - (a = +a) ? 1 / (b - a) : 0;
+ return function(x) {
+ return (x - a) * b;
+ };
+ }
+ function d3_uninterpolateClamp(a, b) {
+ b = b - (a = +a) ? 1 / (b - a) : 0;
+ return function(x) {
+ return Math.max(0, Math.min(1, (x - a) * b));
+ };
+ }
+ d3.layout = {};
+ d3.layout.bundle = function() {
+ return function(links) {
+ var paths = [], i = -1, n = links.length;
+ while (++i < n) paths.push(d3_layout_bundlePath(links[i]));
+ return paths;
+ };
+ };
+ function d3_layout_bundlePath(link) {
+ var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ];
+ while (start !== lca) {
+ start = start.parent;
+ points.push(start);
+ }
+ var k = points.length;
+ while (end !== lca) {
+ points.splice(k, 0, end);
+ end = end.parent;
+ }
+ return points;
+ }
+ function d3_layout_bundleAncestors(node) {
+ var ancestors = [], parent = node.parent;
+ while (parent != null) {
+ ancestors.push(node);
+ node = parent;
+ parent = parent.parent;
+ }
+ ancestors.push(node);
+ return ancestors;
+ }
+ function d3_layout_bundleLeastCommonAncestor(a, b) {
+ if (a === b) return a;
+ var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null;
+ while (aNode === bNode) {
+ sharedNode = aNode;
+ aNode = aNodes.pop();
+ bNode = bNodes.pop();
+ }
+ return sharedNode;
+ }
+ d3.layout.chord = function() {
+ var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords;
+ function relayout() {
+ var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j;
+ chords = [];
+ groups = [];
+ k = 0, i = -1;
+ while (++i < n) {
+ x = 0, j = -1;
+ while (++j < n) {
+ x += matrix[i][j];
+ }
+ groupSums.push(x);
+ subgroupIndex.push(d3.range(n));
+ k += x;
+ }
+ if (sortGroups) {
+ groupIndex.sort(function(a, b) {
+ return sortGroups(groupSums[a], groupSums[b]);
+ });
+ }
+ if (sortSubgroups) {
+ subgroupIndex.forEach(function(d, i) {
+ d.sort(function(a, b) {
+ return sortSubgroups(matrix[i][a], matrix[i][b]);
+ });
+ });
+ }
+ k = (τ - padding * n) / k;
+ x = 0, i = -1;
+ while (++i < n) {
+ x0 = x, j = -1;
+ while (++j < n) {
+ var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k;
+ subgroups[di + "-" + dj] = {
+ index: di,
+ subindex: dj,
+ startAngle: a0,
+ endAngle: a1,
+ value: v
+ };
+ }
+ groups[di] = {
+ index: di,
+ startAngle: x0,
+ endAngle: x,
+ value: (x - x0) / k
+ };
+ x += padding;
+ }
+ i = -1;
+ while (++i < n) {
+ j = i - 1;
+ while (++j < n) {
+ var source = subgroups[i + "-" + j], target = subgroups[j + "-" + i];
+ if (source.value || target.value) {
+ chords.push(source.value < target.value ? {
+ source: target,
+ target: source
+ } : {
+ source: source,
+ target: target
+ });
+ }
+ }
+ }
+ if (sortChords) resort();
+ }
+ function resort() {
+ chords.sort(function(a, b) {
+ return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2);
+ });
+ }
+ chord.matrix = function(x) {
+ if (!arguments.length) return matrix;
+ n = (matrix = x) && matrix.length;
+ chords = groups = null;
+ return chord;
+ };
+ chord.padding = function(x) {
+ if (!arguments.length) return padding;
+ padding = x;
+ chords = groups = null;
+ return chord;
+ };
+ chord.sortGroups = function(x) {
+ if (!arguments.length) return sortGroups;
+ sortGroups = x;
+ chords = groups = null;
+ return chord;
+ };
+ chord.sortSubgroups = function(x) {
+ if (!arguments.length) return sortSubgroups;
+ sortSubgroups = x;
+ chords = null;
+ return chord;
+ };
+ chord.sortChords = function(x) {
+ if (!arguments.length) return sortChords;
+ sortChords = x;
+ if (chords) resort();
+ return chord;
+ };
+ chord.chords = function() {
+ if (!chords) relayout();
+ return chords;
+ };
+ chord.groups = function() {
+ if (!groups) relayout();
+ return groups;
+ };
+ return chord;
+ };
+ d3.layout.force = function() {
+ var force = {}, event = d3.dispatch("start", "tick", "end"), size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges;
+ function repulse(node) {
+ return function(quad, x1, _, x2) {
+ if (quad.point !== node) {
+ var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy;
+ if (dw * dw / theta2 < dn) {
+ if (dn < chargeDistance2) {
+ var k = quad.charge / dn;
+ node.px -= dx * k;
+ node.py -= dy * k;
+ }
+ return true;
+ }
+ if (quad.point && dn && dn < chargeDistance2) {
+ var k = quad.pointCharge / dn;
+ node.px -= dx * k;
+ node.py -= dy * k;
+ }
+ }
+ return !quad.charge;
+ };
+ }
+ force.tick = function() {
+ if ((alpha *= .99) < .005) {
+ event.end({
+ type: "end",
+ alpha: alpha = 0
+ });
+ return true;
+ }
+ var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y;
+ for (i = 0; i < m; ++i) {
+ o = links[i];
+ s = o.source;
+ t = o.target;
+ x = t.x - s.x;
+ y = t.y - s.y;
+ if (l = x * x + y * y) {
+ l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;
+ x *= l;
+ y *= l;
+ t.x -= x * (k = s.weight / (t.weight + s.weight));
+ t.y -= y * k;
+ s.x += x * (k = 1 - k);
+ s.y += y * k;
+ }
+ }
+ if (k = alpha * gravity) {
+ x = size[0] / 2;
+ y = size[1] / 2;
+ i = -1;
+ if (k) while (++i < n) {
+ o = nodes[i];
+ o.x += (x - o.x) * k;
+ o.y += (y - o.y) * k;
+ }
+ }
+ if (charge) {
+ d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);
+ i = -1;
+ while (++i < n) {
+ if (!(o = nodes[i]).fixed) {
+ q.visit(repulse(o));
+ }
+ }
+ }
+ i = -1;
+ while (++i < n) {
+ o = nodes[i];
+ if (o.fixed) {
+ o.x = o.px;
+ o.y = o.py;
+ } else {
+ o.x -= (o.px - (o.px = o.x)) * friction;
+ o.y -= (o.py - (o.py = o.y)) * friction;
+ }
+ }
+ event.tick({
+ type: "tick",
+ alpha: alpha
+ });
+ };
+ force.nodes = function(x) {
+ if (!arguments.length) return nodes;
+ nodes = x;
+ return force;
+ };
+ force.links = function(x) {
+ if (!arguments.length) return links;
+ links = x;
+ return force;
+ };
+ force.size = function(x) {
+ if (!arguments.length) return size;
+ size = x;
+ return force;
+ };
+ force.linkDistance = function(x) {
+ if (!arguments.length) return linkDistance;
+ linkDistance = typeof x === "function" ? x : +x;
+ return force;
+ };
+ force.distance = force.linkDistance;
+ force.linkStrength = function(x) {
+ if (!arguments.length) return linkStrength;
+ linkStrength = typeof x === "function" ? x : +x;
+ return force;
+ };
+ force.friction = function(x) {
+ if (!arguments.length) return friction;
+ friction = +x;
+ return force;
+ };
+ force.charge = function(x) {
+ if (!arguments.length) return charge;
+ charge = typeof x === "function" ? x : +x;
+ return force;
+ };
+ force.chargeDistance = function(x) {
+ if (!arguments.length) return Math.sqrt(chargeDistance2);
+ chargeDistance2 = x * x;
+ return force;
+ };
+ force.gravity = function(x) {
+ if (!arguments.length) return gravity;
+ gravity = +x;
+ return force;
+ };
+ force.theta = function(x) {
+ if (!arguments.length) return Math.sqrt(theta2);
+ theta2 = x * x;
+ return force;
+ };
+ force.alpha = function(x) {
+ if (!arguments.length) return alpha;
+ x = +x;
+ if (alpha) {
+ if (x > 0) alpha = x; else alpha = 0;
+ } else if (x > 0) {
+ event.start({
+ type: "start",
+ alpha: alpha = x
+ });
+ //d3.timer(force.tick);
+ setTimeout(function tick(){
+ force.tick();
+ if(alpha >= .005);
+ setTimeout(tick, 0);
+ }, 0);
+ }
+ return force;
+ };
+ force.start = function() {
+ var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;
+ for (i = 0; i < n; ++i) {
+ (o = nodes[i]).index = i;
+ o.weight = 0;
+ }
+ for (i = 0; i < m; ++i) {
+ o = links[i];
+ if (typeof o.source == "number") o.source = nodes[o.source];
+ if (typeof o.target == "number") o.target = nodes[o.target];
+ ++o.source.weight;
+ ++o.target.weight;
+ }
+ for (i = 0; i < n; ++i) {
+ o = nodes[i];
+ if (isNaN(o.x)) o.x = position("x", w);
+ if (isNaN(o.y)) o.y = position("y", h);
+ if (isNaN(o.px)) o.px = o.x;
+ if (isNaN(o.py)) o.py = o.y;
+ }
+ distances = [];
+ if (typeof linkDistance === "function") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance;
+ strengths = [];
+ if (typeof linkStrength === "function") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength;
+ charges = [];
+ if (typeof charge === "function") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;
+ function position(dimension, size) {
+ if (!neighbors) {
+ neighbors = new Array(n);
+ for (j = 0; j < n; ++j) {
+ neighbors[j] = [];
+ }
+ for (j = 0; j < m; ++j) {
+ var o = links[j];
+ neighbors[o.source.index].push(o.target);
+ neighbors[o.target.index].push(o.source);
+ }
+ }
+ var candidates = neighbors[i], j = -1, m = candidates.length, x;
+ while (++j < m) if (!isNaN(x = candidates[j][dimension])) return x;
+ return Math.random() * size;
+ }
+ return force.resume();
+ };
+ force.resume = function() {
+ return force.alpha(.1);
+ };
+ force.stop = function() {
+ return force.alpha(0);
+ };
+ force.drag = function() {
+ if (!drag) drag = d3.behavior.drag().origin(d3_identity).on("dragstart.force", d3_layout_forceDragstart).on("drag.force", dragmove).on("dragend.force", d3_layout_forceDragend);
+ if (!arguments.length) return drag;
+ this.on("mouseover.force", d3_layout_forceMouseover).on("mouseout.force", d3_layout_forceMouseout).call(drag);
+ };
+ function dragmove(d) {
+ d.px = d3.event.x, d.py = d3.event.y;
+ force.resume();
+ }
+ return d3.rebind(force, event, "on");
+ };
+ function d3_layout_forceDragstart(d) {
+ d.fixed |= 2;
+ }
+ function d3_layout_forceDragend(d) {
+ d.fixed &= ~6;
+ }
+ function d3_layout_forceMouseover(d) {
+ d.fixed |= 4;
+ d.px = d.x, d.py = d.y;
+ }
+ function d3_layout_forceMouseout(d) {
+ d.fixed &= ~4;
+ }
+ function d3_layout_forceAccumulate(quad, alpha, charges) {
+ var cx = 0, cy = 0;
+ quad.charge = 0;
+ if (!quad.leaf) {
+ var nodes = quad.nodes, n = nodes.length, i = -1, c;
+ while (++i < n) {
+ c = nodes[i];
+ if (c == null) continue;
+ d3_layout_forceAccumulate(c, alpha, charges);
+ quad.charge += c.charge;
+ cx += c.charge * c.cx;
+ cy += c.charge * c.cy;
+ }
+ }
+ if (quad.point) {
+ if (!quad.leaf) {
+ quad.point.x += Math.random() - .5;
+ quad.point.y += Math.random() - .5;
+ }
+ var k = alpha * charges[quad.point.index];
+ quad.charge += quad.pointCharge = k;
+ cx += k * quad.point.x;
+ cy += k * quad.point.y;
+ }
+ quad.cx = cx / quad.charge;
+ quad.cy = cy / quad.charge;
+ }
+ var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity;
+ d3.layout.hierarchy = function() {
+ var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;
+ function hierarchy(root) {
+ var stack = [ root ], nodes = [], node;
+ root.depth = 0;
+ while ((node = stack.pop()) != null) {
+ nodes.push(node);
+ if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) {
+ var n, childs, child;
+ while (--n >= 0) {
+ stack.push(child = childs[n]);
+ child.parent = node;
+ child.depth = node.depth + 1;
+ }
+ if (value) node.value = 0;
+ node.children = childs;
+ } else {
+ if (value) node.value = +value.call(hierarchy, node, node.depth) || 0;
+ delete node.children;
+ }
+ }
+ d3_layout_hierarchyVisitAfter(root, function(node) {
+ var childs, parent;
+ if (sort && (childs = node.children)) childs.sort(sort);
+ if (value && (parent = node.parent)) parent.value += node.value;
+ });
+ return nodes;
+ }
+ hierarchy.sort = function(x) {
+ if (!arguments.length) return sort;
+ sort = x;
+ return hierarchy;
+ };
+ hierarchy.children = function(x) {
+ if (!arguments.length) return children;
+ children = x;
+ return hierarchy;
+ };
+ hierarchy.value = function(x) {
+ if (!arguments.length) return value;
+ value = x;
+ return hierarchy;
+ };
+ hierarchy.revalue = function(root) {
+ if (value) {
+ d3_layout_hierarchyVisitBefore(root, function(node) {
+ if (node.children) node.value = 0;
+ });
+ d3_layout_hierarchyVisitAfter(root, function(node) {
+ var parent;
+ if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0;
+ if (parent = node.parent) parent.value += node.value;
+ });
+ }
+ return root;
+ };
+ return hierarchy;
+ };
+ function d3_layout_hierarchyRebind(object, hierarchy) {
+ d3.rebind(object, hierarchy, "sort", "children", "value");
+ object.nodes = object;
+ object.links = d3_layout_hierarchyLinks;
+ return object;
+ }
+ function d3_layout_hierarchyVisitBefore(node, callback) {
+ var nodes = [ node ];
+ while ((node = nodes.pop()) != null) {
+ callback(node);
+ if ((children = node.children) && (n = children.length)) {
+ var n, children;
+ while (--n >= 0) nodes.push(children[n]);
+ }
+ }
+ }
+ function d3_layout_hierarchyVisitAfter(node, callback) {
+ var nodes = [ node ], nodes2 = [];
+ while ((node = nodes.pop()) != null) {
+ nodes2.push(node);
+ if ((children = node.children) && (n = children.length)) {
+ var i = -1, n, children;
+ while (++i < n) nodes.push(children[i]);
+ }
+ }
+ while ((node = nodes2.pop()) != null) {
+ callback(node);
+ }
+ }
+ function d3_layout_hierarchyChildren(d) {
+ return d.children;
+ }
+ function d3_layout_hierarchyValue(d) {
+ return d.value;
+ }
+ function d3_layout_hierarchySort(a, b) {
+ return b.value - a.value;
+ }
+ function d3_layout_hierarchyLinks(nodes) {
+ return d3.merge(nodes.map(function(parent) {
+ return (parent.children || []).map(function(child) {
+ return {
+ source: parent,
+ target: child
+ };
+ });
+ }));
+ }
+ d3.layout.partition = function() {
+ var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ];
+ function position(node, x, dx, dy) {
+ var children = node.children;
+ node.x = x;
+ node.y = node.depth * dy;
+ node.dx = dx;
+ node.dy = dy;
+ if (children && (n = children.length)) {
+ var i = -1, n, c, d;
+ dx = node.value ? dx / node.value : 0;
+ while (++i < n) {
+ position(c = children[i], x, d = c.value * dx, dy);
+ x += d;
+ }
+ }
+ }
+ function depth(node) {
+ var children = node.children, d = 0;
+ if (children && (n = children.length)) {
+ var i = -1, n;
+ while (++i < n) d = Math.max(d, depth(children[i]));
+ }
+ return 1 + d;
+ }
+ function partition(d, i) {
+ var nodes = hierarchy.call(this, d, i);
+ position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));
+ return nodes;
+ }
+ partition.size = function(x) {
+ if (!arguments.length) return size;
+ size = x;
+ return partition;
+ };
+ return d3_layout_hierarchyRebind(partition, hierarchy);
+ };
+ d3.layout.pie = function() {
+ var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ;
+ function pie(data) {
+ var values = data.map(function(d, i) {
+ return +value.call(pie, d, i);
+ });
+ var a = +(typeof startAngle === "function" ? startAngle.apply(this, arguments) : startAngle);
+ var k = ((typeof endAngle === "function" ? endAngle.apply(this, arguments) : endAngle) - a) / d3.sum(values);
+ var index = d3.range(data.length);
+ if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) {
+ return values[j] - values[i];
+ } : function(i, j) {
+ return sort(data[i], data[j]);
+ });
+ var arcs = [];
+ index.forEach(function(i) {
+ var d;
+ arcs[i] = {
+ data: data[i],
+ value: d = values[i],
+ startAngle: a,
+ endAngle: a += d * k
+ };
+ });
+ return arcs;
+ }
+ pie.value = function(x) {
+ if (!arguments.length) return value;
+ value = x;
+ return pie;
+ };
+ pie.sort = function(x) {
+ if (!arguments.length) return sort;
+ sort = x;
+ return pie;
+ };
+ pie.startAngle = function(x) {
+ if (!arguments.length) return startAngle;
+ startAngle = x;
+ return pie;
+ };
+ pie.endAngle = function(x) {
+ if (!arguments.length) return endAngle;
+ endAngle = x;
+ return pie;
+ };
+ return pie;
+ };
+ var d3_layout_pieSortByValue = {};
+ d3.layout.stack = function() {
+ var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY;
+ function stack(data, index) {
+ var series = data.map(function(d, i) {
+ return values.call(stack, d, i);
+ });
+ var points = series.map(function(d) {
+ return d.map(function(v, i) {
+ return [ x.call(stack, v, i), y.call(stack, v, i) ];
+ });
+ });
+ var orders = order.call(stack, points, index);
+ series = d3.permute(series, orders);
+ points = d3.permute(points, orders);
+ var offsets = offset.call(stack, points, index);
+ var n = series.length, m = series[0].length, i, j, o;
+ for (j = 0; j < m; ++j) {
+ out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);
+ for (i = 1; i < n; ++i) {
+ out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);
+ }
+ }
+ return data;
+ }
+ stack.values = function(x) {
+ if (!arguments.length) return values;
+ values = x;
+ return stack;
+ };
+ stack.order = function(x) {
+ if (!arguments.length) return order;
+ order = typeof x === "function" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;
+ return stack;
+ };
+ stack.offset = function(x) {
+ if (!arguments.length) return offset;
+ offset = typeof x === "function" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;
+ return stack;
+ };
+ stack.x = function(z) {
+ if (!arguments.length) return x;
+ x = z;
+ return stack;
+ };
+ stack.y = function(z) {
+ if (!arguments.length) return y;
+ y = z;
+ return stack;
+ };
+ stack.out = function(z) {
+ if (!arguments.length) return out;
+ out = z;
+ return stack;
+ };
+ return stack;
+ };
+ function d3_layout_stackX(d) {
+ return d.x;
+ }
+ function d3_layout_stackY(d) {
+ return d.y;
+ }
+ function d3_layout_stackOut(d, y0, y) {
+ d.y0 = y0;
+ d.y = y;
+ }
+ var d3_layout_stackOrders = d3.map({
+ "inside-out": function(data) {
+ var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) {
+ return max[a] - max[b];
+ }), top = 0, bottom = 0, tops = [], bottoms = [];
+ for (i = 0; i < n; ++i) {
+ j = index[i];
+ if (top < bottom) {
+ top += sums[j];
+ tops.push(j);
+ } else {
+ bottom += sums[j];
+ bottoms.push(j);
+ }
+ }
+ return bottoms.reverse().concat(tops);
+ },
+ reverse: function(data) {
+ return d3.range(data.length).reverse();
+ },
+ "default": d3_layout_stackOrderDefault
+ });
+ var d3_layout_stackOffsets = d3.map({
+ silhouette: function(data) {
+ var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = [];
+ for (j = 0; j < m; ++j) {
+ for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
+ if (o > max) max = o;
+ sums.push(o);
+ }
+ for (j = 0; j < m; ++j) {
+ y0[j] = (max - sums[j]) / 2;
+ }
+ return y0;
+ },
+ wiggle: function(data) {
+ var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = [];
+ y0[0] = o = o0 = 0;
+ for (j = 1; j < m; ++j) {
+ for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];
+ for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {
+ for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {
+ s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;
+ }
+ s2 += s3 * data[i][j][1];
+ }
+ y0[j] = o -= s1 ? s2 / s1 * dx : 0;
+ if (o < o0) o0 = o;
+ }
+ for (j = 0; j < m; ++j) y0[j] -= o0;
+ return y0;
+ },
+ expand: function(data) {
+ var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = [];
+ for (j = 0; j < m; ++j) {
+ for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
+ if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k;
+ }
+ for (j = 0; j < m; ++j) y0[j] = 0;
+ return y0;
+ },
+ zero: d3_layout_stackOffsetZero
+ });
+ function d3_layout_stackOrderDefault(data) {
+ return d3.range(data.length);
+ }
+ function d3_layout_stackOffsetZero(data) {
+ var j = -1, m = data[0].length, y0 = [];
+ while (++j < m) y0[j] = 0;
+ return y0;
+ }
+ function d3_layout_stackMaxIndex(array) {
+ var i = 1, j = 0, v = array[0][1], k, n = array.length;
+ for (;i < n; ++i) {
+ if ((k = array[i][1]) > v) {
+ j = i;
+ v = k;
+ }
+ }
+ return j;
+ }
+ function d3_layout_stackReduceSum(d) {
+ return d.reduce(d3_layout_stackSum, 0);
+ }
+ function d3_layout_stackSum(p, d) {
+ return p + d[1];
+ }
+ d3.layout.histogram = function() {
+ var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges;
+ function histogram(data, i) {
+ var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x;
+ while (++i < m) {
+ bin = bins[i] = [];
+ bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);
+ bin.y = 0;
+ }
+ if (m > 0) {
+ i = -1;
+ while (++i < n) {
+ x = values[i];
+ if (x >= range[0] && x <= range[1]) {
+ bin = bins[d3.bisect(thresholds, x, 1, m) - 1];
+ bin.y += k;
+ bin.push(data[i]);
+ }
+ }
+ }
+ return bins;
+ }
+ histogram.value = function(x) {
+ if (!arguments.length) return valuer;
+ valuer = x;
+ return histogram;
+ };
+ histogram.range = function(x) {
+ if (!arguments.length) return ranger;
+ ranger = d3_functor(x);
+ return histogram;
+ };
+ histogram.bins = function(x) {
+ if (!arguments.length) return binner;
+ binner = typeof x === "number" ? function(range) {
+ return d3_layout_histogramBinFixed(range, x);
+ } : d3_functor(x);
+ return histogram;
+ };
+ histogram.frequency = function(x) {
+ if (!arguments.length) return frequency;
+ frequency = !!x;
+ return histogram;
+ };
+ return histogram;
+ };
+ function d3_layout_histogramBinSturges(range, values) {
+ return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));
+ }
+ function d3_layout_histogramBinFixed(range, n) {
+ var x = -1, b = +range[0], m = (range[1] - b) / n, f = [];
+ while (++x <= n) f[x] = m * x + b;
+ return f;
+ }
+ function d3_layout_histogramRange(values) {
+ return [ d3.min(values), d3.max(values) ];
+ }
+ d3.layout.pack = function() {
+ var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius;
+ function pack(d, i) {
+ var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === "function" ? radius : function() {
+ return radius;
+ };
+ root.x = root.y = 0;
+ d3_layout_hierarchyVisitAfter(root, function(d) {
+ d.r = +r(d.value);
+ });
+ d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);
+ if (padding) {
+ var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2;
+ d3_layout_hierarchyVisitAfter(root, function(d) {
+ d.r += dr;
+ });
+ d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);
+ d3_layout_hierarchyVisitAfter(root, function(d) {
+ d.r -= dr;
+ });
+ }
+ d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h));
+ return nodes;
+ }
+ pack.size = function(_) {
+ if (!arguments.length) return size;
+ size = _;
+ return pack;
+ };
+ pack.radius = function(_) {
+ if (!arguments.length) return radius;
+ radius = _ == null || typeof _ === "function" ? _ : +_;
+ return pack;
+ };
+ pack.padding = function(_) {
+ if (!arguments.length) return padding;
+ padding = +_;
+ return pack;
+ };
+ return d3_layout_hierarchyRebind(pack, hierarchy);
+ };
+ function d3_layout_packSort(a, b) {
+ return a.value - b.value;
+ }
+ function d3_layout_packInsert(a, b) {
+ var c = a._pack_next;
+ a._pack_next = b;
+ b._pack_prev = a;
+ b._pack_next = c;
+ c._pack_prev = b;
+ }
+ function d3_layout_packSplice(a, b) {
+ a._pack_next = b;
+ b._pack_prev = a;
+ }
+ function d3_layout_packIntersects(a, b) {
+ var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r;
+ return .999 * dr * dr > dx * dx + dy * dy;
+ }
+ function d3_layout_packSiblings(node) {
+ if (!(nodes = node.children) || !(n = nodes.length)) return;
+ var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n;
+ function bound(node) {
+ xMin = Math.min(node.x - node.r, xMin);
+ xMax = Math.max(node.x + node.r, xMax);
+ yMin = Math.min(node.y - node.r, yMin);
+ yMax = Math.max(node.y + node.r, yMax);
+ }
+ nodes.forEach(d3_layout_packLink);
+ a = nodes[0];
+ a.x = -a.r;
+ a.y = 0;
+ bound(a);
+ if (n > 1) {
+ b = nodes[1];
+ b.x = b.r;
+ b.y = 0;
+ bound(b);
+ if (n > 2) {
+ c = nodes[2];
+ d3_layout_packPlace(a, b, c);
+ bound(c);
+ d3_layout_packInsert(a, c);
+ a._pack_prev = c;
+ d3_layout_packInsert(c, b);
+ b = a._pack_next;
+ for (i = 3; i < n; i++) {
+ d3_layout_packPlace(a, b, c = nodes[i]);
+ var isect = 0, s1 = 1, s2 = 1;
+ for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {
+ if (d3_layout_packIntersects(j, c)) {
+ isect = 1;
+ break;
+ }
+ }
+ if (isect == 1) {
+ for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {
+ if (d3_layout_packIntersects(k, c)) {
+ break;
+ }
+ }
+ }
+ if (isect) {
+ if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b);
+ i--;
+ } else {
+ d3_layout_packInsert(a, c);
+ b = c;
+ bound(c);
+ }
+ }
+ }
+ }
+ var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0;
+ for (i = 0; i < n; i++) {
+ c = nodes[i];
+ c.x -= cx;
+ c.y -= cy;
+ cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));
+ }
+ node.r = cr;
+ nodes.forEach(d3_layout_packUnlink);
+ }
+ function d3_layout_packLink(node) {
+ node._pack_next = node._pack_prev = node;
+ }
+ function d3_layout_packUnlink(node) {
+ delete node._pack_next;
+ delete node._pack_prev;
+ }
+ function d3_layout_packTransform(node, x, y, k) {
+ var children = node.children;
+ node.x = x += k * node.x;
+ node.y = y += k * node.y;
+ node.r *= k;
+ if (children) {
+ var i = -1, n = children.length;
+ while (++i < n) d3_layout_packTransform(children[i], x, y, k);
+ }
+ }
+ function d3_layout_packPlace(a, b, c) {
+ var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y;
+ if (db && (dx || dy)) {
+ var da = b.r + c.r, dc = dx * dx + dy * dy;
+ da *= da;
+ db *= db;
+ var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
+ c.x = a.x + x * dx + y * dy;
+ c.y = a.y + x * dy - y * dx;
+ } else {
+ c.x = a.x + db;
+ c.y = a.y;
+ }
+ }
+ d3.layout.tree = function() {
+ var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null;
+ function tree(d, i) {
+ var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0);
+ d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z;
+ d3_layout_hierarchyVisitBefore(root1, secondWalk);
+ if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else {
+ var left = root0, right = root0, bottom = root0;
+ d3_layout_hierarchyVisitBefore(root0, function(node) {
+ if (node.x < left.x) left = node;
+ if (node.x > right.x) right = node;
+ if (node.depth > bottom.depth) bottom = node;
+ });
+ var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1);
+ d3_layout_hierarchyVisitBefore(root0, function(node) {
+ node.x = (node.x + tx) * kx;
+ node.y = node.depth * ky;
+ });
+ }
+ return nodes;
+ }
+ function wrapTree(root0) {
+ var root1 = {
+ A: null,
+ children: [ root0 ]
+ }, queue = [ root1 ], node1;
+ while ((node1 = queue.pop()) != null) {
+ for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) {
+ queue.push((children[i] = child = {
+ _: children[i],
+ parent: node1,
+ children: (child = children[i].children) && child.slice() || [],
+ A: null,
+ a: null,
+ z: 0,
+ m: 0,
+ c: 0,
+ s: 0,
+ t: null,
+ i: i
+ }).a = child);
+ }
+ }
+ return root1.children[0];
+ }
+ function firstWalk(v) {
+ var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;
+ if (children.length) {
+ d3_layout_treeShift(v);
+ var midpoint = (children[0].z + children[children.length - 1].z) / 2;
+ if (w) {
+ v.z = w.z + separation(v._, w._);
+ v.m = v.z - midpoint;
+ } else {
+ v.z = midpoint;
+ }
+ } else if (w) {
+ v.z = w.z + separation(v._, w._);
+ }
+ v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
+ }
+ function secondWalk(v) {
+ v._.x = v.z + v.parent.m;
+ v.m += v.parent.m;
+ }
+ function apportion(v, w, ancestor) {
+ if (w) {
+ var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;
+ while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {
+ vom = d3_layout_treeLeft(vom);
+ vop = d3_layout_treeRight(vop);
+ vop.a = v;
+ shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
+ if (shift > 0) {
+ d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift);
+ sip += shift;
+ sop += shift;
+ }
+ sim += vim.m;
+ sip += vip.m;
+ som += vom.m;
+ sop += vop.m;
+ }
+ if (vim && !d3_layout_treeRight(vop)) {
+ vop.t = vim;
+ vop.m += sim - sop;
+ }
+ if (vip && !d3_layout_treeLeft(vom)) {
+ vom.t = vip;
+ vom.m += sip - som;
+ ancestor = v;
+ }
+ }
+ return ancestor;
+ }
+ function sizeNode(node) {
+ node.x *= size[0];
+ node.y = node.depth * size[1];
+ }
+ tree.separation = function(x) {
+ if (!arguments.length) return separation;
+ separation = x;
+ return tree;
+ };
+ tree.size = function(x) {
+ if (!arguments.length) return nodeSize ? null : size;
+ nodeSize = (size = x) == null ? sizeNode : null;
+ return tree;
+ };
+ tree.nodeSize = function(x) {
+ if (!arguments.length) return nodeSize ? size : null;
+ nodeSize = (size = x) == null ? null : sizeNode;
+ return tree;
+ };
+ return d3_layout_hierarchyRebind(tree, hierarchy);
+ };
+ function d3_layout_treeSeparation(a, b) {
+ return a.parent == b.parent ? 1 : 2;
+ }
+ function d3_layout_treeLeft(v) {
+ var children = v.children;
+ return children.length ? children[0] : v.t;
+ }
+ function d3_layout_treeRight(v) {
+ var children = v.children, n;
+ return (n = children.length) ? children[n - 1] : v.t;
+ }
+ function d3_layout_treeMove(wm, wp, shift) {
+ var change = shift / (wp.i - wm.i);
+ wp.c -= change;
+ wp.s += shift;
+ wm.c += change;
+ wp.z += shift;
+ wp.m += shift;
+ }
+ function d3_layout_treeShift(v) {
+ var shift = 0, change = 0, children = v.children, i = children.length, w;
+ while (--i >= 0) {
+ w = children[i];
+ w.z += shift;
+ w.m += shift;
+ shift += w.s + (change += w.c);
+ }
+ }
+ function d3_layout_treeAncestor(vim, v, ancestor) {
+ return vim.a.parent === v.parent ? vim.a : ancestor;
+ }
+ d3.layout.cluster = function() {
+ var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false;
+ function cluster(d, i) {
+ var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0;
+ d3_layout_hierarchyVisitAfter(root, function(node) {
+ var children = node.children;
+ if (children && children.length) {
+ node.x = d3_layout_clusterX(children);
+ node.y = d3_layout_clusterY(children);
+ } else {
+ node.x = previousNode ? x += separation(node, previousNode) : 0;
+ node.y = 0;
+ previousNode = node;
+ }
+ });
+ var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;
+ d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) {
+ node.x = (node.x - root.x) * size[0];
+ node.y = (root.y - node.y) * size[1];
+ } : function(node) {
+ node.x = (node.x - x0) / (x1 - x0) * size[0];
+ node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];
+ });
+ return nodes;
+ }
+ cluster.separation = function(x) {
+ if (!arguments.length) return separation;
+ separation = x;
+ return cluster;
+ };
+ cluster.size = function(x) {
+ if (!arguments.length) return nodeSize ? null : size;
+ nodeSize = (size = x) == null;
+ return cluster;
+ };
+ cluster.nodeSize = function(x) {
+ if (!arguments.length) return nodeSize ? size : null;
+ nodeSize = (size = x) != null;
+ return cluster;
+ };
+ return d3_layout_hierarchyRebind(cluster, hierarchy);
+ };
+ function d3_layout_clusterY(children) {
+ return 1 + d3.max(children, function(child) {
+ return child.y;
+ });
+ }
+ function d3_layout_clusterX(children) {
+ return children.reduce(function(x, child) {
+ return x + child.x;
+ }, 0) / children.length;
+ }
+ function d3_layout_clusterLeft(node) {
+ var children = node.children;
+ return children && children.length ? d3_layout_clusterLeft(children[0]) : node;
+ }
+ function d3_layout_clusterRight(node) {
+ var children = node.children, n;
+ return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;
+ }
+ d3.layout.treemap = function() {
+ var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = "squarify", ratio = .5 * (1 + Math.sqrt(5));
+ function scale(children, k) {
+ var i = -1, n = children.length, child, area;
+ while (++i < n) {
+ area = (child = children[i]).value * (k < 0 ? 0 : k);
+ child.area = isNaN(area) || area <= 0 ? 0 : area;
+ }
+ }
+ function squarify(node) {
+ var children = node.children;
+ if (children && children.length) {
+ var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === "slice" ? rect.dx : mode === "dice" ? rect.dy : mode === "slice-dice" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n;
+ scale(remaining, rect.dx * rect.dy / node.value);
+ row.area = 0;
+ while ((n = remaining.length) > 0) {
+ row.push(child = remaining[n - 1]);
+ row.area += child.area;
+ if (mode !== "squarify" || (score = worst(row, u)) <= best) {
+ remaining.pop();
+ best = score;
+ } else {
+ row.area -= row.pop().area;
+ position(row, u, rect, false);
+ u = Math.min(rect.dx, rect.dy);
+ row.length = row.area = 0;
+ best = Infinity;
+ }
+ }
+ if (row.length) {
+ position(row, u, rect, true);
+ row.length = row.area = 0;
+ }
+ children.forEach(squarify);
+ }
+ }
+ function stickify(node) {
+ var children = node.children;
+ if (children && children.length) {
+ var rect = pad(node), remaining = children.slice(), child, row = [];
+ scale(remaining, rect.dx * rect.dy / node.value);
+ row.area = 0;
+ while (child = remaining.pop()) {
+ row.push(child);
+ row.area += child.area;
+ if (child.z != null) {
+ position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);
+ row.length = row.area = 0;
+ }
+ }
+ children.forEach(stickify);
+ }
+ }
+ function worst(row, u) {
+ var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length;
+ while (++i < n) {
+ if (!(r = row[i].area)) continue;
+ if (r < rmin) rmin = r;
+ if (r > rmax) rmax = r;
+ }
+ s *= s;
+ u *= u;
+ return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity;
+ }
+ function position(row, u, rect, flush) {
+ var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o;
+ if (u == rect.dx) {
+ if (flush || v > rect.dy) v = rect.dy;
+ while (++i < n) {
+ o = row[i];
+ o.x = x;
+ o.y = y;
+ o.dy = v;
+ x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);
+ }
+ o.z = true;
+ o.dx += rect.x + rect.dx - x;
+ rect.y += v;
+ rect.dy -= v;
+ } else {
+ if (flush || v > rect.dx) v = rect.dx;
+ while (++i < n) {
+ o = row[i];
+ o.x = x;
+ o.y = y;
+ o.dx = v;
+ y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);
+ }
+ o.z = false;
+ o.dy += rect.y + rect.dy - y;
+ rect.x += v;
+ rect.dx -= v;
+ }
+ }
+ function treemap(d) {
+ var nodes = stickies || hierarchy(d), root = nodes[0];
+ root.x = 0;
+ root.y = 0;
+ root.dx = size[0];
+ root.dy = size[1];
+ if (stickies) hierarchy.revalue(root);
+ scale([ root ], root.dx * root.dy / root.value);
+ (stickies ? stickify : squarify)(root);
+ if (sticky) stickies = nodes;
+ return nodes;
+ }
+ treemap.size = function(x) {
+ if (!arguments.length) return size;
+ size = x;
+ return treemap;
+ };
+ treemap.padding = function(x) {
+ if (!arguments.length) return padding;
+ function padFunction(node) {
+ var p = x.call(treemap, node, node.depth);
+ return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === "number" ? [ p, p, p, p ] : p);
+ }
+ function padConstant(node) {
+ return d3_layout_treemapPad(node, x);
+ }
+ var type;
+ pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === "function" ? padFunction : type === "number" ? (x = [ x, x, x, x ],
+ padConstant) : padConstant;
+ return treemap;
+ };
+ treemap.round = function(x) {
+ if (!arguments.length) return round != Number;
+ round = x ? Math.round : Number;
+ return treemap;
+ };
+ treemap.sticky = function(x) {
+ if (!arguments.length) return sticky;
+ sticky = x;
+ stickies = null;
+ return treemap;
+ };
+ treemap.ratio = function(x) {
+ if (!arguments.length) return ratio;
+ ratio = x;
+ return treemap;
+ };
+ treemap.mode = function(x) {
+ if (!arguments.length) return mode;
+ mode = x + "";
+ return treemap;
+ };
+ return d3_layout_hierarchyRebind(treemap, hierarchy);
+ };
+ function d3_layout_treemapPadNull(node) {
+ return {
+ x: node.x,
+ y: node.y,
+ dx: node.dx,
+ dy: node.dy
+ };
+ }
+ function d3_layout_treemapPad(node, padding) {
+ var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2];
+ if (dx < 0) {
+ x += dx / 2;
+ dx = 0;
+ }
+ if (dy < 0) {
+ y += dy / 2;
+ dy = 0;
+ }
+ return {
+ x: x,
+ y: y,
+ dx: dx,
+ dy: dy
+ };
+ }
+ d3.random = {
+ normal: function(µ, σ) {
+ var n = arguments.length;
+ if (n < 2) σ = 1;
+ if (n < 1) µ = 0;
+ return function() {
+ var x, y, r;
+ do {
+ x = Math.random() * 2 - 1;
+ y = Math.random() * 2 - 1;
+ r = x * x + y * y;
+ } while (!r || r > 1);
+ return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);
+ };
+ },
+ logNormal: function() {
+ var random = d3.random.normal.apply(d3, arguments);
+ return function() {
+ return Math.exp(random());
+ };
+ },
+ bates: function(m) {
+ var random = d3.random.irwinHall(m);
+ return function() {
+ return random() / m;
+ };
+ },
+ irwinHall: function(m) {
+ return function() {
+ for (var s = 0, j = 0; j < m; j++) s += Math.random();
+ return s;
+ };
+ }
+ };
+ d3.scale = {};
+ function d3_scaleExtent(domain) {
+ var start = domain[0], stop = domain[domain.length - 1];
+ return start < stop ? [ start, stop ] : [ stop, start ];
+ }
+ function d3_scaleRange(scale) {
+ return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());
+ }
+ function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {
+ var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);
+ return function(x) {
+ return i(u(x));
+ };
+ }
+ function d3_scale_nice(domain, nice) {
+ var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;
+ if (x1 < x0) {
+ dx = i0, i0 = i1, i1 = dx;
+ dx = x0, x0 = x1, x1 = dx;
+ }
+ domain[i0] = nice.floor(x0);
+ domain[i1] = nice.ceil(x1);
+ return domain;
+ }
+ function d3_scale_niceStep(step) {
+ return step ? {
+ floor: function(x) {
+ return Math.floor(x / step) * step;
+ },
+ ceil: function(x) {
+ return Math.ceil(x / step) * step;
+ }
+ } : d3_scale_niceIdentity;
+ }
+ var d3_scale_niceIdentity = {
+ floor: d3_identity,
+ ceil: d3_identity
+ };
+ function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {
+ var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;
+ if (domain[k] < domain[0]) {
+ domain = domain.slice().reverse();
+ range = range.slice().reverse();
+ }
+ while (++j <= k) {
+ u.push(uninterpolate(domain[j - 1], domain[j]));
+ i.push(interpolate(range[j - 1], range[j]));
+ }
+ return function(x) {
+ var j = d3.bisect(domain, x, 1, k) - 1;
+ return i[j](u[j](x));
+ };
+ }
+ d3.scale.linear = function() {
+ return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false);
+ };
+ function d3_scale_linear(domain, range, interpolate, clamp) {
+ var output, input;
+ function rescale() {
+ var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;
+ output = linear(domain, range, uninterpolate, interpolate);
+ input = linear(range, domain, uninterpolate, d3_interpolate);
+ return scale;
+ }
+ function scale(x) {
+ return output(x);
+ }
+ scale.invert = function(y) {
+ return input(y);
+ };
+ scale.domain = function(x) {
+ if (!arguments.length) return domain;
+ domain = x.map(Number);
+ return rescale();
+ };
+ scale.range = function(x) {
+ if (!arguments.length) return range;
+ range = x;
+ return rescale();
+ };
+ scale.rangeRound = function(x) {
+ return scale.range(x).interpolate(d3_interpolateRound);
+ };
+ scale.clamp = function(x) {
+ if (!arguments.length) return clamp;
+ clamp = x;
+ return rescale();
+ };
+ scale.interpolate = function(x) {
+ if (!arguments.length) return interpolate;
+ interpolate = x;
+ return rescale();
+ };
+ scale.ticks = function(m) {
+ return d3_scale_linearTicks(domain, m);
+ };
+ scale.tickFormat = function(m, format) {
+ return d3_scale_linearTickFormat(domain, m, format);
+ };
+ scale.nice = function(m) {
+ d3_scale_linearNice(domain, m);
+ return rescale();
+ };
+ scale.copy = function() {
+ return d3_scale_linear(domain, range, interpolate, clamp);
+ };
+ return rescale();
+ }
+ function d3_scale_linearRebind(scale, linear) {
+ return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp");
+ }
+ function d3_scale_linearNice(domain, m) {
+ return d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));
+ }
+ function d3_scale_linearTickRange(domain, m) {
+ if (m == null) m = 10;
+ var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;
+ if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;
+ extent[0] = Math.ceil(extent[0] / step) * step;
+ extent[1] = Math.floor(extent[1] / step) * step + step * .5;
+ extent[2] = step;
+ return extent;
+ }
+ function d3_scale_linearTicks(domain, m) {
+ return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));
+ }
+ function d3_scale_linearTickFormat(domain, m, format) {
+ var range = d3_scale_linearTickRange(domain, m);
+ if (format) {
+ var match = d3_format_re.exec(format);
+ match.shift();
+ if (match[8] === "s") {
+ var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1])));
+ if (!match[7]) match[7] = "." + d3_scale_linearPrecision(prefix.scale(range[2]));
+ match[8] = "f";
+ format = d3.format(match.join(""));
+ return function(d) {
+ return format(prefix.scale(d)) + prefix.symbol;
+ };
+ }
+ if (!match[7]) match[7] = "." + d3_scale_linearFormatPrecision(match[8], range);
+ format = match.join("");
+ } else {
+ format = ",." + d3_scale_linearPrecision(range[2]) + "f";
+ }
+ return d3.format(format);
+ }
+ var d3_scale_linearFormatSignificant = {
+ s: 1,
+ g: 1,
+ p: 1,
+ r: 1,
+ e: 1
+ };
+ function d3_scale_linearPrecision(value) {
+ return -Math.floor(Math.log(value) / Math.LN10 + .01);
+ }
+ function d3_scale_linearFormatPrecision(type, range) {
+ var p = d3_scale_linearPrecision(range[2]);
+ return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== "e") : p - (type === "%") * 2;
+ }
+ d3.scale.log = function() {
+ return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]);
+ };
+ function d3_scale_log(linear, base, positive, domain) {
+ function log(x) {
+ return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base);
+ }
+ function pow(x) {
+ return positive ? Math.pow(base, x) : -Math.pow(base, -x);
+ }
+ function scale(x) {
+ return linear(log(x));
+ }
+ scale.invert = function(x) {
+ return pow(linear.invert(x));
+ };
+ scale.domain = function(x) {
+ if (!arguments.length) return domain;
+ positive = x[0] >= 0;
+ linear.domain((domain = x.map(Number)).map(log));
+ return scale;
+ };
+ scale.base = function(_) {
+ if (!arguments.length) return base;
+ base = +_;
+ linear.domain(domain.map(log));
+ return scale;
+ };
+ scale.nice = function() {
+ var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative);
+ linear.domain(niced);
+ domain = niced.map(pow);
+ return scale;
+ };
+ scale.ticks = function() {
+ var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base;
+ if (isFinite(j - i)) {
+ if (positive) {
+ for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k);
+ ticks.push(pow(i));
+ } else {
+ ticks.push(pow(i));
+ for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k);
+ }
+ for (i = 0; ticks[i] < u; i++) {}
+ for (j = ticks.length; ticks[j - 1] > v; j--) {}
+ ticks = ticks.slice(i, j);
+ }
+ return ticks;
+ };
+ scale.tickFormat = function(n, format) {
+ if (!arguments.length) return d3_scale_logFormat;
+ if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== "function") format = d3.format(format);
+ var k = Math.max(.1, n / scale.ticks().length), f = positive ? (e = 1e-12, Math.ceil) : (e = -1e-12,
+ Math.floor), e;
+ return function(d) {
+ return d / pow(f(log(d) + e)) <= k ? format(d) : "";
+ };
+ };
+ scale.copy = function() {
+ return d3_scale_log(linear.copy(), base, positive, domain);
+ };
+ return d3_scale_linearRebind(scale, linear);
+ }
+ var d3_scale_logFormat = d3.format(".0e"), d3_scale_logNiceNegative = {
+ floor: function(x) {
+ return -Math.ceil(-x);
+ },
+ ceil: function(x) {
+ return -Math.floor(-x);
+ }
+ };
+ d3.scale.pow = function() {
+ return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]);
+ };
+ function d3_scale_pow(linear, exponent, domain) {
+ var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);
+ function scale(x) {
+ return linear(powp(x));
+ }
+ scale.invert = function(x) {
+ return powb(linear.invert(x));
+ };
+ scale.domain = function(x) {
+ if (!arguments.length) return domain;
+ linear.domain((domain = x.map(Number)).map(powp));
+ return scale;
+ };
+ scale.ticks = function(m) {
+ return d3_scale_linearTicks(domain, m);
+ };
+ scale.tickFormat = function(m, format) {
+ return d3_scale_linearTickFormat(domain, m, format);
+ };
+ scale.nice = function(m) {
+ return scale.domain(d3_scale_linearNice(domain, m));
+ };
+ scale.exponent = function(x) {
+ if (!arguments.length) return exponent;
+ powp = d3_scale_powPow(exponent = x);
+ powb = d3_scale_powPow(1 / exponent);
+ linear.domain(domain.map(powp));
+ return scale;
+ };
+ scale.copy = function() {
+ return d3_scale_pow(linear.copy(), exponent, domain);
+ };
+ return d3_scale_linearRebind(scale, linear);
+ }
+ function d3_scale_powPow(e) {
+ return function(x) {
+ return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);
+ };
+ }
+ d3.scale.sqrt = function() {
+ return d3.scale.pow().exponent(.5);
+ };
+ d3.scale.ordinal = function() {
+ return d3_scale_ordinal([], {
+ t: "range",
+ a: [ [] ]
+ });
+ };
+ function d3_scale_ordinal(domain, ranger) {
+ var index, range, rangeBand;
+ function scale(x) {
+ return range[((index.get(x) || (ranger.t === "range" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length];
+ }
+ function steps(start, step) {
+ return d3.range(domain.length).map(function(i) {
+ return start + step * i;
+ });
+ }
+ scale.domain = function(x) {
+ if (!arguments.length) return domain;
+ domain = [];
+ index = new d3_Map();
+ var i = -1, n = x.length, xi;
+ while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));
+ return scale[ranger.t].apply(scale, ranger.a);
+ };
+ scale.range = function(x) {
+ if (!arguments.length) return range;
+ range = x;
+ rangeBand = 0;
+ ranger = {
+ t: "range",
+ a: arguments
+ };
+ return scale;
+ };
+ scale.rangePoints = function(x, padding) {
+ if (arguments.length < 2) padding = 0;
+ var start = x[0], stop = x[1], step = (stop - start) / (Math.max(1, domain.length - 1) + padding);
+ range = steps(domain.length < 2 ? (start + stop) / 2 : start + step * padding / 2, step);
+ rangeBand = 0;
+ ranger = {
+ t: "rangePoints",
+ a: arguments
+ };
+ return scale;
+ };
+ scale.rangeBands = function(x, padding, outerPadding) {
+ if (arguments.length < 2) padding = 0;
+ if (arguments.length < 3) outerPadding = padding;
+ var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);
+ range = steps(start + step * outerPadding, step);
+ if (reverse) range.reverse();
+ rangeBand = step * (1 - padding);
+ ranger = {
+ t: "rangeBands",
+ a: arguments
+ };
+ return scale;
+ };
+ scale.rangeRoundBands = function(x, padding, outerPadding) {
+ if (arguments.length < 2) padding = 0;
+ if (arguments.length < 3) outerPadding = padding;
+ var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding)), error = stop - start - (domain.length - padding) * step;
+ range = steps(start + Math.round(error / 2), step);
+ if (reverse) range.reverse();
+ rangeBand = Math.round(step * (1 - padding));
+ ranger = {
+ t: "rangeRoundBands",
+ a: arguments
+ };
+ return scale;
+ };
+ scale.rangeBand = function() {
+ return rangeBand;
+ };
+ scale.rangeExtent = function() {
+ return d3_scaleExtent(ranger.a[0]);
+ };
+ scale.copy = function() {
+ return d3_scale_ordinal(domain, ranger);
+ };
+ return scale.domain(domain);
+ }
+ d3.scale.category10 = function() {
+ return d3.scale.ordinal().range(d3_category10);
+ };
+ d3.scale.category20 = function() {
+ return d3.scale.ordinal().range(d3_category20);
+ };
+ d3.scale.category20b = function() {
+ return d3.scale.ordinal().range(d3_category20b);
+ };
+ d3.scale.category20c = function() {
+ return d3.scale.ordinal().range(d3_category20c);
+ };
+ var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString);
+ var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString);
+ var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString);
+ var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString);
+ d3.scale.quantile = function() {
+ return d3_scale_quantile([], []);
+ };
+ function d3_scale_quantile(domain, range) {
+ var thresholds;
+ function rescale() {
+ var k = 0, q = range.length;
+ thresholds = [];
+ while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);
+ return scale;
+ }
+ function scale(x) {
+ if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)];
+ }
+ scale.domain = function(x) {
+ if (!arguments.length) return domain;
+ domain = x.filter(d3_number).sort(d3_ascending);
+ return rescale();
+ };
+ scale.range = function(x) {
+ if (!arguments.length) return range;
+ range = x;
+ return rescale();
+ };
+ scale.quantiles = function() {
+ return thresholds;
+ };
+ scale.invertExtent = function(y) {
+ y = range.indexOf(y);
+ return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ];
+ };
+ scale.copy = function() {
+ return d3_scale_quantile(domain, range);
+ };
+ return rescale();
+ }
+ d3.scale.quantize = function() {
+ return d3_scale_quantize(0, 1, [ 0, 1 ]);
+ };
+ function d3_scale_quantize(x0, x1, range) {
+ var kx, i;
+ function scale(x) {
+ return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];
+ }
+ function rescale() {
+ kx = range.length / (x1 - x0);
+ i = range.length - 1;
+ return scale;
+ }
+ scale.domain = function(x) {
+ if (!arguments.length) return [ x0, x1 ];
+ x0 = +x[0];
+ x1 = +x[x.length - 1];
+ return rescale();
+ };
+ scale.range = function(x) {
+ if (!arguments.length) return range;
+ range = x;
+ return rescale();
+ };
+ scale.invertExtent = function(y) {
+ y = range.indexOf(y);
+ y = y < 0 ? NaN : y / kx + x0;
+ return [ y, y + 1 / kx ];
+ };
+ scale.copy = function() {
+ return d3_scale_quantize(x0, x1, range);
+ };
+ return rescale();
+ }
+ d3.scale.threshold = function() {
+ return d3_scale_threshold([ .5 ], [ 0, 1 ]);
+ };
+ function d3_scale_threshold(domain, range) {
+ function scale(x) {
+ if (x <= x) return range[d3.bisect(domain, x)];
+ }
+ scale.domain = function(_) {
+ if (!arguments.length) return domain;
+ domain = _;
+ return scale;
+ };
+ scale.range = function(_) {
+ if (!arguments.length) return range;
+ range = _;
+ return scale;
+ };
+ scale.invertExtent = function(y) {
+ y = range.indexOf(y);
+ return [ domain[y - 1], domain[y] ];
+ };
+ scale.copy = function() {
+ return d3_scale_threshold(domain, range);
+ };
+ return scale;
+ }
+ d3.scale.identity = function() {
+ return d3_scale_identity([ 0, 1 ]);
+ };
+ function d3_scale_identity(domain) {
+ function identity(x) {
+ return +x;
+ }
+ identity.invert = identity;
+ identity.domain = identity.range = function(x) {
+ if (!arguments.length) return domain;
+ domain = x.map(identity);
+ return identity;
+ };
+ identity.ticks = function(m) {
+ return d3_scale_linearTicks(domain, m);
+ };
+ identity.tickFormat = function(m, format) {
+ return d3_scale_linearTickFormat(domain, m, format);
+ };
+ identity.copy = function() {
+ return d3_scale_identity(domain);
+ };
+ return identity;
+ }
+ d3.svg = {};
+ d3.svg.arc = function() {
+ var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;
+ function arc() {
+ var r0 = innerRadius.apply(this, arguments), r1 = outerRadius.apply(this, arguments), a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset, a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset, da = (a1 < a0 && (da = a0,
+ a0 = a1, a1 = da), a1 - a0), df = da < π ? "0" : "1", c0 = Math.cos(a0), s0 = Math.sin(a0), c1 = Math.cos(a1), s1 = Math.sin(a1);
+ return da >= d3_svg_arcMax ? r0 ? "M0," + r1 + "A" + r1 + "," + r1 + " 0 1,1 0," + -r1 + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 + "M0," + r0 + "A" + r0 + "," + r0 + " 0 1,0 0," + -r0 + "A" + r0 + "," + r0 + " 0 1,0 0," + r0 + "Z" : "M0," + r1 + "A" + r1 + "," + r1 + " 0 1,1 0," + -r1 + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 + "Z" : r0 ? "M" + r1 * c0 + "," + r1 * s0 + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 + "L" + r0 * c1 + "," + r0 * s1 + "A" + r0 + "," + r0 + " 0 " + df + ",0 " + r0 * c0 + "," + r0 * s0 + "Z" : "M" + r1 * c0 + "," + r1 * s0 + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 + "L0,0" + "Z";
+ }
+ arc.innerRadius = function(v) {
+ if (!arguments.length) return innerRadius;
+ innerRadius = d3_functor(v);
+ return arc;
+ };
+ arc.outerRadius = function(v) {
+ if (!arguments.length) return outerRadius;
+ outerRadius = d3_functor(v);
+ return arc;
+ };
+ arc.startAngle = function(v) {
+ if (!arguments.length) return startAngle;
+ startAngle = d3_functor(v);
+ return arc;
+ };
+ arc.endAngle = function(v) {
+ if (!arguments.length) return endAngle;
+ endAngle = d3_functor(v);
+ return arc;
+ };
+ arc.centroid = function() {
+ var r = (innerRadius.apply(this, arguments) + outerRadius.apply(this, arguments)) / 2, a = (startAngle.apply(this, arguments) + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset;
+ return [ Math.cos(a) * r, Math.sin(a) * r ];
+ };
+ return arc;
+ };
+ var d3_svg_arcOffset = -halfπ, d3_svg_arcMax = τ - ε;
+ function d3_svg_arcInnerRadius(d) {
+ return d.innerRadius;
+ }
+ function d3_svg_arcOuterRadius(d) {
+ return d.outerRadius;
+ }
+ function d3_svg_arcStartAngle(d) {
+ return d.startAngle;
+ }
+ function d3_svg_arcEndAngle(d) {
+ return d.endAngle;
+ }
+ function d3_svg_line(projection) {
+ var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7;
+ function line(data) {
+ var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y);
+ function segment() {
+ segments.push("M", interpolate(projection(points), tension));
+ }
+ while (++i < n) {
+ if (defined.call(this, d = data[i], i)) {
+ points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]);
+ } else if (points.length) {
+ segment();
+ points = [];
+ }
+ }
+ if (points.length) segment();
+ return segments.length ? segments.join("") : null;
+ }
+ line.x = function(_) {
+ if (!arguments.length) return x;
+ x = _;
+ return line;
+ };
+ line.y = function(_) {
+ if (!arguments.length) return y;
+ y = _;
+ return line;
+ };
+ line.defined = function(_) {
+ if (!arguments.length) return defined;
+ defined = _;
+ return line;
+ };
+ line.interpolate = function(_) {
+ if (!arguments.length) return interpolateKey;
+ if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;
+ return line;
+ };
+ line.tension = function(_) {
+ if (!arguments.length) return tension;
+ tension = _;
+ return line;
+ };
+ return line;
+ }
+ d3.svg.line = function() {
+ return d3_svg_line(d3_identity);
+ };
+ var d3_svg_lineInterpolators = d3.map({
+ linear: d3_svg_lineLinear,
+ "linear-closed": d3_svg_lineLinearClosed,
+ step: d3_svg_lineStep,
+ "step-before": d3_svg_lineStepBefore,
+ "step-after": d3_svg_lineStepAfter,
+ basis: d3_svg_lineBasis,
+ "basis-open": d3_svg_lineBasisOpen,
+ "basis-closed": d3_svg_lineBasisClosed,
+ bundle: d3_svg_lineBundle,
+ cardinal: d3_svg_lineCardinal,
+ "cardinal-open": d3_svg_lineCardinalOpen,
+ "cardinal-closed": d3_svg_lineCardinalClosed,
+ monotone: d3_svg_lineMonotone
+ });
+ d3_svg_lineInterpolators.forEach(function(key, value) {
+ value.key = key;
+ value.closed = /-closed$/.test(key);
+ });
+ function d3_svg_lineLinear(points) {
+ return points.join("L");
+ }
+ function d3_svg_lineLinearClosed(points) {
+ return d3_svg_lineLinear(points) + "Z";
+ }
+ function d3_svg_lineStep(points) {
+ var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ];
+ while (++i < n) path.push("H", (p[0] + (p = points[i])[0]) / 2, "V", p[1]);
+ if (n > 1) path.push("H", p[0]);
+ return path.join("");
+ }
+ function d3_svg_lineStepBefore(points) {
+ var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ];
+ while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]);
+ return path.join("");
+ }
+ function d3_svg_lineStepAfter(points) {
+ var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ];
+ while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]);
+ return path.join("");
+ }
+ function d3_svg_lineCardinalOpen(points, tension) {
+ return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, points.length - 1), d3_svg_lineCardinalTangents(points, tension));
+ }
+ function d3_svg_lineCardinalClosed(points, tension) {
+ return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite((points.push(points[0]),
+ points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension));
+ }
+ function d3_svg_lineCardinal(points, tension) {
+ return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension));
+ }
+ function d3_svg_lineHermite(points, tangents) {
+ if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) {
+ return d3_svg_lineLinear(points);
+ }
+ var quad = points.length != tangents.length, path = "", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1;
+ if (quad) {
+ path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) + "," + p[0] + "," + p[1];
+ p0 = points[1];
+ pi = 2;
+ }
+ if (tangents.length > 1) {
+ t = tangents[1];
+ p = points[pi];
+ pi++;
+ path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1];
+ for (var i = 2; i < tangents.length; i++, pi++) {
+ p = points[pi];
+ t = tangents[i];
+ path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1];
+ }
+ }
+ if (quad) {
+ var lp = points[pi];
+ path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) + "," + lp[0] + "," + lp[1];
+ }
+ return path;
+ }
+ function d3_svg_lineCardinalTangents(points, tension) {
+ var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length;
+ while (++i < n) {
+ p0 = p1;
+ p1 = p2;
+ p2 = points[i];
+ tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]);
+ }
+ return tangents;
+ }
+ function d3_svg_lineBasis(points) {
+ if (points.length < 3) return d3_svg_lineLinear(points);
+ var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, ",", y0, "L", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];
+ points.push(points[n - 1]);
+ while (++i <= n) {
+ pi = points[i];
+ px.shift();
+ px.push(pi[0]);
+ py.shift();
+ py.push(pi[1]);
+ d3_svg_lineBasisBezier(path, px, py);
+ }
+ points.pop();
+ path.push("L", pi);
+ return path.join("");
+ }
+ function d3_svg_lineBasisOpen(points) {
+ if (points.length < 4) return d3_svg_lineLinear(points);
+ var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ];
+ while (++i < 3) {
+ pi = points[i];
+ px.push(pi[0]);
+ py.push(pi[1]);
+ }
+ path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));
+ --i;
+ while (++i < n) {
+ pi = points[i];
+ px.shift();
+ px.push(pi[0]);
+ py.shift();
+ py.push(pi[1]);
+ d3_svg_lineBasisBezier(path, px, py);
+ }
+ return path.join("");
+ }
+ function d3_svg_lineBasisClosed(points) {
+ var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = [];
+ while (++i < 4) {
+ pi = points[i % n];
+ px.push(pi[0]);
+ py.push(pi[1]);
+ }
+ path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];
+ --i;
+ while (++i < m) {
+ pi = points[i % n];
+ px.shift();
+ px.push(pi[0]);
+ py.shift();
+ py.push(pi[1]);
+ d3_svg_lineBasisBezier(path, px, py);
+ }
+ return path.join("");
+ }
+ function d3_svg_lineBundle(points, tension) {
+ var n = points.length - 1;
+ if (n) {
+ var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t;
+ while (++i <= n) {
+ p = points[i];
+ t = i / n;
+ p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);
+ p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);
+ }
+ }
+ return d3_svg_lineBasis(points);
+ }
+ function d3_svg_lineDot4(a, b) {
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
+ }
+ var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ];
+ function d3_svg_lineBasisBezier(path, x, y) {
+ path.push("C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));
+ }
+ function d3_svg_lineSlope(p0, p1) {
+ return (p1[1] - p0[1]) / (p1[0] - p0[0]);
+ }
+ function d3_svg_lineFiniteDifferences(points) {
+ var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1);
+ while (++i < j) {
+ m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;
+ }
+ m[i] = d;
+ return m;
+ }
+ function d3_svg_lineMonotoneTangents(points) {
+ var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;
+ while (++i < j) {
+ d = d3_svg_lineSlope(points[i], points[i + 1]);
+ if (abs(d) < ε) {
+ m[i] = m[i + 1] = 0;
+ } else {
+ a = m[i] / d;
+ b = m[i + 1] / d;
+ s = a * a + b * b;
+ if (s > 9) {
+ s = d * 3 / Math.sqrt(s);
+ m[i] = s * a;
+ m[i + 1] = s * b;
+ }
+ }
+ }
+ i = -1;
+ while (++i <= j) {
+ s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));
+ tangents.push([ s || 0, m[i] * s || 0 ]);
+ }
+ return tangents;
+ }
+ function d3_svg_lineMonotone(points) {
+ return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));
+ }
+ d3.svg.line.radial = function() {
+ var line = d3_svg_line(d3_svg_lineRadial);
+ line.radius = line.x, delete line.x;
+ line.angle = line.y, delete line.y;
+ return line;
+ };
+ function d3_svg_lineRadial(points) {
+ var point, i = -1, n = points.length, r, a;
+ while (++i < n) {
+ point = points[i];
+ r = point[0];
+ a = point[1] + d3_svg_arcOffset;
+ point[0] = r * Math.cos(a);
+ point[1] = r * Math.sin(a);
+ }
+ return points;
+ }
+ function d3_svg_area(projection) {
+ var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = "L", tension = .7;
+ function area(data) {
+ var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() {
+ return x;
+ } : d3_functor(x1), fy1 = y0 === y1 ? function() {
+ return y;
+ } : d3_functor(y1), x, y;
+ function segment() {
+ segments.push("M", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), "Z");
+ }
+ while (++i < n) {
+ if (defined.call(this, d = data[i], i)) {
+ points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]);
+ points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]);
+ } else if (points0.length) {
+ segment();
+ points0 = [];
+ points1 = [];
+ }
+ }
+ if (points0.length) segment();
+ return segments.length ? segments.join("") : null;
+ }
+ area.x = function(_) {
+ if (!arguments.length) return x1;
+ x0 = x1 = _;
+ return area;
+ };
+ area.x0 = function(_) {
+ if (!arguments.length) return x0;
+ x0 = _;
+ return area;
+ };
+ area.x1 = function(_) {
+ if (!arguments.length) return x1;
+ x1 = _;
+ return area;
+ };
+ area.y = function(_) {
+ if (!arguments.length) return y1;
+ y0 = y1 = _;
+ return area;
+ };
+ area.y0 = function(_) {
+ if (!arguments.length) return y0;
+ y0 = _;
+ return area;
+ };
+ area.y1 = function(_) {
+ if (!arguments.length) return y1;
+ y1 = _;
+ return area;
+ };
+ area.defined = function(_) {
+ if (!arguments.length) return defined;
+ defined = _;
+ return area;
+ };
+ area.interpolate = function(_) {
+ if (!arguments.length) return interpolateKey;
+ if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;
+ interpolateReverse = interpolate.reverse || interpolate;
+ L = interpolate.closed ? "M" : "L";
+ return area;
+ };
+ area.tension = function(_) {
+ if (!arguments.length) return tension;
+ tension = _;
+ return area;
+ };
+ return area;
+ }
+ d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;
+ d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;
+ d3.svg.area = function() {
+ return d3_svg_area(d3_identity);
+ };
+ d3.svg.area.radial = function() {
+ var area = d3_svg_area(d3_svg_lineRadial);
+ area.radius = area.x, delete area.x;
+ area.innerRadius = area.x0, delete area.x0;
+ area.outerRadius = area.x1, delete area.x1;
+ area.angle = area.y, delete area.y;
+ area.startAngle = area.y0, delete area.y0;
+ area.endAngle = area.y1, delete area.y1;
+ return area;
+ };
+ d3.svg.chord = function() {
+ var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;
+ function chord(d, i) {
+ var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i);
+ return "M" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + "Z";
+ }
+ function subgroup(self, f, d, i) {
+ var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset, a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset;
+ return {
+ r: r,
+ a0: a0,
+ a1: a1,
+ p0: [ r * Math.cos(a0), r * Math.sin(a0) ],
+ p1: [ r * Math.cos(a1), r * Math.sin(a1) ]
+ };
+ }
+ function equals(a, b) {
+ return a.a0 == b.a0 && a.a1 == b.a1;
+ }
+ function arc(r, p, a) {
+ return "A" + r + "," + r + " 0 " + +(a > π) + ",1 " + p;
+ }
+ function curve(r0, p0, r1, p1) {
+ return "Q 0,0 " + p1;
+ }
+ chord.radius = function(v) {
+ if (!arguments.length) return radius;
+ radius = d3_functor(v);
+ return chord;
+ };
+ chord.source = function(v) {
+ if (!arguments.length) return source;
+ source = d3_functor(v);
+ return chord;
+ };
+ chord.target = function(v) {
+ if (!arguments.length) return target;
+ target = d3_functor(v);
+ return chord;
+ };
+ chord.startAngle = function(v) {
+ if (!arguments.length) return startAngle;
+ startAngle = d3_functor(v);
+ return chord;
+ };
+ chord.endAngle = function(v) {
+ if (!arguments.length) return endAngle;
+ endAngle = d3_functor(v);
+ return chord;
+ };
+ return chord;
+ };
+ function d3_svg_chordRadius(d) {
+ return d.radius;
+ }
+ d3.svg.diagonal = function() {
+ var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection;
+ function diagonal(d, i) {
+ var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, {
+ x: p0.x,
+ y: m
+ }, {
+ x: p3.x,
+ y: m
+ }, p3 ];
+ p = p.map(projection);
+ return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3];
+ }
+ diagonal.source = function(x) {
+ if (!arguments.length) return source;
+ source = d3_functor(x);
+ return diagonal;
+ };
+ diagonal.target = function(x) {
+ if (!arguments.length) return target;
+ target = d3_functor(x);
+ return diagonal;
+ };
+ diagonal.projection = function(x) {
+ if (!arguments.length) return projection;
+ projection = x;
+ return diagonal;
+ };
+ return diagonal;
+ };
+ function d3_svg_diagonalProjection(d) {
+ return [ d.x, d.y ];
+ }
+ d3.svg.diagonal.radial = function() {
+ var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection;
+ diagonal.projection = function(x) {
+ return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection;
+ };
+ return diagonal;
+ };
+ function d3_svg_diagonalRadialProjection(projection) {
+ return function() {
+ var d = projection.apply(this, arguments), r = d[0], a = d[1] + d3_svg_arcOffset;
+ return [ r * Math.cos(a), r * Math.sin(a) ];
+ };
+ }
+ d3.svg.symbol = function() {
+ var type = d3_svg_symbolType, size = d3_svg_symbolSize;
+ function symbol(d, i) {
+ return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i));
+ }
+ symbol.type = function(x) {
+ if (!arguments.length) return type;
+ type = d3_functor(x);
+ return symbol;
+ };
+ symbol.size = function(x) {
+ if (!arguments.length) return size;
+ size = d3_functor(x);
+ return symbol;
+ };
+ return symbol;
+ };
+ function d3_svg_symbolSize() {
+ return 64;
+ }
+ function d3_svg_symbolType() {
+ return "circle";
+ }
+ function d3_svg_symbolCircle(size) {
+ var r = Math.sqrt(size / π);
+ return "M0," + r + "A" + r + "," + r + " 0 1,1 0," + -r + "A" + r + "," + r + " 0 1,1 0," + r + "Z";
+ }
+ var d3_svg_symbols = d3.map({
+ circle: d3_svg_symbolCircle,
+ cross: function(size) {
+ var r = Math.sqrt(size / 5) / 2;
+ return "M" + -3 * r + "," + -r + "H" + -r + "V" + -3 * r + "H" + r + "V" + -r + "H" + 3 * r + "V" + r + "H" + r + "V" + 3 * r + "H" + -r + "V" + r + "H" + -3 * r + "Z";
+ },
+ diamond: function(size) {
+ var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30;
+ return "M0," + -ry + "L" + rx + ",0" + " 0," + ry + " " + -rx + ",0" + "Z";
+ },
+ square: function(size) {
+ var r = Math.sqrt(size) / 2;
+ return "M" + -r + "," + -r + "L" + r + "," + -r + " " + r + "," + r + " " + -r + "," + r + "Z";
+ },
+ "triangle-down": function(size) {
+ var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;
+ return "M0," + ry + "L" + rx + "," + -ry + " " + -rx + "," + -ry + "Z";
+ },
+ "triangle-up": function(size) {
+ var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;
+ return "M0," + -ry + "L" + rx + "," + ry + " " + -rx + "," + ry + "Z";
+ }
+ });
+ d3.svg.symbolTypes = d3_svg_symbols.keys();
+ var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians);
+ function d3_transition(groups, id) {
+ d3_subclass(groups, d3_transitionPrototype);
+ groups.id = id;
+ return groups;
+ }
+ var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit;
+ d3_transitionPrototype.call = d3_selectionPrototype.call;
+ d3_transitionPrototype.empty = d3_selectionPrototype.empty;
+ d3_transitionPrototype.node = d3_selectionPrototype.node;
+ d3_transitionPrototype.size = d3_selectionPrototype.size;
+ d3.transition = function(selection) {
+ return arguments.length ? d3_transitionInheritId ? selection.transition() : selection : d3_selectionRoot.transition();
+ };
+ d3.transition.prototype = d3_transitionPrototype;
+ d3_transitionPrototype.select = function(selector) {
+ var id = this.id, subgroups = [], subgroup, subnode, node;
+ selector = d3_selection_selector(selector);
+ for (var j = -1, m = this.length; ++j < m; ) {
+ subgroups.push(subgroup = []);
+ for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
+ if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) {
+ if ("__data__" in node) subnode.__data__ = node.__data__;
+ d3_transitionNode(subnode, i, id, node.__transition__[id]);
+ subgroup.push(subnode);
+ } else {
+ subgroup.push(null);
+ }
+ }
+ }
+ return d3_transition(subgroups, id);
+ };
+ d3_transitionPrototype.selectAll = function(selector) {
+ var id = this.id, subgroups = [], subgroup, subnodes, node, subnode, transition;
+ selector = d3_selection_selectorAll(selector);
+ for (var j = -1, m = this.length; ++j < m; ) {
+ for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
+ if (node = group[i]) {
+ transition = node.__transition__[id];
+ subnodes = selector.call(node, node.__data__, i, j);
+ subgroups.push(subgroup = []);
+ for (var k = -1, o = subnodes.length; ++k < o; ) {
+ if (subnode = subnodes[k]) d3_transitionNode(subnode, k, id, transition);
+ subgroup.push(subnode);
+ }
+ }
+ }
+ }
+ return d3_transition(subgroups, id);
+ };
+ d3_transitionPrototype.filter = function(filter) {
+ var subgroups = [], subgroup, group, node;
+ if (typeof filter !== "function") filter = d3_selection_filter(filter);
+ for (var j = 0, m = this.length; j < m; j++) {
+ subgroups.push(subgroup = []);
+ for (var group = this[j], i = 0, n = group.length; i < n; i++) {
+ if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {
+ subgroup.push(node);
+ }
+ }
+ }
+ return d3_transition(subgroups, this.id);
+ };
+ d3_transitionPrototype.tween = function(name, tween) {
+ var id = this.id;
+ if (arguments.length < 2) return this.node().__transition__[id].tween.get(name);
+ return d3_selection_each(this, tween == null ? function(node) {
+ node.__transition__[id].tween.remove(name);
+ } : function(node) {
+ node.__transition__[id].tween.set(name, tween);
+ });
+ };
+ function d3_transition_tween(groups, name, value, tween) {
+ var id = groups.id;
+ return d3_selection_each(groups, typeof value === "function" ? function(node, i, j) {
+ node.__transition__[id].tween.set(name, tween(value.call(node, node.__data__, i, j)));
+ } : (value = tween(value), function(node) {
+ node.__transition__[id].tween.set(name, value);
+ }));
+ }
+ d3_transitionPrototype.attr = function(nameNS, value) {
+ if (arguments.length < 2) {
+ for (value in nameNS) this.attr(value, nameNS[value]);
+ return this;
+ }
+ var interpolate = nameNS == "transform" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS);
+ function attrNull() {
+ this.removeAttribute(name);
+ }
+ function attrNullNS() {
+ this.removeAttributeNS(name.space, name.local);
+ }
+ function attrTween(b) {
+ return b == null ? attrNull : (b += "", function() {
+ var a = this.getAttribute(name), i;
+ return a !== b && (i = interpolate(a, b), function(t) {
+ this.setAttribute(name, i(t));
+ });
+ });
+ }
+ function attrTweenNS(b) {
+ return b == null ? attrNullNS : (b += "", function() {
+ var a = this.getAttributeNS(name.space, name.local), i;
+ return a !== b && (i = interpolate(a, b), function(t) {
+ this.setAttributeNS(name.space, name.local, i(t));
+ });
+ });
+ }
+ return d3_transition_tween(this, "attr." + nameNS, value, name.local ? attrTweenNS : attrTween);
+ };
+ d3_transitionPrototype.attrTween = function(nameNS, tween) {
+ var name = d3.ns.qualify(nameNS);
+ function attrTween(d, i) {
+ var f = tween.call(this, d, i, this.getAttribute(name));
+ return f && function(t) {
+ this.setAttribute(name, f(t));
+ };
+ }
+ function attrTweenNS(d, i) {
+ var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));
+ return f && function(t) {
+ this.setAttributeNS(name.space, name.local, f(t));
+ };
+ }
+ return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween);
+ };
+ d3_transitionPrototype.style = function(name, value, priority) {
+ var n = arguments.length;
+ if (n < 3) {
+ if (typeof name !== "string") {
+ if (n < 2) value = "";
+ for (priority in name) this.style(priority, name[priority], value);
+ return this;
+ }
+ priority = "";
+ }
+ function styleNull() {
+ this.style.removeProperty(name);
+ }
+ function styleString(b) {
+ return b == null ? styleNull : (b += "", function() {
+ var a = d3_window.getComputedStyle(this, null).getPropertyValue(name), i;
+ return a !== b && (i = d3_interpolate(a, b), function(t) {
+ this.style.setProperty(name, i(t), priority);
+ });
+ });
+ }
+ return d3_transition_tween(this, "style." + name, value, styleString);
+ };
+ d3_transitionPrototype.styleTween = function(name, tween, priority) {
+ if (arguments.length < 3) priority = "";
+ function styleTween(d, i) {
+ var f = tween.call(this, d, i, d3_window.getComputedStyle(this, null).getPropertyValue(name));
+ return f && function(t) {
+ this.style.setProperty(name, f(t), priority);
+ };
+ }
+ return this.tween("style." + name, styleTween);
+ };
+ d3_transitionPrototype.text = function(value) {
+ return d3_transition_tween(this, "text", value, d3_transition_text);
+ };
+ function d3_transition_text(b) {
+ if (b == null) b = "";
+ return function() {
+ this.textContent = b;
+ };
+ }
+ d3_transitionPrototype.remove = function() {
+ return this.each("end.transition", function() {
+ var p;
+ if (this.__transition__.count < 2 && (p = this.parentNode)) p.removeChild(this);
+ });
+ };
+ d3_transitionPrototype.ease = function(value) {
+ var id = this.id;
+ if (arguments.length < 1) return this.node().__transition__[id].ease;
+ if (typeof value !== "function") value = d3.ease.apply(d3, arguments);
+ return d3_selection_each(this, function(node) {
+ node.__transition__[id].ease = value;
+ });
+ };
+ d3_transitionPrototype.delay = function(value) {
+ var id = this.id;
+ if (arguments.length < 1) return this.node().__transition__[id].delay;
+ return d3_selection_each(this, typeof value === "function" ? function(node, i, j) {
+ node.__transition__[id].delay = +value.call(node, node.__data__, i, j);
+ } : (value = +value, function(node) {
+ node.__transition__[id].delay = value;
+ }));
+ };
+ d3_transitionPrototype.duration = function(value) {
+ var id = this.id;
+ if (arguments.length < 1) return this.node().__transition__[id].duration;
+ return d3_selection_each(this, typeof value === "function" ? function(node, i, j) {
+ node.__transition__[id].duration = Math.max(1, value.call(node, node.__data__, i, j));
+ } : (value = Math.max(1, value), function(node) {
+ node.__transition__[id].duration = value;
+ }));
+ };
+ d3_transitionPrototype.each = function(type, listener) {
+ var id = this.id;
+ if (arguments.length < 2) {
+ var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId;
+ d3_transitionInheritId = id;
+ d3_selection_each(this, function(node, i, j) {
+ d3_transitionInherit = node.__transition__[id];
+ type.call(node, node.__data__, i, j);
+ });
+ d3_transitionInherit = inherit;
+ d3_transitionInheritId = inheritId;
+ } else {
+ d3_selection_each(this, function(node) {
+ var transition = node.__transition__[id];
+ (transition.event || (transition.event = d3.dispatch("start", "end"))).on(type, listener);
+ });
+ }
+ return this;
+ };
+ d3_transitionPrototype.transition = function() {
+ var id0 = this.id, id1 = ++d3_transitionId, subgroups = [], subgroup, group, node, transition;
+ for (var j = 0, m = this.length; j < m; j++) {
+ subgroups.push(subgroup = []);
+ for (var group = this[j], i = 0, n = group.length; i < n; i++) {
+ if (node = group[i]) {
+ transition = Object.create(node.__transition__[id0]);
+ transition.delay += transition.duration;
+ d3_transitionNode(node, i, id1, transition);
+ }
+ subgroup.push(node);
+ }
+ }
+ return d3_transition(subgroups, id1);
+ };
+ function d3_transitionNode(node, i, id, inherit) {
+ var lock = node.__transition__ || (node.__transition__ = {
+ active: 0,
+ count: 0
+ }), transition = lock[id];
+ if (!transition) {
+ var time = inherit.time;
+ transition = lock[id] = {
+ tween: new d3_Map(),
+ time: time,
+ ease: inherit.ease,
+ delay: inherit.delay,
+ duration: inherit.duration
+ };
+ ++lock.count;
+ d3.timer(function(elapsed) {
+ var d = node.__data__, ease = transition.ease, delay = transition.delay, duration = transition.duration, timer = d3_timer_active, tweened = [];
+ timer.t = delay + time;
+ if (delay <= elapsed) return start(elapsed - delay);
+ timer.c = start;
+ function start(elapsed) {
+ if (lock.active > id) return stop();
+ lock.active = id;
+ transition.event && transition.event.start.call(node, d, i);
+ transition.tween.forEach(function(key, value) {
+ if (value = value.call(node, d, i)) {
+ tweened.push(value);
+ }
+ });
+ d3.timer(function() {
+ timer.c = tick(elapsed || 1) ? d3_true : tick;
+ return 1;
+ }, 0, time);
+ }
+ function tick(elapsed) {
+ if (lock.active !== id) return stop();
+ var t = elapsed / duration, e = ease(t), n = tweened.length;
+ while (n > 0) {
+ tweened[--n].call(node, e);
+ }
+ if (t >= 1) {
+ transition.event && transition.event.end.call(node, d, i);
+ return stop();
+ }
+ }
+ function stop() {
+ if (--lock.count) delete lock[id]; else delete node.__transition__;
+ return 1;
+ }
+ }, 0, time);
+ }
+ }
+ d3.svg.axis = function() {
+ var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_;
+ function axis(g) {
+ g.each(function() {
+ var g = d3.select(this);
+ var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy();
+ var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(".tick").data(ticks, scale1), tickEnter = tick.enter().insert("g", ".domain").attr("class", "tick").style("opacity", ε), tickExit = d3.transition(tick.exit()).style("opacity", ε).remove(), tickUpdate = d3.transition(tick.order()).style("opacity", 1), tickTransform;
+ var range = d3_scaleRange(scale1), path = g.selectAll(".domain").data([ 0 ]), pathUpdate = (path.enter().append("path").attr("class", "domain"),
+ d3.transition(path));
+ tickEnter.append("line");
+ tickEnter.append("text");
+ var lineEnter = tickEnter.select("line"), lineUpdate = tickUpdate.select("line"), text = tick.select("text").text(tickFormat), textEnter = tickEnter.select("text"), textUpdate = tickUpdate.select("text");
+ switch (orient) {
+ case "bottom":
+ {
+ tickTransform = d3_svg_axisX;
+ lineEnter.attr("y2", innerTickSize);
+ textEnter.attr("y", Math.max(innerTickSize, 0) + tickPadding);
+ lineUpdate.attr("x2", 0).attr("y2", innerTickSize);
+ textUpdate.attr("x", 0).attr("y", Math.max(innerTickSize, 0) + tickPadding);
+ text.attr("dy", ".71em").style("text-anchor", "middle");
+ pathUpdate.attr("d", "M" + range[0] + "," + outerTickSize + "V0H" + range[1] + "V" + outerTickSize);
+ break;
+ }
+
+ case "top":
+ {
+ tickTransform = d3_svg_axisX;
+ lineEnter.attr("y2", -innerTickSize);
+ textEnter.attr("y", -(Math.max(innerTickSize, 0) + tickPadding));
+ lineUpdate.attr("x2", 0).attr("y2", -innerTickSize);
+ textUpdate.attr("x", 0).attr("y", -(Math.max(innerTickSize, 0) + tickPadding));
+ text.attr("dy", "0em").style("text-anchor", "middle");
+ pathUpdate.attr("d", "M" + range[0] + "," + -outerTickSize + "V0H" + range[1] + "V" + -outerTickSize);
+ break;
+ }
+
+ case "left":
+ {
+ tickTransform = d3_svg_axisY;
+ lineEnter.attr("x2", -innerTickSize);
+ textEnter.attr("x", -(Math.max(innerTickSize, 0) + tickPadding));
+ lineUpdate.attr("x2", -innerTickSize).attr("y2", 0);
+ textUpdate.attr("x", -(Math.max(innerTickSize, 0) + tickPadding)).attr("y", 0);
+ text.attr("dy", ".32em").style("text-anchor", "end");
+ pathUpdate.attr("d", "M" + -outerTickSize + "," + range[0] + "H0V" + range[1] + "H" + -outerTickSize);
+ break;
+ }
+
+ case "right":
+ {
+ tickTransform = d3_svg_axisY;
+ lineEnter.attr("x2", innerTickSize);
+ textEnter.attr("x", Math.max(innerTickSize, 0) + tickPadding);
+ lineUpdate.attr("x2", innerTickSize).attr("y2", 0);
+ textUpdate.attr("x", Math.max(innerTickSize, 0) + tickPadding).attr("y", 0);
+ text.attr("dy", ".32em").style("text-anchor", "start");
+ pathUpdate.attr("d", "M" + outerTickSize + "," + range[0] + "H0V" + range[1] + "H" + outerTickSize);
+ break;
+ }
+ }
+ if (scale1.rangeBand) {
+ var x = scale1, dx = x.rangeBand() / 2;
+ scale0 = scale1 = function(d) {
+ return x(d) + dx;
+ };
+ } else if (scale0.rangeBand) {
+ scale0 = scale1;
+ } else {
+ tickExit.call(tickTransform, scale1);
+ }
+ tickEnter.call(tickTransform, scale0);
+ tickUpdate.call(tickTransform, scale1);
+ });
+ }
+ axis.scale = function(x) {
+ if (!arguments.length) return scale;
+ scale = x;
+ return axis;
+ };
+ axis.orient = function(x) {
+ if (!arguments.length) return orient;
+ orient = x in d3_svg_axisOrients ? x + "" : d3_svg_axisDefaultOrient;
+ return axis;
+ };
+ axis.ticks = function() {
+ if (!arguments.length) return tickArguments_;
+ tickArguments_ = arguments;
+ return axis;
+ };
+ axis.tickValues = function(x) {
+ if (!arguments.length) return tickValues;
+ tickValues = x;
+ return axis;
+ };
+ axis.tickFormat = function(x) {
+ if (!arguments.length) return tickFormat_;
+ tickFormat_ = x;
+ return axis;
+ };
+ axis.tickSize = function(x) {
+ var n = arguments.length;
+ if (!n) return innerTickSize;
+ innerTickSize = +x;
+ outerTickSize = +arguments[n - 1];
+ return axis;
+ };
+ axis.innerTickSize = function(x) {
+ if (!arguments.length) return innerTickSize;
+ innerTickSize = +x;
+ return axis;
+ };
+ axis.outerTickSize = function(x) {
+ if (!arguments.length) return outerTickSize;
+ outerTickSize = +x;
+ return axis;
+ };
+ axis.tickPadding = function(x) {
+ if (!arguments.length) return tickPadding;
+ tickPadding = +x;
+ return axis;
+ };
+ axis.tickSubdivide = function() {
+ return arguments.length && axis;
+ };
+ return axis;
+ };
+ var d3_svg_axisDefaultOrient = "bottom", d3_svg_axisOrients = {
+ top: 1,
+ right: 1,
+ bottom: 1,
+ left: 1
+ };
+ function d3_svg_axisX(selection, x) {
+ selection.attr("transform", function(d) {
+ return "translate(" + x(d) + ",0)";
+ });
+ }
+ function d3_svg_axisY(selection, y) {
+ selection.attr("transform", function(d) {
+ return "translate(0," + y(d) + ")";
+ });
+ }
+ d3.svg.brush = function() {
+ var event = d3_eventDispatch(brush, "brushstart", "brush", "brushend"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0];
+ function brush(g) {
+ g.each(function() {
+ var g = d3.select(this).style("pointer-events", "all").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)").on("mousedown.brush", brushstart).on("touchstart.brush", brushstart);
+ var background = g.selectAll(".background").data([ 0 ]);
+ background.enter().append("rect").attr("class", "background").style("visibility", "hidden").style("cursor", "crosshair");
+ g.selectAll(".extent").data([ 0 ]).enter().append("rect").attr("class", "extent").style("cursor", "move");
+ var resize = g.selectAll(".resize").data(resizes, d3_identity);
+ resize.exit().remove();
+ resize.enter().append("g").attr("class", function(d) {
+ return "resize " + d;
+ }).style("cursor", function(d) {
+ return d3_svg_brushCursor[d];
+ }).append("rect").attr("x", function(d) {
+ return /[ew]$/.test(d) ? -3 : null;
+ }).attr("y", function(d) {
+ return /^[ns]/.test(d) ? -3 : null;
+ }).attr("width", 6).attr("height", 6).style("visibility", "hidden");
+ resize.style("display", brush.empty() ? "none" : null);
+ var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range;
+ if (x) {
+ range = d3_scaleRange(x);
+ backgroundUpdate.attr("x", range[0]).attr("width", range[1] - range[0]);
+ redrawX(gUpdate);
+ }
+ if (y) {
+ range = d3_scaleRange(y);
+ backgroundUpdate.attr("y", range[0]).attr("height", range[1] - range[0]);
+ redrawY(gUpdate);
+ }
+ redraw(gUpdate);
+ });
+ }
+ brush.event = function(g) {
+ g.each(function() {
+ var event_ = event.of(this, arguments), extent1 = {
+ x: xExtent,
+ y: yExtent,
+ i: xExtentDomain,
+ j: yExtentDomain
+ }, extent0 = this.__chart__ || extent1;
+ this.__chart__ = extent1;
+ if (d3_transitionInheritId) {
+ d3.select(this).transition().each("start.brush", function() {
+ xExtentDomain = extent0.i;
+ yExtentDomain = extent0.j;
+ xExtent = extent0.x;
+ yExtent = extent0.y;
+ event_({
+ type: "brushstart"
+ });
+ }).tween("brush:brush", function() {
+ var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y);
+ xExtentDomain = yExtentDomain = null;
+ return function(t) {
+ xExtent = extent1.x = xi(t);
+ yExtent = extent1.y = yi(t);
+ event_({
+ type: "brush",
+ mode: "resize"
+ });
+ };
+ }).each("end.brush", function() {
+ xExtentDomain = extent1.i;
+ yExtentDomain = extent1.j;
+ event_({
+ type: "brush",
+ mode: "resize"
+ });
+ event_({
+ type: "brushend"
+ });
+ });
+ } else {
+ event_({
+ type: "brushstart"
+ });
+ event_({
+ type: "brush",
+ mode: "resize"
+ });
+ event_({
+ type: "brushend"
+ });
+ }
+ });
+ };
+ function redraw(g) {
+ g.selectAll(".resize").attr("transform", function(d) {
+ return "translate(" + xExtent[+/e$/.test(d)] + "," + yExtent[+/^s/.test(d)] + ")";
+ });
+ }
+ function redrawX(g) {
+ g.select(".extent").attr("x", xExtent[0]);
+ g.selectAll(".extent,.n>rect,.s>rect").attr("width", xExtent[1] - xExtent[0]);
+ }
+ function redrawY(g) {
+ g.select(".extent").attr("y", yExtent[0]);
+ g.selectAll(".extent,.e>rect,.w>rect").attr("height", yExtent[1] - yExtent[0]);
+ }
+ function brushstart() {
+ var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed("extent"), dragRestore = d3_event_dragSuppress(), center, origin = d3.mouse(target), offset;
+ var w = d3.select(d3_window).on("keydown.brush", keydown).on("keyup.brush", keyup);
+ if (d3.event.changedTouches) {
+ w.on("touchmove.brush", brushmove).on("touchend.brush", brushend);
+ } else {
+ w.on("mousemove.brush", brushmove).on("mouseup.brush", brushend);
+ }
+ g.interrupt().selectAll("*").interrupt();
+ if (dragging) {
+ origin[0] = xExtent[0] - origin[0];
+ origin[1] = yExtent[0] - origin[1];
+ } else if (resizing) {
+ var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);
+ offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ];
+ origin[0] = xExtent[ex];
+ origin[1] = yExtent[ey];
+ } else if (d3.event.altKey) center = origin.slice();
+ g.style("pointer-events", "none").selectAll(".resize").style("display", null);
+ d3.select("body").style("cursor", eventTarget.style("cursor"));
+ event_({
+ type: "brushstart"
+ });
+ brushmove();
+ function keydown() {
+ if (d3.event.keyCode == 32) {
+ if (!dragging) {
+ center = null;
+ origin[0] -= xExtent[1];
+ origin[1] -= yExtent[1];
+ dragging = 2;
+ }
+ d3_eventPreventDefault();
+ }
+ }
+ function keyup() {
+ if (d3.event.keyCode == 32 && dragging == 2) {
+ origin[0] += xExtent[1];
+ origin[1] += yExtent[1];
+ dragging = 0;
+ d3_eventPreventDefault();
+ }
+ }
+ function brushmove() {
+ var point = d3.mouse(target), moved = false;
+ if (offset) {
+ point[0] += offset[0];
+ point[1] += offset[1];
+ }
+ if (!dragging) {
+ if (d3.event.altKey) {
+ if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ];
+ origin[0] = xExtent[+(point[0] < center[0])];
+ origin[1] = yExtent[+(point[1] < center[1])];
+ } else center = null;
+ }
+ if (resizingX && move1(point, x, 0)) {
+ redrawX(g);
+ moved = true;
+ }
+ if (resizingY && move1(point, y, 1)) {
+ redrawY(g);
+ moved = true;
+ }
+ if (moved) {
+ redraw(g);
+ event_({
+ type: "brush",
+ mode: dragging ? "move" : "resize"
+ });
+ }
+ }
+ function move1(point, scale, i) {
+ var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max;
+ if (dragging) {
+ r0 -= position;
+ r1 -= size + position;
+ }
+ min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i];
+ if (dragging) {
+ max = (min += position) + size;
+ } else {
+ if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));
+ if (position < min) {
+ max = min;
+ min = position;
+ } else {
+ max = position;
+ }
+ }
+ if (extent[0] != min || extent[1] != max) {
+ if (i) yExtentDomain = null; else xExtentDomain = null;
+ extent[0] = min;
+ extent[1] = max;
+ return true;
+ }
+ }
+ function brushend() {
+ brushmove();
+ g.style("pointer-events", "all").selectAll(".resize").style("display", brush.empty() ? "none" : null);
+ d3.select("body").style("cursor", null);
+ w.on("mousemove.brush", null).on("mouseup.brush", null).on("touchmove.brush", null).on("touchend.brush", null).on("keydown.brush", null).on("keyup.brush", null);
+ dragRestore();
+ event_({
+ type: "brushend"
+ });
+ }
+ }
+ brush.x = function(z) {
+ if (!arguments.length) return x;
+ x = z;
+ resizes = d3_svg_brushResizes[!x << 1 | !y];
+ return brush;
+ };
+ brush.y = function(z) {
+ if (!arguments.length) return y;
+ y = z;
+ resizes = d3_svg_brushResizes[!x << 1 | !y];
+ return brush;
+ };
+ brush.clamp = function(z) {
+ if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null;
+ if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z;
+ return brush;
+ };
+ brush.extent = function(z) {
+ var x0, x1, y0, y1, t;
+ if (!arguments.length) {
+ if (x) {
+ if (xExtentDomain) {
+ x0 = xExtentDomain[0], x1 = xExtentDomain[1];
+ } else {
+ x0 = xExtent[0], x1 = xExtent[1];
+ if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);
+ if (x1 < x0) t = x0, x0 = x1, x1 = t;
+ }
+ }
+ if (y) {
+ if (yExtentDomain) {
+ y0 = yExtentDomain[0], y1 = yExtentDomain[1];
+ } else {
+ y0 = yExtent[0], y1 = yExtent[1];
+ if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);
+ if (y1 < y0) t = y0, y0 = y1, y1 = t;
+ }
+ }
+ return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];
+ }
+ if (x) {
+ x0 = z[0], x1 = z[1];
+ if (y) x0 = x0[0], x1 = x1[0];
+ xExtentDomain = [ x0, x1 ];
+ if (x.invert) x0 = x(x0), x1 = x(x1);
+ if (x1 < x0) t = x0, x0 = x1, x1 = t;
+ if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ];
+ }
+ if (y) {
+ y0 = z[0], y1 = z[1];
+ if (x) y0 = y0[1], y1 = y1[1];
+ yExtentDomain = [ y0, y1 ];
+ if (y.invert) y0 = y(y0), y1 = y(y1);
+ if (y1 < y0) t = y0, y0 = y1, y1 = t;
+ if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ];
+ }
+ return brush;
+ };
+ brush.clear = function() {
+ if (!brush.empty()) {
+ xExtent = [ 0, 0 ], yExtent = [ 0, 0 ];
+ xExtentDomain = yExtentDomain = null;
+ }
+ return brush;
+ };
+ brush.empty = function() {
+ return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1];
+ };
+ return d3.rebind(brush, event, "on");
+ };
+ var d3_svg_brushCursor = {
+ n: "ns-resize",
+ e: "ew-resize",
+ s: "ns-resize",
+ w: "ew-resize",
+ nw: "nwse-resize",
+ ne: "nesw-resize",
+ se: "nwse-resize",
+ sw: "nesw-resize"
+ };
+ var d3_svg_brushResizes = [ [ "n", "e", "s", "w", "nw", "ne", "se", "sw" ], [ "e", "w" ], [ "n", "s" ], [] ];
+ var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat;
+ var d3_time_formatUtc = d3_time_format.utc;
+ var d3_time_formatIso = d3_time_formatUtc("%Y-%m-%dT%H:%M:%S.%LZ");
+ d3_time_format.iso = Date.prototype.toISOString && +new Date("2000-01-01T00:00:00.000Z") ? d3_time_formatIsoNative : d3_time_formatIso;
+ function d3_time_formatIsoNative(date) {
+ return date.toISOString();
+ }
+ d3_time_formatIsoNative.parse = function(string) {
+ var date = new Date(string);
+ return isNaN(date) ? null : date;
+ };
+ d3_time_formatIsoNative.toString = d3_time_formatIso.toString;
+ d3_time.second = d3_time_interval(function(date) {
+ return new d3_date(Math.floor(date / 1e3) * 1e3);
+ }, function(date, offset) {
+ date.setTime(date.getTime() + Math.floor(offset) * 1e3);
+ }, function(date) {
+ return date.getSeconds();
+ });
+ d3_time.seconds = d3_time.second.range;
+ d3_time.seconds.utc = d3_time.second.utc.range;
+ d3_time.minute = d3_time_interval(function(date) {
+ return new d3_date(Math.floor(date / 6e4) * 6e4);
+ }, function(date, offset) {
+ date.setTime(date.getTime() + Math.floor(offset) * 6e4);
+ }, function(date) {
+ return date.getMinutes();
+ });
+ d3_time.minutes = d3_time.minute.range;
+ d3_time.minutes.utc = d3_time.minute.utc.range;
+ d3_time.hour = d3_time_interval(function(date) {
+ var timezone = date.getTimezoneOffset() / 60;
+ return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);
+ }, function(date, offset) {
+ date.setTime(date.getTime() + Math.floor(offset) * 36e5);
+ }, function(date) {
+ return date.getHours();
+ });
+ d3_time.hours = d3_time.hour.range;
+ d3_time.hours.utc = d3_time.hour.utc.range;
+ d3_time.month = d3_time_interval(function(date) {
+ date = d3_time.day(date);
+ date.setDate(1);
+ return date;
+ }, function(date, offset) {
+ date.setMonth(date.getMonth() + offset);
+ }, function(date) {
+ return date.getMonth();
+ });
+ d3_time.months = d3_time.month.range;
+ d3_time.months.utc = d3_time.month.utc.range;
+ function d3_time_scale(linear, methods, format) {
+ function scale(x) {
+ return linear(x);
+ }
+ scale.invert = function(x) {
+ return d3_time_scaleDate(linear.invert(x));
+ };
+ scale.domain = function(x) {
+ if (!arguments.length) return linear.domain().map(d3_time_scaleDate);
+ linear.domain(x);
+ return scale;
+ };
+ function tickMethod(extent, count) {
+ var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target);
+ return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) {
+ return d / 31536e6;
+ }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i];
+ }
+ scale.nice = function(interval, skip) {
+ var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === "number" && tickMethod(extent, interval);
+ if (method) interval = method[0], skip = method[1];
+ function skipped(date) {
+ return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length;
+ }
+ return scale.domain(d3_scale_nice(domain, skip > 1 ? {
+ floor: function(date) {
+ while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1);
+ return date;
+ },
+ ceil: function(date) {
+ while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1);
+ return date;
+ }
+ } : interval));
+ };
+ scale.ticks = function(interval, skip) {
+ var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === "number" ? tickMethod(extent, interval) : !interval.range && [ {
+ range: interval
+ }, skip ];
+ if (method) interval = method[0], skip = method[1];
+ return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip);
+ };
+ scale.tickFormat = function() {
+ return format;
+ };
+ scale.copy = function() {
+ return d3_time_scale(linear.copy(), methods, format);
+ };
+ return d3_scale_linearRebind(scale, linear);
+ }
+ function d3_time_scaleDate(t) {
+ return new Date(t);
+ }
+ var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ];
+ var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ];
+ var d3_time_scaleLocalFormat = d3_time_format.multi([ [ ".%L", function(d) {
+ return d.getMilliseconds();
+ } ], [ ":%S", function(d) {
+ return d.getSeconds();
+ } ], [ "%I:%M", function(d) {
+ return d.getMinutes();
+ } ], [ "%I %p", function(d) {
+ return d.getHours();
+ } ], [ "%a %d", function(d) {
+ return d.getDay() && d.getDate() != 1;
+ } ], [ "%b %d", function(d) {
+ return d.getDate() != 1;
+ } ], [ "%B", function(d) {
+ return d.getMonth();
+ } ], [ "%Y", d3_true ] ]);
+ var d3_time_scaleMilliseconds = {
+ range: function(start, stop, step) {
+ return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate);
+ },
+ floor: d3_identity,
+ ceil: d3_identity
+ };
+ d3_time_scaleLocalMethods.year = d3_time.year;
+ d3_time.scale = function() {
+ return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);
+ };
+ var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) {
+ return [ m[0].utc, m[1] ];
+ });
+ var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ ".%L", function(d) {
+ return d.getUTCMilliseconds();
+ } ], [ ":%S", function(d) {
+ return d.getUTCSeconds();
+ } ], [ "%I:%M", function(d) {
+ return d.getUTCMinutes();
+ } ], [ "%I %p", function(d) {
+ return d.getUTCHours();
+ } ], [ "%a %d", function(d) {
+ return d.getUTCDay() && d.getUTCDate() != 1;
+ } ], [ "%b %d", function(d) {
+ return d.getUTCDate() != 1;
+ } ], [ "%B", function(d) {
+ return d.getUTCMonth();
+ } ], [ "%Y", d3_true ] ]);
+ d3_time_scaleUtcMethods.year = d3_time.year.utc;
+ d3_time.scale.utc = function() {
+ return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat);
+ };
+ d3.text = d3_xhrType(function(request) {
+ return request.responseText;
+ });
+ d3.json = function(url, callback) {
+ return d3_xhr(url, "application/json", d3_json, callback);
+ };
+ function d3_json(request) {
+ return JSON.parse(request.responseText);
+ }
+ d3.html = function(url, callback) {
+ return d3_xhr(url, "text/html", d3_html, callback);
+ };
+ function d3_html(request) {
+ var range = d3_document.createRange();
+ range.selectNode(d3_document.body);
+ return range.createContextualFragment(request.responseText);
+ }
+ d3.xml = d3_xhrType(function(request) {
+ return request.responseXML;
+ });
+ if (typeof define === "function" && define.amd) define(d3); else if (typeof module === "object" && module.exports) module.exports = d3;
+ this.d3 = d3;
+}(); \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/tp/d3.min.js b/framework/src/onos/web/gui/src/main/webapp/tp/d3.min.js
new file mode 100644
index 00000000..b4943ee4
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tp/d3.min.js
@@ -0,0 +1,5 @@
+!function(){function n(n,t){return t>n?-1:n>t?1:n>=t?0:0/0}function t(n){return null!=n&&!isNaN(n)}function e(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)<0?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n(t[i],e)>0?u=i:r=i+1}return r}}}function r(n){return n.length}function u(n){for(var t=1;n*t%1;)t*=10;return t}function i(n,t){try{for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}catch(r){n.prototype=t}}function o(){}function a(n){return oa+n in this}function c(n){return n=oa+n,n in this&&delete this[n]}function l(){var n=[];return this.forEach(function(t){n.push(t)}),n}function s(){var n=0;for(var t in this)t.charCodeAt(0)===aa&&++n;return n}function f(){for(var n in this)if(n.charCodeAt(0)===aa)return!1;return!0}function h(){}function g(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function p(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=ca.length;r>e;++e){var u=ca[e]+t;if(u in n)return u}}function v(){}function d(){}function m(n){function t(){for(var t,r=e,u=-1,i=r.length;++u<i;)(t=r[u].on)&&t.apply(this,arguments);return n}var e=[],r=new o;return t.on=function(t,u){var i,o=r.get(t);return arguments.length<2?o&&o.on:(o&&(o.on=null,e=e.slice(0,i=e.indexOf(o)).concat(e.slice(i+1)),r.remove(t)),u&&e.push(r.set(t,{on:u})),n)},t}function y(){Vo.event.preventDefault()}function x(){for(var n,t=Vo.event;n=t.sourceEvent;)t=n;return t}function M(n){for(var t=new d,e=0,r=arguments.length;++e<r;)t[arguments[e]]=m(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=Vo.event;u.target=n,Vo.event=u,t[u.type].apply(e,r)}finally{Vo.event=i}}},t}function _(n){return sa(n,va),n}function b(n){return"function"==typeof n?n:function(){return fa(n,this)}}function w(n){return"function"==typeof n?n:function(){return ha(n,this)}}function S(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function u(){this.setAttribute(n,t)}function i(){this.setAttributeNS(n.space,n.local,t)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=Vo.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?a:o:n.local?i:u}function k(n){return n.trim().replace(/\s+/g," ")}function E(n){return new RegExp("(?:^|\\s+)"+Vo.requote(n)+"(?:\\s+|$)","g")}function A(n){return(n+"").trim().split(/^|\s+/)}function C(n,t){function e(){for(var e=-1;++e<u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<u;)n[e](this,r)}n=A(n).map(N);var u=n.length;return"function"==typeof t?r:e}function N(n){var t=E(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(u)||e.setAttribute("class",k(u+" "+n))):e.setAttribute("class",k(u.replace(t," ")))}}function z(n,t,e){function r(){this.style.removeProperty(n)}function u(){this.style.setProperty(n,t,e)}function i(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:"function"==typeof t?i:u}function L(n,t){function e(){delete this[n]}function r(){this[n]=t}function u(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:"function"==typeof t?u:r}function T(n){return"function"==typeof n?n:(n=Vo.ns.qualify(n)).local?function(){return this.ownerDocument.createElementNS(n.space,n.local)}:function(){return this.ownerDocument.createElementNS(this.namespaceURI,n)}}function q(n){return{__data__:n}}function R(n){return function(){return pa(this,n)}}function D(t){return arguments.length||(t=n),function(n,e){return n&&e?t(n.__data__,e.__data__):!n-!e}}function P(n,t){for(var e=0,r=n.length;r>e;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function U(n){return sa(n,ma),n}function j(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t<c;);return o}}function H(){var n=this.__transition__;n&&++n.active}function F(n,t,e){function r(){var t=this[o];t&&(this.removeEventListener(n,t,t.$),delete this[o])}function u(){var u=c(t,$o(arguments));r.call(this),this.addEventListener(n,this[o]=u,u.$=e),u._=t}function i(){var t,e=new RegExp("^__on([^.]+)"+Vo.requote(n)+"$");for(var r in this)if(t=r.match(e)){var u=this[r];this.removeEventListener(t[1],u,u.$),delete this[r]}}var o="__on"+n,a=n.indexOf("."),c=O;a>0&&(n=n.slice(0,a));var l=xa.get(n);return l&&(n=l,c=Y),a?t?u:r:t?v:i}function O(n,t){return function(e){var r=Vo.event;Vo.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{Vo.event=r}}}function Y(n,t){var e=O(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function I(){var n=".dragsuppress-"+ ++_a,t="click"+n,e=Vo.select(Jo).on("touchmove"+n,y).on("dragstart"+n,y).on("selectstart"+n,y);if(Ma){var r=Wo.style,u=r[Ma];r[Ma]="none"}return function(i){function o(){e.on(t,null)}e.on(n,null),Ma&&(r[Ma]=u),i&&(e.on(t,function(){y(),o()},!0),setTimeout(o,0))}}function Z(n,t){t.changedTouches&&(t=t.changedTouches[0]);var e=n.ownerSVGElement||n;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>ba&&(Jo.scrollX||Jo.scrollY)){e=Vo.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var u=e[0][0].getScreenCTM();ba=!(u.f||u.e),e.remove()}return ba?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(n.getScreenCTM().inverse()),[r.x,r.y]}var i=n.getBoundingClientRect();return[t.clientX-i.left-n.clientLeft,t.clientY-i.top-n.clientTop]}function V(){return Vo.event.changedTouches[0].identifier}function X(){return Vo.event.target}function $(){return Jo}function B(n){return n>0?1:0>n?-1:0}function W(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function J(n){return n>1?0:-1>n?wa:Math.acos(n)}function G(n){return n>1?ka:-1>n?-ka:Math.asin(n)}function K(n){return((n=Math.exp(n))-1/n)/2}function Q(n){return((n=Math.exp(n))+1/n)/2}function nt(n){return((n=Math.exp(2*n))-1)/(n+1)}function tt(n){return(n=Math.sin(n/2))*n}function et(){}function rt(n,t,e){return this instanceof rt?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof rt?new rt(n.h,n.s,n.l):mt(""+n,yt,rt):new rt(n,t,e)}function ut(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,new gt(u(n+120),u(n),u(n-120))}function it(n,t,e){return this instanceof it?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof it?new it(n.h,n.c,n.l):n instanceof at?lt(n.l,n.a,n.b):lt((n=xt((n=Vo.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new it(n,t,e)}function ot(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new at(e,Math.cos(n*=Ca)*t,Math.sin(n)*t)}function at(n,t,e){return this instanceof at?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof at?new at(n.l,n.a,n.b):n instanceof it?ot(n.l,n.c,n.h):xt((n=gt(n)).r,n.g,n.b):new at(n,t,e)}function ct(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=st(u)*Ha,r=st(r)*Fa,i=st(i)*Oa,new gt(ht(3.2404542*u-1.5371385*r-.4985314*i),ht(-.969266*u+1.8760108*r+.041556*i),ht(.0556434*u-.2040259*r+1.0572252*i))}function lt(n,t,e){return n>0?new it(Math.atan2(e,t)*Na,Math.sqrt(t*t+e*e),n):new it(0/0,0/0,n)}function st(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function ft(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function ht(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function gt(n,t,e){return this instanceof gt?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof gt?new gt(n.r,n.g,n.b):mt(""+n,gt,ut):new gt(n,t,e)}function pt(n){return new gt(n>>16,255&n>>8,255&n)}function vt(n){return pt(n)+""}function dt(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function mt(n,t,e){var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(n))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(_t(u[0]),_t(u[1]),_t(u[2]))}return(i=Za.get(n))?t(i.r,i.g,i.b):(null==n||"#"!==n.charAt(0)||isNaN(i=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&i)>>4,o=o>>4|o,a=240&i,a=a>>4|a,c=15&i,c=c<<4|c):7===n.length&&(o=(16711680&i)>>16,a=(65280&i)>>8,c=255&i)),t(o,a,c))}function yt(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),new rt(r,u,c)}function xt(n,t,e){n=Mt(n),t=Mt(t),e=Mt(e);var r=ft((.4124564*n+.3575761*t+.1804375*e)/Ha),u=ft((.2126729*n+.7151522*t+.072175*e)/Fa),i=ft((.0193339*n+.119192*t+.9503041*e)/Oa);return at(116*u-16,500*(r-u),200*(u-i))}function Mt(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function _t(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function bt(n){return"function"==typeof n?n:function(){return n}}function wt(n){return n}function St(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),kt(t,e,n,r)}}function kt(n,t,e,r){function u(){var n,t=c.status;if(!t&&At(c)||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return o.error.call(i,r),void 0}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=Vo.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,l=null;return!Jo.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=Vo.event;Vo.event=n;try{o.progress.call(i,c)}finally{Vo.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(l=n,i):l},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat($o(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var s in a)c.setRequestHeader(s,a[s]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=l&&(c.responseType=l),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},Vo.rebind(i,o,"on"),null==r?i:i.get(Et(r))}function Et(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function At(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function Ct(){var n=Nt(),t=zt()-n;t>24?(isFinite(t)&&(clearTimeout(Ba),Ba=setTimeout(Ct,t)),$a=0):($a=1,Ja(Ct))}function Nt(){var n=Date.now();for(Wa=Va;Wa;)n>=Wa.t&&(Wa.f=Wa.c(n-Wa.t)),Wa=Wa.n;return n}function zt(){for(var n,t=Va,e=1/0;t;)t.f?t=n?n.n=t.n:Va=t.n:(t.t<e&&(e=t.t),t=(n=t).n);return Xa=n,e}function Lt(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function Tt(n,t){var e=Math.pow(10,3*ia(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function qt(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r?function(n){for(var t=n.length,u=[],i=0,o=r[0];o>0&&t>0;)u.push(n.substring(t-=o,t+o)),o=r[i=(i+1)%r.length];return u.reverse().join(e)}:wt;return function(n){var e=Ka.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"",c=e[4]||"",l=e[5],s=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1;switch(h&&(h=+h.substring(1)),(l||"0"===r&&"="===o)&&(l=r="0",o="=",f&&(s-=Math.floor((s-1)/4))),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===c&&(v="0"+g.toLowerCase());case"c":case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===c&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=Qa.get(g)||Rt;var y=l&&f;return function(n){var e=d;if(m&&n%1)return"";var u=0>n||0===n&&0>1/n?(n=-n,"-"):a;if(0>p){var c=Vo.formatPrefix(n,h);n=c.scale(n),e=c.symbol+d}else n*=p;n=g(n,h);var x=n.lastIndexOf("."),M=0>x?n:n.substring(0,x),_=0>x?"":t+n.substring(x+1);!l&&f&&(M=i(M));var b=v.length+M.length+_.length+(y?0:u.length),w=s>b?new Array(b=s-b+1).join(r):"";return y&&(M=i(w+M)),u+=v,n=M+_,("<"===o?u+n+w:">"===o?w+u+n:"^"===o?w.substring(0,b>>=1)+u+n+w.substring(b):u+(y?n:w+n))+e}}}function Rt(n){return n+""}function Dt(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Pt(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new tc(e-1)),1),e}function i(n,e){return t(n=new tc(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{tc=Dt;var r=new Dt;return r._=n,o(r,t,e)}finally{tc=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=Ut(n);return c.floor=c,c.round=Ut(r),c.ceil=Ut(u),c.offset=Ut(i),c.range=a,n}function Ut(n){return function(t,e){try{tc=Dt;var r=new Dt;return r._=t,n(r,e)._}finally{tc=Date}}}function jt(n){function t(n){function t(t){for(var e,u,i,o=[],a=-1,c=0;++a<r;)37===n.charCodeAt(a)&&(o.push(n.slice(c,a)),null!=(u=rc[e=n.charAt(++a)])&&(e=n.charAt(++a)),(i=C[e])&&(e=i(t,null==u?"e"===e?" ":"0":u)),o.push(e),c=a+1);return o.push(n.slice(c,a)),o.join("")}var r=n.length;return t.parse=function(t){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},u=e(r,n,t,0);if(u!=t.length)return null;"p"in r&&(r.H=r.H%12+12*r.p);var i=null!=r.Z&&tc!==Dt,o=new(i?Dt:tc);return"j"in r?o.setFullYear(r.y,0,r.j):"w"in r&&("W"in r||"U"in r)?(o.setFullYear(r.y,0,1),o.setFullYear(r.y,0,"W"in r?(r.w+6)%7+7*r.W-(o.getDay()+5)%7:r.w+7*r.U-(o.getDay()+6)%7)):o.setFullYear(r.y,r.m,r.d),o.setHours(r.H+(0|r.Z/100),r.M+r.Z%100,r.S,r.L),i?o._:o},t.toString=function(){return n},t}function e(n,t,e,r){for(var u,i,o,a=0,c=t.length,l=e.length;c>a;){if(r>=l)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=N[o in rc?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){b.lastIndex=0;var r=b.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){M.lastIndex=0;var r=M.exec(t.slice(e));return r?(n.w=_.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){E.lastIndex=0;var r=E.exec(t.slice(e));return r?(n.m=A.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,C.c.toString(),t,r)}function c(n,t,r){return e(n,C.x.toString(),t,r)}function l(n,t,r){return e(n,C.X.toString(),t,r)}function s(n,t,e){var r=x.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{tc=Dt;var t=new tc;return t._=n,r(t)}finally{tc=Date}}var r=t(n);return e.parse=function(n){try{tc=Dt;var t=r.parse(n);return t&&t._}finally{tc=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ue;var x=Vo.map(),M=Ft(v),_=Ot(v),b=Ft(d),w=Ot(d),S=Ft(m),k=Ot(m),E=Ft(y),A=Ot(y);p.forEach(function(n,t){x.set(n.toLowerCase(),t)});var C={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return Ht(n.getDate(),t,2)},e:function(n,t){return Ht(n.getDate(),t,2)},H:function(n,t){return Ht(n.getHours(),t,2)},I:function(n,t){return Ht(n.getHours()%12||12,t,2)},j:function(n,t){return Ht(1+nc.dayOfYear(n),t,3)},L:function(n,t){return Ht(n.getMilliseconds(),t,3)},m:function(n,t){return Ht(n.getMonth()+1,t,2)},M:function(n,t){return Ht(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return Ht(n.getSeconds(),t,2)},U:function(n,t){return Ht(nc.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Ht(nc.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return Ht(n.getFullYear()%100,t,2)},Y:function(n,t){return Ht(n.getFullYear()%1e4,t,4)},Z:ee,"%":function(){return"%"}},N={a:r,A:u,b:i,B:o,c:a,d:Jt,e:Jt,H:Kt,I:Kt,j:Gt,L:te,m:Wt,M:Qt,p:s,S:ne,U:It,w:Yt,W:Zt,x:c,X:l,y:Xt,Y:Vt,Z:$t,"%":re};return t}function Ht(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function Ft(n){return new RegExp("^(?:"+n.map(Vo.requote).join("|")+")","i")}function Ot(n){for(var t=new o,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function Yt(n,t,e){uc.lastIndex=0;var r=uc.exec(t.slice(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function It(n,t,e){uc.lastIndex=0;var r=uc.exec(t.slice(e));return r?(n.U=+r[0],e+r[0].length):-1}function Zt(n,t,e){uc.lastIndex=0;var r=uc.exec(t.slice(e));return r?(n.W=+r[0],e+r[0].length):-1}function Vt(n,t,e){uc.lastIndex=0;var r=uc.exec(t.slice(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Xt(n,t,e){uc.lastIndex=0;var r=uc.exec(t.slice(e,e+2));return r?(n.y=Bt(+r[0]),e+r[0].length):-1}function $t(n,t,e){return/^[+-]\d{4}$/.test(t=t.slice(e,e+5))?(n.Z=-t,e+5):-1}function Bt(n){return n+(n>68?1900:2e3)}function Wt(n,t,e){uc.lastIndex=0;var r=uc.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function Jt(n,t,e){uc.lastIndex=0;var r=uc.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function Gt(n,t,e){uc.lastIndex=0;var r=uc.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function Kt(n,t,e){uc.lastIndex=0;var r=uc.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function Qt(n,t,e){uc.lastIndex=0;var r=uc.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function ne(n,t,e){uc.lastIndex=0;var r=uc.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function te(n,t,e){uc.lastIndex=0;var r=uc.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ee(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=0|ia(t)/60,u=ia(t)%60;return e+Ht(r,"0",2)+Ht(u,"0",2)}function re(n,t,e){ic.lastIndex=0;var r=ic.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ue(n){for(var t=n.length,e=-1;++e<t;)n[e][0]=this(n[e][0]);return function(t){for(var e=0,r=n[e];!r[1](t);)r=n[++e];return r[0](t)}}function ie(){}function oe(n,t,e){var r=e.s=n+t,u=r-n,i=r-u;e.t=n-i+(t-u)}function ae(n,t){n&&lc.hasOwnProperty(n.type)&&lc[n.type](n,t)}function ce(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u<i;)r=n[u],t.point(r[0],r[1],r[2]);t.lineEnd()}function le(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)ce(n[e],t,1);t.polygonEnd()}function se(){function n(n,t){n*=Ca,t=t*Ca/2+wa/4;var e=n-r,o=e>=0?1:-1,a=o*e,c=Math.cos(t),l=Math.sin(t),s=i*l,f=u*c+s*Math.cos(a),h=s*o*Math.sin(a);fc.add(Math.atan2(h,f)),r=n,u=c,i=l}var t,e,r,u,i;hc.point=function(o,a){hc.point=n,r=(t=o)*Ca,u=Math.cos(a=(e=a)*Ca/2+wa/4),i=Math.sin(a)},hc.lineEnd=function(){n(t,e)}}function fe(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function he(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function ge(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function pe(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function ve(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function de(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function me(n){return[Math.atan2(n[1],n[0]),G(n[2])]}function ye(n,t){return ia(n[0]-t[0])<Ea&&ia(n[1]-t[1])<Ea}function xe(n,t){n*=Ca;var e=Math.cos(t*=Ca);Me(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function Me(n,t,e){++gc,vc+=(n-vc)/gc,dc+=(t-dc)/gc,mc+=(e-mc)/gc}function _e(){function n(n,u){n*=Ca;var i=Math.cos(u*=Ca),o=i*Math.cos(n),a=i*Math.sin(n),c=Math.sin(u),l=Math.atan2(Math.sqrt((l=e*c-r*a)*l+(l=r*o-t*c)*l+(l=t*a-e*o)*l),t*o+e*a+r*c);pc+=l,yc+=l*(t+(t=o)),xc+=l*(e+(e=a)),Mc+=l*(r+(r=c)),Me(t,e,r)}var t,e,r;Sc.point=function(u,i){u*=Ca;var o=Math.cos(i*=Ca);t=o*Math.cos(u),e=o*Math.sin(u),r=Math.sin(i),Sc.point=n,Me(t,e,r)}}function be(){Sc.point=xe}function we(){function n(n,t){n*=Ca;var e=Math.cos(t*=Ca),o=e*Math.cos(n),a=e*Math.sin(n),c=Math.sin(t),l=u*c-i*a,s=i*o-r*c,f=r*a-u*o,h=Math.sqrt(l*l+s*s+f*f),g=r*o+u*a+i*c,p=h&&-J(g)/h,v=Math.atan2(h,g);_c+=p*l,bc+=p*s,wc+=p*f,pc+=v,yc+=v*(r+(r=o)),xc+=v*(u+(u=a)),Mc+=v*(i+(i=c)),Me(r,u,i)}var t,e,r,u,i;Sc.point=function(o,a){t=o,e=a,Sc.point=n,o*=Ca;var c=Math.cos(a*=Ca);r=c*Math.cos(o),u=c*Math.sin(o),i=Math.sin(a),Me(r,u,i)},Sc.lineEnd=function(){n(t,e),Sc.lineEnd=be,Sc.point=xe}}function Se(){return!0}function ke(n,t,e,r,u){var i=[],o=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(ye(e,r)){u.lineStart();for(var a=0;t>a;++a)u.point((e=n[a])[0],e[1]);return u.lineEnd(),void 0}var c=new Ae(e,n,null,!0),l=new Ae(e,null,c,!1);c.o=l,i.push(c),o.push(l),c=new Ae(r,n,null,!1),l=new Ae(r,null,c,!0),c.o=l,i.push(c),o.push(l)}}),o.sort(t),Ee(i),Ee(o),i.length){for(var a=0,c=e,l=o.length;l>a;++a)o[a].e=c=!c;for(var s,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;s=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,l=s.length;l>a;++a)u.point((f=s[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){s=g.p.z;for(var a=s.length-1;a>=0;--a)u.point((f=s[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,s=g.z,p=!p}while(!g.v);u.lineEnd()}}}function Ee(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r<t;)u.n=e=n[r],e.p=u,u=e;u.n=e=n[0],e.p=u}}function Ae(n,t,e,r){this.x=n,this.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Ce(n,t,e,r){return function(u,i){function o(t,e){var r=u(t,e);n(t=r[0],e=r[1])&&i.point(t,e)}function a(n,t){var e=u(n,t);d.point(e[0],e[1])}function c(){y.point=a,d.lineStart()}function l(){y.point=o,d.lineEnd()}function s(n,t){v.push([n,t]);var e=u(n,t);M.point(e[0],e[1])}function f(){M.lineStart(),v=[]}function h(){s(v[0][0],v[0][1]),M.lineEnd();var n,t=M.clean(),e=x.buffer(),r=e.length;if(v.pop(),p.push(v),v=null,r)if(1&t){n=e[0];var u,r=n.length-1,o=-1;if(r>0){for(_||(i.polygonStart(),_=!0),i.lineStart();++o<r;)i.point((u=n[o])[0],u[1]);i.lineEnd()}}else r>1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Ne))}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:l,polygonStart:function(){y.point=s,y.lineStart=f,y.lineEnd=h,g=[],p=[]},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=l,g=Vo.merge(g);var n=De(m,p);g.length?(_||(i.polygonStart(),_=!0),ke(g,Le,n,e,i)):n&&(_||(i.polygonStart(),_=!0),i.lineStart(),e(null,null,1,i),i.lineEnd()),_&&(i.polygonEnd(),_=!1),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},x=ze(),M=t(x),_=!1;return y}}function Ne(n){return n.length>1}function ze(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:v,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Le(n,t){return((n=n.x)[0]<0?n[1]-ka-Ea:ka-n[1])-((t=t.x)[0]<0?t[1]-ka-Ea:ka-t[1])}function Te(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?wa:-wa,c=ia(i-e);ia(c-wa)<Ea?(n.point(e,r=(r+o)/2>0?ka:-ka),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=wa&&(ia(e-u)<Ea&&(e-=u*Ea),ia(i-a)<Ea&&(i-=a*Ea),r=qe(e,r,i,o),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),t=0),n.point(e=i,r=o),u=a},lineEnd:function(){n.lineEnd(),e=r=0/0},clean:function(){return 2-t}}}function qe(n,t,e,r){var u,i,o=Math.sin(n-e);return ia(o)>Ea?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function Re(n,t,e,r){var u;if(null==n)u=e*ka,r.point(-wa,u),r.point(0,u),r.point(wa,u),r.point(wa,0),r.point(wa,-u),r.point(0,-u),r.point(-wa,-u),r.point(-wa,0),r.point(-wa,u);else if(ia(n[0]-t[0])>Ea){var i=n[0]<t[0]?wa:-wa;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function De(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;fc.reset();for(var a=0,c=t.length;c>a;++a){var l=t[a],s=l.length;if(s)for(var f=l[0],h=f[0],g=f[1]/2+wa/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===s&&(d=0),n=l[d];var m=n[0],y=n[1]/2+wa/4,x=Math.sin(y),M=Math.cos(y),_=m-h,b=_>=0?1:-1,w=b*_,S=w>wa,k=p*x;if(fc.add(Math.atan2(k*b*Math.sin(w),v*M+k*Math.cos(w))),i+=S?_+b*Sa:_,S^h>=e^m>=e){var E=ge(fe(f),fe(n));de(E);var A=ge(u,E);de(A);var C=(S^_>=0?-1:1)*G(A[2]);(r>C||r===C&&(E[0]||E[1]))&&(o+=S^_>=0?1:-1)}if(!d++)break;h=m,p=x,v=M,f=n}}return(-Ea>i||Ea>i&&0>fc)^1&o}function Pe(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,c,l,s;return{lineStart:function(){l=c=!1,s=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0>f?wa:-wa),h):0;if(!e&&(l=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(ye(e,g)||ye(p,g))&&(p[0]+=Ea,p[1]+=Ea,v=t(p[0],p[1]))),v!==c)s=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^v){var m;d&i||!(m=r(p,e,!0))||(s=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&ye(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return s|(l&&c)<<1}}}function r(n,t,e){var r=fe(n),u=fe(t),o=[1,0,0],a=ge(r,u),c=he(a,a),l=a[0],s=c-l*l;if(!s)return!e&&n;var f=i*c/s,h=-i*l/s,g=ge(o,a),p=ve(o,f),v=ve(a,h);pe(p,v);var d=g,m=he(p,d),y=he(d,d),x=m*m-y*(he(p,p)-1);if(!(0>x)){var M=Math.sqrt(x),_=ve(d,(-m-M)/y);if(pe(_,p),_=me(_),!e)return _;var b,w=n[0],S=t[0],k=n[1],E=t[1];w>S&&(b=w,w=S,S=b);var A=S-w,C=ia(A-wa)<Ea,N=C||Ea>A;if(!C&&k>E&&(b=k,k=E,E=b),N?C?k+E>0^_[1]<(ia(_[0]-w)<Ea?k:E):k<=_[1]&&_[1]<=E:A>wa^(w<=_[0]&&_[0]<=S)){var z=ve(d,(-m+M)/y);return pe(z,p),[_,me(z)]}}}function u(t,e){var r=o?n:wa-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=ia(i)>Ea,c=sr(n,6*Ca);return Ce(t,e,c,o?[0,-n]:[-wa,n-wa])}function Ue(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,l=o.y,s=a.x,f=a.y,h=0,g=1,p=s-c,v=f-l;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-l,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-l,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:l+h*v}),1>g&&(u.b={x:c+g*p,y:l+g*v}),u}}}}}}function je(n,t,e,r){function u(r,u){return ia(r[0]-n)<Ea?u>0?0:3:ia(r[0]-e)<Ea?u>0?2:1:ia(r[1]-t)<Ea?u>0?1:0:u>0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=d[u],c=a.length,l=a[0];c>o;++o)i=a[o],l[1]<=r?i[1]>r&&W(l,i,n)>0&&++t:i[1]<=r&&W(l,i,n)<0&&--t,l=i;return 0!==t}function l(i,a,c,l){var s=0,f=0;if(null==i||(s=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do l.point(0===s||3===s?n:e,s>1?r:t);while((s=(s+c+4)%4)!==f)}else l.point(a[0],a[1])}function s(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){s(n,t)&&a.point(n,t)}function h(){N.point=p,d&&d.push(m=[]),S=!0,w=!1,_=b=0/0}function g(){v&&(p(y,x),M&&w&&A.rejoin(),v.push(A.buffer())),N.point=f,w&&a.lineEnd()}function p(n,t){n=Math.max(-Ec,Math.min(Ec,n)),t=Math.max(-Ec,Math.min(Ec,t));var e=s(n,t);if(d&&m.push([n,t]),S)y=n,x=t,M=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:_,y:b},b:{x:n,y:t}};C(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}_=n,b=t,w=e}var v,d,m,y,x,M,_,b,w,S,k,E=a,A=ze(),C=Ue(n,t,e,r),N={point:f,lineStart:h,lineEnd:g,polygonStart:function(){a=A,v=[],d=[],k=!0},polygonEnd:function(){a=E,v=Vo.merge(v);var t=c([n,r]),e=k&&t,u=v.length;(e||u)&&(a.polygonStart(),e&&(a.lineStart(),l(null,null,1,a),a.lineEnd()),u&&ke(v,i,t,l,a),a.polygonEnd()),v=d=m=null}};return N}}function He(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function Fe(n){var t=0,e=wa/3,r=er(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*wa/180,e=n[1]*wa/180):[180*(t/wa),180*(e/wa)]},u}function Oe(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,G((i-(n*n+e*e)*u*u)/(2*u))]},e}function Ye(){function n(n,t){Cc+=u*n-r*t,r=n,u=t}var t,e,r,u;qc.point=function(i,o){qc.point=n,t=r=i,e=u=o},qc.lineEnd=function(){n(t,e)}}function Ie(n,t){Nc>n&&(Nc=n),n>Lc&&(Lc=n),zc>t&&(zc=t),t>Tc&&(Tc=t)}function Ze(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=Ve(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=Ve(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Ve(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Xe(n,t){vc+=n,dc+=t,++mc}function $e(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);yc+=o*(t+n)/2,xc+=o*(e+r)/2,Mc+=o,Xe(t=n,e=r)}var t,e;Dc.point=function(r,u){Dc.point=n,Xe(t=r,e=u)}}function Be(){Dc.point=Xe}function We(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);yc+=o*(r+n)/2,xc+=o*(u+t)/2,Mc+=o,o=u*n-r*t,_c+=o*(r+n),bc+=o*(u+t),wc+=3*o,Xe(r=n,u=t)}var t,e,r,u;Dc.point=function(i,o){Dc.point=n,Xe(t=r=i,e=u=o)},Dc.lineEnd=function(){n(t,e)}}function Je(n){function t(t,e){n.moveTo(t,e),n.arc(t,e,o,0,Sa)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:v};return a}function Ge(n){function t(n){return(a?r:e)(n)}function e(t){return nr(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){x=0/0,S.point=i,t.lineStart()}function i(e,r){var i=fe([e,r]),o=n(e,r);u(x,M,y,_,b,w,x=o[0],M=o[1],y=e,_=i[0],b=i[1],w=i[2],a,t),t.point(x,M)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=l,S.lineEnd=s}function l(n,t){i(f=n,h=t),g=x,p=M,v=_,d=b,m=w,S.point=i}function s(){u(x,M,y,_,b,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,x,M,_,b,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,l,s,f,h,g,p,v,d,m){var y=s-t,x=f-e,M=y*y+x*x;if(M>4*i&&d--){var _=a+g,b=c+p,w=l+v,S=Math.sqrt(_*_+b*b+w*w),k=Math.asin(w/=S),E=ia(ia(w)-1)<Ea||ia(r-h)<Ea?(r+h)/2:Math.atan2(b,_),A=n(E,k),C=A[0],N=A[1],z=C-t,L=N-e,T=x*z-y*L;(T*T/M>i||ia((y*z+x*L)/M-.5)>.3||o>a*g+c*p+l*v)&&(u(t,e,r,a,c,l,C,N,E,_/=S,b/=S,w,d,m),m.point(C,N),u(C,N,E,_,b,w,s,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*Ca),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)
+},t}function Ke(n){var t=Ge(function(t,e){return n([t*Na,e*Na])});return function(n){return rr(t(n))}}function Qe(n){this.stream=n}function nr(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function tr(n){return er(function(){return n})()}function er(n){function t(n){return n=a(n[0]*Ca,n[1]*Ca),[n[0]*h+c,l-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(l-n[1])/h),n&&[n[0]*Na,n[1]*Na]}function r(){a=He(o=or(m,y,x),i);var n=i(v,d);return c=g-n[0]*h,l=p+n[1]*h,u()}function u(){return s&&(s.valid=!1,s=null),t}var i,o,a,c,l,s,f=Ge(function(n,t){return n=i(n,t),[n[0]*h+c,l-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,y=0,x=0,M=kc,_=wt,b=null,w=null;return t.stream=function(n){return s&&(s.valid=!1),s=rr(M(o,f(_(n)))),s.valid=!0,s},t.clipAngle=function(n){return arguments.length?(M=null==n?(b=n,kc):Pe((b=+n)*Ca),u()):b},t.clipExtent=function(n){return arguments.length?(w=n,_=n?je(n[0][0],n[0][1],n[1][0],n[1][1]):wt,u()):w},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Ca,d=n[1]%360*Ca,r()):[v*Na,d*Na]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Ca,y=n[1]%360*Ca,x=n.length>2?n[2]%360*Ca:0,r()):[m*Na,y*Na,x*Na]},Vo.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function rr(n){return nr(n,function(t,e){n.point(t*Ca,e*Ca)})}function ur(n,t){return[n,t]}function ir(n,t){return[n>wa?n-Sa:-wa>n?n+Sa:n,t]}function or(n,t,e){return n?t||e?He(cr(n),lr(t,e)):cr(n):t||e?lr(t,e):ir}function ar(n){return function(t,e){return t+=n,[t>wa?t-Sa:-wa>t?t+Sa:t,e]}}function cr(n){var t=ar(n);return t.invert=ar(-n),t}function lr(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*r+a*u;return[Math.atan2(c*i-s*o,a*r-l*u),G(s*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,l=Math.sin(t),s=l*i-c*o;return[Math.atan2(c*i+l*o,a*r+s*u),G(s*r-a*u)]},e}function sr(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=fr(e,u),i=fr(e,i),(o>0?i>u:u>i)&&(u+=o*Sa)):(u=n+o*Sa,i=n-.5*c);for(var l,s=u;o>0?s>i:i>s;s-=c)a.point((l=me([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],l[1])}}function fr(n,t){var e=fe(t);e[0]-=n,de(e);var r=J(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Ea)%(2*Math.PI)}function hr(n,t,e){var r=Vo.range(n,t-Ea,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function gr(n,t,e){var r=Vo.range(n,t-Ea,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function pr(n){return n.source}function vr(n){return n.target}function dr(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),l=u*Math.sin(n),s=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(tt(r-t)+u*o*tt(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*s,u=e*l+t*f,o=e*i+t*a;return[Math.atan2(u,r)*Na,Math.atan2(o,Math.sqrt(r*r+u*u))*Na]}:function(){return[n*Na,t*Na]};return p.distance=h,p}function mr(){function n(n,u){var i=Math.sin(u*=Ca),o=Math.cos(u),a=ia((n*=Ca)-t),c=Math.cos(a);Pc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;Uc.point=function(u,i){t=u*Ca,e=Math.sin(i*=Ca),r=Math.cos(i),Uc.point=n},Uc.lineEnd=function(){Uc.point=Uc.lineEnd=v}}function yr(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function xr(n,t){function e(n,t){o>0?-ka+Ea>t&&(t=-ka+Ea):t>ka-Ea&&(t=ka-Ea);var e=o/Math.pow(u(t),i);return[e*Math.sin(i*n),o-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(wa/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),o=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=o-t,r=B(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(o/r,1/i))-ka]},e):_r}function Mr(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return ia(u)<Ea?ur:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-B(u)*Math.sqrt(n*n+e*e)]},e)}function _r(n,t){return[n,Math.log(Math.tan(wa/4+t/2))]}function br(n){var t,e=tr(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=u.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var o=i.apply(e,arguments);if(o===e){if(t=null==n){var a=wa*r(),c=u();i([[c[0]-a,c[1]-a],[c[0]+a,c[1]+a]])}}else t&&(o=null);return o},e.clipExtent(null)}function wr(n,t){return[Math.log(Math.tan(wa/4+t/2)),-n]}function Sr(n){return n[0]}function kr(n){return n[1]}function Er(n){for(var t=n.length,e=[0,1],r=2,u=2;t>u;u++){for(;r>1&&W(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function Ar(n,t){return n[0]-t[0]||n[1]-t[1]}function Cr(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Nr(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],l=e[1],s=t[1]-c,f=r[1]-l,h=(a*(c-l)-f*(u-i))/(f*o-a*s);return[u+h*o,c+h*s]}function zr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Lr(){Kr(this),this.edge=this.site=this.circle=null}function Tr(n){var t=Wc.pop()||new Lr;return t.site=n,t}function qr(n){Ir(n),Xc.remove(n),Wc.push(n),Kr(n)}function Rr(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];qr(n);for(var c=i;c.circle&&ia(e-c.circle.x)<Ea&&ia(r-c.circle.cy)<Ea;)i=c.P,a.unshift(c),qr(c),c=i;a.unshift(c),Ir(c);for(var l=o;l.circle&&ia(e-l.circle.x)<Ea&&ia(r-l.circle.cy)<Ea;)o=l.N,a.push(l),qr(l),l=o;a.push(l),Ir(l);var s,f=a.length;for(s=1;f>s;++s)l=a[s],c=a[s-1],Wr(l.edge,c.site,l.site,u);c=a[0],l=a[f-1],l.edge=$r(c.site,l.site,null,u),Yr(c),Yr(l)}function Dr(n){for(var t,e,r,u,i=n.x,o=n.y,a=Xc._;a;)if(r=Pr(a,o)-i,r>Ea)a=a.L;else{if(u=i-Ur(a,o),!(u>Ea)){r>-Ea?(t=a.P,e=a):u>-Ea?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Tr(n);if(Xc.insert(t,c),t||e){if(t===e)return Ir(t),e=Tr(t.site),Xc.insert(c,e),c.edge=e.edge=$r(t.site,c.site),Yr(t),Yr(e),void 0;if(!e)return c.edge=$r(t.site,c.site),void 0;Ir(t),Ir(e);var l=t.site,s=l.x,f=l.y,h=n.x-s,g=n.y-f,p=e.site,v=p.x-s,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,x=v*v+d*d,M={x:(d*y-g*x)/m+s,y:(h*x-v*y)/m+f};Wr(e.edge,l,p,M),c.edge=$r(l,n,null,M),e.edge=$r(n,p,null,M),Yr(t),Yr(e)}}function Pr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,l=c-t;if(!l)return a;var s=a-r,f=1/i-1/l,h=s/l;return f?(-h+Math.sqrt(h*h-2*f*(s*s/(-2*l)-c+l/2+u-i/2)))/f+r:(r+a)/2}function Ur(n,t){var e=n.N;if(e)return Pr(e,t);var r=n.site;return r.y===t?r.x:1/0}function jr(n){this.site=n,this.edges=[]}function Hr(n){for(var t,e,r,u,i,o,a,c,l,s,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Vc,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(a=i.edges,c=a.length,o=0;c>o;)s=a[o].end(),r=s.x,u=s.y,l=a[++o%c].start(),t=l.x,e=l.y,(ia(r-t)>Ea||ia(u-e)>Ea)&&(a.splice(o,0,new Jr(Br(i.site,s,ia(r-f)<Ea&&p-u>Ea?{x:f,y:ia(t-f)<Ea?e:p}:ia(u-p)<Ea&&h-r>Ea?{x:ia(e-p)<Ea?t:h,y:p}:ia(r-h)<Ea&&u-g>Ea?{x:h,y:ia(t-h)<Ea?e:g}:ia(u-g)<Ea&&r-f>Ea?{x:ia(e-g)<Ea?t:f,y:g}:null),i.site,null)),++c)}function Fr(n,t){return t.angle-n.angle}function Or(){Kr(this),this.x=this.y=this.arc=this.site=this.cy=null}function Yr(n){var t=n.P,e=n.N;if(t&&e){var r=t.site,u=n.site,i=e.site;if(r!==i){var o=u.x,a=u.y,c=r.x-o,l=r.y-a,s=i.x-o,f=i.y-a,h=2*(c*f-l*s);if(!(h>=-Aa)){var g=c*c+l*l,p=s*s+f*f,v=(f*g-l*p)/h,d=(c*p-s*g)/h,f=d+a,m=Jc.pop()||new Or;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,x=Bc._;x;)if(m.y<x.y||m.y===x.y&&m.x<=x.x){if(!x.L){y=x.P;break}x=x.L}else{if(!x.R){y=x;break}x=x.R}Bc.insert(y,m),y||($c=m)}}}}function Ir(n){var t=n.circle;t&&(t.P||($c=t.N),Bc.remove(t),Jc.push(t),Kr(t),n.circle=null)}function Zr(n){for(var t,e=Zc,r=Ue(n[0][0],n[0][1],n[1][0],n[1][1]),u=e.length;u--;)t=e[u],(!Vr(t,n)||!r(t)||ia(t.a.x-t.b.x)<Ea&&ia(t.a.y-t.b.y)<Ea)&&(t.a=t.b=null,e.splice(u,1))}function Vr(n,t){var e=n.b;if(e)return!0;var r,u,i=n.a,o=t[0][0],a=t[1][0],c=t[0][1],l=t[1][1],s=n.l,f=n.r,h=s.x,g=s.y,p=f.x,v=f.y,d=(h+p)/2,m=(g+v)/2;if(v===g){if(o>d||d>=a)return;if(h>p){if(i){if(i.y>=l)return}else i={x:d,y:c};e={x:d,y:l}}else{if(i){if(i.y<c)return}else i={x:d,y:l};e={x:d,y:c}}}else if(r=(h-p)/(v-g),u=m-r*d,-1>r||r>1)if(h>p){if(i){if(i.y>=l)return}else i={x:(c-u)/r,y:c};e={x:(l-u)/r,y:l}}else{if(i){if(i.y<c)return}else i={x:(l-u)/r,y:l};e={x:(c-u)/r,y:c}}else if(v>g){if(i){if(i.x>=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.x<o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}return n.a=i,n.b=e,!0}function Xr(n,t){this.l=n,this.r=t,this.a=this.b=null}function $r(n,t,e,r){var u=new Xr(n,t);return Zc.push(u),e&&Wr(u,n,t,e),r&&Wr(u,t,n,r),Vc[n.i].edges.push(new Jr(u,n,t)),Vc[t.i].edges.push(new Jr(u,t,n)),u}function Br(n,t,e){var r=new Xr(n,null);return r.a=t,r.b=e,Zc.push(r),r}function Wr(n,t,e,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function Jr(n,t,e){var r=n.a,u=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(u.x-r.x,r.y-u.y):Math.atan2(r.x-u.x,u.y-r.y)}function Gr(){this._=null}function Kr(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function Qr(n,t){var e=t,r=t.R,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function nu(n,t){var e=t,r=t.L,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function tu(n){for(;n.L;)n=n.L;return n}function eu(n,t){var e,r,u,i=n.sort(ru).pop();for(Zc=[],Vc=new Array(n.length),Xc=new Gr,Bc=new Gr;;)if(u=$c,i&&(!u||i.y<u.y||i.y===u.y&&i.x<u.x))(i.x!==e||i.y!==r)&&(Vc[i.i]=new jr(i),Dr(i),e=i.x,r=i.y),i=n.pop();else{if(!u)break;Rr(u.arc)}t&&(Zr(t),Hr(t));var o={cells:Vc,edges:Zc};return Xc=Bc=Zc=Vc=null,o}function ru(n,t){return t.y-n.y||t.x-n.x}function uu(n,t,e){return(n.x-e.x)*(t.y-n.y)-(n.x-t.x)*(e.y-n.y)}function iu(n){return n.x}function ou(n){return n.y}function au(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function cu(n,t,e,r,u,i){if(!n(t,e,r,u,i)){var o=.5*(e+u),a=.5*(r+i),c=t.nodes;c[0]&&cu(n,c[0],e,r,o,a),c[1]&&cu(n,c[1],o,r,u,a),c[2]&&cu(n,c[2],e,a,o,i),c[3]&&cu(n,c[3],o,a,u,i)}}function lu(n,t){n=Vo.rgb(n),t=Vo.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,o=t.g-r,a=t.b-u;return function(n){return"#"+dt(Math.round(e+i*n))+dt(Math.round(r+o*n))+dt(Math.round(u+a*n))}}function su(n,t){var e,r={},u={};for(e in n)e in t?r[e]=gu(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function fu(n,t){return t-=n=+n,function(e){return n+t*e}}function hu(n,t){var e,r,u,i=Kc.lastIndex=Qc.lastIndex=0,o=-1,a=[],c=[];for(n+="",t+="";(e=Kc.exec(n))&&(r=Qc.exec(t));)(u=r.index)>i&&(u=t.slice(i,u),a[o]?a[o]+=u:a[++o]=u),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,c.push({i:o,x:fu(e,r)})),i=Qc.lastIndex;return i<t.length&&(u=t.slice(i),a[o]?a[o]+=u:a[++o]=u),a.length<2?c[0]?(t=c[0].x,function(n){return t(n)+""}):function(){return t}:(t=c.length,function(n){for(var e,r=0;t>r;++r)a[(e=c[r]).i]=e.x(n);return a.join("")})}function gu(n,t){for(var e,r=Vo.interpolators.length;--r>=0&&!(e=Vo.interpolators[r](n,t)););return e}function pu(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(gu(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function vu(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function du(n){return function(t){return 1-n(1-t)}}function mu(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function yu(n){return n*n}function xu(n){return n*n*n}function Mu(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function _u(n){return function(t){return Math.pow(t,n)}}function bu(n){return 1-Math.cos(n*ka)}function wu(n){return Math.pow(2,10*(n-1))}function Su(n){return 1-Math.sqrt(1-n*n)}function ku(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Sa*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Sa/t)}}function Eu(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Au(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Cu(n,t){n=Vo.hcl(n),t=Vo.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return ot(e+i*n,r+o*n,u+a*n)+""}}function Nu(n,t){n=Vo.hsl(n),t=Vo.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return ut(e+i*n,r+o*n,u+a*n)+""}}function zu(n,t){n=Vo.lab(n),t=Vo.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return ct(e+i*n,r+o*n,u+a*n)+""}}function Lu(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Tu(n){var t=[n.a,n.b],e=[n.c,n.d],r=Ru(t),u=qu(t,e),i=Ru(Du(e,t,-u))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*Na,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Na:0}function qu(n,t){return n[0]*t[0]+n[1]*t[1]}function Ru(n){var t=Math.sqrt(qu(n,n));return t&&(n[0]/=t,n[1]/=t),t}function Du(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Pu(n,t){var e,r=[],u=[],i=Vo.transform(n),o=Vo.transform(t),a=i.translate,c=o.translate,l=i.rotate,s=o.rotate,f=i.skew,h=o.skew,g=i.scale,p=o.scale;return a[0]!=c[0]||a[1]!=c[1]?(r.push("translate(",null,",",null,")"),u.push({i:1,x:fu(a[0],c[0])},{i:3,x:fu(a[1],c[1])})):c[0]||c[1]?r.push("translate("+c+")"):r.push(""),l!=s?(l-s>180?s+=360:s-l>180&&(l+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:fu(l,s)})):s&&r.push(r.pop()+"rotate("+s+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:fu(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:fu(g[0],p[0])},{i:e-2,x:fu(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++i<e;)r[(t=u[i]).i]=t.x(n);return r.join("")}}function Uu(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return(e-n)*t}}function ju(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return Math.max(0,Math.min(1,(e-n)*t))}}function Hu(n){for(var t=n.source,e=n.target,r=Ou(t,e),u=[t];t!==r;)t=t.parent,u.push(t);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function Fu(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Ou(n,t){if(n===t)return n;for(var e=Fu(n),r=Fu(t),u=e.pop(),i=r.pop(),o=null;u===i;)o=u,u=e.pop(),i=r.pop();return o}function Yu(n){n.fixed|=2}function Iu(n){n.fixed&=-7}function Zu(n){n.fixed|=4,n.px=n.x,n.py=n.y}function Vu(n){n.fixed&=-5}function Xu(n,t,e){var r=0,u=0;if(n.charge=0,!n.leaf)for(var i,o=n.nodes,a=o.length,c=-1;++c<a;)i=o[c],null!=i&&(Xu(i,t,e),n.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var l=t*e[n.point.index];n.charge+=n.pointCharge=l,r+=l*n.point.x,u+=l*n.point.y}n.cx=r/n.charge,n.cy=u/n.charge}function $u(n,t){return Vo.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=Qu,n}function Bu(n,t){for(var e=[n];null!=(n=e.pop());)if(t(n),(u=n.children)&&(r=u.length))for(var r,u;--r>=0;)e.push(u[r])}function Wu(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(i=n.children)&&(u=i.length))for(var u,i,o=-1;++o<u;)e.push(i[o]);for(;null!=(n=r.pop());)t(n)}function Ju(n){return n.children}function Gu(n){return n.value}function Ku(n,t){return t.value-n.value}function Qu(n){return Vo.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function ni(n){return n.x}function ti(n){return n.y}function ei(n,t,e){n.y0=t,n.y=e}function ri(n){return Vo.range(n.length)}function ui(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function ii(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i>e;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function oi(n){return n.reduce(ai,0)}function ai(n,t){return n+t[1]}function ci(n,t){return li(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function li(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function si(n){return[Vo.min(n),Vo.max(n)]}function fi(n,t){return n.value-t.value}function hi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function gi(n,t){n._pack_next=t,t._pack_prev=n}function pi(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function vi(n){function t(n){s=Math.min(n.x-n.r,s),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(l=e.length)){var e,r,u,i,o,a,c,l,s=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(di),r=e[0],r.x=-r.r,r.y=0,t(r),l>1&&(u=e[1],u.x=u.r,u.y=0,t(u),l>2))for(i=e[2],xi(r,u,i),t(i),hi(r,i),r._pack_prev=i,hi(i,u),u=r._pack_next,o=3;l>o;o++){xi(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(pi(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!pi(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.r<r.r?gi(r,u=a):gi(r=c,u),o--):(hi(r,i),u=i,t(i))}var m=(s+f)/2,y=(h+g)/2,x=0;for(o=0;l>o;o++)i=e[o],i.x-=m,i.y-=y,x=Math.max(x,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=x,e.forEach(mi)}}function di(n){n._pack_next=n._pack_prev=n}function mi(n){delete n._pack_next,delete n._pack_prev}function yi(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++i<o;)yi(u[i],t,e,r)}function xi(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&&(u||i)){var o=t.r+e.r,a=u*u+i*i;o*=o,r*=r;var c=.5+(r-o)/(2*a),l=Math.sqrt(Math.max(0,2*o*(r+a)-(r-=a)*r-o*o))/(2*a);e.x=n.x+c*u+l*i,e.y=n.y+c*i-l*u}else e.x=n.x+r,e.y=n.y}function Mi(n,t){return n.parent==t.parent?1:2}function _i(n){var t=n.children;return t.length?t[0]:n.t}function bi(n){var t,e=n.children;return(t=e.length)?e[t-1]:n.t}function wi(n,t,e){var r=e/(t.i-n.i);t.c-=r,t.s+=e,n.c+=r,t.z+=e,t.m+=e}function Si(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i>=0;)t=u[i],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function ki(n,t,e){return n.a.parent===t.parent?n.a:e}function Ei(n){return 1+Vo.max(n,function(n){return n.y})}function Ai(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Ci(n){var t=n.children;return t&&t.length?Ci(t[0]):n}function Ni(n){var t,e=n.children;return e&&(t=e.length)?Ni(e[t-1]):n}function zi(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Li(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Ti(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function qi(n){return n.rangeExtent?n.rangeExtent():Ti(n.range())}function Ri(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Di(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function Pi(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:sl}function Ui(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++o<=a;)u.push(e(n[o-1],n[o])),i.push(r(t[o-1],t[o]));return function(t){var e=Vo.bisect(n,t,1,a)-1;return i[e](u[e](t))}}function ji(n,t,e,r){function u(){var u=Math.min(n.length,t.length)>2?Ui:Ri,c=r?ju:Uu;return o=u(n,t,c,e),a=u(t,n,c,gu),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Lu)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Yi(n,t)},i.tickFormat=function(t,e){return Ii(n,t,e)},i.nice=function(t){return Fi(n,t),u()},i.copy=function(){return ji(n,t,e,r)},u()}function Hi(n,t){return Vo.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Fi(n,t){return Di(n,Pi(Oi(n,t)[2]))}function Oi(n,t){null==t&&(t=10);var e=Ti(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Yi(n,t){return Vo.range.apply(Vo,Oi(n,t))}function Ii(n,t,e){var r=Oi(n,t);if(e){var u=Ka.exec(e);if(u.shift(),"s"===u[8]){var i=Vo.formatPrefix(Math.max(ia(r[0]),ia(r[1])));return u[7]||(u[7]="."+Zi(i.scale(r[2]))),u[8]="f",e=Vo.format(u.join("")),function(n){return e(i.scale(n))+i.symbol}}u[7]||(u[7]="."+Vi(u[8],r)),e=u.join("")}else e=",."+Zi(r[2])+"f";return Vo.format(e)}function Zi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Vi(n,t){var e=Zi(t[2]);return n in fl?Math.abs(e-Zi(Math.max(ia(t[0]),ia(t[1]))))+ +("e"!==n):e-2*("%"===n)}function Xi(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=Di(r.map(u),e?Math:gl);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=Ti(r),o=[],a=n[0],c=n[1],l=Math.floor(u(a)),s=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(s-l)){if(e){for(;s>l;l++)for(var h=1;f>h;h++)o.push(i(l)*h);o.push(i(l))}else for(o.push(i(l));l++<s;)for(var h=f-1;h>0;h--)o.push(i(l)*h);for(l=0;o[l]<a;l++);for(s=o.length;o[s-1]>c;s--);o=o.slice(l,s)}return o},o.tickFormat=function(n,t){if(!arguments.length)return hl;arguments.length<2?t=hl:"function"!=typeof t&&(t=Vo.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):""}},o.copy=function(){return Xi(n.copy(),t,e,r)},Hi(o,n)}function $i(n,t,e){function r(t){return n(u(t))}var u=Bi(t),i=Bi(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Yi(e,n)},r.tickFormat=function(n,t){return Ii(e,n,t)},r.nice=function(n){return r.domain(Fi(e,n))},r.exponent=function(o){return arguments.length?(u=Bi(t=o),i=Bi(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return $i(n.copy(),t,e)},Hi(r,n)}function Bi(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function Wi(n,t){function e(e){return i[((u.get(e)||("range"===t.t?u.set(e,n.push(e)):0/0))-1)%i.length]}function r(t,e){return Vo.range(n.length).map(function(n){return t+e*n})}var u,i,a;return e.domain=function(r){if(!arguments.length)return n;n=[],u=new o;for(var i,a=-1,c=r.length;++a<c;)u.has(i=r[a])||u.set(i,n.push(i));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(i=n,a=0,t={t:"range",a:arguments},e):i},e.rangePoints=function(u,o){arguments.length<2&&(o=0);var c=u[0],l=u[1],s=(l-c)/(Math.max(1,n.length-1)+o);return i=r(n.length<2?(c+l)/2:c+s*o/2,s),a=0,t={t:"rangePoints",a:arguments},e},e.rangeBands=function(u,o,c){arguments.length<2&&(o=0),arguments.length<3&&(c=o);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=(f-s)/(n.length-o+2*c);return i=r(s+h*c,h),l&&i.reverse(),a=h*(1-o),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,o,c){arguments.length<2&&(o=0),arguments.length<3&&(c=o);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=Math.floor((f-s)/(n.length-o+2*c)),g=f-s-(n.length-o)*h;return i=r(s+Math.round(g/2),h),l&&i.reverse(),a=Math.round(h*(1-o)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return a},e.rangeExtent=function(){return Ti(t.a[0])},e.copy=function(){return Wi(n,t)},e.domain(n)}function Ji(e,r){function u(){var n=0,t=r.length;for(o=[];++n<t;)o[n-1]=Vo.quantile(e,n/t);return i}function i(n){return isNaN(n=+n)?void 0:r[Vo.bisect(o,n)]}var o;return i.domain=function(r){return arguments.length?(e=r.filter(t).sort(n),u()):e},i.range=function(n){return arguments.length?(r=n,u()):r},i.quantiles=function(){return o},i.invertExtent=function(n){return n=r.indexOf(n),0>n?[0/0,0/0]:[n>0?o[n-1]:e[0],n<o.length?o[n]:e[e.length-1]]},i.copy=function(){return Ji(e,r)},u()}function Gi(n,t,e){function r(t){return e[Math.max(0,Math.min(o,Math.floor(i*(t-n))))]}function u(){return i=e.length/(t-n),o=e.length-1,r}var i,o;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],u()):[n,t]},r.range=function(n){return arguments.length?(e=n,u()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return Gi(n,t,e)},u()}function Ki(n,t){function e(e){return e>=e?t[Vo.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return Ki(n,t)},e}function Qi(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Yi(n,t)},t.tickFormat=function(t,e){return Ii(n,t,e)},t.copy=function(){return Qi(n)},t}function no(n){return n.innerRadius}function to(n){return n.outerRadius}function eo(n){return n.startAngle}function ro(n){return n.endAngle}function uo(n){function t(t){function o(){l.push("M",i(n(s),a))}for(var c,l=[],s=[],f=-1,h=t.length,g=bt(e),p=bt(r);++f<h;)u.call(this,c=t[f],f)?s.push([+g.call(this,c,f),+p.call(this,c,f)]):s.length&&(o(),s=[]);return s.length&&o(),l.length?l.join(""):null}var e=Sr,r=kr,u=Se,i=io,o=i.key,a=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(u=n,t):u},t.interpolate=function(n){return arguments.length?(o="function"==typeof n?i=n:(i=Ml.get(n)||io).key,t):o},t.tension=function(n){return arguments.length?(a=n,t):a},t}function io(n){return n.join("L")}function oo(n){return io(n)+"Z"}function ao(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r[0]+(r=n[t])[0])/2,"V",r[1]);return e>1&&u.push("H",r[0]),u.join("")}function co(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("V",(r=n[t])[1],"H",r[0]);return u.join("")}function lo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r=n[t])[0],"V",r[1]);return u.join("")}function so(n,t){return n.length<4?io(n):n[1]+go(n.slice(1,n.length-1),po(n,t))}function fo(n,t){return n.length<3?io(n):n[0]+go((n.push(n[0]),n),po([n[n.length-2]].concat(n,[n[1]]),t))}function ho(n,t){return n.length<3?io(n):n[0]+go(n,po(n,t))}function go(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return io(n);var e=n.length!=t.length,r="",u=n[0],i=n[1],o=t[0],a=o,c=1;if(e&&(r+="Q"+(i[0]-2*o[0]/3)+","+(i[1]-2*o[1]/3)+","+i[0]+","+i[1],u=n[1],c=2),t.length>1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var l=2;l<t.length;l++,c++)i=n[c],a=t[l],r+="S"+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1]}if(e){var s=n[c];r+="Q"+(i[0]+2*a[0]/3)+","+(i[1]+2*a[1]/3)+","+s[0]+","+s[1]}return r}function po(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],o=n[1],a=1,c=n.length;++a<c;)e=i,i=o,o=n[a],r.push([u*(o[0]-e[0]),u*(o[1]-e[1])]);return r}function vo(n){if(n.length<3)return io(n);var t=1,e=n.length,r=n[0],u=r[0],i=r[1],o=[u,u,u,(r=n[1])[0]],a=[i,i,i,r[1]],c=[u,",",i,"L",Mo(wl,o),",",Mo(wl,a)];for(n.push(n[e-1]);++t<=e;)r=n[t],o.shift(),o.push(r[0]),a.shift(),a.push(r[1]),_o(c,o,a);return n.pop(),c.push("L",r),c.join("")}function mo(n){if(n.length<4)return io(n);for(var t,e=[],r=-1,u=n.length,i=[0],o=[0];++r<3;)t=n[r],i.push(t[0]),o.push(t[1]);for(e.push(Mo(wl,i)+","+Mo(wl,o)),--r;++r<u;)t=n[r],i.shift(),i.push(t[0]),o.shift(),o.push(t[1]),_o(e,i,o);return e.join("")}function yo(n){for(var t,e,r=-1,u=n.length,i=u+4,o=[],a=[];++r<4;)e=n[r%u],o.push(e[0]),a.push(e[1]);for(t=[Mo(wl,o),",",Mo(wl,a)],--r;++r<i;)e=n[r%u],o.shift(),o.push(e[0]),a.shift(),a.push(e[1]),_o(t,o,a);return t.join("")}function xo(n,t){var e=n.length-1;if(e)for(var r,u,i=n[0][0],o=n[0][1],a=n[e][0]-i,c=n[e][1]-o,l=-1;++l<=e;)r=n[l],u=l/e,r[0]=t*r[0]+(1-t)*(i+u*a),r[1]=t*r[1]+(1-t)*(o+u*c);return vo(n)}function Mo(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function _o(n,t,e){n.push("C",Mo(_l,t),",",Mo(_l,e),",",Mo(bl,t),",",Mo(bl,e),",",Mo(wl,t),",",Mo(wl,e))}function bo(n,t){return(t[1]-n[1])/(t[0]-n[0])}function wo(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],o=r[0]=bo(u,i);++t<e;)r[t]=(o+(o=bo(u=i,i=n[t+1])))/2;return r[t]=o,r}function So(n){for(var t,e,r,u,i=[],o=wo(n),a=-1,c=n.length-1;++a<c;)t=bo(n[a],n[a+1]),ia(t)<Ea?o[a]=o[a+1]=0:(e=o[a]/t,r=o[a+1]/t,u=e*e+r*r,u>9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function ko(n){return n.length<3?io(n):n[0]+go(n,So(n))}function Eo(n){for(var t,e,r,u=-1,i=n.length;++u<i;)t=n[u],e=t[0],r=t[1]+yl,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function Ao(n){function t(t){function c(){v.push("M",a(n(m),f),s,l(n(d.reverse()),f),"Z")}for(var h,g,p,v=[],d=[],m=[],y=-1,x=t.length,M=bt(e),_=bt(u),b=e===r?function(){return g}:bt(r),w=u===i?function(){return p}:bt(i);++y<x;)o.call(this,h=t[y],y)?(d.push([g=+M.call(this,h,y),p=+_.call(this,h,y)]),m.push([+b.call(this,h,y),+w.call(this,h,y)])):d.length&&(c(),d=[],m=[]);return d.length&&c(),v.length?v.join(""):null}var e=Sr,r=Sr,u=0,i=kr,o=Se,a=io,c=a.key,l=a,s="L",f=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(u=i=n,t):i},t.y0=function(n){return arguments.length?(u=n,t):u},t.y1=function(n){return arguments.length?(i=n,t):i},t.defined=function(n){return arguments.length?(o=n,t):o},t.interpolate=function(n){return arguments.length?(c="function"==typeof n?a=n:(a=Ml.get(n)||io).key,l=a.reverse||a,s=a.closed?"M":"L",t):c},t.tension=function(n){return arguments.length?(f=n,t):f},t}function Co(n){return n.radius}function No(n){return[n.x,n.y]}function zo(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]+yl;return[e*Math.cos(r),e*Math.sin(r)]}}function Lo(){return 64}function To(){return"circle"}function qo(n){var t=Math.sqrt(n/wa);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function Ro(n,t){return sa(n,Nl),n.id=t,n}function Do(n,t,e,r){var u=n.id;return P(n,"function"==typeof e?function(n,i,o){n.__transition__[u].tween.set(t,r(e.call(n,n.__data__,i,o)))}:(e=r(e),function(n){n.__transition__[u].tween.set(t,e)}))}function Po(n){return null==n&&(n=""),function(){this.textContent=n}}function Uo(n,t,e,r){var u=n.__transition__||(n.__transition__={active:0,count:0}),i=u[e];if(!i){var a=r.time;i=u[e]={tween:new o,time:a,ease:r.ease,delay:r.delay,duration:r.duration},++u.count,Vo.timer(function(r){function o(r){return u.active>e?l():(u.active=e,i.event&&i.event.start.call(n,s,t),i.tween.forEach(function(e,r){(r=r.call(n,s,t))&&v.push(r)}),Vo.timer(function(){return p.c=c(r||1)?Se:c,1},0,a),void 0)}function c(r){if(u.active!==e)return l();for(var o=r/g,a=f(o),c=v.length;c>0;)v[--c].call(n,a);return o>=1?(i.event&&i.event.end.call(n,s,t),l()):void 0
+}function l(){return--u.count?delete u[e]:delete n.__transition__,1}var s=n.__data__,f=i.ease,h=i.delay,g=i.duration,p=Wa,v=[];return p.t=h+a,r>=h?o(r-h):(p.c=o,void 0)},0,a)}}function jo(n,t){n.attr("transform",function(n){return"translate("+t(n)+",0)"})}function Ho(n,t){n.attr("transform",function(n){return"translate(0,"+t(n)+")"})}function Fo(n){return n.toISOString()}function Oo(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=Vo.bisect(jl,u);return i==jl.length?[t.year,Oi(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/jl[i-1]<jl[i]/u?i-1:i]:[Ol,Oi(n,e)[2]]}return r.invert=function(t){return Yo(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(Yo)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,Yo(+e+1),t).length}var i=r.domain(),o=Ti(i),a=null==n?u(o,10):"number"==typeof n&&u(o,n);return a&&(n=a[0],t=a[1]),r.domain(Di(i,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=Yo(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Yo(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Ti(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Yo(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Oo(n.copy(),t,e)},Hi(r,n)}function Yo(n){return new Date(n)}function Io(n){return JSON.parse(n.responseText)}function Zo(n){var t=Bo.createRange();return t.selectNode(Bo.body),t.createContextualFragment(n.responseText)}var Vo={version:"3.4.12"};Date.now||(Date.now=function(){return+new Date});var Xo=[].slice,$o=function(n){return Xo.call(n)},Bo=document,Wo=Bo.documentElement,Jo=window;try{$o(Wo.childNodes)[0].nodeType}catch(Go){$o=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}try{Bo.createElement("div").style.setProperty("opacity",0,"")}catch(Ko){var Qo=Jo.Element.prototype,na=Qo.setAttribute,ta=Qo.setAttributeNS,ea=Jo.CSSStyleDeclaration.prototype,ra=ea.setProperty;Qo.setAttribute=function(n,t){na.call(this,n,t+"")},Qo.setAttributeNS=function(n,t,e){ta.call(this,n,t,e+"")},ea.setProperty=function(n,t,e){ra.call(this,n,t+"",e)}}Vo.ascending=n,Vo.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},Vo.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i&&!(null!=(e=n[u])&&e>=e);)e=void 0;for(;++u<i;)null!=(r=n[u])&&e>r&&(e=r)}else{for(;++u<i&&!(null!=(e=t.call(n,n[u],u))&&e>=e);)e=void 0;for(;++u<i;)null!=(r=t.call(n,n[u],u))&&e>r&&(e=r)}return e},Vo.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i&&!(null!=(e=n[u])&&e>=e);)e=void 0;for(;++u<i;)null!=(r=n[u])&&r>e&&(e=r)}else{for(;++u<i&&!(null!=(e=t.call(n,n[u],u))&&e>=e);)e=void 0;for(;++u<i;)null!=(r=t.call(n,n[u],u))&&r>e&&(e=r)}return e},Vo.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i<o&&!(null!=(e=u=n[i])&&e>=e);)e=u=void 0;for(;++i<o;)null!=(r=n[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;++i<o&&!(null!=(e=u=t.call(n,n[i],i))&&e>=e);)e=void 0;for(;++i<o;)null!=(r=t.call(n,n[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},Vo.sum=function(n,t){var e,r=0,u=n.length,i=-1;if(1===arguments.length)for(;++i<u;)isNaN(e=+n[i])||(r+=e);else for(;++i<u;)isNaN(e=+t.call(n,n[i],i))||(r+=e);return r},Vo.mean=function(n,e){var r,u=0,i=n.length,o=-1,a=i;if(1===arguments.length)for(;++o<i;)t(r=n[o])?u+=r:--a;else for(;++o<i;)t(r=e.call(n,n[o],o))?u+=r:--a;return a?u/a:void 0},Vo.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),u=+n[r-1],i=e-r;return i?u+i*(n[r]-u):u},Vo.median=function(e,r){return arguments.length>1&&(e=e.map(r)),e=e.filter(t),e.length?Vo.quantile(e.sort(n),.5):void 0};var ua=e(n);Vo.bisectLeft=ua.left,Vo.bisect=Vo.bisectRight=ua.right,Vo.bisector=function(t){return e(1===t.length?function(e,r){return n(t(e),r)}:t)},Vo.shuffle=function(n){for(var t,e,r=n.length;r;)e=0|Math.random()*r--,t=n[r],n[r]=n[e],n[e]=t;return n},Vo.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},Vo.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},Vo.zip=function(){if(!(u=arguments.length))return[];for(var n=-1,t=Vo.min(arguments,r),e=new Array(t);++n<t;)for(var u,i=-1,o=e[n]=new Array(u);++i<u;)o[i]=arguments[i][n];return e},Vo.transpose=function(n){return Vo.zip.apply(Vo,n)},Vo.keys=function(n){var t=[];for(var e in n)t.push(e);return t},Vo.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},Vo.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},Vo.merge=function(n){for(var t,e,r,u=n.length,i=-1,o=0;++i<u;)o+=n[i].length;for(e=new Array(o);--u>=0;)for(r=n[u],t=r.length;--t>=0;)e[--o]=r[t];return e};var ia=Math.abs;Vo.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),1/0===(t-n)/e)throw new Error("infinite range");var r,i=[],o=u(ia(e)),a=-1;if(n*=o,t*=o,e*=o,0>e)for(;(r=n+e*++a)>t;)i.push(r/o);else for(;(r=n+e*++a)<t;)i.push(r/o);return i},Vo.map=function(n){var t=new o;if(n instanceof o)n.forEach(function(n,e){t.set(n,e)});else for(var e in n)t.set(e,n[e]);return t},i(o,{has:a,get:function(n){return this[oa+n]},set:function(n,t){return this[oa+n]=t},remove:c,keys:l,values:function(){var n=[];return this.forEach(function(t,e){n.push(e)}),n},entries:function(){var n=[];return this.forEach(function(t,e){n.push({key:t,value:e})}),n},size:s,empty:f,forEach:function(n){for(var t in this)t.charCodeAt(0)===aa&&n.call(this,t.slice(1),this[t])}});var oa="\x00",aa=oa.charCodeAt(0);Vo.nest=function(){function n(t,a,c){if(c>=i.length)return r?r.call(u,a):e?a.sort(e):a;for(var l,s,f,h,g=-1,p=a.length,v=i[c++],d=new o;++g<p;)(h=d.get(l=v(s=a[g])))?h.push(s):d.set(l,[s]);return t?(s=t(),f=function(e,r){s.set(e,n(t,r,c))}):(s={},f=function(e,r){s[e]=n(t,r,c)}),d.forEach(f),s}function t(n,e){if(e>=i.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,u={},i=[],a=[];return u.map=function(t,e){return n(e,t,0)},u.entries=function(e){return t(n(Vo.map,e,0),0)},u.key=function(n){return i.push(n),u},u.sortKeys=function(n){return a[i.length-1]=n,u},u.sortValues=function(n){return e=n,u},u.rollup=function(n){return r=n,u},u},Vo.set=function(n){var t=new h;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},i(h,{has:a,add:function(n){return this[oa+n]=!0,n},remove:function(n){return n=oa+n,n in this&&delete this[n]},values:l,size:s,empty:f,forEach:function(n){for(var t in this)t.charCodeAt(0)===aa&&n.call(this,t.slice(1))}}),Vo.behavior={},Vo.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r<u;)n[e=arguments[r]]=g(n,t,t[e]);return n};var ca=["webkit","ms","moz","Moz","o","O"];Vo.dispatch=function(){for(var n=new d,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=m(n);return n},d.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},Vo.event=null,Vo.requote=function(n){return n.replace(la,"\\$&")};var la=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,sa={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},fa=function(n,t){return t.querySelector(n)},ha=function(n,t){return t.querySelectorAll(n)},ga=Wo.matches||Wo[p(Wo,"matchesSelector")],pa=function(n,t){return ga.call(n,t)};"function"==typeof Sizzle&&(fa=function(n,t){return Sizzle(n,t)[0]||null},ha=Sizzle,pa=Sizzle.matchesSelector),Vo.selection=function(){return ya};var va=Vo.selection.prototype=[];va.select=function(n){var t,e,r,u,i=[];n=b(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]),t.parentNode=(r=this[o]).parentNode;for(var c=-1,l=r.length;++c<l;)(u=r[c])?(t.push(e=n.call(u,u.__data__,c,o)),e&&"__data__"in u&&(e.__data__=u.__data__)):t.push(null)}return _(i)},va.selectAll=function(n){var t,e,r=[];n=w(n);for(var u=-1,i=this.length;++u<i;)for(var o=this[u],a=-1,c=o.length;++a<c;)(e=o[a])&&(r.push(t=$o(n.call(e,e.__data__,a,u))),t.parentNode=e);return _(r)};var da={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};Vo.ns={prefix:da,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&(e=n.slice(0,t),n=n.slice(t+1)),da.hasOwnProperty(e)?{space:da[e],local:n}:n}},va.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=Vo.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(S(t,n[t]));return this}return this.each(S(n,t))},va.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=A(n)).length,u=-1;if(t=e.classList){for(;++u<r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute("class");++u<r;)if(!E(n[u]).test(t))return!1;return!0}for(t in n)this.each(C(t,n[t]));return this}return this.each(C(n,t))},va.style=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t="");for(e in n)this.each(z(e,n[e],t));return this}if(2>r)return Jo.getComputedStyle(this.node(),null).getPropertyValue(n);e=""}return this.each(z(n,t,e))},va.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(L(t,n[t]));return this}return this.each(L(n,t))},va.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},va.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},va.append=function(n){return n=T(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},va.insert=function(n,t){return n=T(n),t=b(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},va.remove=function(){return this.each(function(){var n=this.parentNode;n&&n.removeChild(this)})},va.data=function(n,t){function e(n,e){var r,u,i,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),v=new Array(a);if(t){var d,m=new o,y=new o,x=[];for(r=-1;++r<a;)d=t.call(u=n[r],u.__data__,r),m.has(d)?v[r]=u:m.set(d,u),x.push(d);for(r=-1;++r<f;)d=t.call(e,i=e[r],r),(u=m.get(d))?(g[r]=u,u.__data__=i):y.has(d)||(p[r]=q(i)),y.set(d,i),m.remove(d);for(r=-1;++r<a;)m.has(x[r])&&(v[r]=n[r])}else{for(r=-1;++r<h;)u=n[r],i=e[r],u?(u.__data__=i,g[r]=u):p[r]=q(i);for(;f>r;++r)p[r]=q(e[r]);for(;a>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,c.push(p),l.push(g),s.push(v)}var r,u,i=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++i<a;)(u=r[i])&&(n[i]=u.__data__);return n}var c=U([]),l=_([]),s=_([]);if("function"==typeof n)for(;++i<a;)e(r=this[i],n.call(r,r.parentNode.__data__,i));else for(;++i<a;)e(r=this[i],n);return l.enter=function(){return c},l.exit=function(){return s},l},va.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},va.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=R(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return _(u)},va.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},va.sort=function(n){n=D.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},va.each=function(n){return P(this,function(t,e,r){n.call(t,t.__data__,e,r)})},va.call=function(n){var t=$o(arguments);return n.apply(t[0]=this,t),this},va.empty=function(){return!this.node()},va.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},va.size=function(){var n=0;return P(this,function(){++n}),n};var ma=[];Vo.selection.enter=U,Vo.selection.enter.prototype=ma,ma.append=va.append,ma.empty=va.empty,ma.node=va.node,ma.call=va.call,ma.size=va.size,ma.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++a<c;){r=(u=this[a]).update,o.push(t=[]),t.parentNode=u.parentNode;for(var l=-1,s=u.length;++l<s;)(i=u[l])?(t.push(r[l]=e=n.call(u.parentNode,i.__data__,l,a)),e.__data__=i.__data__):t.push(null)}return _(o)},ma.insert=function(n,t){return arguments.length<2&&(t=j(this)),va.insert.call(this,n,t)},va.transition=function(){for(var n,t,e=kl||++zl,r=[],u=El||{time:Date.now(),ease:Mu,delay:0,duration:250},i=-1,o=this.length;++i<o;){r.push(n=[]);for(var a=this[i],c=-1,l=a.length;++c<l;)(t=a[c])&&Uo(t,c,e,u),n.push(t)}return Ro(r,e)},va.interrupt=function(){return this.each(H)},Vo.select=function(n){var t=["string"==typeof n?fa(n,Bo):n];return t.parentNode=Wo,_([t])},Vo.selectAll=function(n){var t=$o("string"==typeof n?ha(n,Bo):n);return t.parentNode=Wo,_([t])};var ya=Vo.select(Wo);va.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(F(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(F(n,t,e))};var xa=Vo.map({mouseenter:"mouseover",mouseleave:"mouseout"});xa.forEach(function(n){"on"+n in Bo&&xa.remove(n)});var Ma="onselectstart"in Bo?null:p(Wo.style,"userSelect"),_a=0;Vo.mouse=function(n){return Z(n,x())};var ba=/WebKit/.test(Jo.navigator.userAgent)?-1:0;Vo.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=x().changedTouches),t)for(var r,u=0,i=t.length;i>u;++u)if((r=t[u]).identifier===e)return Z(n,r)},Vo.behavior.drag=function(){function n(){this.on("mousedown.drag",u).on("touchstart.drag",i)}function t(n,t,u,i,o){return function(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-x[0],e=r[1]-x[1],p|=n|e,x=r,g({type:"drag",x:r[0]+l[0],y:r[1]+l[1],dx:n,dy:e}))}function c(){t(h,v)&&(m.on(i+d,null).on(o+d,null),y(p&&Vo.event.target===f),g({type:"dragend"}))}var l,s=this,f=Vo.event.target,h=s.parentNode,g=e.of(s,arguments),p=0,v=n(),d=".drag"+(null==v?"":"-"+v),m=Vo.select(u()).on(i+d,a).on(o+d,c),y=I(),x=t(h,v);r?(l=r.apply(s,arguments),l=[l.x-x[0],l.y-x[1]]):l=[0,0],g({type:"dragstart"})}}var e=M(n,"drag","dragstart","dragend"),r=null,u=t(v,Vo.mouse,$,"mousemove","mouseup"),i=t(V,Vo.touch,X,"touchmove","touchend");return n.origin=function(t){return arguments.length?(r=t,n):r},Vo.rebind(n,e,"on")},Vo.touches=function(n,t){return arguments.length<2&&(t=x().touches),t?$o(t).map(function(t){var e=Z(n,t);return e.identifier=t.identifier,e}):[]};var wa=Math.PI,Sa=2*wa,ka=wa/2,Ea=1e-6,Aa=Ea*Ea,Ca=wa/180,Na=180/wa,za=Math.SQRT2,La=2,Ta=4;Vo.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=Q(v),o=i/(La*h)*(e*nt(za*t+v)-K(v));return[r+o*l,u+o*s,i*e/Q(za*t+v)]}return[r+n*l,u+n*s,i*Math.exp(za*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],l=o-r,s=a-u,f=l*l+s*s,h=Math.sqrt(f),g=(c*c-i*i+Ta*f)/(2*i*La*h),p=(c*c-i*i-Ta*f)/(2*c*La*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/za;return e.duration=1e3*y,e},Vo.behavior.zoom=function(){function n(n){n.on(A,l).on(Da+".zoom",f).on("dblclick.zoom",h).on(z,s)}function t(n){return[(n[0]-S.x)/S.k,(n[1]-S.y)/S.k]}function e(n){return[n[0]*S.k+S.x,n[1]*S.k+S.y]}function r(n){S.k=Math.max(E[0],Math.min(E[1],n))}function u(n,t){t=e(t),S.x+=n[0]-t[0],S.y+=n[1]-t[1]}function i(){_&&_.domain(x.range().map(function(n){return(n-S.x)/S.k}).map(x.invert)),w&&w.domain(b.range().map(function(n){return(n-S.y)/S.k}).map(b.invert))}function o(n){n({type:"zoomstart"})}function a(n){i(),n({type:"zoom",scale:S.k,translate:[S.x,S.y]})}function c(n){n({type:"zoomend"})}function l(){function n(){s=1,u(Vo.mouse(r),h),a(l)}function e(){f.on(C,null).on(N,null),g(s&&Vo.event.target===i),c(l)}var r=this,i=Vo.event.target,l=L.of(r,arguments),s=0,f=Vo.select(Jo).on(C,n).on(N,e),h=t(Vo.mouse(r)),g=I();H.call(r),o(l)}function s(){function n(){var n=Vo.touches(g);return h=S.k,n.forEach(function(n){n.identifier in v&&(v[n.identifier]=t(n))}),n}function e(){var t=Vo.event.target;Vo.select(t).on(M,i).on(_,f),b.push(t);for(var e=Vo.event.changedTouches,o=0,c=e.length;c>o;++o)v[e[o].identifier]=null;var l=n(),s=Date.now();if(1===l.length){if(500>s-m){var h=l[0],g=v[h.identifier];r(2*S.k),u(h,g),y(),a(p)}m=s}else if(l.length>1){var h=l[0],x=l[1],w=h[0]-x[0],k=h[1]-x[1];d=w*w+k*k}}function i(){for(var n,t,e,i,o=Vo.touches(g),c=0,l=o.length;l>c;++c,i=null)if(e=o[c],i=v[e.identifier]){if(t)break;n=e,t=i}if(i){var s=(s=e[0]-n[0])*s+(s=e[1]-n[1])*s,f=d&&Math.sqrt(s/d);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+i[0])/2,(t[1]+i[1])/2],r(f*h)}m=null,u(n,t),a(p)}function f(){if(Vo.event.touches.length){for(var t=Vo.event.changedTouches,e=0,r=t.length;r>e;++e)delete v[t[e].identifier];for(var u in v)return void n()}Vo.selectAll(b).on(x,null),w.on(A,l).on(z,s),k(),c(p)}var h,g=this,p=L.of(g,arguments),v={},d=0,x=".zoom-"+Vo.event.changedTouches[0].identifier,M="touchmove"+x,_="touchend"+x,b=[],w=Vo.select(g),k=I();H.call(g),e(),o(p),w.on(A,null).on(z,e)}function f(){var n=L.of(this,arguments);d?clearTimeout(d):(g=t(p=v||Vo.mouse(this)),H.call(this),o(n)),d=setTimeout(function(){d=null,c(n)},50),y(),r(Math.pow(2,.002*qa())*S.k),u(p,g),a(n)}function h(){var n=L.of(this,arguments),e=Vo.mouse(this),i=t(e),l=Math.log(S.k)/Math.LN2;o(n),r(Math.pow(2,Vo.event.shiftKey?Math.ceil(l)-1:Math.floor(l)+1)),u(e,i),a(n),c(n)}var g,p,v,d,m,x,_,b,w,S={x:0,y:0,k:1},k=[960,500],E=Ra,A="mousedown.zoom",C="mousemove.zoom",N="mouseup.zoom",z="touchstart.zoom",L=M(n,"zoomstart","zoom","zoomend");return n.event=function(n){n.each(function(){var n=L.of(this,arguments),t=S;kl?Vo.select(this).transition().each("start.zoom",function(){S=this.__chart__||{x:0,y:0,k:1},o(n)}).tween("zoom:zoom",function(){var e=k[0],r=k[1],u=e/2,i=r/2,o=Vo.interpolateZoom([(u-S.x)/S.k,(i-S.y)/S.k,e/S.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),c=e/r[2];this.__chart__=S={x:u-r[0]*c,y:i-r[1]*c,k:c},a(n)}}).each("end.zoom",function(){c(n)}):(this.__chart__=S,o(n),a(n),c(n))})},n.translate=function(t){return arguments.length?(S={x:+t[0],y:+t[1],k:S.k},i(),n):[S.x,S.y]},n.scale=function(t){return arguments.length?(S={x:S.x,y:S.y,k:+t},i(),n):S.k},n.scaleExtent=function(t){return arguments.length?(E=null==t?Ra:[+t[0],+t[1]],n):E},n.center=function(t){return arguments.length?(v=t&&[+t[0],+t[1]],n):v},n.size=function(t){return arguments.length?(k=t&&[+t[0],+t[1]],n):k},n.x=function(t){return arguments.length?(_=t,x=t.copy(),S={x:0,y:0,k:1},n):_},n.y=function(t){return arguments.length?(w=t,b=t.copy(),S={x:0,y:0,k:1},n):w},Vo.rebind(n,L,"on")};var qa,Ra=[0,1/0],Da="onwheel"in Bo?(qa=function(){return-Vo.event.deltaY*(Vo.event.deltaMode?120:1)},"wheel"):"onmousewheel"in Bo?(qa=function(){return Vo.event.wheelDelta},"mousewheel"):(qa=function(){return-Vo.event.detail},"MozMousePixelScroll");Vo.color=et,et.prototype.toString=function(){return this.rgb()+""},Vo.hsl=rt;var Pa=rt.prototype=new et;Pa.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new rt(this.h,this.s,this.l/n)},Pa.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new rt(this.h,this.s,n*this.l)},Pa.rgb=function(){return ut(this.h,this.s,this.l)},Vo.hcl=it;var Ua=it.prototype=new et;Ua.brighter=function(n){return new it(this.h,this.c,Math.min(100,this.l+ja*(arguments.length?n:1)))},Ua.darker=function(n){return new it(this.h,this.c,Math.max(0,this.l-ja*(arguments.length?n:1)))},Ua.rgb=function(){return ot(this.h,this.c,this.l).rgb()},Vo.lab=at;var ja=18,Ha=.95047,Fa=1,Oa=1.08883,Ya=at.prototype=new et;Ya.brighter=function(n){return new at(Math.min(100,this.l+ja*(arguments.length?n:1)),this.a,this.b)},Ya.darker=function(n){return new at(Math.max(0,this.l-ja*(arguments.length?n:1)),this.a,this.b)},Ya.rgb=function(){return ct(this.l,this.a,this.b)},Vo.rgb=gt;var Ia=gt.prototype=new et;Ia.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),new gt(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new gt(u,u,u)},Ia.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new gt(n*this.r,n*this.g,n*this.b)},Ia.hsl=function(){return yt(this.r,this.g,this.b)},Ia.toString=function(){return"#"+dt(this.r)+dt(this.g)+dt(this.b)};var Za=Vo.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Za.forEach(function(n,t){Za.set(n,pt(t))}),Vo.functor=bt,Vo.xhr=St(wt),Vo.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=kt(n,t,null==e?r:u(e),i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),c=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(s>=l)return o;if(u)return u=!1,i;var t=s;if(34===n.charCodeAt(t)){for(var e=t;e++<l;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}s=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,10===n.charCodeAt(e+2)&&++s):10===r&&(u=!0),n.slice(t+1,e).replace(/""/g,'"')}for(;l>s;){var r=n.charCodeAt(s++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(s)&&(++s,++a);else if(r!==c)continue;return n.slice(t,s-a)}return n.slice(t)}for(var r,u,i={},o={},a=[],l=n.length,s=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();(!t||(h=t(h,f++)))&&a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new h,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(o).join(n)].concat(t.map(function(t){return u.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},Vo.csv=Vo.dsv(",","text/csv"),Vo.tsv=Vo.dsv(" ","text/tab-separated-values");var Va,Xa,$a,Ba,Wa,Ja=Jo[p(Jo,"requestAnimationFrame")]||function(n){setTimeout(n,17)};Vo.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};Xa?Xa.n=i:Va=i,Xa=i,$a||(Ba=clearTimeout(Ba),$a=1,Ja(Ct))},Vo.timer.flush=function(){Nt(),zt()},Vo.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var Ga=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Tt);Vo.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=Vo.round(n,Lt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),Ga[8+e/3]};var Ka=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,Qa=Vo.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=Vo.round(n,Lt(n,t))).toFixed(Math.max(0,Math.min(20,Lt(n*(1+1e-15),t))))}}),nc=Vo.time={},tc=Date;Dt.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){ec.setUTCDate.apply(this._,arguments)},setDay:function(){ec.setUTCDay.apply(this._,arguments)},setFullYear:function(){ec.setUTCFullYear.apply(this._,arguments)},setHours:function(){ec.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){ec.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){ec.setUTCMinutes.apply(this._,arguments)},setMonth:function(){ec.setUTCMonth.apply(this._,arguments)},setSeconds:function(){ec.setUTCSeconds.apply(this._,arguments)},setTime:function(){ec.setTime.apply(this._,arguments)}};var ec=Date.prototype;nc.year=Pt(function(n){return n=nc.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),nc.years=nc.year.range,nc.years.utc=nc.year.utc.range,nc.day=Pt(function(n){var t=new tc(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),nc.days=nc.day.range,nc.days.utc=nc.day.utc.range,nc.dayOfYear=function(n){var t=nc.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=nc[n]=Pt(function(n){return(n=nc.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=nc.year(n).getDay();return Math.floor((nc.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});nc[n+"s"]=e.range,nc[n+"s"].utc=e.utc.range,nc[n+"OfYear"]=function(n){var e=nc.year(n).getDay();return Math.floor((nc.dayOfYear(n)+(e+t)%7)/7)}}),nc.week=nc.sunday,nc.weeks=nc.sunday.range,nc.weeks.utc=nc.sunday.utc.range,nc.weekOfYear=nc.sundayOfYear;var rc={"-":"",_:" ",0:"0"},uc=/^\s*\d+/,ic=/^%/;Vo.locale=function(n){return{numberFormat:qt(n),timeFormat:jt(n)}};var oc=Vo.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});Vo.format=oc.numberFormat,Vo.geo={},ie.prototype={s:0,t:0,add:function(n){oe(n,this.t,ac),oe(ac.s,this.s,this),this.s?this.t+=ac.t:this.s=ac.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var ac=new ie;Vo.geo.stream=function(n,t){n&&cc.hasOwnProperty(n.type)?cc[n.type](n,t):ae(n,t)};var cc={Feature:function(n,t){ae(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r<u;)ae(e[r].geometry,t)}},lc={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){ce(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)ce(e[r],t,0)},Polygon:function(n,t){le(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)le(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r<u;)ae(e[r],t)}};Vo.geo.area=function(n){return sc=0,Vo.geo.stream(n,hc),sc};var sc,fc=new ie,hc={sphere:function(){sc+=4*wa},point:v,lineStart:v,lineEnd:v,polygonStart:function(){fc.reset(),hc.lineStart=se},polygonEnd:function(){var n=2*fc;sc+=0>n?4*wa+n:n,hc.lineStart=hc.lineEnd=hc.point=v}};Vo.geo.bounds=function(){function n(n,t){x.push(M=[s=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=fe([t*Ca,e*Ca]);if(m){var u=ge(m,r),i=[u[1],-u[0],0],o=ge(i,u);de(o),o=me(o);var c=t-p,l=c>0?1:-1,v=o[0]*Na*l,d=ia(c)>180;if(d^(v>l*p&&l*t>v)){var y=o[1]*Na;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>l*p&&l*t>v)){var y=-o[1]*Na;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t):h>=s?(s>t&&(s=t),t>h&&(h=t)):t>p?a(s,t)>a(s,h)&&(h=t):a(t,h)>a(s,h)&&(s=t)}else n(t,e);m=r,p=t}function e(){_.point=t}function r(){M[0]=s,M[1]=h,_.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=ia(r)>180?r+(r>0?360:-360):r}else v=n,d=e;hc.point(n,e),t(n,e)}function i(){hc.lineStart()}function o(){u(v,d),hc.lineEnd(),ia(y)>Ea&&(s=-(h=180)),M[0]=s,M[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function l(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var s,f,h,g,p,v,d,m,y,x,M,_={point:n,lineStart:e,lineEnd:r,polygonStart:function(){_.point=u,_.lineStart=i,_.lineEnd=o,y=0,hc.polygonStart()},polygonEnd:function(){hc.polygonEnd(),_.point=n,_.lineStart=e,_.lineEnd=r,0>fc?(s=-(h=180),f=-(g=90)):y>Ea?g=90:-Ea>y&&(f=-90),M[0]=s,M[1]=h}};return function(n){g=h=-(s=f=1/0),x=[],Vo.geo.stream(n,_);var t=x.length;if(t){x.sort(c);for(var e,r=1,u=x[0],i=[u];t>r;++r)e=x[r],l(e[0],u)||l(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,s=e[0],h=u[1])
+}return x=M=null,1/0===s||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[s,f],[h,g]]}}(),Vo.geo.centroid=function(n){gc=pc=vc=dc=mc=yc=xc=Mc=_c=bc=wc=0,Vo.geo.stream(n,Sc);var t=_c,e=bc,r=wc,u=t*t+e*e+r*r;return Aa>u&&(t=yc,e=xc,r=Mc,Ea>pc&&(t=vc,e=dc,r=mc),u=t*t+e*e+r*r,Aa>u)?[0/0,0/0]:[Math.atan2(e,t)*Na,G(r/Math.sqrt(u))*Na]};var gc,pc,vc,dc,mc,yc,xc,Mc,_c,bc,wc,Sc={sphere:v,point:xe,lineStart:_e,lineEnd:be,polygonStart:function(){Sc.lineStart=we},polygonEnd:function(){Sc.lineStart=_e}},kc=Ce(Se,Te,Re,[-wa,-wa/2]),Ec=1e9;Vo.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=je(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(Vo.geo.conicEqualArea=function(){return Fe(Oe)}).raw=Oe,Vo.geo.albers=function(){return Vo.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},Vo.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=Vo.geo.albers(),o=Vo.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=Vo.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var l=i.scale(),s=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[s-.455*l,f-.238*l],[s+.455*l,f+.238*l]]).stream(c).point,r=o.translate([s-.307*l,f+.201*l]).clipExtent([[s-.425*l+Ea,f+.12*l+Ea],[s-.214*l-Ea,f+.234*l-Ea]]).stream(c).point,u=a.translate([s-.205*l,f+.212*l]).clipExtent([[s-.214*l+Ea,f+.166*l+Ea],[s-.115*l-Ea,f+.234*l-Ea]]).stream(c).point,n},n.scale(1070)};var Ac,Cc,Nc,zc,Lc,Tc,qc={point:v,lineStart:v,lineEnd:v,polygonStart:function(){Cc=0,qc.lineStart=Ye},polygonEnd:function(){qc.lineStart=qc.lineEnd=qc.point=v,Ac+=ia(Cc/2)}},Rc={point:Ie,lineStart:v,lineEnd:v,polygonStart:v,polygonEnd:v},Dc={point:Xe,lineStart:$e,lineEnd:Be,polygonStart:function(){Dc.lineStart=We},polygonEnd:function(){Dc.point=Xe,Dc.lineStart=$e,Dc.lineEnd=Be}};Vo.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),Vo.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return Ac=0,Vo.geo.stream(n,u(qc)),Ac},n.centroid=function(n){return vc=dc=mc=yc=xc=Mc=_c=bc=wc=0,Vo.geo.stream(n,u(Dc)),wc?[_c/wc,bc/wc]:Mc?[yc/Mc,xc/Mc]:mc?[vc/mc,dc/mc]:[0/0,0/0]},n.bounds=function(n){return Lc=Tc=-(Nc=zc=1/0),Vo.geo.stream(n,u(Rc)),[[Nc,zc],[Lc,Tc]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||Ke(n):wt,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new Ze:new Je(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection(Vo.geo.albersUsa()).context(null)},Vo.geo.transform=function(n){return{stream:function(t){var e=new Qe(t);for(var r in n)e[r]=n[r];return e}}},Qe.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},Vo.geo.projection=tr,Vo.geo.projectionMutator=er,(Vo.geo.equirectangular=function(){return tr(ur)}).raw=ur.invert=ur,Vo.geo.rotation=function(n){function t(t){return t=n(t[0]*Ca,t[1]*Ca),t[0]*=Na,t[1]*=Na,t}return n=or(n[0]%360*Ca,n[1]*Ca,n.length>2?n[2]*Ca:0),t.invert=function(t){return t=n.invert(t[0]*Ca,t[1]*Ca),t[0]*=Na,t[1]*=Na,t},t},ir.invert=ur,Vo.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=or(-n[0]*Ca,-n[1]*Ca,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Na,n[1]*=Na}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=sr((t=+r)*Ca,u*Ca),n):t},n.precision=function(r){return arguments.length?(e=sr(t*Ca,(u=+r)*Ca),n):u},n.angle(90)},Vo.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Ca,u=n[1]*Ca,i=t[1]*Ca,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),l=Math.cos(u),s=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=l*s-c*f*a)*e),c*s+l*f*a)},Vo.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return Vo.range(Math.ceil(i/d)*d,u,d).map(h).concat(Vo.range(Math.ceil(l/m)*m,c,m).map(g)).concat(Vo.range(Math.ceil(r/p)*p,e,p).filter(function(n){return ia(n%d)>Ea}).map(s)).concat(Vo.range(Math.ceil(a/v)*v,o,v).filter(function(n){return ia(n%m)>Ea}).map(f))}var e,r,u,i,o,a,c,l,s,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(l).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],l=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),l>c&&(t=l,l=c,c=t),n.precision(y)):[[i,l],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,s=hr(a,o,90),f=gr(r,e,y),h=hr(l,c,90),g=gr(i,u,y),n):y},n.majorExtent([[-180,-90+Ea],[180,90-Ea]]).minorExtent([[-180,-80-Ea],[180,80+Ea]])},Vo.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=pr,u=vr;return n.distance=function(){return Vo.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},Vo.geo.interpolate=function(n,t){return dr(n[0]*Ca,n[1]*Ca,t[0]*Ca,t[1]*Ca)},Vo.geo.length=function(n){return Pc=0,Vo.geo.stream(n,Uc),Pc};var Pc,Uc={sphere:v,point:v,lineStart:mr,lineEnd:v,polygonStart:v,polygonEnd:v},jc=yr(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(Vo.geo.azimuthalEqualArea=function(){return tr(jc)}).raw=jc;var Hc=yr(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},wt);(Vo.geo.azimuthalEquidistant=function(){return tr(Hc)}).raw=Hc,(Vo.geo.conicConformal=function(){return Fe(xr)}).raw=xr,(Vo.geo.conicEquidistant=function(){return Fe(Mr)}).raw=Mr;var Fc=yr(function(n){return 1/n},Math.atan);(Vo.geo.gnomonic=function(){return tr(Fc)}).raw=Fc,_r.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-ka]},(Vo.geo.mercator=function(){return br(_r)}).raw=_r;var Oc=yr(function(){return 1},Math.asin);(Vo.geo.orthographic=function(){return tr(Oc)}).raw=Oc;var Yc=yr(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(Vo.geo.stereographic=function(){return tr(Yc)}).raw=Yc,wr.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-ka]},(Vo.geo.transverseMercator=function(){var n=br(wr),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=wr,Vo.geom={},Vo.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=bt(e),i=bt(r),o=n.length,a=[],c=[];for(t=0;o>t;t++)a.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(a.sort(Ar),t=0;o>t;t++)c.push([a[t][0],-a[t][1]]);var l=Er(a),s=Er(c),f=s[0]===l[0],h=s[s.length-1]===l[l.length-1],g=[];for(t=l.length-1;t>=0;--t)g.push(n[a[l[t]][2]]);for(t=+f;t<s.length-h;++t)g.push(n[a[s[t]][2]]);return g}var e=Sr,r=kr;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},Vo.geom.polygon=function(n){return sa(n,Ic),n};var Ic=Vo.geom.polygon.prototype=[];Ic.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],u=0;++t<e;)n=r,r=this[t],u+=n[1]*r[0]-n[0]*r[1];return.5*u},Ic.centroid=function(n){var t,e,r=-1,u=this.length,i=0,o=0,a=this[u-1];for(arguments.length||(n=-1/(6*this.area()));++r<u;)t=a,a=this[r],e=t[0]*a[1]-a[0]*t[1],i+=(t[0]+a[0])*e,o+=(t[1]+a[1])*e;return[i*n,o*n]},Ic.clip=function(n){for(var t,e,r,u,i,o,a=zr(n),c=-1,l=this.length-zr(this),s=this[l-1];++c<l;){for(t=n.slice(),n.length=0,u=this[c],i=t[(r=t.length-a)-1],e=-1;++e<r;)o=t[e],Cr(o,s,u)?(Cr(i,s,u)||n.push(Nr(i,o,s,u)),n.push(o)):Cr(i,s,u)&&n.push(Nr(i,o,s,u)),i=o;a&&n.push(n[0]),s=u}return n};var Zc,Vc,Xc,$c,Bc,Wc=[],Jc=[];jr.prototype.prepare=function(){for(var n,t=this.edges,e=t.length;e--;)n=t[e].edge,n.b&&n.a||t.splice(e,1);return t.sort(Fr),t.length},Jr.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},Gr.prototype={insert:function(n,t){var e,r,u;if(n){if(t.P=n,t.N=n.N,n.N&&(n.N.P=t),n.N=t,n.R){for(n=n.R;n.L;)n=n.L;n.L=t}else n.R=t;e=n}else this._?(n=tu(this._),t.P=null,t.N=n,n.P=n.L=t,e=n):(t.P=t.N=null,this._=t,e=null);for(t.L=t.R=null,t.U=e,t.C=!0,n=t;e&&e.C;)r=e.U,e===r.L?(u=r.R,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.R&&(Qr(this,e),n=e,e=n.U),e.C=!1,r.C=!0,nu(this,r))):(u=r.L,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.L&&(nu(this,e),n=e,e=n.U),e.C=!1,r.C=!0,Qr(this,r))),e=n.U;this._.C=!1},remove:function(n){n.N&&(n.N.P=n.P),n.P&&(n.P.N=n.N),n.N=n.P=null;var t,e,r,u=n.U,i=n.L,o=n.R;if(e=i?o?tu(o):i:o,u?u.L===n?u.L=e:u.R=e:this._=e,i&&o?(r=e.C,e.C=n.C,e.L=i,i.U=e,e!==o?(u=e.U,e.U=n.U,n=e.R,u.L=n,e.R=o,o.U=e):(e.U=u,u=e,n=e.R)):(r=n.C,n=e),n&&(n.U=u),!r){if(n&&n.C)return n.C=!1,void 0;do{if(n===this._)break;if(n===u.L){if(t=u.R,t.C&&(t.C=!1,u.C=!0,Qr(this,u),t=u.R),t.L&&t.L.C||t.R&&t.R.C){t.R&&t.R.C||(t.L.C=!1,t.C=!0,nu(this,t),t=u.R),t.C=u.C,u.C=t.R.C=!1,Qr(this,u),n=this._;break}}else if(t=u.L,t.C&&(t.C=!1,u.C=!0,nu(this,u),t=u.L),t.L&&t.L.C||t.R&&t.R.C){t.L&&t.L.C||(t.R.C=!1,t.C=!0,Qr(this,t),t=u.L),t.C=u.C,u.C=t.L.C=!1,nu(this,u),n=this._;break}t.C=!0,n=u,u=u.U}while(!n.C);n&&(n.C=!1)}}},Vo.geom.voronoi=function(n){function t(n){var t=new Array(n.length),r=a[0][0],u=a[0][1],i=a[1][0],o=a[1][1];return eu(e(n),a).cells.forEach(function(e,a){var c=e.edges,l=e.site,s=t[a]=c.length?c.map(function(n){var t=n.start();return[t.x,t.y]}):l.x>=r&&l.x<=i&&l.y>=u&&l.y<=o?[[r,o],[i,o],[i,u],[r,u]]:[];s.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Ea)*Ea,y:Math.round(o(n,t)/Ea)*Ea,i:t}})}var r=Sr,u=kr,i=r,o=u,a=Gc;return n?t(n):(t.links=function(n){return eu(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return eu(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(Fr),c=-1,l=a.length,s=a[l-1].edge,f=s.l===o?s.r:s.l;++c<l;)u=s,i=f,s=a[c].edge,f=s.l===o?s.r:s.l,r<i.i&&r<f.i&&uu(o,i,f)<0&&t.push([n[r],n[i.i],n[f.i]])}),t},t.x=function(n){return arguments.length?(i=bt(r=n),t):r},t.y=function(n){return arguments.length?(o=bt(u=n),t):u},t.clipExtent=function(n){return arguments.length?(a=null==n?Gc:n,t):a===Gc?null:a},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):a===Gc?null:a&&a[1]},t)};var Gc=[[-1e6,-1e6],[1e6,1e6]];Vo.geom.delaunay=function(n){return Vo.geom.voronoi().triangles(n)},Vo.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,o,a){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var c=n.x,s=n.y;if(null!=c)if(ia(c-e)+ia(s-r)<.01)l(n,t,e,r,u,i,o,a);else{var f=n.point;n.x=n.y=n.point=null,l(n,f,c,s,u,i,o,a),l(n,t,e,r,u,i,o,a)}else n.x=e,n.y=r,n.point=t}else l(n,t,e,r,u,i,o,a)}function l(n,t,e,r,u,o,a,c){var l=.5*(u+a),s=.5*(o+c),f=e>=l,h=r>=s,g=(h<<1)+f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=au()),f?u=l:a=l,h?o=s:c=s,i(n,t,e,r,u,o,a,c)}var s,f,h,g,p,v,d,m,y,x=bt(a),M=bt(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)s=n[g],s.x<v&&(v=s.x),s.y<d&&(d=s.y),s.x>m&&(m=s.x),s.y>y&&(y=s.y),f.push(s.x),h.push(s.y);else for(g=0;p>g;++g){var _=+x(s=n[g],g),b=+M(s,g);v>_&&(v=_),d>b&&(d=b),_>m&&(m=_),b>y&&(y=b),f.push(_),h.push(b)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=au();if(k.add=function(n){i(k,n,+x(n,++g),+M(n,g),v,d,m,y)},k.visit=function(n){cu(n,k,v,d,m,y)},g=-1,null==t){for(;++g<p;)i(k,n[g],f[g],h[g],v,d,m,y);--g}else n.forEach(k.add);return f=h=n=s=null,k}var o,a=Sr,c=kr;return(o=arguments.length)?(a=iu,c=ou,3===o&&(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(a=n,i):a},i.y=function(n){return arguments.length?(c=n,i):c},i.extent=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],u=+n[1][1]),i):null==t?null:[[t,e],[r,u]]},i.size=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=e=0,r=+n[0],u=+n[1]),i):null==t?null:[r-t,u-e]},i)},Vo.interpolateRgb=lu,Vo.interpolateObject=su,Vo.interpolateNumber=fu,Vo.interpolateString=hu;var Kc=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,Qc=new RegExp(Kc.source,"g");Vo.interpolate=gu,Vo.interpolators=[function(n,t){var e=typeof t;return("string"===e?Za.has(t)||/^(#|rgb\(|hsl\()/.test(t)?lu:hu:t instanceof et?lu:Array.isArray(t)?pu:"object"===e&&isNaN(t)?su:fu)(n,t)}],Vo.interpolateArray=pu;var nl=function(){return wt},tl=Vo.map({linear:nl,poly:_u,quad:function(){return yu},cubic:function(){return xu},sin:function(){return bu},exp:function(){return wu},circle:function(){return Su},elastic:ku,back:Eu,bounce:function(){return Au}}),el=Vo.map({"in":wt,out:du,"in-out":mu,"out-in":function(n){return mu(du(n))}});Vo.ease=function(n){var t=n.indexOf("-"),e=t>=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=tl.get(e)||nl,r=el.get(r)||wt,vu(r(e.apply(null,Xo.call(arguments,1))))},Vo.interpolateHcl=Cu,Vo.interpolateHsl=Nu,Vo.interpolateLab=zu,Vo.interpolateRound=Lu,Vo.transform=function(n){var t=Bo.createElementNS(Vo.ns.prefix.svg,"g");return(Vo.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Tu(e?e.matrix:rl)})(n)},Tu.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var rl={a:1,b:0,c:0,d:1,e:0,f:0};Vo.interpolateTransform=Pu,Vo.layout={},Vo.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(Hu(n[e]));return t}},Vo.layout.chord=function(){function n(){var n,l,f,h,g,p={},v=[],d=Vo.range(i),m=[];for(e=[],r=[],n=0,h=-1;++h<i;){for(l=0,g=-1;++g<i;)l+=u[h][g];v.push(l),m.push(Vo.range(i)),n+=l}for(o&&d.sort(function(n,t){return o(v[n],v[t])}),a&&m.forEach(function(n,t){n.sort(function(n,e){return a(u[t][n],u[t][e])})}),n=(Sa-s*i)/n,l=0,h=-1;++h<i;){for(f=l,g=-1;++g<i;){var y=d[h],x=m[y][g],M=u[y][x],_=l,b=l+=M*n;p[y+"-"+x]={index:y,subindex:x,startAngle:_,endAngle:b,value:M}}r[y]={index:y,startAngle:f,endAngle:l,value:(l-f)/n},l+=s}for(h=-1;++h<i;)for(g=h-1;++g<i;){var w=p[h+"-"+g],S=p[g+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&t()}function t(){e.sort(function(n,t){return c((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,u,i,o,a,c,l={},s=0;return l.matrix=function(n){return arguments.length?(i=(u=n)&&u.length,e=r=null,l):u},l.padding=function(n){return arguments.length?(s=n,e=r=null,l):s},l.sortGroups=function(n){return arguments.length?(o=n,e=r=null,l):o},l.sortSubgroups=function(n){return arguments.length?(a=n,e=null,l):a},l.sortChords=function(n){return arguments.length?(c=n,e&&t(),l):c},l.chords=function(){return e||n(),e},l.groups=function(){return r||n(),r},l},Vo.layout.force=function(){function n(n){return function(t,e,r,u){if(t.point!==n){var i=t.cx-n.x,o=t.cy-n.y,a=u-e,c=i*i+o*o;if(c>a*a/d){if(p>c){var l=t.charge/c;n.px-=i*l,n.py-=o*l}return!0}if(t.point&&c&&p>c){var l=t.pointCharge/c;n.px-=i*l,n.py-=o*l}}return!t.charge}}function t(n){n.px=Vo.event.x,n.py=Vo.event.y,a.resume()}var e,r,u,i,o,a={},c=Vo.dispatch("start","tick","end"),l=[1,1],s=.9,f=ul,h=il,g=-30,p=ol,v=.1,d=.64,m=[],y=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,p,d,x,M,_=m.length,b=y.length;for(e=0;b>e;++e)a=y[e],f=a.source,h=a.target,x=h.x-f.x,M=h.y-f.y,(p=x*x+M*M)&&(p=r*i[e]*((p=Math.sqrt(p))-u[e])/p,x*=p,M*=p,h.x-=x*(d=f.weight/(h.weight+f.weight)),h.y-=M*d,f.x+=x*(d=1-d),f.y+=M*d);if((d=r*v)&&(x=l[0]/2,M=l[1]/2,e=-1,d))for(;++e<_;)a=m[e],a.x+=(x-a.x)*d,a.y+=(M-a.y)*d;if(g)for(Xu(t=Vo.geom.quadtree(m),r,o),e=-1;++e<_;)(a=m[e]).fixed||t.visit(n(a));for(e=-1;++e<_;)a=m[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*s,a.y-=(a.py-(a.py=a.y))*s);c.tick({type:"tick",alpha:r})},a.nodes=function(n){return arguments.length?(m=n,a):m},a.links=function(n){return arguments.length?(y=n,a):y},a.size=function(n){return arguments.length?(l=n,a):l},a.linkDistance=function(n){return arguments.length?(f="function"==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,a):h},a.friction=function(n){return arguments.length?(s=+n,a):s},a.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,a):g},a.chargeDistance=function(n){return arguments.length?(p=n*n,a):Math.sqrt(p)},a.gravity=function(n){return arguments.length?(v=+n,a):v},a.theta=function(n){return arguments.length?(d=n*n,a):Math.sqrt(d)},a.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),Vo.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c>a;++a)e[a]=[];for(a=0;l>a;++a){var u=y[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,l=o.length;++a<l;)if(!isNaN(i=o[a][n]))return i;return Math.random()*r}var t,e,r,c=m.length,s=y.length,p=l[0],v=l[1];for(t=0;c>t;++t)(r=m[t]).index=t,r.weight=0;for(t=0;s>t;++t)r=y[t],"number"==typeof r.source&&(r.source=m[r.source]),"number"==typeof r.target&&(r.target=m[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=m[t],isNaN(r.x)&&(r.x=n("x",p)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof f)for(t=0;s>t;++t)u[t]=+f.call(this,y[t],t);else for(t=0;s>t;++t)u[t]=f;if(i=[],"function"==typeof h)for(t=0;s>t;++t)i[t]=+h.call(this,y[t],t);else for(t=0;s>t;++t)i[t]=h;if(o=[],"function"==typeof g)for(t=0;c>t;++t)o[t]=+g.call(this,m[t],t);else for(t=0;c>t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=Vo.behavior.drag().origin(wt).on("dragstart.force",Yu).on("drag.force",t).on("dragend.force",Iu)),arguments.length?(this.on("mouseover.force",Zu).on("mouseout.force",Vu).call(e),void 0):e},Vo.rebind(a,c,"on")};var ul=20,il=1,ol=1/0;Vo.layout.hierarchy=function(){function n(u){var i,o=[u],a=[];for(u.depth=0;null!=(i=o.pop());)if(a.push(i),(l=e.call(n,i,i.depth))&&(c=l.length)){for(var c,l,s;--c>=0;)o.push(s=l[c]),s.parent=i,s.depth=i.depth+1;r&&(i.value=0),i.children=l}else r&&(i.value=+r.call(n,i,i.depth)||0),delete i.children;return Wu(u,function(n){var e,u;t&&(e=n.children)&&e.sort(t),r&&(u=n.parent)&&(u.value+=n.value)}),a}var t=Ku,e=Ju,r=Gu;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(Bu(t,function(n){n.children&&(n.value=0)}),Wu(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},Vo.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(o=i.length)){var o,a,c,l=-1;for(r=t.value?r/t.value:0;++l<o;)n(a=i[l],e,c=a.value*r,u),e+=c}}function t(n){var e=n.children,r=0;if(e&&(u=e.length))for(var u,i=-1;++i<u;)r=Math.max(r,t(e[i]));return 1+r}function e(e,i){var o=r.call(this,e,i);return n(o[0],0,u[0],u[1]/t(o[0])),o}var r=Vo.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},$u(e,r)},Vo.layout.pie=function(){function n(i){var o=i.map(function(e,r){return+t.call(n,e,r)}),a=+("function"==typeof r?r.apply(this,arguments):r),c=(("function"==typeof u?u.apply(this,arguments):u)-a)/Vo.sum(o),l=Vo.range(i.length);null!=e&&l.sort(e===al?function(n,t){return o[t]-o[n]}:function(n,t){return e(i[n],i[t])});var s=[];return l.forEach(function(n){var t;s[n]={data:i[n],value:t=o[n],startAngle:a,endAngle:a+=t*c}}),s}var t=Number,e=al,r=0,u=Sa;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n};var al={};Vo.layout.stack=function(){function n(a,c){var l=a.map(function(e,r){return t.call(n,e,r)}),s=l.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),o.call(n,t,e)]})}),f=e.call(n,s,c);l=Vo.permute(l,f),s=Vo.permute(s,f);var h,g,p,v=r.call(n,s,c),d=l.length,m=l[0].length;for(g=0;m>g;++g)for(u.call(n,l[0][g],p=v[g],s[0][g][1]),h=1;d>h;++h)u.call(n,l[h][g],p+=s[h-1][g][1],s[h][g][1]);return a}var t=wt,e=ri,r=ui,u=ei,i=ni,o=ti;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:cl.get(t)||ri,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:ll.get(t)||ui,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var cl=Vo.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(ii),i=n.map(oi),o=Vo.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,l=[],s=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],l.push(e)):(c+=i[e],s.push(e));return s.reverse().concat(l)},reverse:function(n){return Vo.range(n.length).reverse()},"default":ri}),ll=Vo.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,l,s=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=l=0,e=1;h>e;++e){for(t=0,u=0;s>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];s>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,l>c&&(l=c)}for(e=0;h>e;++e)g[e]-=l;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:ui});Vo.layout.histogram=function(){function n(n,i){for(var o,a,c=[],l=n.map(e,this),s=r.call(this,l,i),f=u.call(this,s,l,i),i=-1,h=l.length,g=f.length-1,p=t?1:1/h;++i<g;)o=c[i]=[],o.dx=f[i+1]-(o.x=f[i]),o.y=0;if(g>0)for(i=-1;++i<h;)a=l[i],a>=s[0]&&a<=s[1]&&(o=c[Vo.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=si,u=ci;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=bt(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return li(n,t)}:bt(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},Vo.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],l=u[1],s=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,Wu(a,function(n){n.r=+s(n.value)}),Wu(a,vi),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/l))/2;Wu(a,function(n){n.r+=f}),Wu(a,vi),Wu(a,function(n){n.r-=f})}return yi(a,c/2,l/2,t?1:1/Math.max(2*a.r/c,2*a.r/l)),o}var t,e=Vo.layout.hierarchy().sort(fi),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},$u(n,e)},Vo.layout.tree=function(){function n(n,u){var s=o.call(this,n,u),f=s[0],h=t(f);if(Wu(h,e),h.parent.m=-h.z,Bu(h,r),l)Bu(f,i);else{var g=f,p=f,v=f;Bu(f,function(n){n.x<g.x&&(g=n),n.x>p.x&&(p=n),n.depth>v.depth&&(v=n)});var d=a(g,p)/2-g.x,m=c[0]/(p.x+a(p,g)/2+d),y=c[1]/(v.depth||1);Bu(f,function(n){n.x=(n.x+d)*m,n.y=n.depth*y})}return s}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var u,i=t.children,o=0,a=i.length;a>o;++o)r.push((i[o]=u={_:i[o],parent:t,children:(u=i[o].children)&&u.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=u);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Si(n);var i=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+a(n._,r._),n.m=n.z-i):n.z=i}else r&&(n.z=r.z+a(n._,r._));n.parent.A=u(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function u(n,t,e){if(t){for(var r,u=n,i=n,o=t,c=u.parent.children[0],l=u.m,s=i.m,f=o.m,h=c.m;o=bi(o),u=_i(u),o&&u;)c=_i(c),i=bi(i),i.a=n,r=o.z+f-u.z-l+a(o._,u._),r>0&&(wi(ki(o,n,e),n,r),l+=r,s+=r),f+=o.m,l+=u.m,h+=c.m,s+=i.m;o&&!bi(i)&&(i.t=o,i.m+=f-s),u&&!_i(c)&&(c.t=u,c.m+=l-h,e=n)}return e}function i(n){n.x*=c[0],n.y=n.depth*c[1]}var o=Vo.layout.hierarchy().sort(null).value(null),a=Mi,c=[1,1],l=null;return n.separation=function(t){return arguments.length?(a=t,n):a},n.size=function(t){return arguments.length?(l=null==(c=t)?i:null,n):l?null:c},n.nodeSize=function(t){return arguments.length?(l=null==(c=t)?null:i,n):l?c:null},$u(n,o)},Vo.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],l=0;Wu(c,function(n){var t=n.children;t&&t.length?(n.x=Ai(t),n.y=Ei(t)):(n.x=o?l+=e(n,o):0,n.y=0,o=n)});var s=Ci(c),f=Ni(c),h=s.x-e(s,f)/2,g=f.x+e(f,s)/2;return Wu(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=Vo.layout.hierarchy().sort(null).value(null),e=Mi,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},$u(n,t)},Vo.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u<i;)r=(e=n[u]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,l=f(e),s=[],h=i.slice(),p=1/0,v="slice"===g?l.dx:"dice"===g?l.dy:"slice-dice"===g?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(n(h,l.dx*l.dy/e.value),s.area=0;(c=h.length)>0;)s.push(o=h[c-1]),s.area+=o.area,"squarify"!==g||(a=r(s,v))<=p?(h.pop(),p=a):(s.area-=s.pop().area,u(s,v,l,!1),v=Math.min(l.dx,l.dy),s.length=s.area=0,p=1/0);s.length&&(u(s,v,l,!0),s.length=s.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++o<a;)(e=n[o].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,l=e.y,s=t?c(n.area/t):0;if(t==e.dx){for((r||s>e.dy)&&(s=e.dy);++i<o;)u=n[i],u.x=a,u.y=l,u.dy=s,a+=u.dx=Math.min(e.x+e.dx-a,s?c(u.area/s):0);u.z=!0,u.dx+=e.x+e.dx-a,e.y+=s,e.dy-=s}else{for((r||s>e.dx)&&(s=e.dx);++i<o;)u=n[i],u.x=a,u.y=l,u.dx=s,l+=u.dy=Math.min(e.y+e.dy-l,s?c(u.area/s):0);u.z=!1,u.dy+=e.y+e.dy-l,e.x+=s,e.dx-=s}}function i(r){var u=o||a(r),i=u[0];return i.x=0,i.y=0,i.dx=l[0],i.dy=l[1],o&&a.revalue(i),n([i],i.dx*i.dy/i.value),(o?e:t)(i),h&&(o=u),u}var o,a=Vo.layout.hierarchy(),c=Math.round,l=[1,1],s=null,f=zi,h=!1,g="squarify",p=.5*(1+Math.sqrt(5));return i.size=function(n){return arguments.length?(l=n,i):l},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?zi(t):Li(t,"number"==typeof e?[e,e,e,e]:e)}function e(t){return Li(t,n)}if(!arguments.length)return s;var r;return f=null==(s=n)?zi:"function"==(r=typeof n)?t:"number"===r?(n=[n,n,n,n],e):e,i},i.round=function(n){return arguments.length?(c=n?Math.round:Number,i):c!=Number},i.sticky=function(n){return arguments.length?(h=n,o=null,i):h},i.ratio=function(n){return arguments.length?(p=n,i):p},i.mode=function(n){return arguments.length?(g=n+"",i):g},$u(i,a)},Vo.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=Vo.random.normal.apply(Vo,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=Vo.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},Vo.scale={};var sl={floor:wt,ceil:wt};Vo.scale.linear=function(){return ji([0,1],[0,1],gu,!1)};var fl={s:1,g:1,p:1,r:1,e:1};Vo.scale.log=function(){return Xi(Vo.scale.linear().domain([0,1]),10,!0,[1,10])};var hl=Vo.format(".0e"),gl={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};Vo.scale.pow=function(){return $i(Vo.scale.linear(),1,[0,1])},Vo.scale.sqrt=function(){return Vo.scale.pow().exponent(.5)},Vo.scale.ordinal=function(){return Wi([],{t:"range",a:[[]]})},Vo.scale.category10=function(){return Vo.scale.ordinal().range(pl)},Vo.scale.category20=function(){return Vo.scale.ordinal().range(vl)},Vo.scale.category20b=function(){return Vo.scale.ordinal().range(dl)},Vo.scale.category20c=function(){return Vo.scale.ordinal().range(ml)};var pl=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(vt),vl=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(vt),dl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(vt),ml=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(vt);Vo.scale.quantile=function(){return Ji([],[])},Vo.scale.quantize=function(){return Gi(0,1,[0,1])},Vo.scale.threshold=function(){return Ki([.5],[0,1])},Vo.scale.identity=function(){return Qi([0,1])},Vo.svg={},Vo.svg.arc=function(){function n(){var n=t.apply(this,arguments),i=e.apply(this,arguments),o=r.apply(this,arguments)+yl,a=u.apply(this,arguments)+yl,c=(o>a&&(c=o,o=a,a=c),a-o),l=wa>c?"0":"1",s=Math.cos(o),f=Math.sin(o),h=Math.cos(a),g=Math.sin(a);
+return c>=xl?n?"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"M0,"+n+"A"+n+","+n+" 0 1,0 0,"+-n+"A"+n+","+n+" 0 1,0 0,"+n+"Z":"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"Z":n?"M"+i*s+","+i*f+"A"+i+","+i+" 0 "+l+",1 "+i*h+","+i*g+"L"+n*h+","+n*g+"A"+n+","+n+" 0 "+l+",0 "+n*s+","+n*f+"Z":"M"+i*s+","+i*f+"A"+i+","+i+" 0 "+l+",1 "+i*h+","+i*g+"L0,0"+"Z"}var t=no,e=to,r=eo,u=ro;return n.innerRadius=function(e){return arguments.length?(t=bt(e),n):t},n.outerRadius=function(t){return arguments.length?(e=bt(t),n):e},n.startAngle=function(t){return arguments.length?(r=bt(t),n):r},n.endAngle=function(t){return arguments.length?(u=bt(t),n):u},n.centroid=function(){var n=(t.apply(this,arguments)+e.apply(this,arguments))/2,i=(r.apply(this,arguments)+u.apply(this,arguments))/2+yl;return[Math.cos(i)*n,Math.sin(i)*n]},n};var yl=-ka,xl=Sa-Ea;Vo.svg.line=function(){return uo(wt)};var Ml=Vo.map({linear:io,"linear-closed":oo,step:ao,"step-before":co,"step-after":lo,basis:vo,"basis-open":mo,"basis-closed":yo,bundle:xo,cardinal:ho,"cardinal-open":so,"cardinal-closed":fo,monotone:ko});Ml.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var _l=[0,2/3,1/3,0],bl=[0,1/3,2/3,0],wl=[0,1/6,2/3,1/6];Vo.svg.line.radial=function(){var n=uo(Eo);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},co.reverse=lo,lo.reverse=co,Vo.svg.area=function(){return Ao(wt)},Vo.svg.area.radial=function(){var n=Ao(Eo);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},Vo.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),l=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,l)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,l.r,l.p0)+r(l.r,l.p1,l.a1-l.a0)+u(l.r,l.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)+yl,s=l.call(n,u,r)+yl;return{r:i,a0:o,a1:s,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(s),i*Math.sin(s)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>wa)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=pr,o=vr,a=Co,c=eo,l=ro;return n.radius=function(t){return arguments.length?(a=bt(t),n):a},n.source=function(t){return arguments.length?(i=bt(t),n):i},n.target=function(t){return arguments.length?(o=bt(t),n):o},n.startAngle=function(t){return arguments.length?(c=bt(t),n):c},n.endAngle=function(t){return arguments.length?(l=bt(t),n):l},n},Vo.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=pr,e=vr,r=No;return n.source=function(e){return arguments.length?(t=bt(e),n):t},n.target=function(t){return arguments.length?(e=bt(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},Vo.svg.diagonal.radial=function(){var n=Vo.svg.diagonal(),t=No,e=n.projection;return n.projection=function(n){return arguments.length?e(zo(t=n)):t},n},Vo.svg.symbol=function(){function n(n,r){return(Sl.get(t.call(this,n,r))||qo)(e.call(this,n,r))}var t=To,e=Lo;return n.type=function(e){return arguments.length?(t=bt(e),n):t},n.size=function(t){return arguments.length?(e=bt(t),n):e},n};var Sl=Vo.map({circle:qo,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Cl)),e=t*Cl;return"M0,"+-t+"L"+e+",0"+" 0,"+t+" "+-e+",0"+"Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/Al),e=t*Al/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/Al),e=t*Al/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});Vo.svg.symbolTypes=Sl.keys();var kl,El,Al=Math.sqrt(3),Cl=Math.tan(30*Ca),Nl=[],zl=0;Nl.call=va.call,Nl.empty=va.empty,Nl.node=va.node,Nl.size=va.size,Vo.transition=function(n){return arguments.length?kl?n.transition():n:ya.transition()},Vo.transition.prototype=Nl,Nl.select=function(n){var t,e,r,u=this.id,i=[];n=b(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]);for(var c=this[o],l=-1,s=c.length;++l<s;)(r=c[l])&&(e=n.call(r,r.__data__,l,o))?("__data__"in r&&(e.__data__=r.__data__),Uo(e,l,u,r.__transition__[u]),t.push(e)):t.push(null)}return Ro(i,u)},Nl.selectAll=function(n){var t,e,r,u,i,o=this.id,a=[];n=w(n);for(var c=-1,l=this.length;++c<l;)for(var s=this[c],f=-1,h=s.length;++f<h;)if(r=s[f]){i=r.__transition__[o],e=n.call(r,r.__data__,f,c),a.push(t=[]);for(var g=-1,p=e.length;++g<p;)(u=e[g])&&Uo(u,g,o,i),t.push(u)}return Ro(a,o)},Nl.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=R(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return Ro(u,this.id)},Nl.tween=function(n,t){var e=this.id;return arguments.length<2?this.node().__transition__[e].tween.get(n):P(this,null==t?function(t){t.__transition__[e].tween.remove(n)}:function(r){r.__transition__[e].tween.set(n,t)})},Nl.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?Pu:gu,a=Vo.ns.qualify(n);return Do(this,"attr."+n,t,a.local?i:u)},Nl.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=Vo.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Nl.style=function(n,t,e){function r(){this.style.removeProperty(n)}function u(t){return null==t?r:(t+="",function(){var r,u=Jo.getComputedStyle(this,null).getPropertyValue(n);return u!==t&&(r=gu(u,t),function(t){this.style.setProperty(n,r(t),e)})})}var i=arguments.length;if(3>i){if("string"!=typeof n){2>i&&(t="");for(e in n)this.style(e,n[e],t);return this}e=""}return Do(this,"style."+n,t,u)},Nl.styleTween=function(n,t,e){function r(r,u){var i=t.call(this,r,u,Jo.getComputedStyle(this,null).getPropertyValue(n));return i&&function(t){this.style.setProperty(n,i(t),e)}}return arguments.length<3&&(e=""),this.tween("style."+n,r)},Nl.text=function(n){return Do(this,"text",n,Po)},Nl.remove=function(){return this.each("end.transition",function(){var n;this.__transition__.count<2&&(n=this.parentNode)&&n.removeChild(this)})},Nl.ease=function(n){var t=this.id;return arguments.length<1?this.node().__transition__[t].ease:("function"!=typeof n&&(n=Vo.ease.apply(Vo,arguments)),P(this,function(e){e.__transition__[t].ease=n}))},Nl.delay=function(n){var t=this.id;return arguments.length<1?this.node().__transition__[t].delay:P(this,"function"==typeof n?function(e,r,u){e.__transition__[t].delay=+n.call(e,e.__data__,r,u)}:(n=+n,function(e){e.__transition__[t].delay=n}))},Nl.duration=function(n){var t=this.id;return arguments.length<1?this.node().__transition__[t].duration:P(this,"function"==typeof n?function(e,r,u){e.__transition__[t].duration=Math.max(1,n.call(e,e.__data__,r,u))}:(n=Math.max(1,n),function(e){e.__transition__[t].duration=n}))},Nl.each=function(n,t){var e=this.id;if(arguments.length<2){var r=El,u=kl;kl=e,P(this,function(t,r,u){El=t.__transition__[e],n.call(t,t.__data__,r,u)}),El=r,kl=u}else P(this,function(r){var u=r.__transition__[e];(u.event||(u.event=Vo.dispatch("start","end"))).on(n,t)});return this},Nl.transition=function(){for(var n,t,e,r,u=this.id,i=++zl,o=[],a=0,c=this.length;c>a;a++){o.push(n=[]);for(var t=this[a],l=0,s=t.length;s>l;l++)(e=t[l])&&(r=Object.create(e.__transition__[u]),r.delay+=r.duration,Uo(e,l,i,r)),n.push(e)}return Ro(o,i)},Vo.svg.axis=function(){function n(n){n.each(function(){var n,l=Vo.select(this),s=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):wt:t,p=l.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Ea),d=Vo.transition(p.exit()).style("opacity",Ea).remove(),m=Vo.transition(p.order()).style("opacity",1),y=qi(f),x=l.selectAll(".domain").data([0]),M=(x.enter().append("path").attr("class","domain"),Vo.transition(x));v.append("line"),v.append("text");var _=v.select("line"),b=m.select("line"),w=p.select("text").text(g),S=v.select("text"),k=m.select("text");switch(r){case"bottom":n=jo,_.attr("y2",u),S.attr("y",Math.max(u,0)+o),b.attr("x2",0).attr("y2",u),k.attr("x",0).attr("y",Math.max(u,0)+o),w.attr("dy",".71em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+i+"V0H"+y[1]+"V"+i);break;case"top":n=jo,_.attr("y2",-u),S.attr("y",-(Math.max(u,0)+o)),b.attr("x2",0).attr("y2",-u),k.attr("x",0).attr("y",-(Math.max(u,0)+o)),w.attr("dy","0em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+-i+"V0H"+y[1]+"V"+-i);break;case"left":n=Ho,_.attr("x2",-u),S.attr("x",-(Math.max(u,0)+o)),b.attr("x2",-u).attr("y2",0),k.attr("x",-(Math.max(u,0)+o)).attr("y",0),w.attr("dy",".32em").style("text-anchor","end"),M.attr("d","M"+-i+","+y[0]+"H0V"+y[1]+"H"+-i);break;case"right":n=Ho,_.attr("x2",u),S.attr("x",Math.max(u,0)+o),b.attr("x2",u).attr("y2",0),k.attr("x",Math.max(u,0)+o).attr("y",0),w.attr("dy",".32em").style("text-anchor","start"),M.attr("d","M"+i+","+y[0]+"H0V"+y[1]+"H"+i)}if(f.rangeBand){var E=f,A=E.rangeBand()/2;s=f=function(n){return E(n)+A}}else s.rangeBand?s=f:d.call(n,f);v.call(n,s),m.call(n,f)})}var t,e=Vo.scale.linear(),r=Ll,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Tl?t+"":Ll,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var Ll="bottom",Tl={top:1,right:1,bottom:1,left:1};Vo.svg.brush=function(){function n(i){i.each(function(){var i=Vo.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=i.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),i.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=i.selectAll(".resize").data(p,wt);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return ql[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var s,f=Vo.transition(i),h=Vo.transition(o);c&&(s=qi(c),h.attr("x",s[0]).attr("width",s[1]-s[0]),e(f)),l&&(s=qi(l),h.attr("y",s[0]).attr("height",s[1]-s[0]),r(f)),t(f)})}function t(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+s[+/e$/.test(n)]+","+f[+/^s/.test(n)]+")"})}function e(n){n.select(".extent").attr("x",s[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",s[1]-s[0])}function r(n){n.select(".extent").attr("y",f[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",f[1]-f[0])}function u(){function u(){32==Vo.event.keyCode&&(C||(x=null,z[0]-=s[1],z[1]-=f[1],C=2),y())}function p(){32==Vo.event.keyCode&&2==C&&(z[0]+=s[1],z[1]+=f[1],C=0,y())}function v(){var n=Vo.mouse(_),u=!1;M&&(n[0]+=M[0],n[1]+=M[1]),C||(Vo.event.altKey?(x||(x=[(s[0]+s[1])/2,(f[0]+f[1])/2]),z[0]=s[+(n[0]<x[0])],z[1]=f[+(n[1]<x[1])]):x=null),E&&d(n,c,0)&&(e(S),u=!0),A&&d(n,l,1)&&(r(S),u=!0),u&&(t(S),w({type:"brush",mode:C?"move":"resize"}))}function d(n,t,e){var r,u,a=qi(t),c=a[0],l=a[1],p=z[e],v=e?f:s,d=v[1]-v[0];return C&&(c-=p,l-=d+p),r=(e?g:h)?Math.max(c,Math.min(l,n[e])):n[e],C?u=(r+=p)+d:(x&&(p=Math.max(c,Math.min(l,2*x[e]-r))),r>p?(u=r,r=p):u=p),v[0]!=r||v[1]!=u?(e?o=null:i=null,v[0]=r,v[1]=u,!0):void 0}function m(){v(),S.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),Vo.select("body").style("cursor",null),L.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),N(),w({type:"brushend"})}var x,M,_=this,b=Vo.select(Vo.event.target),w=a.of(_,arguments),S=Vo.select(_),k=b.datum(),E=!/^(n|s)$/.test(k)&&c,A=!/^(e|w)$/.test(k)&&l,C=b.classed("extent"),N=I(),z=Vo.mouse(_),L=Vo.select(Jo).on("keydown.brush",u).on("keyup.brush",p);if(Vo.event.changedTouches?L.on("touchmove.brush",v).on("touchend.brush",m):L.on("mousemove.brush",v).on("mouseup.brush",m),S.interrupt().selectAll("*").interrupt(),C)z[0]=s[0]-z[0],z[1]=f[0]-z[1];else if(k){var T=+/w$/.test(k),q=+/^n/.test(k);M=[s[1-T]-z[0],f[1-q]-z[1]],z[0]=s[T],z[1]=f[q]}else Vo.event.altKey&&(x=z.slice());S.style("pointer-events","none").selectAll(".resize").style("display",null),Vo.select("body").style("cursor",b.style("cursor")),w({type:"brushstart"}),v()}var i,o,a=M(n,"brushstart","brush","brushend"),c=null,l=null,s=[0,0],f=[0,0],h=!0,g=!0,p=Rl[0];return n.event=function(n){n.each(function(){var n=a.of(this,arguments),t={x:s,y:f,i:i,j:o},e=this.__chart__||t;this.__chart__=t,kl?Vo.select(this).transition().each("start.brush",function(){i=e.i,o=e.j,s=e.x,f=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=pu(s,t.x),r=pu(f,t.y);return i=o=null,function(u){s=t.x=e(u),f=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){i=t.i,o=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,p=Rl[!c<<1|!l],n):c},n.y=function(t){return arguments.length?(l=t,p=Rl[!c<<1|!l],n):l},n.clamp=function(t){return arguments.length?(c&&l?(h=!!t[0],g=!!t[1]):c?h=!!t:l&&(g=!!t),n):c&&l?[h,g]:c?h:l?g:null},n.extent=function(t){var e,r,u,a,h;return arguments.length?(c&&(e=t[0],r=t[1],l&&(e=e[0],r=r[0]),i=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(h=e,e=r,r=h),(e!=s[0]||r!=s[1])&&(s=[e,r])),l&&(u=t[0],a=t[1],c&&(u=u[1],a=a[1]),o=[u,a],l.invert&&(u=l(u),a=l(a)),u>a&&(h=u,u=a,a=h),(u!=f[0]||a!=f[1])&&(f=[u,a])),n):(c&&(i?(e=i[0],r=i[1]):(e=s[0],r=s[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(h=e,e=r,r=h))),l&&(o?(u=o[0],a=o[1]):(u=f[0],a=f[1],l.invert&&(u=l.invert(u),a=l.invert(a)),u>a&&(h=u,u=a,a=h))),c&&l?[[e,u],[r,a]]:c?[e,r]:l&&[u,a])},n.clear=function(){return n.empty()||(s=[0,0],f=[0,0],i=o=null),n},n.empty=function(){return!!c&&s[0]==s[1]||!!l&&f[0]==f[1]},Vo.rebind(n,a,"on")};var ql={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Rl=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Dl=nc.format=oc.timeFormat,Pl=Dl.utc,Ul=Pl("%Y-%m-%dT%H:%M:%S.%LZ");Dl.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Fo:Ul,Fo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Fo.toString=Ul.toString,nc.second=Pt(function(n){return new tc(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),nc.seconds=nc.second.range,nc.seconds.utc=nc.second.utc.range,nc.minute=Pt(function(n){return new tc(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),nc.minutes=nc.minute.range,nc.minutes.utc=nc.minute.utc.range,nc.hour=Pt(function(n){var t=n.getTimezoneOffset()/60;return new tc(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),nc.hours=nc.hour.range,nc.hours.utc=nc.hour.utc.range,nc.month=Pt(function(n){return n=nc.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),nc.months=nc.month.range,nc.months.utc=nc.month.utc.range;var jl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Hl=[[nc.second,1],[nc.second,5],[nc.second,15],[nc.second,30],[nc.minute,1],[nc.minute,5],[nc.minute,15],[nc.minute,30],[nc.hour,1],[nc.hour,3],[nc.hour,6],[nc.hour,12],[nc.day,1],[nc.day,2],[nc.week,1],[nc.month,1],[nc.month,3],[nc.year,1]],Fl=Dl.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",Se]]),Ol={range:function(n,t,e){return Vo.range(Math.ceil(n/e)*e,+t,e).map(Yo)},floor:wt,ceil:wt};Hl.year=nc.year,nc.scale=function(){return Oo(Vo.scale.linear(),Hl,Fl)};var Yl=Hl.map(function(n){return[n[0].utc,n[1]]}),Il=Pl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",Se]]);Yl.year=nc.year.utc,nc.scale.utc=function(){return Oo(Vo.scale.linear(),Yl,Il)},Vo.text=St(function(n){return n.responseText}),Vo.json=function(n,t){return kt(n,"application/json",Io,t)},Vo.html=function(n,t){return kt(n,"text/html",Zo,t)},Vo.xml=St(function(n){return n.responseXML}),"function"==typeof define&&define.amd?define(Vo):"object"==typeof module&&module.exports&&(module.exports=Vo),this.d3=Vo}(); \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/main/webapp/tp/jquery-2.1.1.js b/framework/src/onos/web/gui/src/main/webapp/tp/jquery-2.1.1.js
new file mode 100644
index 00000000..04263688
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tp/jquery-2.1.1.js
@@ -0,0 +1,9176 @@
+(function( global, factory ) {
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+ // For CommonJS and CommonJS-like environments where a proper window is present,
+ // execute the factory and get jQuery
+ // For environments that do not inherently posses a window with a document
+ // (such as Node.js), expose a jQuery-making factory as module.exports
+ // This accentuates the need for the creation of a real window
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//
+
+var arr = [];
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var support = {};
+
+
+
+var
+ // Use the correct document accordingly with window argument (sandbox)
+ document = window.document,
+
+ version = "2.1.1",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Support: Android<4.1
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([\da-z])/gi,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ };
+
+jQuery.fn = jQuery.prototype = {
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // Start with an empty selector
+ selector: "",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num != null ?
+
+ // Return just the one element from the set
+ ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
+
+ // Return all the elements in a clean array
+ slice.call( this );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+ ret.context = this.context;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ // (You can seed the arguments with an array of args, but this is
+ // only used internally.)
+ each: function( callback, args ) {
+ return jQuery.each( this, callback, args );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ }));
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor(null);
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[0] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+ target = {};
+ }
+
+ // extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+ // Only deal with non-null/undefined values
+ if ( (options = arguments[ i ]) != null ) {
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray(src) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend({
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ // See test/unit/core.js for details concerning isFunction.
+ // Since version 1.3, DOM methods and functions like alert
+ // aren't supported. They return false on IE (#2968).
+ isFunction: function( obj ) {
+ return jQuery.type(obj) === "function";
+ },
+
+ isArray: Array.isArray,
+
+ isWindow: function( obj ) {
+ return obj != null && obj === obj.window;
+ },
+
+ isNumeric: function( obj ) {
+ // parseFloat NaNs numeric-cast false positives (null|true|false|"")
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ // subtraction forces infinities to NaN
+ return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0;
+ },
+
+ isPlainObject: function( obj ) {
+ // Not plain objects:
+ // - Any object or value whose internal [[Class]] property is not "[object Object]"
+ // - DOM nodes
+ // - window
+ if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.constructor &&
+ !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
+ return false;
+ }
+
+ // If the function hasn't returned already, we're confident that
+ // |obj| is a plain object, created by {} or constructed with new Object
+ return true;
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ type: function( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+ // Support: Android < 4.0, iOS < 6 (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call(obj) ] || "object" :
+ typeof obj;
+ },
+
+ // Evaluates a script in a global context
+ globalEval: function( code ) {
+ var script,
+ indirect = eval;
+
+ code = jQuery.trim( code );
+
+ if ( code ) {
+ // If the code includes a valid, prologue position
+ // strict mode pragma, execute code by injecting a
+ // script tag into the document.
+ if ( code.indexOf("use strict") === 1 ) {
+ script = document.createElement("script");
+ script.text = code;
+ document.head.appendChild( script ).parentNode.removeChild( script );
+ } else {
+ // Otherwise, avoid the DOM node creation, insertion
+ // and removal by using an indirect global eval
+ indirect( code );
+ }
+ }
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ },
+
+ // args is for internal usage only
+ each: function( obj, callback, args ) {
+ var value,
+ i = 0,
+ length = obj.length,
+ isArray = isArraylike( obj );
+
+ if ( args ) {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Support: Android<4.1
+ trim: function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArraylike( Object(arr) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
+ },
+
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var value,
+ i = 0,
+ length = elems.length,
+ isArray = isArraylike( elems ),
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ var tmp, args, proxy;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ now: Date.now,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+ var length = obj.length,
+ type = jQuery.type( obj );
+
+ if ( type === "function" || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.nodeType === 1 && length ) {
+ return true;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v1.10.19
+ * http://sizzlejs.com/
+ *
+ * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-04-18
+ */
+(function( window ) {
+
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + -(new Date()),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // General-purpose constants
+ strundefined = typeof undefined,
+ MAX_NEGATIVE = 1 << 31,
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf if we can't use a native one
+ indexOf = arr.indexOf || function( elem ) {
+ var i = 0,
+ len = this.length;
+ for ( ; i < len; i++ ) {
+ if ( this[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+ // http://www.w3.org/TR/css3-syntax/#characters
+ characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+ // Loosely modeled on CSS identifier characters
+ // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+ // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = characterEncoding.replace( "w", "w#" ),
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + characterEncoding + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + characterEncoding + ")" ),
+ "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+ "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+ rescape = /'|\\/g,
+
+ // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ };
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var match, elem, m, nodeType,
+ // QSA vars
+ i, groups, old, nid, newContext, newSelector;
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+
+ context = context || document;
+ results = results || [];
+
+ if ( !selector || typeof selector !== "string" ) {
+ return results;
+ }
+
+ if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
+ return [];
+ }
+
+ if ( documentIsHTML && !seed ) {
+
+ // Shortcuts
+ if ( (match = rquickExpr.exec( selector )) ) {
+ // Speed-up: Sizzle("#ID")
+ if ( (m = match[1]) ) {
+ if ( nodeType === 9 ) {
+ elem = context.getElementById( m );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document (jQuery #6963)
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE, Opera, and Webkit return items
+ // by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+ } else {
+ // Context is not a document
+ if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+ contains( context, elem ) && elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Speed-up: Sizzle("TAG")
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Speed-up: Sizzle(".CLASS")
+ } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // QSA path
+ if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+ nid = old = expando;
+ newContext = context;
+ newSelector = nodeType === 9 && selector;
+
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+ groups = tokenize( selector );
+
+ if ( (old = context.getAttribute("id")) ) {
+ nid = old.replace( rescape, "\\$&" );
+ } else {
+ context.setAttribute( "id", nid );
+ }
+ nid = "[id='" + nid + "'] ";
+
+ i = groups.length;
+ while ( i-- ) {
+ groups[i] = nid + toSelector( groups[i] );
+ }
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
+ newSelector = groups.join(",");
+ }
+
+ if ( newSelector ) {
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch(qsaError) {
+ } finally {
+ if ( !old ) {
+ context.removeAttribute("id");
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key + " " ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+ var div = document.createElement("div");
+
+ try {
+ return !!fn( div );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( div.parentNode ) {
+ div.parentNode.removeChild( div );
+ }
+ // release memory in IE
+ div = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = attrs.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ ( ~b.sourceIndex || MAX_NEGATIVE ) -
+ ( ~a.sourceIndex || MAX_NEGATIVE );
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== strundefined && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare,
+ doc = node ? node.ownerDocument || node : preferredDoc,
+ parent = doc.defaultView;
+
+ // If no document and documentElement is available, return
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Set our document
+ document = doc;
+ docElem = doc.documentElement;
+
+ // Support tests
+ documentIsHTML = !isXML( doc );
+
+ // Support: IE>8
+ // If iframe document is assigned to "document" variable and if iframe has been reloaded,
+ // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+ // IE6-8 do not support the defaultView property so parent will be undefined
+ if ( parent && parent !== parent.top ) {
+ // IE11 does not have attachEvent, so all must suffer
+ if ( parent.addEventListener ) {
+ parent.addEventListener( "unload", function() {
+ setDocument();
+ }, false );
+ } else if ( parent.attachEvent ) {
+ parent.attachEvent( "onunload", function() {
+ setDocument();
+ });
+ }
+ }
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
+ support.attributes = assert(function( div ) {
+ div.className = "i";
+ return !div.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( div ) {
+ div.appendChild( doc.createComment("") );
+ return !div.getElementsByTagName("*").length;
+ });
+
+ // Check if getElementsByClassName can be trusted
+ support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {
+ div.innerHTML = "<div class='a'></div><div class='a i'></div>";
+
+ // Support: Safari<4
+ // Catch class over-caching
+ div.firstChild.className = "i";
+ // Support: Opera<10
+ // Catch gEBCN failure to find non-leading classes
+ return div.getElementsByClassName("i").length === 2;
+ });
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( div ) {
+ docElem.appendChild( div ).id = expando;
+ return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+ });
+
+ // ID find and filter
+ if ( support.getById ) {
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
+ var m = context.getElementById( id );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ return m && m.parentNode ? [ m ] : [];
+ }
+ };
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ } else {
+ // Support: IE6/7
+ // getElementById is not reliable as a find shortcut
+ delete Expr.find["ID"];
+
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== strundefined ) {
+ return context.getElementsByTagName( tag );
+ }
+ } :
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See http://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( div ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // http://bugs.jquery.com/ticket/12359
+ div.innerHTML = "<select msallowclip=''><option selected=''></option></select>";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( div.querySelectorAll("[msallowclip^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !div.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+ });
+
+ assert(function( div ) {
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = doc.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ div.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( div.querySelectorAll("[name=d]").length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":enabled").length ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ div.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( div ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( div, "div" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( div, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully does not implement inclusive descendent
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+ return a === doc ? -1 :
+ b === doc ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return doc;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace( rattributeQuotes, "='$1']" );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch(e) {}
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ while ( (node = elem[i++]) ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] ) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, outerCache, node, diff, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+ // Seek `elem` from a previously-cached index
+ outerCache = parent[ expando ] || (parent[ expando ] = {});
+ cache = outerCache[ type ] || [];
+ nodeIndex = cache[0] === dirruns && cache[1];
+ diff = cache[0] === dirruns && cache[2];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ // Use previously-cached element index if available
+ } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+ diff = cache[1];
+
+ // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ } else {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf.call( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ return function( elem ) {
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": function( elem ) {
+ return elem.disabled === false;
+ },
+
+ "disabled": function( elem ) {
+ return elem.disabled === true;
+ },
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( (tokens = []) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ checkNonElements = base && dir === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+ if ( (oldCache = outerCache[ dir ]) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[ 2 ] = oldCache[ 2 ]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ outerCache[ dir ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf.call( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if ( outermost ) {
+ outermostContext = context !== document && context;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context, xml ) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // Apply set filters to unmatched elements
+ matchedCount += i;
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is no seed and only one group
+ if ( match.length === 1 ) {
+
+ // Take a shortcut and set the context if the root selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ support.getById && context.nodeType === 9 && documentIsHTML &&
+ Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome<14
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+ // Should return 1, but returns 4 (following)
+ return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+ div.innerHTML = "<a href='#'></a>";
+ return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+ div.innerHTML = "<input/>";
+ div.firstChild.setAttribute( "value", "" );
+ return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+ return div.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ /* jshint -W018 */
+ return !!qualifier.call( elem, i, elem ) !== not;
+ });
+
+ }
+
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ });
+
+ }
+
+ if ( typeof qualifier === "string" ) {
+ if ( risSimple.test( qualifier ) ) {
+ return jQuery.filter( qualifier, elements, not );
+ }
+
+ qualifier = jQuery.filter( qualifier, elements );
+ }
+
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
+ });
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 && elem.nodeType === 1 ?
+ jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+ jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ }));
+};
+
+jQuery.fn.extend({
+ find: function( selector ) {
+ var i,
+ len = this.length,
+ ret = [],
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter(function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ }) );
+ }
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ // Needed because $( selector, context ) becomes $( context ).find( selector )
+ ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+ ret.selector = this.selector ? this.selector + " " + selector : selector;
+ return ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], false) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], true) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+});
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+ init = jQuery.fn.init = function( selector, context ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) {
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ context = context instanceof jQuery ? context[0] : context;
+
+ // scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[1],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[2] );
+
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ if ( elem && elem.parentNode ) {
+ // Inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || rootjQuery ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return typeof rootjQuery.ready !== "undefined" ?
+ rootjQuery.ready( selector ) :
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+ // methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.extend({
+ dir: function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+ },
+
+ sibling: function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+ }
+});
+
+jQuery.fn.extend({
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter(function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[i] ) ) {
+ return true;
+ }
+ }
+ });
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+ jQuery( selectors, context || this.context ) :
+ 0;
+
+ for ( ; i < l; i++ ) {
+ for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && (pos ?
+ pos.index(cur) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector(cur, selectors)) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
+ },
+
+ // Determine the position of an element within
+ // the matched set of elements
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.unique(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter(selector)
+ );
+ }
+});
+
+function sibling( cur, dir ) {
+ while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each({
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return jQuery.dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return jQuery.dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return jQuery.dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return jQuery.sibling( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return elem.contentDocument || jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.unique( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+});
+var rnotwhite = (/\S+/g);
+
+
+
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+ var object = optionsCache[ options ] = {};
+ jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ });
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ ( optionsCache[ options ] || createOptions( options ) ) :
+ jQuery.extend( {}, options );
+
+ var // Last fire value (for non-forgettable lists)
+ memory,
+ // Flag to know if list was already fired
+ fired,
+ // Flag to know if list is currently firing
+ firing,
+ // First callback to fire (used internally by add and fireWith)
+ firingStart,
+ // End of the loop when firing
+ firingLength,
+ // Index of currently firing callback (modified by remove if needed)
+ firingIndex,
+ // Actual callback list
+ list = [],
+ // Stack of fire calls for repeatable lists
+ stack = !options.once && [],
+ // Fire callbacks
+ fire = function( data ) {
+ memory = options.memory && data;
+ fired = true;
+ firingIndex = firingStart || 0;
+ firingStart = 0;
+ firingLength = list.length;
+ firing = true;
+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+ if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+ memory = false; // To prevent further calls using add
+ break;
+ }
+ }
+ firing = false;
+ if ( list ) {
+ if ( stack ) {
+ if ( stack.length ) {
+ fire( stack.shift() );
+ }
+ } else if ( memory ) {
+ list = [];
+ } else {
+ self.disable();
+ }
+ }
+ },
+ // Actual Callbacks object
+ self = {
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+ // First, we save the current length
+ var start = list.length;
+ (function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ var type = jQuery.type( arg );
+ if ( type === "function" ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && type !== "string" ) {
+ // Inspect recursively
+ add( arg );
+ }
+ });
+ })( arguments );
+ // Do we need to add the callbacks to the
+ // current firing batch?
+ if ( firing ) {
+ firingLength = list.length;
+ // With memory, if we're not firing then
+ // we should call right away
+ } else if ( memory ) {
+ firingStart = start;
+ fire( memory );
+ }
+ }
+ return this;
+ },
+ // Remove a callback from the list
+ remove: function() {
+ if ( list ) {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+ // Handle firing indexes
+ if ( firing ) {
+ if ( index <= firingLength ) {
+ firingLength--;
+ }
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ }
+ });
+ }
+ return this;
+ },
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
+ },
+ // Remove all callbacks from the list
+ empty: function() {
+ list = [];
+ firingLength = 0;
+ return this;
+ },
+ // Have the list do nothing anymore
+ disable: function() {
+ list = stack = memory = undefined;
+ return this;
+ },
+ // Is it disabled?
+ disabled: function() {
+ return !list;
+ },
+ // Lock the list in its current state
+ lock: function() {
+ stack = undefined;
+ if ( !memory ) {
+ self.disable();
+ }
+ return this;
+ },
+ // Is it locked?
+ locked: function() {
+ return !stack;
+ },
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( list && ( !fired || stack ) ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ if ( firing ) {
+ stack.push( args );
+ } else {
+ fire( args );
+ }
+ }
+ return this;
+ },
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+jQuery.extend({
+
+ Deferred: function( func ) {
+ var tuples = [
+ // action, add listener, listener list, final state
+ [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+ [ "notify", "progress", jQuery.Callbacks("memory") ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ then: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+ return jQuery.Deferred(function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+ var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+ // deferred[ done | fail | progress ] for forwarding actions to newDefer
+ deferred[ tuple[1] ](function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .done( newDefer.resolve )
+ .fail( newDefer.reject )
+ .progress( newDefer.notify );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+ }
+ });
+ });
+ fns = null;
+ }).promise();
+ },
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Keep pipe for back-compat
+ promise.pipe = promise.then;
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 3 ];
+
+ // promise[ done | fail | progress ] = list.add
+ promise[ tuple[1] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(function() {
+ // state = [ resolved | rejected ]
+ state = stateString;
+
+ // [ reject_list | resolve_list ].disable; progress_list.lock
+ }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+ }
+
+ // deferred[ resolve | reject | notify ]
+ deferred[ tuple[0] ] = function() {
+ deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+ return this;
+ };
+ deferred[ tuple[0] + "With" ] = list.fireWith;
+ });
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( subordinate /* , ..., subordinateN */ ) {
+ var i = 0,
+ resolveValues = slice.call( arguments ),
+ length = resolveValues.length,
+
+ // the count of uncompleted subordinates
+ remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+ // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+ deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+ // Update function for both resolve and progress values
+ updateFunc = function( i, contexts, values ) {
+ return function( value ) {
+ contexts[ i ] = this;
+ values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( values === progressValues ) {
+ deferred.notifyWith( contexts, values );
+ } else if ( !( --remaining ) ) {
+ deferred.resolveWith( contexts, values );
+ }
+ };
+ },
+
+ progressValues, progressContexts, resolveContexts;
+
+ // add listeners to Deferred subordinates; treat others as resolved
+ if ( length > 1 ) {
+ progressValues = new Array( length );
+ progressContexts = new Array( length );
+ resolveContexts = new Array( length );
+ for ( ; i < length; i++ ) {
+ if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+ resolveValues[ i ].promise()
+ .done( updateFunc( i, resolveContexts, resolveValues ) )
+ .fail( deferred.reject )
+ .progress( updateFunc( i, progressContexts, progressValues ) );
+ } else {
+ --remaining;
+ }
+ }
+ }
+
+ // if we're not waiting on anything, resolve the master
+ if ( !remaining ) {
+ deferred.resolveWith( resolveContexts, resolveValues );
+ }
+
+ return deferred.promise();
+ }
+});
+
+
+// The deferred used on DOM ready
+var readyList;
+
+jQuery.fn.ready = function( fn ) {
+ // Add the callback
+ jQuery.ready.promise().done( fn );
+
+ return this;
+};
+
+jQuery.extend({
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.triggerHandler ) {
+ jQuery( document ).triggerHandler( "ready" );
+ jQuery( document ).off( "ready" );
+ }
+ }
+});
+
+/**
+ * The ready event handler and self cleanup method
+ */
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed, false );
+ window.removeEventListener( "load", completed, false );
+ jQuery.ready();
+}
+
+jQuery.ready.promise = function( obj ) {
+ if ( !readyList ) {
+
+ readyList = jQuery.Deferred();
+
+ // Catch cases where $(document).ready() is called after the browser event has already occurred.
+ // we once tried to use readyState "interactive" here, but it caused issues like the one
+ // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ setTimeout( jQuery.ready );
+
+ } else {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed, false );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed, false );
+ }
+ }
+ return readyList.promise( obj );
+};
+
+// Kick off the DOM ready check even if the user does not
+jQuery.ready.promise();
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+ }
+ }
+ }
+
+ return chainable ?
+ elems :
+
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ len ? fn( elems[0], key ) : emptyGet;
+};
+
+
+/**
+ * Determines whether an object can have data
+ */
+jQuery.acceptData = function( owner ) {
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ /* jshint -W018 */
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+function Data() {
+ // Support: Android < 4,
+ // Old WebKit does not have Object.preventExtensions/freeze method,
+ // return new empty object instead with no [[set]] accessor
+ Object.defineProperty( this.cache = {}, 0, {
+ get: function() {
+ return {};
+ }
+ });
+
+ this.expando = jQuery.expando + Math.random();
+}
+
+Data.uid = 1;
+Data.accepts = jQuery.acceptData;
+
+Data.prototype = {
+ key: function( owner ) {
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return the key for a frozen object.
+ if ( !Data.accepts( owner ) ) {
+ return 0;
+ }
+
+ var descriptor = {},
+ // Check if the owner object already has a cache key
+ unlock = owner[ this.expando ];
+
+ // If not, create one
+ if ( !unlock ) {
+ unlock = Data.uid++;
+
+ // Secure it in a non-enumerable, non-writable property
+ try {
+ descriptor[ this.expando ] = { value: unlock };
+ Object.defineProperties( owner, descriptor );
+
+ // Support: Android < 4
+ // Fallback to a less secure definition
+ } catch ( e ) {
+ descriptor[ this.expando ] = unlock;
+ jQuery.extend( owner, descriptor );
+ }
+ }
+
+ // Ensure the cache object
+ if ( !this.cache[ unlock ] ) {
+ this.cache[ unlock ] = {};
+ }
+
+ return unlock;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ // There may be an unlock assigned to this node,
+ // if there is no entry for this "owner", create one inline
+ // and set the unlock as though an owner entry had always existed
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
+
+ // Handle: [ owner, key, value ] args
+ if ( typeof data === "string" ) {
+ cache[ data ] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+ // Fresh assignments by object are shallow copied
+ if ( jQuery.isEmptyObject( cache ) ) {
+ jQuery.extend( this.cache[ unlock ], data );
+ // Otherwise, copy the properties one-by-one to the cache object
+ } else {
+ for ( prop in data ) {
+ cache[ prop ] = data[ prop ];
+ }
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ // Either a valid cache is found, or will be created.
+ // New caches will be created and the unlock returned,
+ // allowing direct access to the newly created
+ // empty data object. A valid owner object must be provided.
+ var cache = this.cache[ this.key( owner ) ];
+
+ return key === undefined ?
+ cache : cache[ key ];
+ },
+ access: function( owner, key, value ) {
+ var stored;
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ((key && typeof key === "string") && value === undefined) ) {
+
+ stored = this.get( owner, key );
+
+ return stored !== undefined ?
+ stored : this.get( owner, jQuery.camelCase(key) );
+ }
+
+ // [*]When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i, name, camel,
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
+
+ if ( key === undefined ) {
+ this.cache[ unlock ] = {};
+
+ } else {
+ // Support array or space separated string of keys
+ if ( jQuery.isArray( key ) ) {
+ // If "name" is an array of keys...
+ // When data is initially created, via ("key", "val") signature,
+ // keys will be converted to camelCase.
+ // Since there is no way to tell _how_ a key was added, remove
+ // both plain key and camelCase key. #12786
+ // This will only penalize the array argument path.
+ name = key.concat( key.map( jQuery.camelCase ) );
+ } else {
+ camel = jQuery.camelCase( key );
+ // Try the string as a key before any manipulation
+ if ( key in cache ) {
+ name = [ key, camel ];
+ } else {
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ name = camel;
+ name = name in cache ?
+ [ name ] : ( name.match( rnotwhite ) || [] );
+ }
+ }
+
+ i = name.length;
+ while ( i-- ) {
+ delete cache[ name[ i ] ];
+ }
+ }
+ },
+ hasData: function( owner ) {
+ return !jQuery.isEmptyObject(
+ this.cache[ owner[ this.expando ] ] || {}
+ );
+ },
+ discard: function( owner ) {
+ if ( owner[ this.expando ] ) {
+ delete this.cache[ owner[ this.expando ] ];
+ }
+ }
+};
+var data_priv = new Data();
+
+var data_user = new Data();
+
+
+
+/*
+ Implementation Summary
+
+ 1. Enforce API surface and semantic compatibility with 1.9.x branch
+ 2. Improve the module's maintainability by reducing the storage
+ paths to a single mechanism.
+ 3. Use the same single mechanism to support "private" and "user" data.
+ 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+ 5. Avoid exposing implementation details on user objects (eg. expando properties)
+ 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+*/
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /([A-Z])/g;
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ data_user.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+}
+
+jQuery.extend({
+ hasData: function( elem ) {
+ return data_user.hasData( elem ) || data_priv.hasData( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return data_user.access( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ data_user.remove( elem, name );
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to data_priv methods, these can be deprecated.
+ _data: function( elem, name, data ) {
+ return data_priv.access( elem, name, data );
+ },
+
+ _removeData: function( elem, name ) {
+ data_priv.remove( elem, name );
+ }
+});
+
+jQuery.fn.extend({
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = data_user.get( elem );
+
+ if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE11+
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = jQuery.camelCase( name.slice(5) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ data_priv.set( elem, "hasDataAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each(function() {
+ data_user.set( this, key );
+ });
+ }
+
+ return access( this, function( value ) {
+ var data,
+ camelKey = jQuery.camelCase( key );
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+ // Attempt to get data from the cache
+ // with the key as-is
+ data = data_user.get( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to get data from the cache
+ // with the key camelized
+ data = data_user.get( elem, camelKey );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, camelKey, undefined );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ this.each(function() {
+ // First, attempt to store a copy or reference of any
+ // data that might've been store with a camelCased key.
+ var data = data_user.get( this, camelKey );
+
+ // For HTML5 data-* attribute interop, we have to
+ // store property names with dashes in a camelCase form.
+ // This might not apply to all properties...*
+ data_user.set( this, camelKey, value );
+
+ // *... In the case of properties that might _actually_
+ // have dashes, we need to also store a copy of that
+ // unchanged property.
+ if ( key.indexOf("-") !== -1 && data !== undefined ) {
+ data_user.set( this, key, value );
+ }
+ });
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each(function() {
+ data_user.remove( this, key );
+ });
+ }
+});
+
+
+jQuery.extend({
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = data_priv.get( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || jQuery.isArray( data ) ) {
+ queue = data_priv.access( elem, type, jQuery.makeArray(data) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // not intended for public consumption - generates a queueHooks object, or returns the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return data_priv.get( elem, key ) || data_priv.access( elem, key, {
+ empty: jQuery.Callbacks("once memory").add(function() {
+ data_priv.remove( elem, [ type + "queue", key ] );
+ })
+ });
+ }
+});
+
+jQuery.fn.extend({
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[0], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each(function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ dequeue: function( type ) {
+ return this.each(function() {
+ jQuery.dequeue( this, type );
+ });
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = data_priv.get( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+});
+var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHidden = function( elem, el ) {
+ // isHidden might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+ return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+ };
+
+var rcheckableType = (/^(?:checkbox|radio)$/i);
+
+
+
+(function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // #11217 - WebKit loses check when the name is after the checked attribute
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` need .setAttribute for WWA
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
+ // old WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ // Support: IE9-IE11+
+ div.innerHTML = "<textarea>x</textarea>";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+})();
+var strundefined = typeof undefined;
+
+
+
+support.focusinBubbles = "onfocusin" in window;
+
+
+var
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.get( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !(events = elemData.events) ) {
+ events = elemData.events = {};
+ }
+ if ( !(eventHandle = elemData.handle) ) {
+ eventHandle = elemData.handle = function( e ) {
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend({
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join(".")
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !(handlers = events[ type ]) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle, false );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.hasData( elem ) && data_priv.get( elem );
+
+ if ( !elemData || !(events = elemData.events) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ delete elemData.handle;
+ data_priv.remove( elem, "events" );
+ }
+ },
+
+ trigger: function( event, data, elem, onlyHandlers ) {
+
+ var i, cur, tmp, bubbleType, ontype, handle, special,
+ eventPath = [ elem || document ],
+ type = hasOwn.call( event, "type" ) ? event.type : event,
+ namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+ cur = tmp = elem = elem || document;
+
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+ return;
+ }
+
+ if ( type.indexOf(".") >= 0 ) {
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf(":") < 0 && "on" + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[ jQuery.expando ] ?
+ event :
+ new jQuery.Event( type, typeof event === "object" && event );
+
+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+ event.isTrigger = onlyHandlers ? 2 : 3;
+ event.namespace = namespaces.join(".");
+ event.namespace_re = event.namespace ?
+ new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+ null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if ( !event.target ) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ?
+ [ event ] :
+ jQuery.makeArray( data, [ event ] );
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+ bubbleType = special.delegateType || type;
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
+ cur = cur.parentNode;
+ }
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push( cur );
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( tmp === (elem.ownerDocument || document) ) {
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+
+ // jQuery handler
+ handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+
+ // Native handler
+ handle = ontype && cur[ ontype ];
+ if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
+ event.result = handle.apply( cur, data );
+ if ( event.result === false ) {
+ event.preventDefault();
+ }
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+ if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
+ jQuery.acceptData( elem ) ) {
+
+ // Call a native DOM method on the target with the same name name as the event.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
+
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ tmp = elem[ ontype ];
+
+ if ( tmp ) {
+ elem[ ontype ] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+ elem[ type ]();
+ jQuery.event.triggered = undefined;
+
+ if ( tmp ) {
+ elem[ ontype ] = tmp;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ dispatch: function( event ) {
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( event );
+
+ var i, j, ret, matched, handleObj,
+ handlerQueue = [],
+ args = slice.call( arguments ),
+ handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[0] = event;
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or
+ // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+ .apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( (event.result = ret) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, matches, sel, handleObj,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ // Black-hole SVG <use> instance trees (#13180)
+ // Avoid non-left-click bubbling in Firefox (#3861)
+ if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
+
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.disabled !== true || event.type !== "click" ) {
+ matches = [];
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matches[ sel ] === undefined ) {
+ matches[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) >= 0 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matches[ sel ] ) {
+ matches.push( handleObj );
+ }
+ }
+ if ( matches.length ) {
+ handlerQueue.push({ elem: cur, handlers: matches });
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+ }
+
+ return handlerQueue;
+ },
+
+ // Includes some event props shared by KeyEvent and MouseEvent
+ props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+ fixHooks: {},
+
+ keyHooks: {
+ props: "char charCode key keyCode".split(" "),
+ filter: function( event, original ) {
+
+ // Add which for key events
+ if ( event.which == null ) {
+ event.which = original.charCode != null ? original.charCode : original.keyCode;
+ }
+
+ return event;
+ }
+ },
+
+ mouseHooks: {
+ props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+ filter: function( event, original ) {
+ var eventDoc, doc, body,
+ button = original.button;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && original.clientX != null ) {
+ eventDoc = event.target.ownerDocument || document;
+ doc = eventDoc.documentElement;
+ body = eventDoc.body;
+
+ event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+ event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && button !== undefined ) {
+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+ }
+
+ return event;
+ }
+ },
+
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
+
+ // Create a writable copy of the event object and normalize some properties
+ var i, prop, copy,
+ type = event.type,
+ originalEvent = event,
+ fixHook = this.fixHooks[ type ];
+
+ if ( !fixHook ) {
+ this.fixHooks[ type ] = fixHook =
+ rmouseEvent.test( type ) ? this.mouseHooks :
+ rkeyEvent.test( type ) ? this.keyHooks :
+ {};
+ }
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+ event = new jQuery.Event( originalEvent );
+
+ i = copy.length;
+ while ( i-- ) {
+ prop = copy[ i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Support: Cordova 2.5 (WebKit) (#13255)
+ // All events should have a target; Cordova deviceready doesn't
+ if ( !event.target ) {
+ event.target = document;
+ }
+
+ // Support: Safari 6.0+, Chrome < 28
+ // Target should not be a text node (#504, #13143)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+ },
+
+ special: {
+ load: {
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ focus: {
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function() {
+ if ( this !== safeActiveElement() && this.focus ) {
+ this.focus();
+ return false;
+ }
+ },
+ delegateType: "focusin"
+ },
+ blur: {
+ trigger: function() {
+ if ( this === safeActiveElement() && this.blur ) {
+ this.blur();
+ return false;
+ }
+ },
+ delegateType: "focusout"
+ },
+ click: {
+ // For checkbox, fire native event so checked state will be right
+ trigger: function() {
+ if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
+ this.click();
+ return false;
+ }
+ },
+
+ // For cross-browser consistency, don't fire native .click() on links
+ _default: function( event ) {
+ return jQuery.nodeName( event.target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ },
+
+ simulate: function( type, elem, event, bubble ) {
+ // Piggyback on a donor event to simulate a different one.
+ // Fake originalEvent to avoid donor's stopPropagation, but if the
+ // simulated event prevents default then we do the same on the donor.
+ var e = jQuery.extend(
+ new jQuery.Event(),
+ event,
+ {
+ type: type,
+ isSimulated: true,
+ originalEvent: {}
+ }
+ );
+ if ( bubble ) {
+ jQuery.event.trigger( e, null, elem );
+ } else {
+ jQuery.event.dispatch.call( elem, e );
+ }
+ if ( e.isDefaultPrevented() ) {
+ event.preventDefault();
+ }
+ }
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle, false );
+ }
+};
+
+jQuery.Event = function( src, props ) {
+ // Allow instantiation without the 'new' keyword
+ if ( !(this instanceof jQuery.Event) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+ // Support: Android < 4.0
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || jQuery.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if ( e && e.preventDefault ) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if ( e && e.stopPropagation ) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && e.stopImmediatePropagation ) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// Support: Chrome 15+
+jQuery.each({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mousenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+});
+
+// Create "bubbling" focus and blur events
+// Support: Firefox, Chrome, Safari
+if ( !support.focusinBubbles ) {
+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+ // Attach a single capturing handler on the document while someone wants focusin/focusout
+ var handler = function( event ) {
+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+ };
+
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix );
+
+ if ( !attaches ) {
+ doc.addEventListener( orig, handler, true );
+ }
+ data_priv.access( doc, fix, ( attaches || 0 ) + 1 );
+ },
+ teardown: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix ) - 1;
+
+ if ( !attaches ) {
+ doc.removeEventListener( orig, handler, true );
+ data_priv.remove( doc, fix );
+
+ } else {
+ data_priv.access( doc, fix, attaches );
+ }
+ }
+ };
+ });
+}
+
+jQuery.fn.extend({
+
+ on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ this.on( type, selector, data, types[ type ], one );
+ }
+ return this;
+ }
+
+ if ( data == null && fn == null ) {
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return this;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return this.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ });
+ },
+ one: function( types, selector, data, fn ) {
+ return this.on( types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each(function() {
+ jQuery.event.remove( this, types, fn, selector );
+ });
+ },
+
+ trigger: function( type, data ) {
+ return this.each(function() {
+ jQuery.event.trigger( type, data, this );
+ });
+ },
+ triggerHandler: function( type, data ) {
+ var elem = this[0];
+ if ( elem ) {
+ return jQuery.event.trigger( type, data, elem, true );
+ }
+ }
+});
+
+
+var
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+ rtagName = /<([\w:]+)/,
+ rhtml = /<|&#?\w+;/,
+ rnoInnerhtml = /<(?:script|style|link)/i,
+ // checked="checked" or checked
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+ rscriptType = /^$|\/(?:java|ecma)script/i,
+ rscriptTypeMasked = /^true\/(.*)/,
+ rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+
+ // We have to close these tags to support XHTML (#13200)
+ wrapMap = {
+
+ // Support: IE 9
+ option: [ 1, "<select multiple='multiple'>", "</select>" ],
+
+ thead: [ 1, "<table>", "</table>" ],
+ col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
+ tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+ td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+ _default: [ 0, "", "" ]
+ };
+
+// Support: IE 9
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// Support: 1.x compatibility
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+ return jQuery.nodeName( elem, "table" ) &&
+ jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
+
+ elem.getElementsByTagName("tbody")[0] ||
+ elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+ elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+ elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
+ return elem;
+}
+function restoreScript( elem ) {
+ var match = rscriptTypeMasked.exec( elem.type );
+
+ if ( match ) {
+ elem.type = match[ 1 ];
+ } else {
+ elem.removeAttribute("type");
+ }
+
+ return elem;
+}
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ data_priv.set(
+ elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" )
+ );
+ }
+}
+
+function cloneCopyEvent( src, dest ) {
+ var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+
+ if ( dest.nodeType !== 1 ) {
+ return;
+ }
+
+ // 1. Copy private data: events, handlers, etc.
+ if ( data_priv.hasData( src ) ) {
+ pdataOld = data_priv.access( src );
+ pdataCur = data_priv.set( dest, pdataOld );
+ events = pdataOld.events;
+
+ if ( events ) {
+ delete pdataCur.handle;
+ pdataCur.events = {};
+
+ for ( type in events ) {
+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+ jQuery.event.add( dest, type, events[ type ][ i ] );
+ }
+ }
+ }
+ }
+
+ // 2. Copy user data
+ if ( data_user.hasData( src ) ) {
+ udataOld = data_user.access( src );
+ udataCur = jQuery.extend( {}, udataOld );
+
+ data_user.set( dest, udataCur );
+ }
+}
+
+function getAll( context, tag ) {
+ var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) :
+ context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :
+ [];
+
+ return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+ jQuery.merge( [ context ], ret ) :
+ ret;
+}
+
+// Support: IE >= 9
+function fixInput( src, dest ) {
+ var nodeName = dest.nodeName.toLowerCase();
+
+ // Fails to persist the checked state of a cloned checkbox or radio button.
+ if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+ dest.checked = src.checked;
+
+ // Fails to return the selected option to the default selected state when cloning options
+ } else if ( nodeName === "input" || nodeName === "textarea" ) {
+ dest.defaultValue = src.defaultValue;
+ }
+}
+
+jQuery.extend({
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+ var i, l, srcElements, destElements,
+ clone = elem.cloneNode( true ),
+ inPage = jQuery.contains( elem.ownerDocument, elem );
+
+ // Support: IE >= 9
+ // Fix Cloning issues
+ if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+ !jQuery.isXMLDoc( elem ) ) {
+
+ // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+ destElements = getAll( clone );
+ srcElements = getAll( elem );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ fixInput( srcElements[ i ], destElements[ i ] );
+ }
+ }
+
+ // Copy the events from the original to the clone
+ if ( dataAndEvents ) {
+ if ( deepDataAndEvents ) {
+ srcElements = srcElements || getAll( elem );
+ destElements = destElements || getAll( clone );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+ }
+ } else {
+ cloneCopyEvent( elem, clone );
+ }
+ }
+
+ // Preserve script evaluation history
+ destElements = getAll( clone, "script" );
+ if ( destElements.length > 0 ) {
+ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+ }
+
+ // Return the cloned set
+ return clone;
+ },
+
+ buildFragment: function( elems, context, scripts, selection ) {
+ var elem, tmp, tag, wrap, contains, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( jQuery.type( elem ) === "object" ) {
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement("div") );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ];
+
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Fixes #12346
+ // Support: Webkit, IE
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ( (elem = nodes[ i++ ]) ) {
+
+ // #4087 - If origin and destination elements are the same, and this is
+ // that element, do not do anything
+ if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+ continue;
+ }
+
+ contains = jQuery.contains( elem.ownerDocument, elem );
+
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( (elem = tmp[ j++ ]) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
+ },
+
+ cleanData: function( elems ) {
+ var data, elem, type, key,
+ special = jQuery.event.special,
+ i = 0;
+
+ for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
+ if ( jQuery.acceptData( elem ) ) {
+ key = elem[ data_priv.expando ];
+
+ if ( key && (data = data_priv.cache[ key ]) ) {
+ if ( data.events ) {
+ for ( type in data.events ) {
+ if ( special[ type ] ) {
+ jQuery.event.remove( elem, type );
+
+ // This is a shortcut to avoid jQuery.event.remove's overhead
+ } else {
+ jQuery.removeEvent( elem, type, data.handle );
+ }
+ }
+ }
+ if ( data_priv.cache[ key ] ) {
+ // Discard any remaining `private` data
+ delete data_priv.cache[ key ];
+ }
+ }
+ }
+ // Discard any remaining `user` data
+ delete data_user.cache[ elem[ data_user.expando ] ];
+ }
+ }
+});
+
+jQuery.fn.extend({
+ text: function( value ) {
+ return access( this, function( value ) {
+ return value === undefined ?
+ jQuery.text( this ) :
+ this.empty().each(function() {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ this.textContent = value;
+ }
+ });
+ }, null, value, arguments.length );
+ },
+
+ append: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.appendChild( elem );
+ }
+ });
+ },
+
+ prepend: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.insertBefore( elem, target.firstChild );
+ }
+ });
+ },
+
+ before: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this );
+ }
+ });
+ },
+
+ after: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ }
+ });
+ },
+
+ remove: function( selector, keepData /* Internal Use Only */ ) {
+ var elem,
+ elems = selector ? jQuery.filter( selector, this ) : this,
+ i = 0;
+
+ for ( ; (elem = elems[i]) != null; i++ ) {
+ if ( !keepData && elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem ) );
+ }
+
+ if ( elem.parentNode ) {
+ if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+ setGlobalEval( getAll( elem, "script" ) );
+ }
+ elem.parentNode.removeChild( elem );
+ }
+ }
+
+ return this;
+ },
+
+ empty: function() {
+ var elem,
+ i = 0;
+
+ for ( ; (elem = this[i]) != null; i++ ) {
+ if ( elem.nodeType === 1 ) {
+
+ // Prevent memory leaks
+ jQuery.cleanData( getAll( elem, false ) );
+
+ // Remove any remaining nodes
+ elem.textContent = "";
+ }
+ }
+
+ return this;
+ },
+
+ clone: function( dataAndEvents, deepDataAndEvents ) {
+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+ return this.map(function() {
+ return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+ });
+ },
+
+ html: function( value ) {
+ return access( this, function( value ) {
+ var elem = this[ 0 ] || {},
+ i = 0,
+ l = this.length;
+
+ if ( value === undefined && elem.nodeType === 1 ) {
+ return elem.innerHTML;
+ }
+
+ // See if we can take a shortcut and just use innerHTML
+ if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+ !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+ value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+ try {
+ for ( ; i < l; i++ ) {
+ elem = this[ i ] || {};
+
+ // Remove element nodes and prevent memory leaks
+ if ( elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem, false ) );
+ elem.innerHTML = value;
+ }
+ }
+
+ elem = 0;
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch( e ) {}
+ }
+
+ if ( elem ) {
+ this.empty().append( value );
+ }
+ }, null, value, arguments.length );
+ },
+
+ replaceWith: function() {
+ var arg = arguments[ 0 ];
+
+ // Make the changes, replacing each context element with the new content
+ this.domManip( arguments, function( elem ) {
+ arg = this.parentNode;
+
+ jQuery.cleanData( getAll( this ) );
+
+ if ( arg ) {
+ arg.replaceChild( elem, this );
+ }
+ });
+
+ // Force removal if there was no new content (e.g., from empty arguments)
+ return arg && (arg.length || arg.nodeType) ? this : this.remove();
+ },
+
+ detach: function( selector ) {
+ return this.remove( selector, true );
+ },
+
+ domManip: function( args, callback ) {
+
+ // Flatten any nested arrays
+ args = concat.apply( [], args );
+
+ var fragment, first, scripts, hasScripts, node, doc,
+ i = 0,
+ l = this.length,
+ set = this,
+ iNoClone = l - 1,
+ value = args[ 0 ],
+ isFunction = jQuery.isFunction( value );
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if ( isFunction ||
+ ( l > 1 && typeof value === "string" &&
+ !support.checkClone && rchecked.test( value ) ) ) {
+ return this.each(function( index ) {
+ var self = set.eq( index );
+ if ( isFunction ) {
+ args[ 0 ] = value.call( this, index, self.html() );
+ }
+ self.domManip( args, callback );
+ });
+ }
+
+ if ( l ) {
+ fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
+ first = fragment.firstChild;
+
+ if ( fragment.childNodes.length === 1 ) {
+ fragment = first;
+ }
+
+ if ( first ) {
+ scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+ hasScripts = scripts.length;
+
+ // Use the original fragment for the last item instead of the first because it can end up
+ // being emptied incorrectly in certain situations (#8070).
+ for ( ; i < l; i++ ) {
+ node = fragment;
+
+ if ( i !== iNoClone ) {
+ node = jQuery.clone( node, true, true );
+
+ // Keep references to cloned scripts for later restoration
+ if ( hasScripts ) {
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( scripts, getAll( node, "script" ) );
+ }
+ }
+
+ callback.call( this[ i ], node, i );
+ }
+
+ if ( hasScripts ) {
+ doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+ // Reenable scripts
+ jQuery.map( scripts, restoreScript );
+
+ // Evaluate executable scripts on first document insertion
+ for ( i = 0; i < hasScripts; i++ ) {
+ node = scripts[ i ];
+ if ( rscriptType.test( node.type || "" ) &&
+ !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+ if ( node.src ) {
+ // Optional AJAX dependency, but won't run scripts if not present
+ if ( jQuery._evalUrl ) {
+ jQuery._evalUrl( node.src );
+ }
+ } else {
+ jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return this;
+ }
+});
+
+jQuery.each({
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function( name, original ) {
+ jQuery.fn[ name ] = function( selector ) {
+ var elems,
+ ret = [],
+ insert = jQuery( selector ),
+ last = insert.length - 1,
+ i = 0;
+
+ for ( ; i <= last; i++ ) {
+ elems = i === last ? this : this.clone( true );
+ jQuery( insert[ i ] )[ original ]( elems );
+
+ // Support: QtWebKit
+ // .get() because push.apply(_, arraylike) throws
+ push.apply( ret, elems.get() );
+ }
+
+ return this.pushStack( ret );
+ };
+});
+
+
+var iframe,
+ elemdisplay = {};
+
+/**
+ * Retrieve the actual display of a element
+ * @param {String} name nodeName of the element
+ * @param {Object} doc Document object
+ */
+// Called only from within defaultDisplay
+function actualDisplay( name, doc ) {
+ var style,
+ elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+
+ // getDefaultComputedStyle might be reliably used only on attached element
+ display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
+
+ // Use of this method is a temporary fix (more like optmization) until something better comes along,
+ // since it was removed from specification and supported only in FF
+ style.display : jQuery.css( elem[ 0 ], "display" );
+
+ // We don't have any data stored on the element,
+ // so use "detach" method as fast way to get rid of the element
+ elem.detach();
+
+ return display;
+}
+
+/**
+ * Try to determine the default display value of an element
+ * @param {String} nodeName
+ */
+function defaultDisplay( nodeName ) {
+ var doc = document,
+ display = elemdisplay[ nodeName ];
+
+ if ( !display ) {
+ display = actualDisplay( nodeName, doc );
+
+ // If the simple way fails, read from inside an iframe
+ if ( display === "none" || !display ) {
+
+ // Use the already-created iframe if possible
+ iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
+
+ // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+ doc = iframe[ 0 ].contentDocument;
+
+ // Support: IE
+ doc.write();
+ doc.close();
+
+ display = actualDisplay( nodeName, doc );
+ iframe.detach();
+ }
+
+ // Store the correct default display
+ elemdisplay[ nodeName ] = display;
+ }
+
+ return display;
+}
+var rmargin = (/^margin/);
+
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var getStyles = function( elem ) {
+ return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
+ };
+
+
+
+function curCSS( elem, name, computed ) {
+ var width, minWidth, maxWidth, ret,
+ style = elem.style;
+
+ computed = computed || getStyles( elem );
+
+ // Support: IE9
+ // getPropertyValue is only needed for .css('filter') in IE9, see #12537
+ if ( computed ) {
+ ret = computed.getPropertyValue( name ) || computed[ name ];
+ }
+
+ if ( computed ) {
+
+ if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+ ret = jQuery.style( elem, name );
+ }
+
+ // Support: iOS < 6
+ // A tribute to the "awesome hack by Dean Edwards"
+ // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+ // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+ if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+ // Remember the original values
+ width = style.width;
+ minWidth = style.minWidth;
+ maxWidth = style.maxWidth;
+
+ // Put in the new values to get a computed value out
+ style.minWidth = style.maxWidth = style.width = ret;
+ ret = computed.width;
+
+ // Revert the changed values
+ style.width = width;
+ style.minWidth = minWidth;
+ style.maxWidth = maxWidth;
+ }
+ }
+
+ return ret !== undefined ?
+ // Support: IE
+ // IE returns zIndex value as an integer.
+ ret + "" :
+ ret;
+}
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+ // Define the hook, we'll check on the first run if it's really needed.
+ return {
+ get: function() {
+ if ( conditionFn() ) {
+ // Hook not needed (or it's not possible to use it due to missing dependency),
+ // remove it.
+ // Since there are no other hooks for marginRight, remove the whole object.
+ delete this.get;
+ return;
+ }
+
+ // Hook needed; redefine it so that the support test is not executed again.
+
+ return (this.get = hookFn).apply( this, arguments );
+ }
+ };
+}
+
+
+(function() {
+ var pixelPositionVal, boxSizingReliableVal,
+ docElem = document.documentElement,
+ container = document.createElement( "div" ),
+ div = document.createElement( "div" );
+
+ if ( !div.style ) {
+ return;
+ }
+
+ div.style.backgroundClip = "content-box";
+ div.cloneNode( true ).style.backgroundClip = "";
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+ container.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" +
+ "position:absolute";
+ container.appendChild( div );
+
+ // Executing both pixelPosition & boxSizingReliable tests require only one layout
+ // so they're executed at the same time to save the second computation.
+ function computePixelPositionAndBoxSizingReliable() {
+ div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
+ "box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
+ "border:1px;padding:1px;width:4px;position:absolute";
+ div.innerHTML = "";
+ docElem.appendChild( container );
+
+ var divStyle = window.getComputedStyle( div, null );
+ pixelPositionVal = divStyle.top !== "1%";
+ boxSizingReliableVal = divStyle.width === "4px";
+
+ docElem.removeChild( container );
+ }
+
+ // Support: node.js jsdom
+ // Don't assume that getComputedStyle is a property of the global object
+ if ( window.getComputedStyle ) {
+ jQuery.extend( support, {
+ pixelPosition: function() {
+ // This test is executed only once but we still do memoizing
+ // since we can use the boxSizingReliable pre-computing.
+ // No need to check if the test was already performed, though.
+ computePixelPositionAndBoxSizingReliable();
+ return pixelPositionVal;
+ },
+ boxSizingReliable: function() {
+ if ( boxSizingReliableVal == null ) {
+ computePixelPositionAndBoxSizingReliable();
+ }
+ return boxSizingReliableVal;
+ },
+ reliableMarginRight: function() {
+ // Support: Android 2.3
+ // Check if div with explicit width and no margin-right incorrectly
+ // gets computed margin-right based on width of container. (#3333)
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // This support function is only executed once so no memoizing is needed.
+ var ret,
+ marginDiv = div.appendChild( document.createElement( "div" ) );
+
+ // Reset CSS: box-sizing; display; margin; border; padding
+ marginDiv.style.cssText = div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+ "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
+ marginDiv.style.marginRight = marginDiv.style.width = "0";
+ div.style.width = "1px";
+ docElem.appendChild( container );
+
+ ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
+
+ docElem.removeChild( container );
+
+ return ret;
+ }
+ });
+ }
+})();
+
+
+// A method for quickly swapping in/out CSS properties to get correct calculations.
+jQuery.swap = function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.apply( elem, args || [] );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+};
+
+
+var
+ // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+ // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+ rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
+ rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
+
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+ cssNormalTransform = {
+ letterSpacing: "0",
+ fontWeight: "400"
+ },
+
+ cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+ // shortcut for names that are not vendor prefixed
+ if ( name in style ) {
+ return name;
+ }
+
+ // check for vendor prefixed names
+ var capName = name[0].toUpperCase() + name.slice(1),
+ origName = name,
+ i = cssPrefixes.length;
+
+ while ( i-- ) {
+ name = cssPrefixes[ i ] + capName;
+ if ( name in style ) {
+ return name;
+ }
+ }
+
+ return origName;
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+ var matches = rnumsplit.exec( value );
+ return matches ?
+ // Guard against undefined "subtract", e.g., when used as in cssHooks
+ Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+ value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+ var i = extra === ( isBorderBox ? "border" : "content" ) ?
+ // If we already have the right measurement, avoid augmentation
+ 4 :
+ // Otherwise initialize for horizontal or vertical properties
+ name === "width" ? 1 : 0,
+
+ val = 0;
+
+ for ( ; i < 4; i += 2 ) {
+ // both box models exclude margin, so add it if we want it
+ if ( extra === "margin" ) {
+ val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+ }
+
+ if ( isBorderBox ) {
+ // border-box includes padding, so remove it if we want content
+ if ( extra === "content" ) {
+ val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+ }
+
+ // at this point, extra isn't border nor margin, so remove border
+ if ( extra !== "margin" ) {
+ val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ } else {
+ // at this point, extra isn't content, so add padding
+ val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+ // at this point, extra isn't content nor padding, so add border
+ if ( extra !== "padding" ) {
+ val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ }
+ }
+
+ return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+ // Start with offset property, which is equivalent to the border-box value
+ var valueIsBorderBox = true,
+ val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+ styles = getStyles( elem ),
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+ // some non-html elements return undefined for offsetWidth, so check for null/undefined
+ // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+ // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+ if ( val <= 0 || val == null ) {
+ // Fall back to computed then uncomputed css if necessary
+ val = curCSS( elem, name, styles );
+ if ( val < 0 || val == null ) {
+ val = elem.style[ name ];
+ }
+
+ // Computed unit is not pixels. Stop here and return.
+ if ( rnumnonpx.test(val) ) {
+ return val;
+ }
+
+ // we need the check for style in case a browser which returns unreliable values
+ // for getComputedStyle silently falls back to the reliable elem.style
+ valueIsBorderBox = isBorderBox &&
+ ( support.boxSizingReliable() || val === elem.style[ name ] );
+
+ // Normalize "", auto, and prepare for extra
+ val = parseFloat( val ) || 0;
+ }
+
+ // use the active box-sizing model to add/subtract irrelevant styles
+ return ( val +
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra || ( isBorderBox ? "border" : "content" ),
+ valueIsBorderBox,
+ styles
+ )
+ ) + "px";
+}
+
+function showHide( elements, show ) {
+ var display, elem, hidden,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ for ( ; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+
+ values[ index ] = data_priv.get( elem, "olddisplay" );
+ display = elem.style.display;
+ if ( show ) {
+ // Reset the inline display of this element to learn if it is
+ // being hidden by cascaded rules or not
+ if ( !values[ index ] && display === "none" ) {
+ elem.style.display = "";
+ }
+
+ // Set elements which have been overridden with display: none
+ // in a stylesheet to whatever the default browser style is
+ // for such an element
+ if ( elem.style.display === "" && isHidden( elem ) ) {
+ values[ index ] = data_priv.access( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+ }
+ } else {
+ hidden = isHidden( elem );
+
+ if ( display !== "none" || !hidden ) {
+ data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+ }
+ }
+ }
+
+ // Set the display of most of the elements in a second loop
+ // to avoid the constant reflow
+ for ( index = 0; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+ if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+ elem.style.display = show ? values[ index ] || "" : "none";
+ }
+ }
+
+ return elements;
+}
+
+jQuery.extend({
+ // Add in style property hooks for overriding the default
+ // behavior of getting and setting a style property
+ cssHooks: {
+ opacity: {
+ get: function( elem, computed ) {
+ if ( computed ) {
+ // We should always get a number back from opacity
+ var ret = curCSS( elem, "opacity" );
+ return ret === "" ? "1" : ret;
+ }
+ }
+ }
+ },
+
+ // Don't automatically add "px" to these possibly-unitless properties
+ cssNumber: {
+ "columnCount": true,
+ "fillOpacity": true,
+ "flexGrow": true,
+ "flexShrink": true,
+ "fontWeight": true,
+ "lineHeight": true,
+ "opacity": true,
+ "order": true,
+ "orphans": true,
+ "widows": true,
+ "zIndex": true,
+ "zoom": true
+ },
+
+ // Add in properties whose names you wish to fix before
+ // setting or getting the value
+ cssProps: {
+ // normalize float css property
+ "float": "cssFloat"
+ },
+
+ // Get and set the style property on a DOM Node
+ style: function( elem, name, value, extra ) {
+ // Don't set styles on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+ return;
+ }
+
+ // Make sure that we're working with the right name
+ var ret, type, hooks,
+ origName = jQuery.camelCase( name ),
+ style = elem.style;
+
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+ // gets hook for the prefixed version
+ // followed by the unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // Check if we're setting a value
+ if ( value !== undefined ) {
+ type = typeof value;
+
+ // convert relative number strings (+= or -=) to relative numbers. #7345
+ if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+ value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+ // Fixes bug #9237
+ type = "number";
+ }
+
+ // Make sure that null and NaN values aren't set. See: #7116
+ if ( value == null || value !== value ) {
+ return;
+ }
+
+ // If a number was passed in, add 'px' to the (except for certain CSS properties)
+ if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+ value += "px";
+ }
+
+ // Fixes #8908, it can be done more correctly by specifying setters in cssHooks,
+ // but it would mean to define eight (for every problematic property) identical functions
+ if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+ style[ name ] = "inherit";
+ }
+
+ // If a hook was provided, use that value, otherwise just set the specified value
+ if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+ style[ name ] = value;
+ }
+
+ } else {
+ // If a hook was provided get the non-computed value from there
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+ return ret;
+ }
+
+ // Otherwise just get the value from the style object
+ return style[ name ];
+ }
+ },
+
+ css: function( elem, name, extra, styles ) {
+ var val, num, hooks,
+ origName = jQuery.camelCase( name );
+
+ // Make sure that we're working with the right name
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+ // gets hook for the prefixed version
+ // followed by the unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // If a hook was provided get the computed value from there
+ if ( hooks && "get" in hooks ) {
+ val = hooks.get( elem, true, extra );
+ }
+
+ // Otherwise, if a way to get the computed value exists, use that
+ if ( val === undefined ) {
+ val = curCSS( elem, name, styles );
+ }
+
+ //convert "normal" to computed value
+ if ( val === "normal" && name in cssNormalTransform ) {
+ val = cssNormalTransform[ name ];
+ }
+
+ // Return, converting to number if forced or a qualifier was provided and val looks numeric
+ if ( extra === "" || extra ) {
+ num = parseFloat( val );
+ return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
+ }
+ return val;
+ }
+});
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+ jQuery.cssHooks[ name ] = {
+ get: function( elem, computed, extra ) {
+ if ( computed ) {
+ // certain elements can have dimension info if we invisibly show them
+ // however, it must have a current display style that would benefit from this
+ return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
+ jQuery.swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, name, extra );
+ }) :
+ getWidthOrHeight( elem, name, extra );
+ }
+ },
+
+ set: function( elem, value, extra ) {
+ var styles = extra && getStyles( elem );
+ return setPositiveNumber( elem, value, extra ?
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra,
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+ styles
+ ) : 0
+ );
+ }
+ };
+});
+
+// Support: Android 2.3
+jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
+ function( elem, computed ) {
+ if ( computed ) {
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // Work around by temporarily setting element display to inline-block
+ return jQuery.swap( elem, { "display": "inline-block" },
+ curCSS, [ elem, "marginRight" ] );
+ }
+ }
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+ margin: "",
+ padding: "",
+ border: "Width"
+}, function( prefix, suffix ) {
+ jQuery.cssHooks[ prefix + suffix ] = {
+ expand: function( value ) {
+ var i = 0,
+ expanded = {},
+
+ // assumes a single number if not a string
+ parts = typeof value === "string" ? value.split(" ") : [ value ];
+
+ for ( ; i < 4; i++ ) {
+ expanded[ prefix + cssExpand[ i ] + suffix ] =
+ parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+ }
+
+ return expanded;
+ }
+ };
+
+ if ( !rmargin.test( prefix ) ) {
+ jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+ }
+});
+
+jQuery.fn.extend({
+ css: function( name, value ) {
+ return access( this, function( elem, name, value ) {
+ var styles, len,
+ map = {},
+ i = 0;
+
+ if ( jQuery.isArray( name ) ) {
+ styles = getStyles( elem );
+ len = name.length;
+
+ for ( ; i < len; i++ ) {
+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+ }
+
+ return map;
+ }
+
+ return value !== undefined ?
+ jQuery.style( elem, name, value ) :
+ jQuery.css( elem, name );
+ }, name, value, arguments.length > 1 );
+ },
+ show: function() {
+ return showHide( this, true );
+ },
+ hide: function() {
+ return showHide( this );
+ },
+ toggle: function( state ) {
+ if ( typeof state === "boolean" ) {
+ return state ? this.show() : this.hide();
+ }
+
+ return this.each(function() {
+ if ( isHidden( this ) ) {
+ jQuery( this ).show();
+ } else {
+ jQuery( this ).hide();
+ }
+ });
+ }
+});
+
+
+function Tween( elem, options, prop, end, easing ) {
+ return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+ constructor: Tween,
+ init: function( elem, options, prop, end, easing, unit ) {
+ this.elem = elem;
+ this.prop = prop;
+ this.easing = easing || "swing";
+ this.options = options;
+ this.start = this.now = this.cur();
+ this.end = end;
+ this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+ },
+ cur: function() {
+ var hooks = Tween.propHooks[ this.prop ];
+
+ return hooks && hooks.get ?
+ hooks.get( this ) :
+ Tween.propHooks._default.get( this );
+ },
+ run: function( percent ) {
+ var eased,
+ hooks = Tween.propHooks[ this.prop ];
+
+ if ( this.options.duration ) {
+ this.pos = eased = jQuery.easing[ this.easing ](
+ percent, this.options.duration * percent, 0, 1, this.options.duration
+ );
+ } else {
+ this.pos = eased = percent;
+ }
+ this.now = ( this.end - this.start ) * eased + this.start;
+
+ if ( this.options.step ) {
+ this.options.step.call( this.elem, this.now, this );
+ }
+
+ if ( hooks && hooks.set ) {
+ hooks.set( this );
+ } else {
+ Tween.propHooks._default.set( this );
+ }
+ return this;
+ }
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+ _default: {
+ get: function( tween ) {
+ var result;
+
+ if ( tween.elem[ tween.prop ] != null &&
+ (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+ return tween.elem[ tween.prop ];
+ }
+
+ // passing an empty string as a 3rd parameter to .css will automatically
+ // attempt a parseFloat and fallback to a string if the parse fails
+ // so, simple values such as "10px" are parsed to Float.
+ // complex values such as "rotate(1rad)" are returned as is.
+ result = jQuery.css( tween.elem, tween.prop, "" );
+ // Empty strings, null, undefined and "auto" are converted to 0.
+ return !result || result === "auto" ? 0 : result;
+ },
+ set: function( tween ) {
+ // use step hook for back compat - use cssHook if its there - use .style if its
+ // available and use plain properties where available
+ if ( jQuery.fx.step[ tween.prop ] ) {
+ jQuery.fx.step[ tween.prop ]( tween );
+ } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+ jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+ } else {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+ }
+};
+
+// Support: IE9
+// Panic based approach to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+ set: function( tween ) {
+ if ( tween.elem.nodeType && tween.elem.parentNode ) {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+};
+
+jQuery.easing = {
+ linear: function( p ) {
+ return p;
+ },
+ swing: function( p ) {
+ return 0.5 - Math.cos( p * Math.PI ) / 2;
+ }
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+ fxNow, timerId,
+ rfxtypes = /^(?:toggle|show|hide)$/,
+ rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
+ rrun = /queueHooks$/,
+ animationPrefilters = [ defaultPrefilter ],
+ tweeners = {
+ "*": [ function( prop, value ) {
+ var tween = this.createTween( prop, value ),
+ target = tween.cur(),
+ parts = rfxnum.exec( value ),
+ unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+ rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+ scale = 1,
+ maxIterations = 20;
+
+ if ( start && start[ 3 ] !== unit ) {
+ // Trust units reported by jQuery.css
+ unit = unit || start[ 3 ];
+
+ // Make sure we update the tween properties later on
+ parts = parts || [];
+
+ // Iteratively approximate from a nonzero starting point
+ start = +target || 1;
+
+ do {
+ // If previous iteration zeroed out, double until we get *something*
+ // Use a string for doubling factor so we don't accidentally see scale as unchanged below
+ scale = scale || ".5";
+
+ // Adjust and apply
+ start = start / scale;
+ jQuery.style( tween.elem, prop, start + unit );
+
+ // Update scale, tolerating zero or NaN from tween.cur()
+ // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+ } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+ }
+
+ // Update tween properties
+ if ( parts ) {
+ start = tween.start = +start || +target || 0;
+ tween.unit = unit;
+ // If a +=/-= token was provided, we're doing a relative animation
+ tween.end = parts[ 1 ] ?
+ start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+ +parts[ 2 ];
+ }
+
+ return tween;
+ } ]
+ };
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+ setTimeout(function() {
+ fxNow = undefined;
+ });
+ return ( fxNow = jQuery.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+ var which,
+ i = 0,
+ attrs = { height: type };
+
+ // if we include width, step value is 1 to do all cssExpand values,
+ // if we don't include width, step value is 2 to skip over Left and Right
+ includeWidth = includeWidth ? 1 : 0;
+ for ( ; i < 4 ; i += 2 - includeWidth ) {
+ which = cssExpand[ i ];
+ attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+ }
+
+ if ( includeWidth ) {
+ attrs.opacity = attrs.width = type;
+ }
+
+ return attrs;
+}
+
+function createTween( value, prop, animation ) {
+ var tween,
+ collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+ index = 0,
+ length = collection.length;
+ for ( ; index < length; index++ ) {
+ if ( (tween = collection[ index ].call( animation, prop, value )) ) {
+
+ // we're done with this property
+ return tween;
+ }
+ }
+}
+
+function defaultPrefilter( elem, props, opts ) {
+ /* jshint validthis: true */
+ var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
+ anim = this,
+ orig = {},
+ style = elem.style,
+ hidden = elem.nodeType && isHidden( elem ),
+ dataShow = data_priv.get( elem, "fxshow" );
+
+ // handle queue: false promises
+ if ( !opts.queue ) {
+ hooks = jQuery._queueHooks( elem, "fx" );
+ if ( hooks.unqueued == null ) {
+ hooks.unqueued = 0;
+ oldfire = hooks.empty.fire;
+ hooks.empty.fire = function() {
+ if ( !hooks.unqueued ) {
+ oldfire();
+ }
+ };
+ }
+ hooks.unqueued++;
+
+ anim.always(function() {
+ // doing this makes sure that the complete handler will be called
+ // before this completes
+ anim.always(function() {
+ hooks.unqueued--;
+ if ( !jQuery.queue( elem, "fx" ).length ) {
+ hooks.empty.fire();
+ }
+ });
+ });
+ }
+
+ // height/width overflow pass
+ if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+ // Make sure that nothing sneaks out
+ // Record all 3 overflow attributes because IE9-10 do not
+ // change the overflow attribute when overflowX and
+ // overflowY are set to the same value
+ opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+ // Set display property to inline-block for height/width
+ // animations on inline elements that are having width/height animated
+ display = jQuery.css( elem, "display" );
+
+ // Test default display if display is currently "none"
+ checkDisplay = display === "none" ?
+ data_priv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
+
+ if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
+ style.display = "inline-block";
+ }
+ }
+
+ if ( opts.overflow ) {
+ style.overflow = "hidden";
+ anim.always(function() {
+ style.overflow = opts.overflow[ 0 ];
+ style.overflowX = opts.overflow[ 1 ];
+ style.overflowY = opts.overflow[ 2 ];
+ });
+ }
+
+ // show/hide pass
+ for ( prop in props ) {
+ value = props[ prop ];
+ if ( rfxtypes.exec( value ) ) {
+ delete props[ prop ];
+ toggle = toggle || value === "toggle";
+ if ( value === ( hidden ? "hide" : "show" ) ) {
+
+ // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
+ if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+ hidden = true;
+ } else {
+ continue;
+ }
+ }
+ orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+
+ // Any non-fx value stops us from restoring the original display value
+ } else {
+ display = undefined;
+ }
+ }
+
+ if ( !jQuery.isEmptyObject( orig ) ) {
+ if ( dataShow ) {
+ if ( "hidden" in dataShow ) {
+ hidden = dataShow.hidden;
+ }
+ } else {
+ dataShow = data_priv.access( elem, "fxshow", {} );
+ }
+
+ // store state if its toggle - enables .stop().toggle() to "reverse"
+ if ( toggle ) {
+ dataShow.hidden = !hidden;
+ }
+ if ( hidden ) {
+ jQuery( elem ).show();
+ } else {
+ anim.done(function() {
+ jQuery( elem ).hide();
+ });
+ }
+ anim.done(function() {
+ var prop;
+
+ data_priv.remove( elem, "fxshow" );
+ for ( prop in orig ) {
+ jQuery.style( elem, prop, orig[ prop ] );
+ }
+ });
+ for ( prop in orig ) {
+ tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+
+ if ( !( prop in dataShow ) ) {
+ dataShow[ prop ] = tween.start;
+ if ( hidden ) {
+ tween.end = tween.start;
+ tween.start = prop === "width" || prop === "height" ? 1 : 0;
+ }
+ }
+ }
+
+ // If this is a noop like .hide().hide(), restore an overwritten display value
+ } else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
+ style.display = display;
+ }
+}
+
+function propFilter( props, specialEasing ) {
+ var index, name, easing, value, hooks;
+
+ // camelCase, specialEasing and expand cssHook pass
+ for ( index in props ) {
+ name = jQuery.camelCase( index );
+ easing = specialEasing[ name ];
+ value = props[ index ];
+ if ( jQuery.isArray( value ) ) {
+ easing = value[ 1 ];
+ value = props[ index ] = value[ 0 ];
+ }
+
+ if ( index !== name ) {
+ props[ name ] = value;
+ delete props[ index ];
+ }
+
+ hooks = jQuery.cssHooks[ name ];
+ if ( hooks && "expand" in hooks ) {
+ value = hooks.expand( value );
+ delete props[ name ];
+
+ // not quite $.extend, this wont overwrite keys already present.
+ // also - reusing 'index' from above because we have the correct "name"
+ for ( index in value ) {
+ if ( !( index in props ) ) {
+ props[ index ] = value[ index ];
+ specialEasing[ index ] = easing;
+ }
+ }
+ } else {
+ specialEasing[ name ] = easing;
+ }
+ }
+}
+
+function Animation( elem, properties, options ) {
+ var result,
+ stopped,
+ index = 0,
+ length = animationPrefilters.length,
+ deferred = jQuery.Deferred().always( function() {
+ // don't match elem in the :animated selector
+ delete tick.elem;
+ }),
+ tick = function() {
+ if ( stopped ) {
+ return false;
+ }
+ var currentTime = fxNow || createFxNow(),
+ remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+ // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+ temp = remaining / animation.duration || 0,
+ percent = 1 - temp,
+ index = 0,
+ length = animation.tweens.length;
+
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( percent );
+ }
+
+ deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+ if ( percent < 1 && length ) {
+ return remaining;
+ } else {
+ deferred.resolveWith( elem, [ animation ] );
+ return false;
+ }
+ },
+ animation = deferred.promise({
+ elem: elem,
+ props: jQuery.extend( {}, properties ),
+ opts: jQuery.extend( true, { specialEasing: {} }, options ),
+ originalProperties: properties,
+ originalOptions: options,
+ startTime: fxNow || createFxNow(),
+ duration: options.duration,
+ tweens: [],
+ createTween: function( prop, end ) {
+ var tween = jQuery.Tween( elem, animation.opts, prop, end,
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.tweens.push( tween );
+ return tween;
+ },
+ stop: function( gotoEnd ) {
+ var index = 0,
+ // if we are going to the end, we want to run all the tweens
+ // otherwise we skip this part
+ length = gotoEnd ? animation.tweens.length : 0;
+ if ( stopped ) {
+ return this;
+ }
+ stopped = true;
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( 1 );
+ }
+
+ // resolve when we played the last frame
+ // otherwise, reject
+ if ( gotoEnd ) {
+ deferred.resolveWith( elem, [ animation, gotoEnd ] );
+ } else {
+ deferred.rejectWith( elem, [ animation, gotoEnd ] );
+ }
+ return this;
+ }
+ }),
+ props = animation.props;
+
+ propFilter( props, animation.opts.specialEasing );
+
+ for ( ; index < length ; index++ ) {
+ result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+ if ( result ) {
+ return result;
+ }
+ }
+
+ jQuery.map( props, createTween, animation );
+
+ if ( jQuery.isFunction( animation.opts.start ) ) {
+ animation.opts.start.call( elem, animation );
+ }
+
+ jQuery.fx.timer(
+ jQuery.extend( tick, {
+ elem: elem,
+ anim: animation,
+ queue: animation.opts.queue
+ })
+ );
+
+ // attach callbacks from options
+ return animation.progress( animation.opts.progress )
+ .done( animation.opts.done, animation.opts.complete )
+ .fail( animation.opts.fail )
+ .always( animation.opts.always );
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+ tweener: function( props, callback ) {
+ if ( jQuery.isFunction( props ) ) {
+ callback = props;
+ props = [ "*" ];
+ } else {
+ props = props.split(" ");
+ }
+
+ var prop,
+ index = 0,
+ length = props.length;
+
+ for ( ; index < length ; index++ ) {
+ prop = props[ index ];
+ tweeners[ prop ] = tweeners[ prop ] || [];
+ tweeners[ prop ].unshift( callback );
+ }
+ },
+
+ prefilter: function( callback, prepend ) {
+ if ( prepend ) {
+ animationPrefilters.unshift( callback );
+ } else {
+ animationPrefilters.push( callback );
+ }
+ }
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+ var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+ complete: fn || !fn && easing ||
+ jQuery.isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+ };
+
+ opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+ opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+ // normalize opt.queue - true/undefined/null -> "fx"
+ if ( opt.queue == null || opt.queue === true ) {
+ opt.queue = "fx";
+ }
+
+ // Queueing
+ opt.old = opt.complete;
+
+ opt.complete = function() {
+ if ( jQuery.isFunction( opt.old ) ) {
+ opt.old.call( this );
+ }
+
+ if ( opt.queue ) {
+ jQuery.dequeue( this, opt.queue );
+ }
+ };
+
+ return opt;
+};
+
+jQuery.fn.extend({
+ fadeTo: function( speed, to, easing, callback ) {
+
+ // show any hidden elements after setting opacity to 0
+ return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+ // animate to the value specified
+ .end().animate({ opacity: to }, speed, easing, callback );
+ },
+ animate: function( prop, speed, easing, callback ) {
+ var empty = jQuery.isEmptyObject( prop ),
+ optall = jQuery.speed( speed, easing, callback ),
+ doAnimation = function() {
+ // Operate on a copy of prop so per-property easing won't be lost
+ var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+ // Empty animations, or finishing resolves immediately
+ if ( empty || data_priv.get( this, "finish" ) ) {
+ anim.stop( true );
+ }
+ };
+ doAnimation.finish = doAnimation;
+
+ return empty || optall.queue === false ?
+ this.each( doAnimation ) :
+ this.queue( optall.queue, doAnimation );
+ },
+ stop: function( type, clearQueue, gotoEnd ) {
+ var stopQueue = function( hooks ) {
+ var stop = hooks.stop;
+ delete hooks.stop;
+ stop( gotoEnd );
+ };
+
+ if ( typeof type !== "string" ) {
+ gotoEnd = clearQueue;
+ clearQueue = type;
+ type = undefined;
+ }
+ if ( clearQueue && type !== false ) {
+ this.queue( type || "fx", [] );
+ }
+
+ return this.each(function() {
+ var dequeue = true,
+ index = type != null && type + "queueHooks",
+ timers = jQuery.timers,
+ data = data_priv.get( this );
+
+ if ( index ) {
+ if ( data[ index ] && data[ index ].stop ) {
+ stopQueue( data[ index ] );
+ }
+ } else {
+ for ( index in data ) {
+ if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+ stopQueue( data[ index ] );
+ }
+ }
+ }
+
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+ timers[ index ].anim.stop( gotoEnd );
+ dequeue = false;
+ timers.splice( index, 1 );
+ }
+ }
+
+ // start the next in the queue if the last step wasn't forced
+ // timers currently will call their complete callbacks, which will dequeue
+ // but only if they were gotoEnd
+ if ( dequeue || !gotoEnd ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ finish: function( type ) {
+ if ( type !== false ) {
+ type = type || "fx";
+ }
+ return this.each(function() {
+ var index,
+ data = data_priv.get( this ),
+ queue = data[ type + "queue" ],
+ hooks = data[ type + "queueHooks" ],
+ timers = jQuery.timers,
+ length = queue ? queue.length : 0;
+
+ // enable finishing flag on private data
+ data.finish = true;
+
+ // empty the queue first
+ jQuery.queue( this, type, [] );
+
+ if ( hooks && hooks.stop ) {
+ hooks.stop.call( this, true );
+ }
+
+ // look for any active animations, and finish them
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+ timers[ index ].anim.stop( true );
+ timers.splice( index, 1 );
+ }
+ }
+
+ // look for any animations in the old queue and finish them
+ for ( index = 0; index < length; index++ ) {
+ if ( queue[ index ] && queue[ index ].finish ) {
+ queue[ index ].finish.call( this );
+ }
+ }
+
+ // turn off finishing flag
+ delete data.finish;
+ });
+ }
+});
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+ var cssFn = jQuery.fn[ name ];
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return speed == null || typeof speed === "boolean" ?
+ cssFn.apply( this, arguments ) :
+ this.animate( genFx( name, true ), speed, easing, callback );
+ };
+});
+
+// Generate shortcuts for custom animations
+jQuery.each({
+ slideDown: genFx("show"),
+ slideUp: genFx("hide"),
+ slideToggle: genFx("toggle"),
+ fadeIn: { opacity: "show" },
+ fadeOut: { opacity: "hide" },
+ fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return this.animate( props, speed, easing, callback );
+ };
+});
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+ var timer,
+ i = 0,
+ timers = jQuery.timers;
+
+ fxNow = jQuery.now();
+
+ for ( ; i < timers.length; i++ ) {
+ timer = timers[ i ];
+ // Checks the timer has not already been removed
+ if ( !timer() && timers[ i ] === timer ) {
+ timers.splice( i--, 1 );
+ }
+ }
+
+ if ( !timers.length ) {
+ jQuery.fx.stop();
+ }
+ fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+ jQuery.timers.push( timer );
+ if ( timer() ) {
+ jQuery.fx.start();
+ } else {
+ jQuery.timers.pop();
+ }
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+ if ( !timerId ) {
+ timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+ }
+};
+
+jQuery.fx.stop = function() {
+ clearInterval( timerId );
+ timerId = null;
+};
+
+jQuery.fx.speeds = {
+ slow: 600,
+ fast: 200,
+ // Default speed
+ _default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function( next, hooks ) {
+ var timeout = setTimeout( next, time );
+ hooks.stop = function() {
+ clearTimeout( timeout );
+ };
+ });
+};
+
+
+(function() {
+ var input = document.createElement( "input" ),
+ select = document.createElement( "select" ),
+ opt = select.appendChild( document.createElement( "option" ) );
+
+ input.type = "checkbox";
+
+ // Support: iOS 5.1, Android 4.x, Android 2.3
+ // Check the default checkbox/radio value ("" on old WebKit; "on" elsewhere)
+ support.checkOn = input.value !== "";
+
+ // Must access the parent to make an option select properly
+ // Support: IE9, IE10
+ support.optSelected = opt.selected;
+
+ // Make sure that the options inside disabled selects aren't marked as disabled
+ // (WebKit marks them as disabled)
+ select.disabled = true;
+ support.optDisabled = !opt.disabled;
+
+ // Check if an input maintains its value after becoming a radio
+ // Support: IE9, IE10
+ input = document.createElement( "input" );
+ input.value = "t";
+ input.type = "radio";
+ support.radioValue = input.value === "t";
+})();
+
+
+var nodeHook, boolHook,
+ attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend({
+ attr: function( name, value ) {
+ return access( this, jQuery.attr, name, value, arguments.length > 1 );
+ },
+
+ removeAttr: function( name ) {
+ return this.each(function() {
+ jQuery.removeAttr( this, name );
+ });
+ }
+});
+
+jQuery.extend({
+ attr: function( elem, name, value ) {
+ var hooks, ret,
+ nType = elem.nodeType;
+
+ // don't get/set attributes on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ // Fallback to prop when attributes are not supported
+ if ( typeof elem.getAttribute === strundefined ) {
+ return jQuery.prop( elem, name, value );
+ }
+
+ // All attributes are lowercase
+ // Grab necessary hook if one is defined
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+ name = name.toLowerCase();
+ hooks = jQuery.attrHooks[ name ] ||
+ ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+ }
+
+ if ( value !== undefined ) {
+
+ if ( value === null ) {
+ jQuery.removeAttr( elem, name );
+
+ } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+ return ret;
+
+ } else {
+ elem.setAttribute( name, value + "" );
+ return value;
+ }
+
+ } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+ return ret;
+
+ } else {
+ ret = jQuery.find.attr( elem, name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret == null ?
+ undefined :
+ ret;
+ }
+ },
+
+ removeAttr: function( elem, value ) {
+ var name, propName,
+ i = 0,
+ attrNames = value && value.match( rnotwhite );
+
+ if ( attrNames && elem.nodeType === 1 ) {
+ while ( (name = attrNames[i++]) ) {
+ propName = jQuery.propFix[ name ] || name;
+
+ // Boolean attributes get special treatment (#10870)
+ if ( jQuery.expr.match.bool.test( name ) ) {
+ // Set corresponding property to false
+ elem[ propName ] = false;
+ }
+
+ elem.removeAttribute( name );
+ }
+ }
+ },
+
+ attrHooks: {
+ type: {
+ set: function( elem, value ) {
+ if ( !support.radioValue && value === "radio" &&
+ jQuery.nodeName( elem, "input" ) ) {
+ // Setting the type on a radio button after the value resets the value in IE6-9
+ // Reset value to default in case type is set after value during creation
+ var val = elem.value;
+ elem.setAttribute( "type", value );
+ if ( val ) {
+ elem.value = val;
+ }
+ return value;
+ }
+ }
+ }
+ }
+});
+
+// Hooks for boolean attributes
+boolHook = {
+ set: function( elem, value, name ) {
+ if ( value === false ) {
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else {
+ elem.setAttribute( name, name );
+ }
+ return name;
+ }
+};
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+ var getter = attrHandle[ name ] || jQuery.find.attr;
+
+ attrHandle[ name ] = function( elem, name, isXML ) {
+ var ret, handle;
+ if ( !isXML ) {
+ // Avoid an infinite loop by temporarily removing this function from the getter
+ handle = attrHandle[ name ];
+ attrHandle[ name ] = ret;
+ ret = getter( elem, name, isXML ) != null ?
+ name.toLowerCase() :
+ null;
+ attrHandle[ name ] = handle;
+ }
+ return ret;
+ };
+});
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i;
+
+jQuery.fn.extend({
+ prop: function( name, value ) {
+ return access( this, jQuery.prop, name, value, arguments.length > 1 );
+ },
+
+ removeProp: function( name ) {
+ return this.each(function() {
+ delete this[ jQuery.propFix[ name ] || name ];
+ });
+ }
+});
+
+jQuery.extend({
+ propFix: {
+ "for": "htmlFor",
+ "class": "className"
+ },
+
+ prop: function( elem, name, value ) {
+ var ret, hooks, notxml,
+ nType = elem.nodeType;
+
+ // don't get/set properties on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ if ( notxml ) {
+ // Fix name and attach hooks
+ name = jQuery.propFix[ name ] || name;
+ hooks = jQuery.propHooks[ name ];
+ }
+
+ if ( value !== undefined ) {
+ return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+ ret :
+ ( elem[ name ] = value );
+
+ } else {
+ return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+ ret :
+ elem[ name ];
+ }
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function( elem ) {
+ return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
+ elem.tabIndex :
+ -1;
+ }
+ }
+ }
+});
+
+// Support: IE9+
+// Selectedness for an option in an optgroup can be inaccurate
+if ( !support.optSelected ) {
+ jQuery.propHooks.selected = {
+ get: function( elem ) {
+ var parent = elem.parentNode;
+ if ( parent && parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ return null;
+ }
+ };
+}
+
+jQuery.each([
+ "tabIndex",
+ "readOnly",
+ "maxLength",
+ "cellSpacing",
+ "cellPadding",
+ "rowSpan",
+ "colSpan",
+ "useMap",
+ "frameBorder",
+ "contentEditable"
+], function() {
+ jQuery.propFix[ this.toLowerCase() ] = this;
+});
+
+
+
+
+var rclass = /[\t\r\n\f]/g;
+
+jQuery.fn.extend({
+ addClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).addClass( value.call( this, j, this.className ) );
+ });
+ }
+
+ if ( proceed ) {
+ // The disjunction here is for better compressibility (see removeClass)
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ " "
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+ cur += clazz + " ";
+ }
+ }
+
+ // only assign if different to avoid unneeded rendering.
+ finalValue = jQuery.trim( cur );
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = arguments.length === 0 || typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).removeClass( value.call( this, j, this.className ) );
+ });
+ }
+ if ( proceed ) {
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ // This expression is here for better compressibility (see addClass)
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ ""
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ // Remove *all* instances
+ while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+ cur = cur.replace( " " + clazz + " ", " " );
+ }
+ }
+
+ // only assign if different to avoid unneeded rendering.
+ finalValue = value ? jQuery.trim( cur ) : "";
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value;
+
+ if ( typeof stateVal === "boolean" && type === "string" ) {
+ return stateVal ? this.addClass( value ) : this.removeClass( value );
+ }
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+ });
+ }
+
+ return this.each(function() {
+ if ( type === "string" ) {
+ // toggle individual class names
+ var className,
+ i = 0,
+ self = jQuery( this ),
+ classNames = value.match( rnotwhite ) || [];
+
+ while ( (className = classNames[ i++ ]) ) {
+ // check each className given, space separated list
+ if ( self.hasClass( className ) ) {
+ self.removeClass( className );
+ } else {
+ self.addClass( className );
+ }
+ }
+
+ // Toggle whole class name
+ } else if ( type === strundefined || type === "boolean" ) {
+ if ( this.className ) {
+ // store className if set
+ data_priv.set( this, "__className__", this.className );
+ }
+
+ // If the element has a class name or if we're passed "false",
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || "";
+ }
+ });
+ },
+
+ hasClass: function( selector ) {
+ var className = " " + selector + " ",
+ i = 0,
+ l = this.length;
+ for ( ; i < l; i++ ) {
+ if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+});
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend({
+ val: function( value ) {
+ var hooks, ret, isFunction,
+ elem = this[0];
+
+ if ( !arguments.length ) {
+ if ( elem ) {
+ hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ return typeof ret === "string" ?
+ // handle most common string cases
+ ret.replace(rreturn, "") :
+ // handle cases where value is null/undef or number
+ ret == null ? "" : ret;
+ }
+
+ return;
+ }
+
+ isFunction = jQuery.isFunction( value );
+
+ return this.each(function( i ) {
+ var val;
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( isFunction ) {
+ val = value.call( this, i, jQuery( this ).val() );
+ } else {
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+
+ } else if ( typeof val === "number" ) {
+ val += "";
+
+ } else if ( jQuery.isArray( val ) ) {
+ val = jQuery.map( val, function( value ) {
+ return value == null ? "" : value + "";
+ });
+ }
+
+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+ // If set returns undefined, fall back to normal setting
+ if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+ this.value = val;
+ }
+ });
+ }
+});
+
+jQuery.extend({
+ valHooks: {
+ option: {
+ get: function( elem ) {
+ var val = jQuery.find.attr( elem, "value" );
+ return val != null ?
+ val :
+ // Support: IE10-11+
+ // option.text throws exceptions (#14686, #14858)
+ jQuery.trim( jQuery.text( elem ) );
+ }
+ },
+ select: {
+ get: function( elem ) {
+ var value, option,
+ options = elem.options,
+ index = elem.selectedIndex,
+ one = elem.type === "select-one" || index < 0,
+ values = one ? null : [],
+ max = one ? index + 1 : options.length,
+ i = index < 0 ?
+ max :
+ one ? index : 0;
+
+ // Loop through all the selected options
+ for ( ; i < max; i++ ) {
+ option = options[ i ];
+
+ // IE6-9 doesn't update selected after form reset (#2551)
+ if ( ( option.selected || i === index ) &&
+ // Don't return options that are disabled or in a disabled optgroup
+ ( support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null ) &&
+ ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+ // Get the specific value for the option
+ value = jQuery( option ).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ },
+
+ set: function( elem, value ) {
+ var optionSet, option,
+ options = elem.options,
+ values = jQuery.makeArray( value ),
+ i = options.length;
+
+ while ( i-- ) {
+ option = options[ i ];
+ if ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {
+ optionSet = true;
+ }
+ }
+
+ // force browsers to behave consistently when non-matching value is set
+ if ( !optionSet ) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ }
+ }
+ }
+});
+
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = {
+ set: function( elem, value ) {
+ if ( jQuery.isArray( value ) ) {
+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+ }
+ }
+ };
+ if ( !support.checkOn ) {
+ jQuery.valHooks[ this ].get = function( elem ) {
+ // Support: Webkit
+ // "" is returned instead of "on" if a value isn't specified
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ };
+ }
+});
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+ "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+});
+
+jQuery.fn.extend({
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+ },
+
+ bind: function( types, data, fn ) {
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ return this.off( types, null, fn );
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.on( types, selector, data, fn );
+ },
+ undelegate: function( selector, types, fn ) {
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+ }
+});
+
+
+var nonce = jQuery.now();
+
+var rquery = (/\?/);
+
+
+
+// Support: Android 2.3
+// Workaround failure to string-cast null input
+jQuery.parseJSON = function( data ) {
+ return JSON.parse( data + "" );
+};
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+ var xml, tmp;
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+
+ // Support: IE9
+ try {
+ tmp = new DOMParser();
+ xml = tmp.parseFromString( data, "text/xml" );
+ } catch ( e ) {
+ xml = undefined;
+ }
+
+ if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
+ jQuery.error( "Invalid XML: " + data );
+ }
+ return xml;
+};
+
+
+var
+ // Document location
+ ajaxLocParts,
+ ajaxLocation,
+
+ rhash = /#.*$/,
+ rts = /([?&])_=[^&]*/,
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+ // #7653, #8125, #8152: local protocol detection
+ rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+ rnoContent = /^(?:GET|HEAD)$/,
+ rprotocol = /^\/\//,
+ rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
+
+ /* Prefilters
+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+ * 2) These are called:
+ * - BEFORE asking for a transport
+ * - AFTER param serialization (s.data is a string if s.processData is true)
+ * 3) key is the dataType
+ * 4) the catchall symbol "*" can be used
+ * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+ */
+ prefilters = {},
+
+ /* Transports bindings
+ * 1) key is the dataType
+ * 2) the catchall symbol "*" can be used
+ * 3) selection will start with transport dataType and THEN go to "*" if needed
+ */
+ transports = {},
+
+ // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+ allTypes = "*/".concat("*");
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+ ajaxLocation = location.href;
+} catch( e ) {
+ // Use the href attribute of an A element
+ // since IE will modify it given document.location
+ ajaxLocation = document.createElement( "a" );
+ ajaxLocation.href = "";
+ ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+ // dataTypeExpression is optional and defaults to "*"
+ return function( dataTypeExpression, func ) {
+
+ if ( typeof dataTypeExpression !== "string" ) {
+ func = dataTypeExpression;
+ dataTypeExpression = "*";
+ }
+
+ var dataType,
+ i = 0,
+ dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
+
+ if ( jQuery.isFunction( func ) ) {
+ // For each dataType in the dataTypeExpression
+ while ( (dataType = dataTypes[i++]) ) {
+ // Prepend if requested
+ if ( dataType[0] === "+" ) {
+ dataType = dataType.slice( 1 ) || "*";
+ (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+
+ // Otherwise append
+ } else {
+ (structure[ dataType ] = structure[ dataType ] || []).push( func );
+ }
+ }
+ }
+ };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+ var inspected = {},
+ seekingTransport = ( structure === transports );
+
+ function inspect( dataType ) {
+ var selected;
+ inspected[ dataType ] = true;
+ jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+ var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+ if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+ options.dataTypes.unshift( dataTypeOrTransport );
+ inspect( dataTypeOrTransport );
+ return false;
+ } else if ( seekingTransport ) {
+ return !( selected = dataTypeOrTransport );
+ }
+ });
+ return selected;
+ }
+
+ return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+ var key, deep,
+ flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+ for ( key in src ) {
+ if ( src[ key ] !== undefined ) {
+ ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
+ }
+ }
+ if ( deep ) {
+ jQuery.extend( true, target, deep );
+ }
+
+ return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+ var ct, type, finalDataType, firstDataType,
+ contents = s.contents,
+ dataTypes = s.dataTypes;
+
+ // Remove auto dataType and get content-type in the process
+ while ( dataTypes[ 0 ] === "*" ) {
+ dataTypes.shift();
+ if ( ct === undefined ) {
+ ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+ }
+ }
+
+ // Check if we're dealing with a known content-type
+ if ( ct ) {
+ for ( type in contents ) {
+ if ( contents[ type ] && contents[ type ].test( ct ) ) {
+ dataTypes.unshift( type );
+ break;
+ }
+ }
+ }
+
+ // Check to see if we have a response for the expected dataType
+ if ( dataTypes[ 0 ] in responses ) {
+ finalDataType = dataTypes[ 0 ];
+ } else {
+ // Try convertible dataTypes
+ for ( type in responses ) {
+ if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+ finalDataType = type;
+ break;
+ }
+ if ( !firstDataType ) {
+ firstDataType = type;
+ }
+ }
+ // Or just use first one
+ finalDataType = finalDataType || firstDataType;
+ }
+
+ // If we found a dataType
+ // We add the dataType to the list if needed
+ // and return the corresponding response
+ if ( finalDataType ) {
+ if ( finalDataType !== dataTypes[ 0 ] ) {
+ dataTypes.unshift( finalDataType );
+ }
+ return responses[ finalDataType ];
+ }
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+ var conv2, current, conv, tmp, prev,
+ converters = {},
+ // Work with a copy of dataTypes in case we need to modify it for conversion
+ dataTypes = s.dataTypes.slice();
+
+ // Create converters map with lowercased keys
+ if ( dataTypes[ 1 ] ) {
+ for ( conv in s.converters ) {
+ converters[ conv.toLowerCase() ] = s.converters[ conv ];
+ }
+ }
+
+ current = dataTypes.shift();
+
+ // Convert to each sequential dataType
+ while ( current ) {
+
+ if ( s.responseFields[ current ] ) {
+ jqXHR[ s.responseFields[ current ] ] = response;
+ }
+
+ // Apply the dataFilter if provided
+ if ( !prev && isSuccess && s.dataFilter ) {
+ response = s.dataFilter( response, s.dataType );
+ }
+
+ prev = current;
+ current = dataTypes.shift();
+
+ if ( current ) {
+
+ // There's only work to do if current dataType is non-auto
+ if ( current === "*" ) {
+
+ current = prev;
+
+ // Convert response if prev dataType is non-auto and differs from current
+ } else if ( prev !== "*" && prev !== current ) {
+
+ // Seek a direct converter
+ conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+ // If none found, seek a pair
+ if ( !conv ) {
+ for ( conv2 in converters ) {
+
+ // If conv2 outputs current
+ tmp = conv2.split( " " );
+ if ( tmp[ 1 ] === current ) {
+
+ // If prev can be converted to accepted input
+ conv = converters[ prev + " " + tmp[ 0 ] ] ||
+ converters[ "* " + tmp[ 0 ] ];
+ if ( conv ) {
+ // Condense equivalence converters
+ if ( conv === true ) {
+ conv = converters[ conv2 ];
+
+ // Otherwise, insert the intermediate dataType
+ } else if ( converters[ conv2 ] !== true ) {
+ current = tmp[ 0 ];
+ dataTypes.unshift( tmp[ 1 ] );
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ // Apply converter (if not an equivalence)
+ if ( conv !== true ) {
+
+ // Unless errors are allowed to bubble, catch and return them
+ if ( conv && s[ "throws" ] ) {
+ response = conv( response );
+ } else {
+ try {
+ response = conv( response );
+ } catch ( e ) {
+ return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return { state: "success", data: response };
+}
+
+jQuery.extend({
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+ etag: {},
+
+ ajaxSettings: {
+ url: ajaxLocation,
+ type: "GET",
+ isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+ global: true,
+ processData: true,
+ async: true,
+ contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+ /*
+ timeout: 0,
+ data: null,
+ dataType: null,
+ username: null,
+ password: null,
+ cache: null,
+ throws: false,
+ traditional: false,
+ headers: {},
+ */
+
+ accepts: {
+ "*": allTypes,
+ text: "text/plain",
+ html: "text/html",
+ xml: "application/xml, text/xml",
+ json: "application/json, text/javascript"
+ },
+
+ contents: {
+ xml: /xml/,
+ html: /html/,
+ json: /json/
+ },
+
+ responseFields: {
+ xml: "responseXML",
+ text: "responseText",
+ json: "responseJSON"
+ },
+
+ // Data converters
+ // Keys separate source (or catchall "*") and destination types with a single space
+ converters: {
+
+ // Convert anything to text
+ "* text": String,
+
+ // Text to html (true = no transformation)
+ "text html": true,
+
+ // Evaluate text as a json expression
+ "text json": jQuery.parseJSON,
+
+ // Parse text as xml
+ "text xml": jQuery.parseXML
+ },
+
+ // For options that shouldn't be deep extended:
+ // you can add your own custom options here if
+ // and when you create one that shouldn't be
+ // deep extended (see ajaxExtend)
+ flatOptions: {
+ url: true,
+ context: true
+ }
+ },
+
+ // Creates a full fledged settings object into target
+ // with both ajaxSettings and settings fields.
+ // If target is omitted, writes into ajaxSettings.
+ ajaxSetup: function( target, settings ) {
+ return settings ?
+
+ // Building a settings object
+ ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+ // Extending ajaxSettings
+ ajaxExtend( jQuery.ajaxSettings, target );
+ },
+
+ ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+ ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+ // Main method
+ ajax: function( url, options ) {
+
+ // If url is an object, simulate pre-1.5 signature
+ if ( typeof url === "object" ) {
+ options = url;
+ url = undefined;
+ }
+
+ // Force options to be an object
+ options = options || {};
+
+ var transport,
+ // URL without anti-cache param
+ cacheURL,
+ // Response headers
+ responseHeadersString,
+ responseHeaders,
+ // timeout handle
+ timeoutTimer,
+ // Cross-domain detection vars
+ parts,
+ // To know if global events are to be dispatched
+ fireGlobals,
+ // Loop variable
+ i,
+ // Create the final options object
+ s = jQuery.ajaxSetup( {}, options ),
+ // Callbacks context
+ callbackContext = s.context || s,
+ // Context for global events is callbackContext if it is a DOM node or jQuery collection
+ globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
+ jQuery( callbackContext ) :
+ jQuery.event,
+ // Deferreds
+ deferred = jQuery.Deferred(),
+ completeDeferred = jQuery.Callbacks("once memory"),
+ // Status-dependent callbacks
+ statusCode = s.statusCode || {},
+ // Headers (they are sent all at once)
+ requestHeaders = {},
+ requestHeadersNames = {},
+ // The jqXHR state
+ state = 0,
+ // Default abort message
+ strAbort = "canceled",
+ // Fake xhr
+ jqXHR = {
+ readyState: 0,
+
+ // Builds headers hashtable if needed
+ getResponseHeader: function( key ) {
+ var match;
+ if ( state === 2 ) {
+ if ( !responseHeaders ) {
+ responseHeaders = {};
+ while ( (match = rheaders.exec( responseHeadersString )) ) {
+ responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+ }
+ }
+ match = responseHeaders[ key.toLowerCase() ];
+ }
+ return match == null ? null : match;
+ },
+
+ // Raw string
+ getAllResponseHeaders: function() {
+ return state === 2 ? responseHeadersString : null;
+ },
+
+ // Caches the header
+ setRequestHeader: function( name, value ) {
+ var lname = name.toLowerCase();
+ if ( !state ) {
+ name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+ requestHeaders[ name ] = value;
+ }
+ return this;
+ },
+
+ // Overrides response content-type header
+ overrideMimeType: function( type ) {
+ if ( !state ) {
+ s.mimeType = type;
+ }
+ return this;
+ },
+
+ // Status-dependent callbacks
+ statusCode: function( map ) {
+ var code;
+ if ( map ) {
+ if ( state < 2 ) {
+ for ( code in map ) {
+ // Lazy-add the new callback in a way that preserves old ones
+ statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+ }
+ } else {
+ // Execute the appropriate callbacks
+ jqXHR.always( map[ jqXHR.status ] );
+ }
+ }
+ return this;
+ },
+
+ // Cancel the request
+ abort: function( statusText ) {
+ var finalText = statusText || strAbort;
+ if ( transport ) {
+ transport.abort( finalText );
+ }
+ done( 0, finalText );
+ return this;
+ }
+ };
+
+ // Attach deferreds
+ deferred.promise( jqXHR ).complete = completeDeferred.add;
+ jqXHR.success = jqXHR.done;
+ jqXHR.error = jqXHR.fail;
+
+ // Remove hash character (#7531: and string promotion)
+ // Add protocol if not provided (prefilters might expect it)
+ // Handle falsy url in the settings object (#10093: consistency with old signature)
+ // We also use the url parameter if available
+ s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" )
+ .replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+ // Alias method option to type as per ticket #12004
+ s.type = options.method || options.type || s.method || s.type;
+
+ // Extract dataTypes list
+ s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
+
+ // A cross-domain request is in order when we have a protocol:host:port mismatch
+ if ( s.crossDomain == null ) {
+ parts = rurl.exec( s.url.toLowerCase() );
+ s.crossDomain = !!( parts &&
+ ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+ ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+ ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
+ );
+ }
+
+ // Convert data if not already a string
+ if ( s.data && s.processData && typeof s.data !== "string" ) {
+ s.data = jQuery.param( s.data, s.traditional );
+ }
+
+ // Apply prefilters
+ inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+ // If request was aborted inside a prefilter, stop there
+ if ( state === 2 ) {
+ return jqXHR;
+ }
+
+ // We can fire global events as of now if asked to
+ fireGlobals = s.global;
+
+ // Watch for a new set of requests
+ if ( fireGlobals && jQuery.active++ === 0 ) {
+ jQuery.event.trigger("ajaxStart");
+ }
+
+ // Uppercase the type
+ s.type = s.type.toUpperCase();
+
+ // Determine if request has content
+ s.hasContent = !rnoContent.test( s.type );
+
+ // Save the URL in case we're toying with the If-Modified-Since
+ // and/or If-None-Match header later on
+ cacheURL = s.url;
+
+ // More options handling for requests with no content
+ if ( !s.hasContent ) {
+
+ // If data is available, append data to url
+ if ( s.data ) {
+ cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+ // #9682: remove data so that it's not used in an eventual retry
+ delete s.data;
+ }
+
+ // Add anti-cache in url if needed
+ if ( s.cache === false ) {
+ s.url = rts.test( cacheURL ) ?
+
+ // If there is already a '_' parameter, set its value
+ cacheURL.replace( rts, "$1_=" + nonce++ ) :
+
+ // Otherwise add one to the end
+ cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
+ }
+ }
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ if ( jQuery.lastModified[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+ }
+ if ( jQuery.etag[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+ }
+ }
+
+ // Set the correct header, if data is being sent
+ if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+ jqXHR.setRequestHeader( "Content-Type", s.contentType );
+ }
+
+ // Set the Accepts header for the server, depending on the dataType
+ jqXHR.setRequestHeader(
+ "Accept",
+ s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+ s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+ s.accepts[ "*" ]
+ );
+
+ // Check for headers option
+ for ( i in s.headers ) {
+ jqXHR.setRequestHeader( i, s.headers[ i ] );
+ }
+
+ // Allow custom headers/mimetypes and early abort
+ if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+ // Abort if not done already and return
+ return jqXHR.abort();
+ }
+
+ // aborting is no longer a cancellation
+ strAbort = "abort";
+
+ // Install callbacks on deferreds
+ for ( i in { success: 1, error: 1, complete: 1 } ) {
+ jqXHR[ i ]( s[ i ] );
+ }
+
+ // Get transport
+ transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+ // If no transport, we auto-abort
+ if ( !transport ) {
+ done( -1, "No Transport" );
+ } else {
+ jqXHR.readyState = 1;
+
+ // Send global event
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+ }
+ // Timeout
+ if ( s.async && s.timeout > 0 ) {
+ timeoutTimer = setTimeout(function() {
+ jqXHR.abort("timeout");
+ }, s.timeout );
+ }
+
+ try {
+ state = 1;
+ transport.send( requestHeaders, done );
+ } catch ( e ) {
+ // Propagate exception as error if not done
+ if ( state < 2 ) {
+ done( -1, e );
+ // Simply rethrow otherwise
+ } else {
+ throw e;
+ }
+ }
+ }
+
+ // Callback for when everything is done
+ function done( status, nativeStatusText, responses, headers ) {
+ var isSuccess, success, error, response, modified,
+ statusText = nativeStatusText;
+
+ // Called once
+ if ( state === 2 ) {
+ return;
+ }
+
+ // State is "done" now
+ state = 2;
+
+ // Clear timeout if it exists
+ if ( timeoutTimer ) {
+ clearTimeout( timeoutTimer );
+ }
+
+ // Dereference transport for early garbage collection
+ // (no matter how long the jqXHR object will be used)
+ transport = undefined;
+
+ // Cache response headers
+ responseHeadersString = headers || "";
+
+ // Set readyState
+ jqXHR.readyState = status > 0 ? 4 : 0;
+
+ // Determine if successful
+ isSuccess = status >= 200 && status < 300 || status === 304;
+
+ // Get response data
+ if ( responses ) {
+ response = ajaxHandleResponses( s, jqXHR, responses );
+ }
+
+ // Convert no matter what (that way responseXXX fields are always set)
+ response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+ // If successful, handle type chaining
+ if ( isSuccess ) {
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ modified = jqXHR.getResponseHeader("Last-Modified");
+ if ( modified ) {
+ jQuery.lastModified[ cacheURL ] = modified;
+ }
+ modified = jqXHR.getResponseHeader("etag");
+ if ( modified ) {
+ jQuery.etag[ cacheURL ] = modified;
+ }
+ }
+
+ // if no content
+ if ( status === 204 || s.type === "HEAD" ) {
+ statusText = "nocontent";
+
+ // if not modified
+ } else if ( status === 304 ) {
+ statusText = "notmodified";
+
+ // If we have data, let's convert it
+ } else {
+ statusText = response.state;
+ success = response.data;
+ error = response.error;
+ isSuccess = !error;
+ }
+ } else {
+ // We extract error from statusText
+ // then normalize statusText and status for non-aborts
+ error = statusText;
+ if ( status || !statusText ) {
+ statusText = "error";
+ if ( status < 0 ) {
+ status = 0;
+ }
+ }
+ }
+
+ // Set data for the fake xhr object
+ jqXHR.status = status;
+ jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+ // Success/Error
+ if ( isSuccess ) {
+ deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+ } else {
+ deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+ }
+
+ // Status-dependent callbacks
+ jqXHR.statusCode( statusCode );
+ statusCode = undefined;
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+ [ jqXHR, s, isSuccess ? success : error ] );
+ }
+
+ // Complete
+ completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+ // Handle the global AJAX counter
+ if ( !( --jQuery.active ) ) {
+ jQuery.event.trigger("ajaxStop");
+ }
+ }
+ }
+
+ return jqXHR;
+ },
+
+ getJSON: function( url, data, callback ) {
+ return jQuery.get( url, data, callback, "json" );
+ },
+
+ getScript: function( url, callback ) {
+ return jQuery.get( url, undefined, callback, "script" );
+ }
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+ jQuery[ method ] = function( url, data, callback, type ) {
+ // shift arguments if data argument was omitted
+ if ( jQuery.isFunction( data ) ) {
+ type = type || callback;
+ callback = data;
+ data = undefined;
+ }
+
+ return jQuery.ajax({
+ url: url,
+ type: method,
+ dataType: type,
+ data: data,
+ success: callback
+ });
+ };
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
+ jQuery.fn[ type ] = function( fn ) {
+ return this.on( type, fn );
+ };
+});
+
+
+jQuery._evalUrl = function( url ) {
+ return jQuery.ajax({
+ url: url,
+ type: "GET",
+ dataType: "script",
+ async: false,
+ global: false,
+ "throws": true
+ });
+};
+
+
+jQuery.fn.extend({
+ wrapAll: function( html ) {
+ var wrap;
+
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( html.call(this, i) );
+ });
+ }
+
+ if ( this[ 0 ] ) {
+
+ // The elements to wrap the target around
+ wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+ if ( this[ 0 ].parentNode ) {
+ wrap.insertBefore( this[ 0 ] );
+ }
+
+ wrap.map(function() {
+ var elem = this;
+
+ while ( elem.firstElementChild ) {
+ elem = elem.firstElementChild;
+ }
+
+ return elem;
+ }).append( this );
+ }
+
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapInner( html.call(this, i) );
+ });
+ }
+
+ return this.each(function() {
+ var self = jQuery( this ),
+ contents = self.contents();
+
+ if ( contents.length ) {
+ contents.wrapAll( html );
+
+ } else {
+ self.append( html );
+ }
+ });
+ },
+
+ wrap: function( html ) {
+ var isFunction = jQuery.isFunction( html );
+
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+ });
+ },
+
+ unwrap: function() {
+ return this.parent().each(function() {
+ if ( !jQuery.nodeName( this, "body" ) ) {
+ jQuery( this ).replaceWith( this.childNodes );
+ }
+ }).end();
+ }
+});
+
+
+jQuery.expr.filters.hidden = function( elem ) {
+ // Support: Opera <= 12.12
+ // Opera reports offsetWidths and offsetHeights less than zero on some elements
+ return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
+};
+jQuery.expr.filters.visible = function( elem ) {
+ return !jQuery.expr.filters.hidden( elem );
+};
+
+
+
+
+var r20 = /%20/g,
+ rbracket = /\[\]$/,
+ rCRLF = /\r?\n/g,
+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+ var name;
+
+ if ( jQuery.isArray( obj ) ) {
+ // Serialize array item.
+ jQuery.each( obj, function( i, v ) {
+ if ( traditional || rbracket.test( prefix ) ) {
+ // Treat each array item as a scalar.
+ add( prefix, v );
+
+ } else {
+ // Item is non-scalar (array or object), encode its numeric index.
+ buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+ }
+ });
+
+ } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+ // Serialize object item.
+ for ( name in obj ) {
+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+ }
+
+ } else {
+ // Serialize scalar item.
+ add( prefix, obj );
+ }
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+ var prefix,
+ s = [],
+ add = function( key, value ) {
+ // If value is a function, invoke it and return its value
+ value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+ s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+ };
+
+ // Set traditional to true for jQuery <= 1.3.2 behavior.
+ if ( traditional === undefined ) {
+ traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+ }
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+ // Serialize the form elements
+ jQuery.each( a, function() {
+ add( this.name, this.value );
+ });
+
+ } else {
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for ( prefix in a ) {
+ buildParams( prefix, a[ prefix ], traditional, add );
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join( "&" ).replace( r20, "+" );
+};
+
+jQuery.fn.extend({
+ serialize: function() {
+ return jQuery.param( this.serializeArray() );
+ },
+ serializeArray: function() {
+ return this.map(function() {
+ // Can add propHook for "elements" to filter or add form elements
+ var elements = jQuery.prop( this, "elements" );
+ return elements ? jQuery.makeArray( elements ) : this;
+ })
+ .filter(function() {
+ var type = this.type;
+
+ // Use .is( ":disabled" ) so that fieldset[disabled] works
+ return this.name && !jQuery( this ).is( ":disabled" ) &&
+ rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+ ( this.checked || !rcheckableType.test( type ) );
+ })
+ .map(function( i, elem ) {
+ var val = jQuery( this ).val();
+
+ return val == null ?
+ null :
+ jQuery.isArray( val ) ?
+ jQuery.map( val, function( val ) {
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }) :
+ { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }).get();
+ }
+});
+
+
+jQuery.ajaxSettings.xhr = function() {
+ try {
+ return new XMLHttpRequest();
+ } catch( e ) {}
+};
+
+var xhrId = 0,
+ xhrCallbacks = {},
+ xhrSuccessStatus = {
+ // file protocol always yields status code 0, assume 200
+ 0: 200,
+ // Support: IE9
+ // #1450: sometimes IE returns 1223 when it should be 204
+ 1223: 204
+ },
+ xhrSupported = jQuery.ajaxSettings.xhr();
+
+// Support: IE9
+// Open requests must be manually aborted on unload (#5280)
+if ( window.ActiveXObject ) {
+ jQuery( window ).on( "unload", function() {
+ for ( var key in xhrCallbacks ) {
+ xhrCallbacks[ key ]();
+ }
+ });
+}
+
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+support.ajax = xhrSupported = !!xhrSupported;
+
+jQuery.ajaxTransport(function( options ) {
+ var callback;
+
+ // Cross domain only allowed if supported through XMLHttpRequest
+ if ( support.cors || xhrSupported && !options.crossDomain ) {
+ return {
+ send: function( headers, complete ) {
+ var i,
+ xhr = options.xhr(),
+ id = ++xhrId;
+
+ xhr.open( options.type, options.url, options.async, options.username, options.password );
+
+ // Apply custom fields if provided
+ if ( options.xhrFields ) {
+ for ( i in options.xhrFields ) {
+ xhr[ i ] = options.xhrFields[ i ];
+ }
+ }
+
+ // Override mime type if needed
+ if ( options.mimeType && xhr.overrideMimeType ) {
+ xhr.overrideMimeType( options.mimeType );
+ }
+
+ // X-Requested-With header
+ // For cross-domain requests, seeing as conditions for a preflight are
+ // akin to a jigsaw puzzle, we simply never set it to be sure.
+ // (it can always be set on a per-request basis or even using ajaxSetup)
+ // For same-domain requests, won't change header if already provided.
+ if ( !options.crossDomain && !headers["X-Requested-With"] ) {
+ headers["X-Requested-With"] = "XMLHttpRequest";
+ }
+
+ // Set headers
+ for ( i in headers ) {
+ xhr.setRequestHeader( i, headers[ i ] );
+ }
+
+ // Callback
+ callback = function( type ) {
+ return function() {
+ if ( callback ) {
+ delete xhrCallbacks[ id ];
+ callback = xhr.onload = xhr.onerror = null;
+
+ if ( type === "abort" ) {
+ xhr.abort();
+ } else if ( type === "error" ) {
+ complete(
+ // file: protocol always yields status 0; see #8605, #14207
+ xhr.status,
+ xhr.statusText
+ );
+ } else {
+ complete(
+ xhrSuccessStatus[ xhr.status ] || xhr.status,
+ xhr.statusText,
+ // Support: IE9
+ // Accessing binary-data responseText throws an exception
+ // (#11426)
+ typeof xhr.responseText === "string" ? {
+ text: xhr.responseText
+ } : undefined,
+ xhr.getAllResponseHeaders()
+ );
+ }
+ }
+ };
+ };
+
+ // Listen to events
+ xhr.onload = callback();
+ xhr.onerror = callback("error");
+
+ // Create the abort callback
+ callback = xhrCallbacks[ id ] = callback("abort");
+
+ try {
+ // Do send the request (this may raise an exception)
+ xhr.send( options.hasContent && options.data || null );
+ } catch ( e ) {
+ // #14683: Only rethrow if this hasn't been notified as an error yet
+ if ( callback ) {
+ throw e;
+ }
+ }
+ },
+
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+ accepts: {
+ script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+ },
+ contents: {
+ script: /(?:java|ecma)script/
+ },
+ converters: {
+ "text script": function( text ) {
+ jQuery.globalEval( text );
+ return text;
+ }
+ }
+});
+
+// Handle cache's special case and crossDomain
+jQuery.ajaxPrefilter( "script", function( s ) {
+ if ( s.cache === undefined ) {
+ s.cache = false;
+ }
+ if ( s.crossDomain ) {
+ s.type = "GET";
+ }
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+ // This transport only deals with cross domain requests
+ if ( s.crossDomain ) {
+ var script, callback;
+ return {
+ send: function( _, complete ) {
+ script = jQuery("<script>").prop({
+ async: true,
+ charset: s.scriptCharset,
+ src: s.url
+ }).on(
+ "load error",
+ callback = function( evt ) {
+ script.remove();
+ callback = null;
+ if ( evt ) {
+ complete( evt.type === "error" ? 404 : 200, evt.type );
+ }
+ }
+ );
+ document.head.appendChild( script[ 0 ] );
+ },
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+});
+
+
+
+
+var oldCallbacks = [],
+ rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+ jsonp: "callback",
+ jsonpCallback: function() {
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+ this[ callback ] = true;
+ return callback;
+ }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+ var callbackName, overwritten, responseContainer,
+ jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+ "url" :
+ typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
+ );
+
+ // Handle iff the expected data type is "jsonp" or we have a parameter to set
+ if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+ // Get callback name, remembering preexisting value associated with it
+ callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+ s.jsonpCallback() :
+ s.jsonpCallback;
+
+ // Insert callback into url or form data
+ if ( jsonProp ) {
+ s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+ } else if ( s.jsonp !== false ) {
+ s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+ }
+
+ // Use data converter to retrieve json after script execution
+ s.converters["script json"] = function() {
+ if ( !responseContainer ) {
+ jQuery.error( callbackName + " was not called" );
+ }
+ return responseContainer[ 0 ];
+ };
+
+ // force json dataType
+ s.dataTypes[ 0 ] = "json";
+
+ // Install callback
+ overwritten = window[ callbackName ];
+ window[ callbackName ] = function() {
+ responseContainer = arguments;
+ };
+
+ // Clean-up function (fires after converters)
+ jqXHR.always(function() {
+ // Restore preexisting value
+ window[ callbackName ] = overwritten;
+
+ // Save back as free
+ if ( s[ callbackName ] ) {
+ // make sure that re-using the options doesn't screw things around
+ s.jsonpCallback = originalSettings.jsonpCallback;
+
+ // save the callback name for future use
+ oldCallbacks.push( callbackName );
+ }
+
+ // Call if it was a function and we have a response
+ if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+ overwritten( responseContainer[ 0 ] );
+ }
+
+ responseContainer = overwritten = undefined;
+ });
+
+ // Delegate to script
+ return "script";
+ }
+});
+
+
+
+
+// data: string of html
+// context (optional): If specified, the fragment will be created in this context, defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+ if ( typeof context === "boolean" ) {
+ keepScripts = context;
+ context = false;
+ }
+ context = context || document;
+
+ var parsed = rsingleTag.exec( data ),
+ scripts = !keepScripts && [];
+
+ // Single tag
+ if ( parsed ) {
+ return [ context.createElement( parsed[1] ) ];
+ }
+
+ parsed = jQuery.buildFragment( [ data ], context, scripts );
+
+ if ( scripts && scripts.length ) {
+ jQuery( scripts ).remove();
+ }
+
+ return jQuery.merge( [], parsed.childNodes );
+};
+
+
+// Keep a copy of the old load method
+var _load = jQuery.fn.load;
+
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+ if ( typeof url !== "string" && _load ) {
+ return _load.apply( this, arguments );
+ }
+
+ var selector, type, response,
+ self = this,
+ off = url.indexOf(" ");
+
+ if ( off >= 0 ) {
+ selector = jQuery.trim( url.slice( off ) );
+ url = url.slice( 0, off );
+ }
+
+ // If it's a function
+ if ( jQuery.isFunction( params ) ) {
+
+ // We assume that it's the callback
+ callback = params;
+ params = undefined;
+
+ // Otherwise, build a param string
+ } else if ( params && typeof params === "object" ) {
+ type = "POST";
+ }
+
+ // If we have elements to modify, make the request
+ if ( self.length > 0 ) {
+ jQuery.ajax({
+ url: url,
+
+ // if "type" variable is undefined, then "GET" method will be used
+ type: type,
+ dataType: "html",
+ data: params
+ }).done(function( responseText ) {
+
+ // Save response for use in complete callback
+ response = arguments;
+
+ self.html( selector ?
+
+ // If a selector was specified, locate the right elements in a dummy div
+ // Exclude scripts to avoid IE 'Permission Denied' errors
+ jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+ // Otherwise use the full result
+ responseText );
+
+ }).complete( callback && function( jqXHR, status ) {
+ self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+ });
+ }
+
+ return this;
+};
+
+
+
+
+jQuery.expr.filters.animated = function( elem ) {
+ return jQuery.grep(jQuery.timers, function( fn ) {
+ return elem === fn.elem;
+ }).length;
+};
+
+
+
+
+var docElem = window.document.documentElement;
+
+/**
+ * Gets a window from an element
+ */
+function getWindow( elem ) {
+ return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
+}
+
+jQuery.offset = {
+ setOffset: function( elem, options, i ) {
+ var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+ position = jQuery.css( elem, "position" ),
+ curElem = jQuery( elem ),
+ props = {};
+
+ // Set position first, in-case top/left are set even on static elem
+ if ( position === "static" ) {
+ elem.style.position = "relative";
+ }
+
+ curOffset = curElem.offset();
+ curCSSTop = jQuery.css( elem, "top" );
+ curCSSLeft = jQuery.css( elem, "left" );
+ calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+ ( curCSSTop + curCSSLeft ).indexOf("auto") > -1;
+
+ // Need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+ if ( calculatePosition ) {
+ curPosition = curElem.position();
+ curTop = curPosition.top;
+ curLeft = curPosition.left;
+
+ } else {
+ curTop = parseFloat( curCSSTop ) || 0;
+ curLeft = parseFloat( curCSSLeft ) || 0;
+ }
+
+ if ( jQuery.isFunction( options ) ) {
+ options = options.call( elem, i, curOffset );
+ }
+
+ if ( options.top != null ) {
+ props.top = ( options.top - curOffset.top ) + curTop;
+ }
+ if ( options.left != null ) {
+ props.left = ( options.left - curOffset.left ) + curLeft;
+ }
+
+ if ( "using" in options ) {
+ options.using.call( elem, props );
+
+ } else {
+ curElem.css( props );
+ }
+ }
+};
+
+jQuery.fn.extend({
+ offset: function( options ) {
+ if ( arguments.length ) {
+ return options === undefined ?
+ this :
+ this.each(function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ });
+ }
+
+ var docElem, win,
+ elem = this[ 0 ],
+ box = { top: 0, left: 0 },
+ doc = elem && elem.ownerDocument;
+
+ if ( !doc ) {
+ return;
+ }
+
+ docElem = doc.documentElement;
+
+ // Make sure it's not a disconnected DOM node
+ if ( !jQuery.contains( docElem, elem ) ) {
+ return box;
+ }
+
+ // If we don't have gBCR, just use 0,0 rather than error
+ // BlackBerry 5, iOS 3 (original iPhone)
+ if ( typeof elem.getBoundingClientRect !== strundefined ) {
+ box = elem.getBoundingClientRect();
+ }
+ win = getWindow( doc );
+ return {
+ top: box.top + win.pageYOffset - docElem.clientTop,
+ left: box.left + win.pageXOffset - docElem.clientLeft
+ };
+ },
+
+ position: function() {
+ if ( !this[ 0 ] ) {
+ return;
+ }
+
+ var offsetParent, offset,
+ elem = this[ 0 ],
+ parentOffset = { top: 0, left: 0 };
+
+ // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
+ if ( jQuery.css( elem, "position" ) === "fixed" ) {
+ // We assume that getBoundingClientRect is available when computed position is fixed
+ offset = elem.getBoundingClientRect();
+
+ } else {
+ // Get *real* offsetParent
+ offsetParent = this.offsetParent();
+
+ // Get correct offsets
+ offset = this.offset();
+ if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+ parentOffset = offsetParent.offset();
+ }
+
+ // Add offsetParent borders
+ parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+ parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+ }
+
+ // Subtract parent offsets and element margins
+ return {
+ top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+ left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+ };
+ },
+
+ offsetParent: function() {
+ return this.map(function() {
+ var offsetParent = this.offsetParent || docElem;
+
+ while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
+ offsetParent = offsetParent.offsetParent;
+ }
+
+ return offsetParent || docElem;
+ });
+ }
+});
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+ var top = "pageYOffset" === prop;
+
+ jQuery.fn[ method ] = function( val ) {
+ return access( this, function( elem, method, val ) {
+ var win = getWindow( elem );
+
+ if ( val === undefined ) {
+ return win ? win[ prop ] : elem[ method ];
+ }
+
+ if ( win ) {
+ win.scrollTo(
+ !top ? val : window.pageXOffset,
+ top ? val : window.pageYOffset
+ );
+
+ } else {
+ elem[ method ] = val;
+ }
+ }, method, val, arguments.length, null );
+ };
+});
+
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// getComputedStyle returns percent when specified for top/left/bottom/right
+// rather than make the css module depend on the offset module, we just check for it here
+jQuery.each( [ "top", "left" ], function( i, prop ) {
+ jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+ function( elem, computed ) {
+ if ( computed ) {
+ computed = curCSS( elem, prop );
+ // if curCSS returns percentage, fallback to offset
+ return rnumnonpx.test( computed ) ?
+ jQuery( elem ).position()[ prop ] + "px" :
+ computed;
+ }
+ }
+ );
+});
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+ jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+ // margin is only for outerHeight, outerWidth
+ jQuery.fn[ funcName ] = function( margin, value ) {
+ var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+ extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+ return access( this, function( elem, type, value ) {
+ var doc;
+
+ if ( jQuery.isWindow( elem ) ) {
+ // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+ // isn't a whole lot we can do. See pull request at this URL for discussion:
+ // https://github.com/jquery/jquery/pull/764
+ return elem.document.documentElement[ "client" + name ];
+ }
+
+ // Get document width or height
+ if ( elem.nodeType === 9 ) {
+ doc = elem.documentElement;
+
+ // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+ // whichever is greatest
+ return Math.max(
+ elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+ elem.body[ "offset" + name ], doc[ "offset" + name ],
+ doc[ "client" + name ]
+ );
+ }
+
+ return value === undefined ?
+ // Get width or height on the element, requesting but not forcing parseFloat
+ jQuery.css( elem, type, extra ) :
+
+ // Set width or height on the element
+ jQuery.style( elem, type, value, extra );
+ }, type, chainable ? margin : undefined, chainable, null );
+ };
+ });
+});
+
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+ return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+ define( "jquery", [], function() {
+ return jQuery;
+ });
+}
+
+
+
+
+var
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+ if ( window.$ === jQuery ) {
+ window.$ = _$;
+ }
+
+ if ( deep && window.jQuery === jQuery ) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in
+// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( typeof noGlobal === strundefined ) {
+ window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+
+}));
diff --git a/framework/src/onos/web/gui/src/main/webapp/tp/jquery-2.1.1.min.js b/framework/src/onos/web/gui/src/main/webapp/tp/jquery-2.1.1.min.js
new file mode 100644
index 00000000..e5ace116
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tp/jquery-2.1.1.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v2.1.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.1",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=lb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=mb(b);function pb(){}pb.prototype=d.filters=d.pseudos,d.setFilters=new pb,g=fb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fb.error(a):z(a,i).slice(0)};function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+Math.random()}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)
+},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ab=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ib={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1></$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,"script"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=qb[0].contentDocument,b.write(),b.close(),c=sb(a,b),qb.detach()),rb[a]=c),c}var ub=/^margin/,vb=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wb=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)};function xb(a,b,c){var d,e,f,g,h=a.style;return c=c||wb(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),vb.test(g)&&ub.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function yb(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var zb=/^(none|table(?!-c[ea]).+)/,Ab=new RegExp("^("+Q+")(.*)$","i"),Bb=new RegExp("^([+-])=("+Q+")","i"),Cb={position:"absolute",visibility:"hidden",display:"block"},Db={letterSpacing:"0",fontWeight:"400"},Eb=["Webkit","O","Moz","ms"];function Fb(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Eb.length;while(e--)if(b=Eb[e]+c,b in a)return b;return d}function Gb(a,b,c){var d=Ab.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Hb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ib(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wb(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xb(a,b,f),(0>e||null==e)&&(e=a.style[b]),vb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Hb(a,b,c||(g?"border":"content"),d,f)+"px"}function Jb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",tb(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fb(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Bb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fb(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xb(a,b,d)),"normal"===e&&b in Db&&(e=Db[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?zb.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Cb,function(){return Ib(a,b,d)}):Ib(a,b,d):void 0},set:function(a,c,d){var e=d&&wb(a);return Gb(a,c,d?Hb(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=yb(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xb,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ub.test(a)||(n.cssHooks[a+b].set=Gb)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wb(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Jb(this,!0)},hide:function(){return Jb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Kb(a,b,c,d,e){return new Kb.prototype.init(a,b,c,d,e)}n.Tween=Kb,Kb.prototype={constructor:Kb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Kb.propHooks[this.prop];return a&&a.get?a.get(this):Kb.propHooks._default.get(this)},run:function(a){var b,c=Kb.propHooks[this.prop];return this.pos=b=this.options.duration?n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Kb.propHooks._default.set(this),this}},Kb.prototype.init.prototype=Kb.prototype,Kb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Kb.propHooks.scrollTop=Kb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Kb.prototype.init,n.fx.step={};var Lb,Mb,Nb=/^(?:toggle|show|hide)$/,Ob=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pb=/queueHooks$/,Qb=[Vb],Rb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Ob.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Ob.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sb(){return setTimeout(function(){Lb=void 0}),Lb=n.now()}function Tb(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ub(a,b,c){for(var d,e=(Rb[b]||[]).concat(Rb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Vb(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||tb(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Nb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?tb(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ub(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xb(a,b,c){var d,e,f=0,g=Qb.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Lb||Sb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:Lb||Sb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wb(k,j.opts.specialEasing);g>f;f++)if(d=Qb[f].call(j,a,k,j.opts))return d;return n.map(k,Ub,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xb,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Rb[c]=Rb[c]||[],Rb[c].unshift(b)},prefilter:function(a,b){b?Qb.unshift(a):Qb.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xb(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Tb(b,!0),a,d,e)}}),n.each({slideDown:Tb("show"),slideUp:Tb("hide"),slideToggle:Tb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(Lb=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),Lb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Mb||(Mb=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Mb),Mb=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement("input"),b=l.createElement("select"),c=b.appendChild(l.createElement("option"));a.type="checkbox",k.checkOn=""!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement("input"),a.value="t",a.type="radio",k.radioValue="t"===a.value}();var Yb,Zb,$b=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Zb:Yb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))
+},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Zb={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$b[b]||n.find.attr;$b[b]=function(a,b,d){var e,f;return d||(f=$b[b],$b[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$b[b]=f),e}});var _b=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_b.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ac=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ac," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ac," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ac," ").indexOf(b)>=0)return!0;return!1}});var bc=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bc,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cc=n.now(),dc=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var ec,fc,gc=/#.*$/,hc=/([?&])_=[^&]*/,ic=/^(.*?):[ \t]*([^\r\n]*)$/gm,jc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,kc=/^(?:GET|HEAD)$/,lc=/^\/\//,mc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,nc={},oc={},pc="*/".concat("*");try{fc=location.href}catch(qc){fc=l.createElement("a"),fc.href="",fc=fc.href}ec=mc.exec(fc.toLowerCase())||[];function rc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function sc(a,b,c,d){var e={},f=a===oc;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function tc(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function uc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function vc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:fc,type:"GET",isLocal:jc.test(ec[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":pc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?tc(tc(a,n.ajaxSettings),b):tc(n.ajaxSettings,a)},ajaxPrefilter:rc(nc),ajaxTransport:rc(oc),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=ic.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||fc)+"").replace(gc,"").replace(lc,ec[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=mc.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===ec[1]&&h[2]===ec[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(ec[3]||("http:"===ec[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),sc(nc,k,b,v),2===t)return v;i=k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!kc.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(dc.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=hc.test(d)?d.replace(hc,"$1_="+cc++):d+(dc.test(d)?"&":"?")+"_="+cc++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+pc+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=sc(oc,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=uc(k,v,f)),u=vc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var wc=/%20/g,xc=/\[\]$/,yc=/\r?\n/g,zc=/^(?:submit|button|image|reset|file)$/i,Ac=/^(?:input|select|textarea|keygen)/i;function Bc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||xc.test(a)?d(a,e):Bc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Bc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Bc(c,a[c],b,e);return d.join("&").replace(wc,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Ac.test(this.nodeName)&&!zc.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(yc,"\r\n")}}):{name:b.name,value:c.replace(yc,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Cc=0,Dc={},Ec={0:200,1223:204},Fc=n.ajaxSettings.xhr();a.ActiveXObject&&n(a).on("unload",function(){for(var a in Dc)Dc[a]()}),k.cors=!!Fc&&"withCredentials"in Fc,k.ajax=Fc=!!Fc,n.ajaxTransport(function(a){var b;return k.cors||Fc&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Cc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Dc[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Ec[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Dc[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Gc=[],Hc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Gc.pop()||n.expando+"_"+cc++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Hc.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Hc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Hc,"$1"+e):b.jsonp!==!1&&(b.url+=(dc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Gc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Ic=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Ic)return Ic.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Jc=a.document.documentElement;function Kc(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Kc(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Jc;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Jc})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Kc(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=yb(k.pixelPosition,function(a,c){return c?(c=xb(a,b),vb.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Lc=a.jQuery,Mc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Mc),b&&a.jQuery===n&&(a.jQuery=Lc),n},typeof b===U&&(a.jQuery=a.$=n),n});
diff --git a/framework/src/onos/web/gui/src/main/webapp/tp/topojson.v1.min.js b/framework/src/onos/web/gui/src/main/webapp/tp/topojson.v1.min.js
new file mode 100644
index 00000000..865f8d3b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/main/webapp/tp/topojson.v1.min.js
@@ -0,0 +1 @@
+!function(){function t(n,t){function r(t){var r,e=n.arcs[0>t?~t:t],o=e[0];return n.transform?(r=[0,0],e.forEach(function(n){r[0]+=n[0],r[1]+=n[1]})):r=e[e.length-1],0>t?[r,o]:[o,r]}function e(n,t){for(var r in n){var e=n[r];delete t[e.start],delete e.start,delete e.end,e.forEach(function(n){o[0>n?~n:n]=1}),f.push(e)}}var o={},i={},u={},f=[],c=-1;return t.forEach(function(r,e){var o,i=n.arcs[0>r?~r:r];i.length<3&&!i[1][0]&&!i[1][1]&&(o=t[++c],t[c]=r,t[e]=o)}),t.forEach(function(n){var t,e,o=r(n),f=o[0],c=o[1];if(t=u[f])if(delete u[t.end],t.push(n),t.end=c,e=i[c]){delete i[e.start];var a=e===t?t:t.concat(e);i[a.start=t.start]=u[a.end=e.end]=a}else i[t.start]=u[t.end]=t;else if(t=i[c])if(delete i[t.start],t.unshift(n),t.start=f,e=u[f]){delete u[e.end];var s=e===t?t:e.concat(t);i[s.start=e.start]=u[s.end=t.end]=s}else i[t.start]=u[t.end]=t;else t=[n],i[t.start=f]=u[t.end=c]=t}),e(u,i),e(i,u),t.forEach(function(n){o[0>n?~n:n]||f.push([n])}),f}function r(n,r,e){function o(n){var t=0>n?~n:n;(s[t]||(s[t]=[])).push({i:n,g:a})}function i(n){n.forEach(o)}function u(n){n.forEach(i)}function f(n){"GeometryCollection"===n.type?n.geometries.forEach(f):n.type in l&&(a=n,l[n.type](n.arcs))}var c=[];if(arguments.length>1){var a,s=[],l={LineString:i,MultiLineString:u,Polygon:u,MultiPolygon:function(n){n.forEach(u)}};f(r),s.forEach(arguments.length<3?function(n){c.push(n[0].i)}:function(n){e(n[0].g,n[n.length-1].g)&&c.push(n[0].i)})}else for(var h=0,p=n.arcs.length;p>h;++h)c.push(h);return{type:"MultiLineString",arcs:t(n,c)}}function e(r,e){function o(n){n.forEach(function(t){t.forEach(function(t){(f[t=0>t?~t:t]||(f[t]=[])).push(n)})}),c.push(n)}function i(n){return l(u(r,{type:"Polygon",arcs:[n]}).coordinates[0])>0}var f={},c=[],a=[];return e.forEach(function(n){"Polygon"===n.type?o(n.arcs):"MultiPolygon"===n.type&&n.arcs.forEach(o)}),c.forEach(function(n){if(!n._){var t=[],r=[n];for(n._=1,a.push(t);n=r.pop();)t.push(n),n.forEach(function(n){n.forEach(function(n){f[0>n?~n:n].forEach(function(n){n._||(n._=1,r.push(n))})})})}}),c.forEach(function(n){delete n._}),{type:"MultiPolygon",arcs:a.map(function(e){var o=[];if(e.forEach(function(n){n.forEach(function(n){n.forEach(function(n){f[0>n?~n:n].length<2&&o.push(n)})})}),o=t(r,o),(n=o.length)>1)for(var u,c=i(e[0][0]),a=0;n>a;++a)if(c===i(o[a])){u=o[0],o[0]=o[a],o[a]=u;break}return o})}}function o(n,t){return"GeometryCollection"===t.type?{type:"FeatureCollection",features:t.geometries.map(function(t){return i(n,t)})}:i(n,t)}function i(n,t){var r={type:"Feature",id:t.id,properties:t.properties||{},geometry:u(n,t)};return null==t.id&&delete r.id,r}function u(n,t){function r(n,t){t.length&&t.pop();for(var r,e=s[0>n?~n:n],o=0,i=e.length;i>o;++o)t.push(r=e[o].slice()),a(r,o);0>n&&f(t,i)}function e(n){return n=n.slice(),a(n,0),n}function o(n){for(var t=[],e=0,o=n.length;o>e;++e)r(n[e],t);return t.length<2&&t.push(t[0].slice()),t}function i(n){for(var t=o(n);t.length<4;)t.push(t[0].slice());return t}function u(n){return n.map(i)}function c(n){var t=n.type;return"GeometryCollection"===t?{type:t,geometries:n.geometries.map(c)}:t in l?{type:t,coordinates:l[t](n)}:null}var a=v(n.transform),s=n.arcs,l={Point:function(n){return e(n.coordinates)},MultiPoint:function(n){return n.coordinates.map(e)},LineString:function(n){return o(n.arcs)},MultiLineString:function(n){return n.arcs.map(o)},Polygon:function(n){return u(n.arcs)},MultiPolygon:function(n){return n.arcs.map(u)}};return c(t)}function f(n,t){for(var r,e=n.length,o=e-t;o<--e;)r=n[o],n[o++]=n[e],n[e]=r}function c(n,t){for(var r=0,e=n.length;e>r;){var o=r+e>>>1;n[o]<t?r=o+1:e=o}return r}function a(n){function t(n,t){n.forEach(function(n){0>n&&(n=~n);var r=o[n];r?r.push(t):o[n]=[t]})}function r(n,r){n.forEach(function(n){t(n,r)})}function e(n,t){"GeometryCollection"===n.type?n.geometries.forEach(function(n){e(n,t)}):n.type in u&&u[n.type](n.arcs,t)}var o={},i=n.map(function(){return[]}),u={LineString:t,MultiLineString:r,Polygon:r,MultiPolygon:function(n,t){n.forEach(function(n){r(n,t)})}};n.forEach(e);for(var f in o)for(var a=o[f],s=a.length,l=0;s>l;++l)for(var h=l+1;s>h;++h){var p,g=a[l],v=a[h];(p=i[g])[f=c(p,v)]!==v&&p.splice(f,0,v),(p=i[v])[f=c(p,g)]!==g&&p.splice(f,0,g)}return i}function s(n,t){function r(n){i.remove(n),n[1][2]=t(n),i.push(n)}var e=v(n.transform),o=m(n.transform),i=g();return t||(t=h),n.arcs.forEach(function(n){for(var u,f,c=[],a=0,s=0,l=n.length;l>s;++s)f=n[s],e(n[s]=[f[0],f[1],1/0],s);for(var s=1,l=n.length-1;l>s;++s)u=n.slice(s-1,s+2),u[1][2]=t(u),c.push(u),i.push(u);for(var s=0,l=c.length;l>s;++s)u=c[s],u.previous=c[s-1],u.next=c[s+1];for(;u=i.pop();){var h=u.previous,p=u.next;u[1][2]<a?u[1][2]=a:a=u[1][2],h&&(h.next=p,h[2]=u[2],r(h)),p&&(p.previous=h,p[0]=u[0],r(p))}n.forEach(o)}),n}function l(n){for(var t,r=-1,e=n.length,o=n[e-1],i=0;++r<e;)t=o,o=n[r],i+=t[0]*o[1]-t[1]*o[0];return.5*i}function h(n){var t=n[0],r=n[1],e=n[2];return Math.abs((t[0]-e[0])*(r[1]-t[1])-(t[0]-r[0])*(e[1]-t[1]))}function p(n,t){return n[1][2]-t[1][2]}function g(){function n(n,t){for(;t>0;){var r=(t+1>>1)-1,o=e[r];if(p(n,o)>=0)break;e[o._=t]=o,e[n._=t=r]=n}}function t(n,t){for(;;){var r=t+1<<1,i=r-1,u=t,f=e[u];if(o>i&&p(e[i],f)<0&&(f=e[u=i]),o>r&&p(e[r],f)<0&&(f=e[u=r]),u===t)break;e[f._=t]=f,e[n._=t=u]=n}}var r={},e=[],o=0;return r.push=function(t){return n(e[t._=o]=t,o++),o},r.pop=function(){if(!(0>=o)){var n,r=e[0];return--o>0&&(n=e[o],t(e[n._=0]=n,0)),r}},r.remove=function(r){var i,u=r._;if(e[u]===r)return u!==--o&&(i=e[o],(p(i,r)<0?n:t)(e[i._=u]=i,u)),u},r}function v(n){if(!n)return y;var t,r,e=n.scale[0],o=n.scale[1],i=n.translate[0],u=n.translate[1];return function(n,f){f||(t=r=0),n[0]=(t+=n[0])*e+i,n[1]=(r+=n[1])*o+u}}function m(n){if(!n)return y;var t,r,e=n.scale[0],o=n.scale[1],i=n.translate[0],u=n.translate[1];return function(n,f){f||(t=r=0);var c=(n[0]-i)/e|0,a=(n[1]-u)/o|0;n[0]=c-t,n[1]=a-r,t=c,r=a}}function y(){}var d={version:"1.6.18",mesh:function(n){return u(n,r.apply(this,arguments))},meshArcs:r,merge:function(n){return u(n,e.apply(this,arguments))},mergeArcs:e,feature:o,neighbors:a,presimplify:s};"function"==typeof define&&define.amd?define(d):"object"==typeof module&&module.exports?module.exports=d:this.topojson=d}(); \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex1.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex1.json
new file mode 100644
index 00000000..b82fda85
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex1.json
@@ -0,0 +1,19 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000000000000003",
+ "type": "switch",
+ "online": true,
+ "labels": [
+ "of:0000000000000003",
+ "3",
+ "",
+ null
+ ],
+ "props": {
+ "latitude": 123.5,
+ "longitude": 67.8,
+ "anotherProp": "foobar"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex2_memo.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex2_memo.json
new file mode 100644
index 00000000..5f519ffa
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex2_memo.json
@@ -0,0 +1,24 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000000000000003",
+ "type": "switch",
+ "online": true,
+ "labels": [
+ "of:0000000000000003",
+ "3",
+ "",
+ null
+ ],
+ "props": {
+ "latitude": 123.5,
+ "longitude": 67.8,
+ "anotherProp": "foobar"
+ },
+ "metaUi": {
+ "xpc": 57.3,
+ "ypc": 24.86,
+ "and": "other properties the UI wishes to remember..."
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex3.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex3.json
new file mode 100644
index 00000000..e02f7124
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addDevice_ex3.json
@@ -0,0 +1,24 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:000000000000000a",
+ "type": "switch",
+ "online": true,
+ "master": "local",
+ "labels": [
+ "",
+ "NWOR",
+ "of:000000000000000a"
+ ],
+ "props": {
+ "latitude": "29.951475",
+ "name": "NWOR",
+ "longitude": "-90.078434"
+ },
+ "location": {
+ "type": "latlng",
+ "lat": 29.951475,
+ "lng": -90.078434
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addHost_ex1.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addHost_ex1.json
new file mode 100644
index 00000000..a97d15a4
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addHost_ex1.json
@@ -0,0 +1,17 @@
+{
+ "event": "addHost",
+ "payload": {
+ "id": "6A:40:24:F7:9C:2C/-1",
+ "ingress": "6A:40:24:F7:9C:2C/-1/0-of:0000000000000003/2",
+ "egress": "of:0000000000000003/2-6A:40:24:F7:9C:2C/-1/0",
+ "cp": {
+ "device": "of:0000000000000003",
+ "port": 2
+ },
+ "labels": [
+ "unknown",
+ "6A:40:24:F7:9C:2C"
+ ],
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addHost_ex2.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addHost_ex2.json
new file mode 100644
index 00000000..d47265b3
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addHost_ex2.json
@@ -0,0 +1,27 @@
+{
+ "event": "addHost",
+ "payload": {
+ "id": "00:00:00:00:00:01/-1",
+ "type": "endstation",
+ "ingress": "00:00:00:00:00:01/-1/0-of:0000000000000001/1",
+ "egress": "of:0000000000000001/1-00:00:00:00:00:01/-1/0",
+ "cp": {
+ "device": "of:0000000000000001",
+ "port": 1
+ },
+ "labels": [
+ "10.0.0.1",
+ "00:00:00:00:00:01"
+ ],
+ "props": {
+ "name": "CMBR",
+ "latitude": "44.37373",
+ "longitude": "-71.109734"
+ },
+ "location": {
+ "type": "latlng",
+ "lat": 44.37373,
+ "lng": -71.109734
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addInstance_ex1.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addInstance_ex1.json
new file mode 100644
index 00000000..0579c1d5
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addInstance_ex1.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "local",
+ "ip": "127.0.0.1",
+ "online": true,
+ "uiAttached": true,
+ "switches": 25,
+ "labels": [
+ "local",
+ "127.0.0.1"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addLink_ex1.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addLink_ex1.json
new file mode 100644
index 00000000..f48147fc
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/addLink_ex1.json
@@ -0,0 +1,13 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000000000000007/4-of:0000000000000006/1",
+ "type": "direct",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000000000000007",
+ "srcPort": "4",
+ "dst": "of:0000000000000006",
+ "dstPort": "1"
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/removeDevice_fab.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/removeDevice_fab.json
new file mode 100644
index 00000000..0e8d47a0
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/removeDevice_fab.json
@@ -0,0 +1,20 @@
+{
+ "__comments__": [
+ "fabricated event",
+ "not sure if this is the actual format",
+ "but we really only care about 'id' being in the payload"
+ ],
+ "event": "removeDevice",
+ "payload": {
+ "id": "of:0000000000000002",
+ "type": "switch",
+ "online": true,
+ "labels": [
+ "of:0000000000000002",
+ "2",
+ "",
+ null
+ ],
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/removeHost_fab.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/removeHost_fab.json
new file mode 100644
index 00000000..42371993
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/removeHost_fab.json
@@ -0,0 +1,22 @@
+{
+ "__comments__": [
+ "fabricated event",
+ "not sure if this is the actual format",
+ "but we really only care about 'id' being in the payload"
+ ],
+ "event": "removeHost",
+ "payload": {
+ "id": "6A:40:24:F7:9C:2C/-1",
+ "ingress": "6A:40:24:F7:9C:2C/-1/0-of:0000000000000003/2",
+ "egress": "of:0000000000000003/2-6A:40:24:F7:9C:2C/-1/0",
+ "cp": {
+ "device": "of:0000000000000003",
+ "port": 2
+ },
+ "labels": [
+ "unknown",
+ "6A:40:24:F7:9C:2C"
+ ],
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/removeInstance_ex1.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/removeInstance_ex1.json
new file mode 100644
index 00000000..0f9388b6
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/removeInstance_ex1.json
@@ -0,0 +1,7 @@
+{
+ "event": "removeInstance",
+ "payload": {
+ "id": "onos-1",
+ "online": "false"
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/removeLink_ex1.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/removeLink_ex1.json
new file mode 100644
index 00000000..8d1dd035
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/removeLink_ex1.json
@@ -0,0 +1,12 @@
+{
+ "event": "removeLink",
+ "payload": {
+ "id": "of:0000000000000001/1-of:0000000000000002/4",
+ "type": "direct",
+ "linkWidth": 2,
+ "src": "of:0000000000000001",
+ "srcPort": "1",
+ "dst": "of:0000000000000002",
+ "dstPort": "4"
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showDetails_ex1_host.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showDetails_ex1_host.json
new file mode 100644
index 00000000..19d99593
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showDetails_ex1_host.json
@@ -0,0 +1,22 @@
+{
+ "event": "showDetails",
+ "sid": 9,
+ "payload": {
+ "id": "CA:4B:EE:A4:B0:33/-1",
+ "type": "host",
+ "propOrder": [
+ "MAC",
+ "IP",
+ "-",
+ "Latitude",
+ "Longitude"
+ ],
+ "props": {
+ "MAC": "CA:4B:EE:A4:B0:33",
+ "IP": "[10.0.0.1]",
+ "-": "",
+ "Latitude": null,
+ "Longitude": null
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showDetails_ex2_device.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showDetails_ex2_device.json
new file mode 100644
index 00000000..8ac1f4f9
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showDetails_ex2_device.json
@@ -0,0 +1,33 @@
+{
+ "event": "showDetails",
+ "sid": 37,
+ "payload": {
+ "id": "of:000000000000000a",
+ "type": "switch",
+ "propOrder": [
+ "Name",
+ "Vendor",
+ "H/W Version",
+ "S/W Version",
+ "Serial Number",
+ "-",
+ "Latitude",
+ "Longitude",
+ "Ports",
+ "-",
+ "Master"
+ ],
+ "props": {
+ "Name": null,
+ "Vendor": "Nicira, Inc.",
+ "H/W Version": "Open vSwitch",
+ "S/W Version": "2.0.1",
+ "Serial Number": "None",
+ "-": "",
+ "Latitude": null,
+ "Longitude": null,
+ "Ports": "5",
+ "Master":"local"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showSummary_ex1.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showSummary_ex1.json
new file mode 100644
index 00000000..4d5bd30b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showSummary_ex1.json
@@ -0,0 +1,30 @@
+{
+ "event": "showSummary",
+ "sid": 1,
+ "payload": {
+ "id": "ONOS Summary",
+ "type": "node",
+ "propOrder": [
+ "Devices",
+ "Links",
+ "Hosts",
+ "Topology SCCs",
+ "Paths",
+ "-",
+ "Intents",
+ "Flows",
+ "Version"
+ ],
+ "props": {
+ "Devices": "25",
+ "Links": "112",
+ "Hosts": "25",
+ "Topology SCCs": "1",
+ "Paths": "1,272",
+ "-": "",
+ "Intents": "0",
+ "Flows": "0",
+ "Version": "1.0.0*"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex1.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex1.json
new file mode 100644
index 00000000..bed7cdd0
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex1.json
@@ -0,0 +1,48 @@
+{
+ "event": "showTraffic",
+ "sid":63,
+ "payload": {
+ "paths": [
+ {
+ "class": "primary",
+ "traffic": false,
+ "links": [
+ "1E:10:D9:A2:84:E2/-1/0-of:0000000000000003/1",
+ "of:0000000000000003/4-of:0000000000000002/1",
+ "of:0000000000000002/4-of:0000000000000001/1",
+ "of:0000000000000001/2-of:0000000000000006/4",
+ "of:0000000000000006/2-of:0000000000000008/4",
+ "of:0000000000000008/3-9E:0B:E0:38:98:DE/-1/0"
+ ],
+ "labels": [
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ {
+ "class": "primary",
+ "traffic": false,
+ "links": [
+ "9E:0B:E0:38:98:DE/-1/0-of:0000000000000008/3",
+ "of:0000000000000008/4-of:0000000000000006/2",
+ "of:0000000000000006/4-of:0000000000000001/2",
+ "of:0000000000000001/1-of:0000000000000002/4",
+ "of:0000000000000002/1-of:0000000000000003/4",
+ "of:0000000000000003/1-1E:10:D9:A2:84:E2/-1/0"
+ ],
+ "labels": [
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ]
+ }
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex2_animated.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex2_animated.json
new file mode 100644
index 00000000..610b516c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex2_animated.json
@@ -0,0 +1,88 @@
+{
+ "event": "showTraffic",
+ "sid": 227,
+ "payload": {
+ "paths": [
+ {
+ "class": "primary animated",
+ "traffic": true,
+ "links": [
+ "02:D7:91:9F:4B:E8/-1/0-of:0000000000000004/1",
+ "of:0000000000000004/4-of:0000000000000002/2",
+ "of:0000000000000002/4-of:0000000000000001/1",
+ "of:0000000000000001/2-of:0000000000000006/4",
+ "of:0000000000000006/2-of:0000000000000008/4",
+ "of:0000000000000008/3-9E:0B:E0:38:98:DE/-1/0"
+ ],
+ "labels": [
+ "",
+ "Load{rate=98, latest=37898}",
+ "",
+ "",
+ "",
+ "Load{rate=98, latest=38080}"
+ ]
+ },
+ {
+ "class": "primary animated",
+ "traffic": true,
+ "links": [
+ "9E:0B:E0:38:98:DE/-1/0-of:0000000000000008/3",
+ "of:0000000000000008/4-of:0000000000000006/2",
+ "of:0000000000000006/4-of:0000000000000001/2",
+ "of:0000000000000001/1-of:0000000000000002/4",
+ "of:0000000000000002/2-of:0000000000000004/4",
+ "of:0000000000000004/1-02:D7:91:9F:4B:E8/-1/0"
+ ],
+ "labels": [
+ "",
+ "",
+ "Load{rate=98, latest=38178}",
+ "",
+ "Load{rate=98, latest=37898}",
+ "Load{rate=98, latest=37898}"
+ ]
+ },
+ {
+ "class": "primary animated",
+ "traffic": true,
+ "links": [
+ "1E:10:D9:A2:84:E2/-1/0-of:0000000000000003/1",
+ "of:0000000000000003/4-of:0000000000000002/1",
+ "of:0000000000000002/4-of:0000000000000001/1",
+ "of:0000000000000001/2-of:0000000000000006/4",
+ "of:0000000000000006/2-of:0000000000000008/4",
+ "of:0000000000000008/3-9E:0B:E0:38:98:DE/-1/0"
+ ],
+ "labels": [
+ "",
+ "",
+ "",
+ "",
+ "",
+ "Load{rate=98, latest=38080}"
+ ]
+ },
+ {
+ "class": "primary animated",
+ "traffic": true,
+ "links": [
+ "9E:0B:E0:38:98:DE/-1/0-of:0000000000000008/3",
+ "of:0000000000000008/4-of:0000000000000006/2",
+ "of:0000000000000006/4-of:0000000000000001/2",
+ "of:0000000000000001/1-of:0000000000000002/4",
+ "of:0000000000000002/1-of:0000000000000003/4",
+ "of:0000000000000003/1-1E:10:D9:A2:84:E2/-1/0"
+ ],
+ "labels": [
+ "",
+ "",
+ "Load{rate=98, latest=38178}",
+ "",
+ "",
+ ""
+ ]
+ }
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex3_none.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex3_none.json
new file mode 100644
index 00000000..4acd8296
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/showTraffic_ex3_none.json
@@ -0,0 +1,7 @@
+{
+ "event": "showTraffic",
+ "sid": 11,
+ "payload": {
+ "paths": []
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/updateDevice_ex1.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/updateDevice_ex1.json
new file mode 100644
index 00000000..dda6186b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/updateDevice_ex1.json
@@ -0,0 +1,15 @@
+{
+ "event": "updateDevice",
+ "payload": {
+ "id": "of:0000000000000002",
+ "type": "switch",
+ "online": true,
+ "labels": [
+ "of:0000000000000002",
+ "2",
+ "",
+ null
+ ],
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/updateDevice_ex2.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/updateDevice_ex2.json
new file mode 100644
index 00000000..d607f985
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/updateDevice_ex2.json
@@ -0,0 +1,15 @@
+{
+ "event": "updateDevice",
+ "payload": {
+ "id": "of:0000000000000002",
+ "type": "switch",
+ "online": false,
+ "labels": [
+ "of:0000000000000002",
+ "2",
+ "",
+ null
+ ],
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/updateHost.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/updateHost.json
new file mode 100644
index 00000000..fd7361c9
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/updateHost.json
@@ -0,0 +1,17 @@
+{
+ "event": "updateHost",
+ "payload": {
+ "id": "AA:C2:74:3F:B8:06/-1",
+ "ingress": "AA:C2:74:3F:B8:06/-1/0-of:0000000000000005/3",
+ "egress": "of:0000000000000005/3-AA:C2:74:3F:B8:06/-1/0",
+ "cp": {
+ "device": "of:0000000000000005",
+ "port": 3
+ },
+ "labels": [
+ "10.0.0.9",
+ "AA:C2:74:3F:B8:06"
+ ],
+ "props":{}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/updateInstance_ex1.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/updateInstance_ex1.json
new file mode 100644
index 00000000..e8cf9e8d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/updateInstance_ex1.json
@@ -0,0 +1,7 @@
+{
+ "event": "updateInstance",
+ "payload": {
+ "id": "onos-1",
+ "online": "false"
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/updateLink_ex1.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/updateLink_ex1.json
new file mode 100644
index 00000000..3be5c5fb
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/rx/updateLink_ex1.json
@@ -0,0 +1,12 @@
+{
+ "event": "updateLink",
+ "payload": {
+ "id": "of:0000000000000002/4-of:0000000000000001/1",
+ "type": "direct",
+ "linkWidth": 2,
+ "src": "of:0000000000000002",
+ "srcPort": "4",
+ "dst": "of:0000000000000001",
+ "dstPort": "1"
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/cancelSummary_ex1.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/cancelSummary_ex1.json
new file mode 100644
index 00000000..6418471f
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/cancelSummary_ex1.json
@@ -0,0 +1,5 @@
+{
+ "event": "cancelSummary",
+ "sid": 2,
+ "payload": {}
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestDetails_ex1.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestDetails_ex1.json
new file mode 100644
index 00000000..6c886057
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestDetails_ex1.json
@@ -0,0 +1,9 @@
+{
+ "event": "requestDetails",
+ "sid": 15,
+ "payload": {
+ "id": "of:0000000000000003",
+ "class": "device"
+ }
+}
+
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestDetails_ex2.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestDetails_ex2.json
new file mode 100644
index 00000000..2cc1bfa7
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestDetails_ex2.json
@@ -0,0 +1,8 @@
+{
+ "event": "requestDetails",
+ "sid": 9,
+ "payload": {
+ "id": "CA:4B:EE:A4:B0:33/-1",
+ "class": "host"
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestSummary_ex1.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestSummary_ex1.json
new file mode 100644
index 00000000..448d027c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestSummary_ex1.json
@@ -0,0 +1,5 @@
+{
+ "event": "requestSummary",
+ "sid": 1,
+ "payload": {}
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex1_devs.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex1_devs.json
new file mode 100644
index 00000000..5c00b710
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex1_devs.json
@@ -0,0 +1,12 @@
+{
+ "event": "requestTraffic",
+ "sid": 6,
+ "payload": {
+ "ids": [
+ "of:0000000000000007",
+ "of:000000000000000c",
+ "of:000000000000000a"
+ ],
+ "hover": ""
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex2_hosts.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex2_hosts.json
new file mode 100644
index 00000000..3d7bb2dc
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex2_hosts.json
@@ -0,0 +1,13 @@
+{
+ "event": "requestTraffic",
+ "sid": 12,
+ "payload": {
+ "ids": [
+ "86:C3:7B:90:79:CD/-1",
+ "22:BA:28:81:FD:45/-1",
+ "BA:91:F6:8E:B6:B6/-1",
+ "06:E2:E6:F7:03:12/-1"
+ ],
+ "hover": ""
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex3_devs_hosts.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex3_devs_hosts.json
new file mode 100644
index 00000000..1757b443
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex3_devs_hosts.json
@@ -0,0 +1,13 @@
+{
+ "event": "requestTraffic",
+ "sid": 18,
+ "payload": {
+ "ids": [
+ "of:0000000000000001",
+ "86:C3:7B:90:79:CD/-1",
+ "7E:D2:EE:0F:12:4A/-1",
+ "of:000000000000000c"
+ ],
+ "hover": ""
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex4_hover.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex4_hover.json
new file mode 100644
index 00000000..b86e03aa
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/requestTraffic_ex4_hover.json
@@ -0,0 +1,8 @@
+{
+ "event": "requestTraffic",
+ "sid": 48,
+ "payload": {
+ "ids": [],
+ "hover": "9E:0B:E0:38:98:DE/-1"
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/updateMeta_ex1.json b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/updateMeta_ex1.json
new file mode 100644
index 00000000..61145837
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/_capture/tx/updateMeta_ex1.json
@@ -0,0 +1,14 @@
+{
+ "event": "updateMeta",
+ "sid": 11,
+ "payload": {
+ "id": "62:4F:65:BF:FF:B3/-1",
+ "class": "host",
+ "memento": {
+ "xpc": 57.3,
+ "ypc": 24.86,
+ "and": "other properties the UI wishes to remember..."
+ }
+ }
+}
+
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_10_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_10_onos.json
new file mode 100644
index 00000000..b4685cbc
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_10_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffffff03",
+ "type": "roadm",
+ "online": true,
+ "master": "192.168.56.101",
+ "labels": [
+ "",
+ "opt-3",
+ "0000ffffffffff03"
+ ],
+ "metaUi": {
+ "x": 282,
+ "y": 603
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_11_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_11_onos.json
new file mode 100644
index 00000000..0fde1c0b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_11_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0009",
+ "type": "switch",
+ "online": false,
+ "master": "onos-2",
+ "labels": [
+ "",
+ "sw-9",
+ "0000ffffffff0009"
+ ],
+ "metaUi": {
+ "x": 884,
+ "y": 477
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_12_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_12_onos.json
new file mode 100644
index 00000000..4f3af686
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_12_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffffff09",
+ "type": "roadm",
+ "online": false,
+ "master": "onos-2",
+ "labels": [
+ "",
+ "opt-9",
+ "0000ffffffffff09"
+ ],
+ "metaUi": {
+ "x": 884,
+ "y": 577
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_13_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_13_onos.json
new file mode 100644
index 00000000..56338021
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_13_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "updateInstance",
+ "payload": {
+ "id": "onos-slave",
+ "ip": "192.168.24.11",
+ "online": true,
+ "uiAttached": false,
+ "switches": 103,
+ "labels": [
+ "onos-slave",
+ "192.168.24.11"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_14_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_14_onos.json
new file mode 100644
index 00000000..f8a91863
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_14_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "removeInstance",
+ "payload": {
+ "id": "onos-leader",
+ "ip": "192.168.0.5",
+ "online": false,
+ "uiAttached": false,
+ "switches": 0,
+ "labels": [
+ "onos-leader",
+ "192.168.0.5"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_15_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_15_onos.json
new file mode 100644
index 00000000..eef2964b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_15_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "onos-leader",
+ "ip": "192.168.0.5",
+ "online": true,
+ "uiAttached": false,
+ "switches": 0,
+ "labels": [
+ "onos-leader",
+ "192.168.0.5"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_16_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_16_onos.json
new file mode 100644
index 00000000..1367251c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_16_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "onos-6",
+ "ip": "192.168.0.66",
+ "online": true,
+ "uiAttached": false,
+ "switches": 0,
+ "labels": [
+ "onos-6",
+ "192.168.0.66"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_17_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_17_onos.json
new file mode 100644
index 00000000..c080d560
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_17_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "onos-7",
+ "ip": "192.168.0.77",
+ "online": true,
+ "uiAttached": false,
+ "switches": 0,
+ "labels": [
+ "onos-7",
+ "192.168.0.77"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_18_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_18_onos.json
new file mode 100644
index 00000000..c1955853
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_18_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "updateInstance",
+ "payload": {
+ "id": "onos-master",
+ "ip": "192.168.0.7",
+ "online": true,
+ "uiAttached": false,
+ "switches": 300,
+ "labels": [
+ "onos-master",
+ "192.168.0.7"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_19_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_19_onos.json
new file mode 100644
index 00000000..bd536daf
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_19_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0002",
+ "type": "switch",
+ "online": false,
+ "master": "192.168.56.101",
+ "labels": [
+ "",
+ "sw-2",
+ "0000ffffffff0002"
+ ],
+ "metaUi": {
+ "x": 142,
+ "y": 503
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_1_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_1_onos.json
new file mode 100644
index 00000000..0fac1a1a
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_1_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "192.168.56.101",
+ "ip": "192.168.56.101",
+ "online": true,
+ "uiAttached": true,
+ "switches": 4,
+ "labels": [
+ "192.168.56.101",
+ "192.168.56.101"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_20_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_20_onos.json
new file mode 100644
index 00000000..faf0a771
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_20_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffffff02",
+ "type": "roadm",
+ "online": false,
+ "master": "192.168.56.101",
+ "labels": [
+ "",
+ "opt-2",
+ "0000ffffffffff02"
+ ],
+ "metaUi": {
+ "x": 142,
+ "y": 603
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_21_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_21_onos.json
new file mode 100644
index 00000000..5d44197b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_21_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0006",
+ "type": "switch",
+ "online": false,
+ "master": "onos-master",
+ "labels": [
+ "",
+ "sw-6",
+ "0000ffffffff0006"
+ ],
+ "metaUi": {
+ "x": 382,
+ "y": 333
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_22_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_22_onos.json
new file mode 100644
index 00000000..02e3d6e0
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_22_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff000a",
+ "type": "switch",
+ "online": true,
+ "master": "onos-slave",
+ "labels": [
+ "",
+ "sw-A",
+ "0000ffffffff000a"
+ ],
+ "metaUi": {
+ "x": 195,
+ "y": 259
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_23_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_23_onos.json
new file mode 100644
index 00000000..547d6a08
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_23_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff000b",
+ "type": "switch",
+ "online": false,
+ "master": "onos-slave",
+ "labels": [
+ "",
+ "sw-B",
+ "0000ffffffff000b"
+ ],
+ "metaUi": {
+ "x": 52,
+ "y": 262
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_24_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_24_onos.json
new file mode 100644
index 00000000..d7de3c1b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_24_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff000c",
+ "type": "switch",
+ "online": true,
+ "master": "onos-leader",
+ "labels": [
+ "",
+ "sw-C",
+ "0000ffffffff000c"
+ ],
+ "metaUi": {
+ "x": 229,
+ "y": 354
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_25_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_25_onos.json
new file mode 100644
index 00000000..cade64c8
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_25_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff000d",
+ "type": "switch",
+ "online": false,
+ "master": "onos-leader",
+ "labels": [
+ "",
+ "sw-D",
+ "0000ffffffff000d"
+ ],
+ "metaUi": {
+ "x": 100,
+ "y": 357
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_26_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_26_onos.json
new file mode 100644
index 00000000..9f21a7cc
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_26_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff000e",
+ "type": "switch",
+ "online": true,
+ "master": "onos-6",
+ "labels": [
+ "",
+ "sw-E",
+ "0000ffffffff000e"
+ ],
+ "metaUi": {
+ "x": 757,
+ "y": 267
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_27_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_27_onos.json
new file mode 100644
index 00000000..9f9b70a9
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_27_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff000f",
+ "type": "switch",
+ "online": false,
+ "master": "onos-6",
+ "labels": [
+ "",
+ "sw-F",
+ "0000ffffffff000f"
+ ],
+ "metaUi": {
+ "x": 877,
+ "y": 267
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_28_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_28_onos.json
new file mode 100644
index 00000000..a60b43e5
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_28_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0010",
+ "type": "switch",
+ "online": true,
+ "master": "onos-7",
+ "labels": [
+ "",
+ "sw-1-0",
+ "0000ffffffff0010"
+ ],
+ "metaUi": {
+ "x": 442,
+ "y": 508
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_29_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_29_onos.json
new file mode 100644
index 00000000..ae45cd27
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_29_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0011",
+ "type": "switch",
+ "online": false,
+ "master": "onos-7",
+ "labels": [
+ "",
+ "sw-1-1",
+ "0000ffffffff0011"
+ ],
+ "metaUi": {
+ "x": 576,
+ "y": 519
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_2_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_2_onos.json
new file mode 100644
index 00000000..bbc587ae
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_2_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "onos-2",
+ "ip": "192.168.0.2",
+ "online": true,
+ "uiAttached": false,
+ "switches": 3,
+ "labels": [
+ "onos-2",
+ "192.168.0.2"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_30_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_30_onos.json
new file mode 100644
index 00000000..327e2641
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_30_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "updateInstance",
+ "payload": {
+ "id": "192.168.56.101",
+ "ip": "192.168.56.101",
+ "online": false,
+ "uiAttached": false,
+ "switches": 4,
+ "labels": [
+ "192.168.56.101",
+ "192.168.56.101"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_31_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_31_onos.json
new file mode 100644
index 00000000..dad87a23
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_31_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "updateInstance",
+ "payload": {
+ "id": "onos-2",
+ "ip": "192.168.0.2",
+ "online": false,
+ "uiAttached": false,
+ "switches": 3,
+ "labels": [
+ "onos-2",
+ "192.168.0.2"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_32_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_32_onos.json
new file mode 100644
index 00000000..6efdfc5d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_32_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "updateInstance",
+ "payload": {
+ "id": "onos-leader",
+ "ip": "192.168.0.5",
+ "online": false,
+ "uiAttached": false,
+ "switches": 0,
+ "labels": [
+ "onos-leader",
+ "192.168.0.5"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_33_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_33_onos.json
new file mode 100644
index 00000000..2751055a
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_33_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "updateInstance",
+ "payload": {
+ "id": "onos-master",
+ "ip": "192.168.0.7",
+ "online": true,
+ "uiAttached": true,
+ "switches": 300,
+ "labels": [
+ "onos-master",
+ "192.168.0.7"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_34_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_34_onos.json
new file mode 100644
index 00000000..1cab6fd7
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_34_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "updateInstance",
+ "payload": {
+ "id": "onos-slave",
+ "ip": "192.168.0.11",
+ "online": false,
+ "uiAttached": false,
+ "switches": 17,
+ "labels": [
+ "onos-slave",
+ "192.168.0.11"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_35_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_35_onos.json
new file mode 100644
index 00000000..142bd367
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_35_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "updateInstance",
+ "payload": {
+ "id": "onos-6",
+ "ip": "192.168.0.66",
+ "online": false,
+ "uiAttached": false,
+ "switches": 17,
+ "labels": [
+ "onos-6",
+ "192.168.0.66"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_36_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_36_onos.json
new file mode 100644
index 00000000..a4d8dfa4
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_36_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "updateInstance",
+ "payload": {
+ "id": "onos-7",
+ "ip": "192.168.0.77",
+ "online": false,
+ "uiAttached": false,
+ "switches": 17,
+ "labels": [
+ "onos-7",
+ "192.168.0.77"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_37_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_37_onos.json
new file mode 100644
index 00000000..a5cef11a
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_37_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "updateInstance",
+ "payload": {
+ "id": "192.168.56.101",
+ "ip": "192.168.56.101",
+ "online": true,
+ "uiAttached": true,
+ "switches": 4,
+ "labels": [
+ "192.168.56.101",
+ "192.168.56.101"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_38_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_38_onos.json
new file mode 100644
index 00000000..65cae8d8
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_38_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "updateInstance",
+ "payload": {
+ "id": "onos-master",
+ "ip": "192.168.0.7",
+ "online": false,
+ "uiAttached": false,
+ "switches": 300,
+ "labels": [
+ "onos-master",
+ "192.168.0.7"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_3_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_3_onos.json
new file mode 100644
index 00000000..f7e1f497
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_3_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "onos-leader",
+ "ip": "192.168.0.5",
+ "online": false,
+ "uiAttached": false,
+ "switches": 0,
+ "labels": [
+ "onos-leader",
+ "192.168.0.5"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_4_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_4_onos.json
new file mode 100644
index 00000000..3eeb99a0
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_4_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "onos-master",
+ "ip": "192.168.0.7",
+ "online": false,
+ "uiAttached": false,
+ "switches": 300,
+ "labels": [
+ "onos-master",
+ "192.168.0.7"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_5_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_5_onos.json
new file mode 100644
index 00000000..a41e1d7d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_5_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "onos-slave",
+ "ip": "192.168.0.11",
+ "online": false,
+ "uiAttached": false,
+ "switches": 17,
+ "labels": [
+ "onos-slave",
+ "192.168.0.11"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_6_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_6_onos.json
new file mode 100644
index 00000000..d19a508d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_6_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0008",
+ "type": "switch",
+ "online": true,
+ "master": "onos-2",
+ "labels": [
+ "",
+ "sw-8",
+ "0000ffffffff0008"
+ ],
+ "metaUi": {
+ "x": 734,
+ "y": 477
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_7_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_7_onos.json
new file mode 100644
index 00000000..d382b7c8
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_7_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0003",
+ "type": "switch",
+ "online": true,
+ "master": "192.168.56.101",
+ "labels": [
+ "",
+ "sw-3",
+ "0000ffffffff0003"
+ ],
+ "metaUi": {
+ "x": 282,
+ "y": 503
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_8_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_8_onos.json
new file mode 100644
index 00000000..7967c0e7
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_8_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0007",
+ "type": "switch",
+ "online": true,
+ "master": "onos-master",
+ "labels": [
+ "",
+ "sw-7",
+ "0000ffffffff0007"
+ ],
+ "metaUi": {
+ "x": 530,
+ "y": 330
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_9_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_9_onos.json
new file mode 100644
index 00000000..ff160d62
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/ev_9_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffffff08",
+ "type": "roadm",
+ "online": true,
+ "master": "onos-2",
+ "labels": [
+ "",
+ "opt-8",
+ "0000ffffffffff08"
+ ],
+ "metaUi": {
+ "x": 734,
+ "y": 577
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/colors/scenario.json b/framework/src/onos/web/gui/src/test/_karma/ev/colors/scenario.json
new file mode 100644
index 00000000..dd178283
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/colors/scenario.json
@@ -0,0 +1,13 @@
+{
+ "comments": [
+ "Tweaking Colors"
+ ],
+ "title": "Color-Tweaking Scenario",
+ "params": {
+ "lastAuto": 29
+ },
+ "description": [
+ "Press '=' to load initial events.",
+ "Press '-' to fire further events."
+ ]
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_10_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_10_onos.json
new file mode 100644
index 00000000..4a289d82
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_10_onos.json
@@ -0,0 +1,15 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0003/4-of:0000ffffffffff03/1",
+ "type": "pktopt",
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0003",
+ "srcPort": "4",
+ "dst": "of:0000ffffffffff03",
+ "dstPort": "1",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_11_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_11_onos.json
new file mode 100644
index 00000000..70dc216c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_11_onos.json
@@ -0,0 +1,15 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0003/9-of:0000ffffffff0007/2",
+ "type": "direct",
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0003",
+ "srcPort": "9",
+ "dst": "of:0000ffffffff0007",
+ "dstPort": "2",
+ "props" : {
+ "BW": "120 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_12_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_12_onos.json
new file mode 100644
index 00000000..78e6a394
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_12_onos.json
@@ -0,0 +1,15 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0008/2-of:0000ffffffff0003/1",
+ "type": "direct",
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0008",
+ "srcPort": "2",
+ "dst": "of:0000ffffffff0003",
+ "dstPort": "1",
+ "props" : {
+ "BW": "70 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_13_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_13_onos.json
new file mode 100644
index 00000000..d9d27e70
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_13_onos.json
@@ -0,0 +1,15 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0008/4-of:0000ffffffff0007/1",
+ "type": "direct",
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0008",
+ "srcPort": "4",
+ "dst": "of:0000ffffffff0007",
+ "dstPort": "1",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_14_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_14_onos.json
new file mode 100644
index 00000000..89435bcd
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_14_onos.json
@@ -0,0 +1,15 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffffff08/4-of:0000ffffffffff03/1",
+ "type": "optical",
+ "linkWidth": 2,
+ "src": "of:0000ffffffffff08",
+ "srcPort": "4",
+ "dst": "of:0000ffffffffff03",
+ "dstPort": "1",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_15_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_15_onos.json
new file mode 100644
index 00000000..af031a63
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_15_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addHost",
+ "payload": {
+ "id": "0E:2A:69:30:13:aa/-1",
+ "ingress": "0E:2A:69:30:13:aa/-1/0-of:0000ffffffff0008/101",
+ "egress": "of:0000ffffffff0008/101-0E:2A:69:30:13:aa/-1/0",
+ "cp": {
+ "device": "of:0000ffffffff0008",
+ "port": 101
+ },
+ "labels": [
+ "12.13.14.15",
+ "0E:2A:69:30:13:aa"
+ ],
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_16_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_16_onos.json
new file mode 100644
index 00000000..6efcda93
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_16_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addHost",
+ "payload": {
+ "id": "0E:2A:69:30:13:88/-1",
+ "ingress": "0E:2A:69:30:13:88/-1/0-of:0000ffffffff0007/101",
+ "egress": "of:0000ffffffff0007/101-0E:2A:69:30:13:86/-1/0",
+ "cp": {
+ "device": "of:0000ffffffff0007",
+ "port": 101
+ },
+ "labels": [
+ "4.5.7.6",
+ "0E:2A:69:30:13:88"
+ ],
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_17_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_17_onos.json
new file mode 100644
index 00000000..a5ee5c98
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_17_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addHost",
+ "payload": {
+ "id": "0E:2A:69:30:13:86/-1",
+ "ingress": "0E:2A:69:30:13:86/-1/0-of:0000ffffffff0003/101",
+ "egress": "of:0000ffffffff0003/101-0E:2A:69:30:13:86/-1/0",
+ "cp": {
+ "device": "of:0000ffffffff0003",
+ "port": 101
+ },
+ "labels": [
+ "1.2.3.4",
+ "0E:2A:69:30:13:86"
+ ],
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_18_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_18_onos.json
new file mode 100644
index 00000000..4168e11d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_18_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "updateInstance",
+ "payload": {
+ "id": "onos-3",
+ "ip": "192.168.3.3",
+ "online": true,
+ "uiAttached": false,
+ "switches": 2,
+ "labels": [
+ "onos-3",
+ "192.168.3.3"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_19_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_19_onos.json
new file mode 100644
index 00000000..2e955399
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_19_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "updateInstance",
+ "payload": {
+ "id": "onos-3",
+ "ip": "192.168.3.3",
+ "online": false,
+ "uiAttached": false,
+ "switches": 2,
+ "labels": [
+ "onos-3",
+ "192.168.3.3"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_1_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_1_onos.json
new file mode 100644
index 00000000..287538ef
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_1_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "192.168.56.101",
+ "ip": "192.168.56.101",
+ "online": true,
+ "uiAttached": false,
+ "switches": 2,
+ "labels": [
+ "192.168.56.101",
+ "127.0.0.1"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_2_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_2_onos.json
new file mode 100644
index 00000000..bbf6c649
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_2_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "onos-2",
+ "ip": "192.168.2.2",
+ "online": true,
+ "uiAttached": true,
+ "switches": 1,
+ "labels": [
+ "onos-2",
+ "192.168.2.2"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_3_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_3_onos.json
new file mode 100644
index 00000000..0459e10a
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_3_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "onos-3",
+ "ip": "192.168.3.3",
+ "online": false,
+ "uiAttached": false,
+ "switches": 2,
+ "labels": [
+ "onos-3",
+ "192.168.3.3"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_4_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_4_onos.json
new file mode 100644
index 00000000..f1abeeb5
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_4_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0008",
+ "type": "switch",
+ "online": true,
+ "master": "onos-3",
+ "labels": [
+ "0000ffffffff0008",
+ "FF:FF:FF:FF:00:08",
+ "sw-8"
+ ],
+ "metaUi": {
+ "x": 734,
+ "y": 477
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_5_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_5_onos.json
new file mode 100644
index 00000000..d99b0fe6
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_5_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0003",
+ "type": "switch",
+ "online": true,
+ "master": "192.168.56.101",
+ "labels": [
+ "0000ffffffff0003",
+ "FF:FF:FF:FF:00:03",
+ "sw-3"
+ ],
+ "metaUi": {
+ "x": 282,
+ "y": 503
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_6_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_6_onos.json
new file mode 100644
index 00000000..2f58f613
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_6_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0007",
+ "type": "switch",
+ "online": true,
+ "master": "onos-2",
+ "labels": [
+ "0000ffffffff0007",
+ "FF:FF:FF:FF:00:07",
+ "sw-7"
+ ],
+ "metaUi": {
+ "x": 530,
+ "y": 330
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_7_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_7_onos.json
new file mode 100644
index 00000000..33f29679
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_7_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffffff08",
+ "type": "roadm",
+ "online": true,
+ "master": "onos-3",
+ "labels": [
+ "0000ffffffffff08",
+ "FF:FF:FF:FF:FF:08",
+ "opt-8"
+ ],
+ "metaUi": {
+ "x": 734,
+ "y": 577
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_8_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_8_onos.json
new file mode 100644
index 00000000..d3bb1435
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_8_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffffff03",
+ "type": "roadm",
+ "online": true,
+ "master": "192.168.56.101",
+ "labels": [
+ "0000ffffffffff03",
+ "FF:FF:FF:FF:FF:03",
+ "opt-3"
+ ],
+ "metaUi": {
+ "x": 282,
+ "y": 603
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_9_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_9_onos.json
new file mode 100644
index 00000000..115858ae
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/instances/ev_9_onos.json
@@ -0,0 +1,15 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0008/4-of:0000ffffffffff08/1",
+ "type": "pktopt",
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0008",
+ "srcPort": "4",
+ "dst": "of:0000ffffffffff08",
+ "dstPort": "1",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/instances/scenario.json b/framework/src/onos/web/gui/src/test/_karma/ev/instances/scenario.json
new file mode 100644
index 00000000..503edfc3
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/instances/scenario.json
@@ -0,0 +1,16 @@
+{
+ "comments": [
+ "Developing ONOS instance visualization"
+ ],
+ "title": "ONOS Instance Scenario",
+ "params": {
+ "lastAuto": 17
+ },
+ "description": [
+ "Press 'I' to show instance pane.",
+ "Press 'H' to show hosts.",
+ "",
+ "Press '=' to load initial events.",
+ "Press '-' to fire further events."
+ ]
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_1_ui.json b/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_1_ui.json
new file mode 100644
index 00000000..962fcaa3
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_1_ui.json
@@ -0,0 +1,8 @@
+{
+ "event": "addHostIntent",
+ "sid": 1,
+ "payload": {
+ "one": "hostOne",
+ "two": "hostTwo"
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_2_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_2_onos.json
new file mode 100644
index 00000000..4fdeaa1a
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_2_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "showTraffic",
+ "sid": 1,
+ "payload": {
+ "paths": [
+ {
+ "intentId": "0x1234",
+ "links": [ "1-2", "2-3" ],
+ "class": "primary"
+ },
+ {
+ "intentId": "0x4321",
+ "links": [ "5-6", "6-7" ],
+ "class": "secondary"
+ }
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_3_ui.json b/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_3_ui.json
new file mode 100644
index 00000000..f6a2b173
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_3_ui.json
@@ -0,0 +1,8 @@
+{
+ "event": "requestTraffic",
+ "sid": 2,
+ "payload": {
+ "ids": [ "00:00:00:00:00:01/-1", "00:00:00:00:00:02/-1" ],
+ "hover": ""
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_4_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_4_onos.json
new file mode 100644
index 00000000..f78616a0
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_4_onos.json
@@ -0,0 +1,20 @@
+{
+ "event": "showPath",
+ "sid": 2,
+ "payload": {
+ "paths": [
+ {
+ "intentId": "0x1234",
+ "links": [ "1-2", "2-3" ],
+ "class": "animated",
+ "labels": [ "9Gb", "9Gb" ]
+ },
+ {
+ "intentId": "0x4321",
+ "links": [ "5-6", "6-7" ],
+ "class": "animated",
+ "labels": [ "4GB", "4GB" ]
+ }
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_5_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_5_onos.json
new file mode 100644
index 00000000..2afb7857
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_5_onos.json
@@ -0,0 +1,20 @@
+{
+ "event": "showTraffic",
+ "sid": 2,
+ "payload": {
+ "paths": [
+ {
+ "intentId": "0x1234",
+ "links": [ "1-2", "2-3" ],
+ "class": "animated",
+ "labels": [ "17Gb", "16Gb" ]
+ },
+ {
+ "intentId": "0x4321",
+ "links": [ "5-6", "6-7" ],
+ "class": "animated",
+ "labels": [ "9Gb", "5Gb" ]
+ }
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_6_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_6_onos.json
new file mode 100644
index 00000000..5f554151
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_6_onos.json
@@ -0,0 +1,20 @@
+{
+ "event": "showTraffic",
+ "sid": 2,
+ "payload": {
+ "paths": [
+ {
+ "intentId": "0x1234",
+ "links": [ "1-2", "2-3" ],
+ "class": "primary",
+ "labels": [ "17Gb", "16Gb" ]
+ },
+ {
+ "intentId": "0x4321",
+ "links": [ "5-6", "6-7" ],
+ "class": "secondary",
+ "labels": [ "9Gb", "5Gb" ]
+ }
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_7_ui.json b/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_7_ui.json
new file mode 100644
index 00000000..89da44e1
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_7_ui.json
@@ -0,0 +1,6 @@
+{
+ "event": "cancelTraffic",
+ "sid": 3,
+ "payload": {
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_8_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_8_onos.json
new file mode 100644
index 00000000..8d5a50ee
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/ev_8_onos.json
@@ -0,0 +1,7 @@
+{
+ "event": "showTraffic",
+ "sid": 3,
+ "payload": {
+ "paths": []
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/scenario.json b/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/scenario.json
new file mode 100644
index 00000000..f109ddeb
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/intentSketch/scenario.json
@@ -0,0 +1,13 @@
+{
+ "comments": [
+ "This scenario steps through adding a host intent."
+ ],
+ "title": "Host Intent Scenario",
+ "params": {
+ "lastAuto": 0
+ },
+ "description": [
+ "Currently this is just a sketch of the event sequence,",
+ " but is NOT YET a runnable scenario."
+ ]
+} \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_10_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_10_onos.json
new file mode 100644
index 00000000..5775e43f
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_10_onos.json
@@ -0,0 +1,15 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0008/10-of:0000ffffffff0003/20",
+ "type": "direct",
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0008",
+ "srcPort": "10",
+ "dst": "of:0000ffffffff0003",
+ "dstPort": "20",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_11_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_11_onos.json
new file mode 100644
index 00000000..f0d0b4d3
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_11_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addHost",
+ "payload": {
+ "id": "0E:2A:69:30:13:88/-1",
+ "ingress": "0E:2A:69:30:13:88/-1/0-of:0000ffffffff0003/1",
+ "egress": "of:0000ffffffff0003/1-0E:2A:69:30:13:88/-1/0",
+ "cp": {
+ "device": "of:0000ffffffff0003",
+ "port": 1
+ },
+ "labels": [
+ "Host-A",
+ "0E:2A:69:30:13:88"
+ ],
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_12_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_12_onos.json
new file mode 100644
index 00000000..d9773430
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_12_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addHost",
+ "payload": {
+ "id": "0E:2A:69:30:13:89/-1",
+ "ingress": "0E:2A:69:30:13:89/-1/0-of:0000ffffffff0007/1",
+ "egress": "of:0000ffffffff0007/1-0E:2A:69:30:13:89/-1/0",
+ "cp": {
+ "device": "of:0000ffffffff0007",
+ "port": 1
+ },
+ "labels": [
+ "Host-B",
+ "0E:2A:69:30:13:89"
+ ],
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_13_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_13_onos.json
new file mode 100644
index 00000000..8f643baf
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_13_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addHost",
+ "payload": {
+ "id": "0E:2A:69:30:13:8A/-1",
+ "ingress": "0E:2A:69:30:13:8A/-1/0-of:0000ffffffff0008/1",
+ "egress": "of:0000ffffffff0008/1-0E:2A:69:30:13:8A/-1/0",
+ "cp": {
+ "device": "of:0000ffffffff0008",
+ "port": 1
+ },
+ "labels": [
+ "Host-C",
+ "0E:2A:69:30:13:8A"
+ ],
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_14_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_14_onos.json
new file mode 100644
index 00000000..d7610199
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_14_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "updateLink",
+ "payload": {
+ "id": "of:0000ffffffff0007/10-of:0000ffffffff0008/20",
+ "src": "of:0000ffffffff0007",
+ "srcPort": "10",
+ "dst": "of:0000ffffffff0008",
+ "dstPort": "20",
+
+ "type": "direct",
+ "linkWidth": 2,
+ "online": true,
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_15_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_15_onos.json
new file mode 100644
index 00000000..dbdfb3a0
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_15_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "updateLink",
+ "payload": {
+ "id": "of:0000ffffffff0007/20-of:0000ffffffff0003/10",
+ "src": "of:0000ffffffff0007",
+ "srcPort": "20",
+ "dst": "of:0000ffffffff0003",
+ "dstPort": "10",
+
+ "type": "direct",
+ "linkWidth": 6,
+ "online": true,
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_16_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_16_onos.json
new file mode 100644
index 00000000..b7783c12
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_16_onos.json
@@ -0,0 +1,15 @@
+{
+ "event": "removeLink",
+ "payload": {
+ "id": "of:0000ffffffff0007/20-of:0000ffffffff0003/10",
+ "type": "direct",
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0007",
+ "srcPort": "20",
+ "dst": "of:0000ffffffff0003",
+ "dstPort": "10",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_17_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_17_onos.json
new file mode 100644
index 00000000..daf926e7
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_17_onos.json
@@ -0,0 +1,15 @@
+{
+ "event": "removeLink",
+ "payload": {
+ "id": "of:0000ffffffff0003/10-of:0000ffffffff0007/20",
+ "type": "direct",
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0003",
+ "srcPort": "10",
+ "dst": "of:0000ffffffff0007",
+ "dstPort": "20",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_18_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_18_onos.json
new file mode 100644
index 00000000..aa403613
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_18_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0003/10-of:0000ffffffff0007/20",
+ "type": "direct",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0003",
+ "srcPort": "10",
+ "dst": "of:0000ffffffff0007",
+ "dstPort": "20",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_19_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_19_onos.json
new file mode 100644
index 00000000..58772f7b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_19_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0007/20-of:0000ffffffff0003/10",
+ "type": "direct",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0007",
+ "srcPort": "20",
+ "dst": "of:0000ffffffff0003",
+ "dstPort": "10",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_1_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_1_onos.json
new file mode 100644
index 00000000..46803a23
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_1_onos.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "local",
+ "ip": "127.0.0.1",
+ "online": true,
+ "uiAttached": true,
+ "switches": 43,
+ "labels": [
+ "local",
+ "127.0.0.1"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_20_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_20_onos.json
new file mode 100644
index 00000000..19b5cd3c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_20_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "updateLink",
+ "payload": {
+ "id": "of:0000ffffffff0003/20-of:0000ffffffff0008/10",
+ "type": "direct",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0003",
+ "srcPort": "20",
+ "dst": "of:0000ffffffff0008",
+ "dstPort": "10",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_21_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_21_onos.json
new file mode 100644
index 00000000..342272c4
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_21_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "updateLink",
+ "payload": {
+ "id": "of:0000ffffffff0008/10-of:0000ffffffff0003/20",
+ "type": "direct",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0008",
+ "srcPort": "10",
+ "dst": "of:0000ffffffff0003",
+ "dstPort": "20",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_22_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_22_onos.json
new file mode 100644
index 00000000..b0b51b1f
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_22_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addHost",
+ "payload": {
+ "id": "0E:2A:69:30:BB:BB/-1",
+ "type": "bgpSpeaker",
+ "ingress": "0E:2A:69:30:BB:BB/-1/0-of:0000ffffffff0007/2",
+ "egress": "of:0000ffffffff0007/2-0E:2A:69:30:BB:BB/-1/0",
+ "cp": {
+ "device": "of:0000ffffffff0007",
+ "port": 2
+ },
+ "labels": [
+ "BGP",
+ "0E:2A:69:30:BB:BB"
+ ],
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_23_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_23_onos.json
new file mode 100644
index 00000000..1fd53cd8
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_23_onos.json
@@ -0,0 +1,22 @@
+{
+ "event": "showTraffic",
+ "sid":62,
+ "payload": {
+ "paths": [
+ {
+ "class": "primary",
+ "traffic": false,
+ "links": [
+ "0E:2A:69:30:13:8A/-1/0-of:0000ffffffff0008/1",
+ "of:0000ffffffff0008/20-of:0000ffffffff0007/10",
+ "of:0000ffffffff0007/1-0E:2A:69:30:13:89/-1/0"
+ ],
+ "labels": [
+ "123 bytes",
+ "10 bytes",
+ "0 bytes"
+ ]
+ }
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_24_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_24_onos.json
new file mode 100644
index 00000000..b797752d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_24_onos.json
@@ -0,0 +1,22 @@
+{
+ "event": "showTraffic",
+ "sid":63,
+ "payload": {
+ "paths": [
+ {
+ "class": "primary animated",
+ "traffic": true,
+ "links": [
+ "0E:2A:69:30:13:8A/-1/0-of:0000ffffffff0008/1",
+ "of:0000ffffffff0008/20-of:0000ffffffff0007/10",
+ "of:0000ffffffff0007/1-0E:2A:69:30:13:89/-1/0"
+ ],
+ "labels": [
+ "99997 bytes",
+ "200 bytes",
+ "3.1415926 bytes"
+ ]
+ }
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_25_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_25_onos.json
new file mode 100644
index 00000000..59c12fa7
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_25_onos.json
@@ -0,0 +1,7 @@
+{
+ "event": "showTraffic",
+ "sid": 64,
+ "payload": {
+ "paths": []
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_2_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_2_onos.json
new file mode 100644
index 00000000..46e56f60
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_2_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0003",
+ "type": "switch",
+ "online": true,
+ "master": "local",
+ "labels": [
+ "",
+ "sw-3",
+ "0000ffffffff0003"
+ ],
+ "metaUi": {
+ "x": 282,
+ "y": 503
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_3_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_3_onos.json
new file mode 100644
index 00000000..c32cd285
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_3_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0007",
+ "type": "switch",
+ "online": true,
+ "master": "local",
+ "labels": [
+ "",
+ "sw-7",
+ "0000ffffffff0007"
+ ],
+ "metaUi": {
+ "x": 530,
+ "y": 330
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_4_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_4_onos.json
new file mode 100644
index 00000000..375fcccf
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_4_onos.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0008",
+ "type": "switch",
+ "online": true,
+ "master": "local",
+ "labels": [
+ "",
+ "sw-8",
+ "0000ffffffff0008"
+ ],
+ "metaUi": {
+ "x": 734,
+ "y": 477
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_5_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_5_onos.json
new file mode 100644
index 00000000..771c332a
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_5_onos.json
@@ -0,0 +1,15 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0007/10-of:0000ffffffff0008/20",
+ "type": "direct",
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0007",
+ "srcPort": "10",
+ "dst": "of:0000ffffffff0008",
+ "dstPort": "20",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_6_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_6_onos.json
new file mode 100644
index 00000000..6eea869a
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_6_onos.json
@@ -0,0 +1,15 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0008/20-of:0000ffffffff0007/10",
+ "type": "direct",
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0008",
+ "srcPort": "20",
+ "dst": "of:0000ffffffff0007",
+ "dstPort": "10",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_7_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_7_onos.json
new file mode 100644
index 00000000..cff94a50
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_7_onos.json
@@ -0,0 +1,15 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0003/10-of:0000ffffffff0007/20",
+ "type": "direct",
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0003",
+ "srcPort": "10",
+ "dst": "of:0000ffffffff0007",
+ "dstPort": "20",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_8_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_8_onos.json
new file mode 100644
index 00000000..0a5a3142
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_8_onos.json
@@ -0,0 +1,15 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0007/20-of:0000ffffffff0003/10",
+ "type": "direct",
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0007",
+ "srcPort": "20",
+ "dst": "of:0000ffffffff0003",
+ "dstPort": "10",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_9_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_9_onos.json
new file mode 100644
index 00000000..0b6b67b1
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/ev_9_onos.json
@@ -0,0 +1,15 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0003/20-of:0000ffffffff0008/10",
+ "type": "direct",
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0003",
+ "srcPort": "20",
+ "dst": "of:0000ffffffff0008",
+ "dstPort": "10",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/links/scenario.json b/framework/src/onos/web/gui/src/test/_karma/ev/links/scenario.json
new file mode 100644
index 00000000..2cef0aa7
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/links/scenario.json
@@ -0,0 +1,15 @@
+{
+ "comments": [
+ "Stepping through link events"
+ ],
+ "title": "Process Link Events Scenario",
+ "params": {
+ "lastAuto": 13
+ },
+ "description": [
+ "Press 'H' to show hosts.",
+ "",
+ "Press '=' to load initial events.",
+ "Press '-' to fire further events."
+ ]
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_10_addInstance_F.json b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_10_addInstance_F.json
new file mode 100644
index 00000000..ce5a2e95
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_10_addInstance_F.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "instF",
+ "ip": "123.6.6.6",
+ "online": true,
+ "uiAttached": false,
+ "switches": 6,
+ "labels": [
+ "instF",
+ "123.6.6.6"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_11_addInstance_G.json b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_11_addInstance_G.json
new file mode 100644
index 00000000..c2a70afa
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_11_addInstance_G.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "instG",
+ "ip": "123.7.7.7",
+ "online": true,
+ "uiAttached": false,
+ "switches": 7,
+ "labels": [
+ "instG",
+ "123.7.7.7"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_1_showSummary.json b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_1_showSummary.json
new file mode 100644
index 00000000..a08504e1
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_1_showSummary.json
@@ -0,0 +1,28 @@
+{
+ "event": "showSummary",
+ "sid": 1,
+ "payload": {
+ "id": "ONOS Summary",
+ "type": "node",
+ "propOrder": [
+ "Devices",
+ "Links",
+ "Hosts",
+ "Topology SCCs",
+ "-",
+ "Intents",
+ "Flows",
+ "Version"
+ ],
+ "props": {
+ "Devices": "25",
+ "Links": "112",
+ "Hosts": "0",
+ "Topology SCCs": "1",
+ "-": "",
+ "Intents": "0",
+ "Flows": "125",
+ "Version": "1.0.0*"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_2_addInstance.json b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_2_addInstance.json
new file mode 100644
index 00000000..0579c1d5
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_2_addInstance.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "local",
+ "ip": "127.0.0.1",
+ "online": true,
+ "uiAttached": true,
+ "switches": 25,
+ "labels": [
+ "local",
+ "127.0.0.1"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_3_addInstance_B.json b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_3_addInstance_B.json
new file mode 100644
index 00000000..4313116d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_3_addInstance_B.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "instB",
+ "ip": "123.22.33.241",
+ "online": true,
+ "uiAttached": false,
+ "switches": 14,
+ "labels": [
+ "instB",
+ "123.22.33.241"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_4_addInstance_C.json b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_4_addInstance_C.json
new file mode 100644
index 00000000..b3376c0d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_4_addInstance_C.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "instC",
+ "ip": "123.22.33.124",
+ "online": true,
+ "uiAttached": false,
+ "switches": 7,
+ "labels": [
+ "instC",
+ "123.22.33.124"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_5_updateInstance_B.json b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_5_updateInstance_B.json
new file mode 100644
index 00000000..f3cc9c92
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_5_updateInstance_B.json
@@ -0,0 +1,14 @@
+{
+ "event": "updateInstance",
+ "payload": {
+ "id": "instB",
+ "ip": "123.22.33.241",
+ "online": false,
+ "uiAttached": false,
+ "switches": 14,
+ "labels": [
+ "instB",
+ "123.22.33.241"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_6_removeInstance_B.json b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_6_removeInstance_B.json
new file mode 100644
index 00000000..0ade799d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_6_removeInstance_B.json
@@ -0,0 +1,14 @@
+{
+ "event": "removeInstance",
+ "payload": {
+ "id": "instB",
+ "ip": "123.22.33.241",
+ "online": false,
+ "uiAttached": false,
+ "switches": 14,
+ "labels": [
+ "instB",
+ "123.22.33.241"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_7_addInstance_D.json b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_7_addInstance_D.json
new file mode 100644
index 00000000..3ba5fca6
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_7_addInstance_D.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "instD",
+ "ip": "123.33.44.55",
+ "online": true,
+ "uiAttached": false,
+ "switches": 133,
+ "labels": [
+ "instD",
+ "123.33.44.55"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_8_addInstance_B.json b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_8_addInstance_B.json
new file mode 100644
index 00000000..4313116d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_8_addInstance_B.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "instB",
+ "ip": "123.22.33.241",
+ "online": true,
+ "uiAttached": false,
+ "switches": 14,
+ "labels": [
+ "instB",
+ "123.22.33.241"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_9_addInstance_E.json b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_9_addInstance_E.json
new file mode 100644
index 00000000..18000937
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/ev_9_addInstance_E.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "instE",
+ "ip": "123.5.5.5",
+ "online": true,
+ "uiAttached": false,
+ "switches": 5,
+ "labels": [
+ "instE",
+ "123.5.5.5"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/migrate/scenario.json b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/scenario.json
new file mode 100644
index 00000000..5ba25204
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/migrate/scenario.json
@@ -0,0 +1,12 @@
+{
+ "comments": [
+ "Used during the migration of old GUI (topo.js==3.1KLOC) to Angular"
+ ],
+ "title": "Migration Helper",
+ "params": {
+ "lastAuto": 0
+ },
+ "description": [
+ "Do what you need to..."
+ ]
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_1_addInstanceA.json b/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_1_addInstanceA.json
new file mode 100644
index 00000000..ea1fa0ff
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_1_addInstanceA.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "myInstA",
+ "ip": "192.168.56.101",
+ "online": true,
+ "uiAttached": true,
+ "switches": 2,
+ "labels": [
+ "myInstA",
+ "192.168.56.101"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_2_addInstanceB.json b/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_2_addInstanceB.json
new file mode 100644
index 00000000..5b09dec7
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_2_addInstanceB.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "myInstB",
+ "ip": "192.168.56.102",
+ "online": true,
+ "uiAttached": false,
+ "switches": 4,
+ "labels": [
+ "myInstB",
+ "192.168.56.102"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_3_addDevice_08.json b/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_3_addDevice_08.json
new file mode 100644
index 00000000..029dec10
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_3_addDevice_08.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0008",
+ "type": "switch",
+ "online": true,
+ "master": "myInstA",
+ "labels": [
+ "",
+ "switch-8",
+ "0000ffffffff0008"
+ ],
+ "metaUi": {
+ "x": 520,
+ "y": 350
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_4_addDevice_03.json b/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_4_addDevice_03.json
new file mode 100644
index 00000000..39aa5cfd
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_4_addDevice_03.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0003",
+ "type": "switch",
+ "online": true,
+ "master": "myInstB",
+ "labels": [
+ "",
+ "switch-3",
+ "0000ffffffff0003"
+ ],
+ "metaUi": {
+ "x": 800,
+ "y": 280
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_5_addLink_03_08.json b/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_5_addLink_03_08.json
new file mode 100644
index 00000000..755255a2
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_5_addLink_03_08.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0003/21-of:0000ffffffff0008/20",
+ "type": "direct",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0003",
+ "srcPort": "21",
+ "dst": "of:0000ffffffff0008",
+ "dstPort": "20",
+ "props" : {
+ "BW": "70 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_6_addHost_03.json b/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_6_addHost_03.json
new file mode 100644
index 00000000..c357942e
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_6_addHost_03.json
@@ -0,0 +1,20 @@
+{
+ "event": "addHost",
+ "payload": {
+ "id": "0E:2A:69:30:13:86/-1",
+ "ingress": "0E:2A:69:30:13:86/-1/0-of:0000ffffffff0003/2",
+ "egress": "of:0000ffffffff0003/2-0E:2A:69:30:13:86/-1/0",
+ "cp": [
+ { "device": "of:0000ffffffff0003", "port": 2 },
+ { "device": "of:0000ffffffff0008", "port": 4 }
+ ],
+ "labels": [
+ "192.168.1.201",
+ "0E:2A:69:30:13:86"
+ ],
+ "props": {
+ "routerId": "router-one"
+ },
+ "type": "router"
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_7_addHost_08.json b/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_7_addHost_08.json
new file mode 100644
index 00000000..43f6b2ba
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/ev_7_addHost_08.json
@@ -0,0 +1,19 @@
+{
+ "event": "addHost",
+ "payload": {
+ "id": "A6:96:E5:03:52:5F/-1",
+ "ingress": "A6:96:E5:03:52:5F/-1/0-of:0000ffffffff0008/1",
+ "egress": "of:0000ffffffff0008/1-A6:96:E5:03:52:5F/-1/0",
+ "cp": [
+ { "device": "of:0000ffffffff0008", "port": 1 }
+ ],
+ "labels": [
+ "192.168.1.202",
+ "A6:96:E5:03:52:5F"
+ ],
+ "props": {
+ "routerId": "router-one"
+ },
+ "type": "router"
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/scenario.json b/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/scenario.json
new file mode 100644
index 00000000..a720ab86
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/multiHomed/scenario.json
@@ -0,0 +1,21 @@
+{
+ "comments": [
+ "Add two devices and one link (auto), and two 'hosts'.",
+ "But the hosts are the same box with two NICs."
+ ],
+ "title": "Multi-Homed Scenario",
+ "params": {
+ "lastAuto": 0
+ },
+ "description": [
+ "Simple sequence of events...",
+ "",
+ "1. add instance A",
+ "2. add instance B",
+ "3. add device [8]",
+ "4. add device [3]",
+ "5. add link [3] --> [8]",
+ "6. add host (to [3])",
+ "7. add host (to [8])"
+ ]
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_10_addLink_2-2b.json b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_10_addLink_2-2b.json
new file mode 100644
index 00000000..10f868fa
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_10_addLink_2-2b.json
@@ -0,0 +1,13 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "2-2b",
+ "type": "direct",
+ "online": true,
+ "linkWidth": 2,
+ "src": "sw2",
+ "srcPort": "20",
+ "dst": "sw2b",
+ "dstPort": "10"
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_11_addLink_3-3b.json b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_11_addLink_3-3b.json
new file mode 100644
index 00000000..deaf0a14
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_11_addLink_3-3b.json
@@ -0,0 +1,13 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "3-3b",
+ "type": "direct",
+ "online": true,
+ "linkWidth": 2,
+ "src": "sw3",
+ "srcPort": "20",
+ "dst": "sw3b",
+ "dstPort": "10"
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_12_addLink_4-4b.json b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_12_addLink_4-4b.json
new file mode 100644
index 00000000..ff47e5cd
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_12_addLink_4-4b.json
@@ -0,0 +1,13 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "4-4b",
+ "type": "direct",
+ "online": true,
+ "linkWidth": 2,
+ "src": "sw4",
+ "srcPort": "20",
+ "dst": "sw4b",
+ "dstPort": "10"
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_1_addDevice_sw1b.json b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_1_addDevice_sw1b.json
new file mode 100644
index 00000000..780f0aaf
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_1_addDevice_sw1b.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "sw1b",
+ "type": "roadm",
+ "online": true,
+ "labels": [
+ "",
+ "sw-1b",
+ "00001b"
+ ],
+ "metaUi": {
+ "x": 200,
+ "y": 200
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_2_addDevice_sw2b.json b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_2_addDevice_sw2b.json
new file mode 100644
index 00000000..e0dba2b3
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_2_addDevice_sw2b.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "sw2b",
+ "type": "roadm",
+ "online": true,
+ "labels": [
+ "",
+ "sw-2b",
+ "00002b"
+ ],
+ "metaUi": {
+ "x": 800,
+ "y": 200
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_3_addDevice_sw3b.json b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_3_addDevice_sw3b.json
new file mode 100644
index 00000000..38d066a7
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_3_addDevice_sw3b.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "sw3b",
+ "type": "roadm",
+ "online": true,
+ "labels": [
+ "",
+ "sw-3b",
+ "00003b"
+ ],
+ "metaUi": {
+ "x": 200,
+ "y": 600
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_4_addDevice_sw4b.json b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_4_addDevice_sw4b.json
new file mode 100644
index 00000000..bece53db
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_4_addDevice_sw4b.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "sw4b",
+ "type": "roadm",
+ "online": true,
+ "labels": [
+ "",
+ "sw-4b",
+ "00004b"
+ ],
+ "metaUi": {
+ "x": 800,
+ "y": 600
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_5_addDevice_sw1.json b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_5_addDevice_sw1.json
new file mode 100644
index 00000000..a05f3f91
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_5_addDevice_sw1.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "sw1",
+ "type": "switch",
+ "online": true,
+ "labels": [
+ "",
+ "sw-1",
+ "00001"
+ ],
+ "metaUi": {
+ "x": 200,
+ "y": 200
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_6_addDevice_sw2.json b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_6_addDevice_sw2.json
new file mode 100644
index 00000000..27e3b14f
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_6_addDevice_sw2.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "sw2",
+ "type": "switch",
+ "online": true,
+ "labels": [
+ "",
+ "sw-2",
+ "00002"
+ ],
+ "metaUi": {
+ "x": 800,
+ "y": 200
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_7_addDevice_sw3.json b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_7_addDevice_sw3.json
new file mode 100644
index 00000000..992b964d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_7_addDevice_sw3.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "sw3",
+ "type": "switch",
+ "online": true,
+ "labels": [
+ "",
+ "sw-3",
+ "00003"
+ ],
+ "metaUi": {
+ "x": 200,
+ "y": 600
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_8_addDevice_sw4.json b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_8_addDevice_sw4.json
new file mode 100644
index 00000000..2c33d501
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_8_addDevice_sw4.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "sw4",
+ "type": "switch",
+ "online": true,
+ "labels": [
+ "",
+ "sw-4",
+ "00004"
+ ],
+ "metaUi": {
+ "x": 800,
+ "y": 600
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_9_addLink_1-1b.json b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_9_addLink_1-1b.json
new file mode 100644
index 00000000..57e97069
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/ev_9_addLink_1-1b.json
@@ -0,0 +1,13 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "1-1b",
+ "type": "direct",
+ "online": true,
+ "linkWidth": 2,
+ "src": "sw1",
+ "srcPort": "20",
+ "dst": "sw1b",
+ "dstPort": "10"
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/oblique/scenario.json b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/scenario.json
new file mode 100644
index 00000000..ff55c183
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/oblique/scenario.json
@@ -0,0 +1,9 @@
+{
+ "title": "Oblique Test Scenario",
+ "params": {
+ "lastAuto": 8
+ },
+ "description": [
+ "Test Scenario for Oblique view"
+ ]
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_10_updateHost_03.json b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_10_updateHost_03.json
new file mode 100644
index 00000000..3a3ea9e8
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_10_updateHost_03.json
@@ -0,0 +1,17 @@
+{
+ "event": "updateHost",
+ "payload": {
+ "id": "0E:2A:69:30:13:86/-1",
+ "ingress": "0E:2A:69:30:13:86/-1/0-of:0000ffffffff0003/2",
+ "egress": "of:0000ffffffff0003/2-0E:2A:69:30:13:86/-1/0",
+ "cp": {
+ "device": "of:0000ffffffff0003",
+ "port": 2
+ },
+ "labels": [
+ "10.0.0.13",
+ "0E:2A:69:30:13:86"
+ ],
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_11_updateHost_08.json b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_11_updateHost_08.json
new file mode 100644
index 00000000..0fb56fae
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_11_updateHost_08.json
@@ -0,0 +1,17 @@
+{
+ "event": "updateHost",
+ "payload": {
+ "id": "A6:96:E5:03:52:5F/-1",
+ "ingress": "A6:96:E5:03:52:5F/-1/0-of:0000ffffffff0008/1",
+ "egress": "of:0000ffffffff0008/1-A6:96:E5:03:52:5F/-1/0",
+ "cp": {
+ "device": "of:0000ffffffff0008",
+ "port": 1
+ },
+ "labels": [
+ "10.0.0.17",
+ "A6:96:E5:03:52:5F"
+ ],
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_12_updateLink.json b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_12_updateLink.json
new file mode 100644
index 00000000..f09cc9bc
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_12_updateLink.json
@@ -0,0 +1,15 @@
+{
+ "event": "updateLink",
+ "payload": {
+ "id": "of:0000ffffffff0003/21-of:0000ffffffff0008/20",
+ "type": "direct",
+ "linkWidth": 6,
+ "src": "of:0000ffffffff0003",
+ "srcPort": "21",
+ "dst": "of:0000ffffffff0008",
+ "dstPort": "20",
+ "props" : {
+ "BW": "512 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_13_updateLink.json b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_13_updateLink.json
new file mode 100644
index 00000000..447ded37
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_13_updateLink.json
@@ -0,0 +1,15 @@
+{
+ "event": "updateLink",
+ "payload": {
+ "id": "of:0000ffffffff0003/21-of:0000ffffffff0008/20",
+ "type": "direct",
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0003",
+ "srcPort": "21",
+ "dst": "of:0000ffffffff0008",
+ "dstPort": "20",
+ "props" : {
+ "BW": "80 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_14_removeLink.json b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_14_removeLink.json
new file mode 100644
index 00000000..96018f33
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_14_removeLink.json
@@ -0,0 +1,15 @@
+{
+ "event": "removeLink",
+ "payload": {
+ "id": "of:0000ffffffff0003/21-of:0000ffffffff0008/20",
+ "type": "direct",
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0003",
+ "srcPort": "21",
+ "dst": "of:0000ffffffff0008",
+ "dstPort": "20",
+ "props" : {
+ "BW": "80 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_15_removeHost_08.json b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_15_removeHost_08.json
new file mode 100644
index 00000000..5320841f
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_15_removeHost_08.json
@@ -0,0 +1,17 @@
+{
+ "event": "removeHost",
+ "payload": {
+ "id": "A6:96:E5:03:52:5F/-1",
+ "ingress": "A6:96:E5:03:52:5F/-1/0-of:0000ffffffff0008/1",
+ "egress": "of:0000ffffffff0008/1-A6:96:E5:03:52:5F/-1/0",
+ "cp": {
+ "device": "of:0000ffffffff0008",
+ "port": 1
+ },
+ "labels": [
+ "10.0.0.17",
+ "A6:96:E5:03:52:5F"
+ ],
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_16_removeDevice_03.json b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_16_removeDevice_03.json
new file mode 100644
index 00000000..9df9d613
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_16_removeDevice_03.json
@@ -0,0 +1,22 @@
+{
+ "event": "removeDevice",
+ "payload": {
+ "id": "of:0000ffffffff0003",
+ "type": "switch",
+ "online": false,
+ "location": {
+ "type": "latlng",
+ "lat": 40.7127,
+ "lng": -74.0059
+ },
+ "labels": [
+ "",
+ "sw-3",
+ "0000ffffffff0003"
+ ],
+ "metaUi": {
+ "x": 800,
+ "y": 280
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_17_removeDevice_08.json b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_17_removeDevice_08.json
new file mode 100644
index 00000000..15e711d0
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_17_removeDevice_08.json
@@ -0,0 +1,23 @@
+{
+ "event": "removeDevice",
+ "payload": {
+ "id": "of:0000ffffffff0008",
+ "type": "switch",
+ "online": false,
+ "master": "myInstA",
+ "location": {
+ "type": "latlng",
+ "lat": 37.7833,
+ "lng": -122.4167
+ },
+ "labels": [
+ "",
+ "sw-8",
+ "0000ffffffff0008"
+ ],
+ "metaUi": {
+ "x": 520,
+ "y": 350
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_1_addInstanceA.json b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_1_addInstanceA.json
new file mode 100644
index 00000000..ea1fa0ff
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_1_addInstanceA.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "myInstA",
+ "ip": "192.168.56.101",
+ "online": true,
+ "uiAttached": true,
+ "switches": 2,
+ "labels": [
+ "myInstA",
+ "192.168.56.101"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_2_addInstanceB.json b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_2_addInstanceB.json
new file mode 100644
index 00000000..5b09dec7
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_2_addInstanceB.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "myInstB",
+ "ip": "192.168.56.102",
+ "online": true,
+ "uiAttached": false,
+ "switches": 4,
+ "labels": [
+ "myInstB",
+ "192.168.56.102"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_3_addDevice_08.json b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_3_addDevice_08.json
new file mode 100644
index 00000000..9c16f2b4
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_3_addDevice_08.json
@@ -0,0 +1,23 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0008",
+ "type": "switch",
+ "online": false,
+ "master": "myInstA",
+ "location": {
+ "type": "latlng",
+ "lat": 37.7833,
+ "lng": -122.4167
+ },
+ "labels": [
+ "",
+ "sw-8",
+ "0000ffffffff0008"
+ ],
+ "metaUi": {
+ "x": 520,
+ "y": 350
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_4_addDevice_03.json b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_4_addDevice_03.json
new file mode 100644
index 00000000..0b8f0447
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_4_addDevice_03.json
@@ -0,0 +1,23 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0003",
+ "type": "switch",
+ "online": false,
+ "master": "myInstB",
+ "location": {
+ "type": "latlng",
+ "lat": 40.7127,
+ "lng": -74.0059
+ },
+ "labels": [
+ "",
+ "sw-3",
+ "0000ffffffff0003"
+ ],
+ "metaUi": {
+ "x": 800,
+ "y": 280
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_5_updateDevice_08_online.json b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_5_updateDevice_08_online.json
new file mode 100644
index 00000000..3b422833
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_5_updateDevice_08_online.json
@@ -0,0 +1,18 @@
+{
+ "event": "updateDevice",
+ "payload": {
+ "id": "of:0000ffffffff0008",
+ "type": "switch",
+ "online": true,
+ "master": "myInstA",
+ "labels": [
+ "",
+ "switch-8",
+ "0000ffffffff0008"
+ ],
+ "metaUi": {
+ "x": 520,
+ "y": 350
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_6_updateDevice_03_online.json b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_6_updateDevice_03_online.json
new file mode 100644
index 00000000..d05aea66
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_6_updateDevice_03_online.json
@@ -0,0 +1,18 @@
+{
+ "event": "updateDevice",
+ "payload": {
+ "id": "of:0000ffffffff0003",
+ "type": "switch",
+ "online": true,
+ "master": "myInstB",
+ "labels": [
+ "",
+ "switch-3",
+ "0000ffffffff0003"
+ ],
+ "metaUi": {
+ "x": 800,
+ "y": 280
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_7_addLink_03_08.json b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_7_addLink_03_08.json
new file mode 100644
index 00000000..755255a2
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_7_addLink_03_08.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0003/21-of:0000ffffffff0008/20",
+ "type": "direct",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0003",
+ "srcPort": "21",
+ "dst": "of:0000ffffffff0008",
+ "dstPort": "20",
+ "props" : {
+ "BW": "70 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_8_addHost_03.json b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_8_addHost_03.json
new file mode 100644
index 00000000..fba7015a
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_8_addHost_03.json
@@ -0,0 +1,21 @@
+{
+ "event": "addHost",
+ "payload": {
+ "id": "0E:2A:69:30:13:86/-1",
+ "ingress": "0E:2A:69:30:13:86/-1/0-of:0000ffffffff0003/2",
+ "egress": "of:0000ffffffff0003/2-0E:2A:69:30:13:86/-1/0",
+ "cp": {
+ "device": "of:0000ffffffff0003",
+ "port": 2
+ },
+ "labels": [
+ "unknown",
+ "0E:2A:69:30:13:86"
+ ],
+ "metaUi": {
+ "Xx": 800,
+ "Xy": 180
+ },
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_9_addHost_08.json b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_9_addHost_08.json
new file mode 100644
index 00000000..eff767dd
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/simple/ev_9_addHost_08.json
@@ -0,0 +1,21 @@
+{
+ "event": "addHost",
+ "payload": {
+ "id": "A6:96:E5:03:52:5F/-1",
+ "ingress": "A6:96:E5:03:52:5F/-1/0-of:0000ffffffff0008/1",
+ "egress": "of:0000ffffffff0008/1-A6:96:E5:03:52:5F/-1/0",
+ "cp": {
+ "device": "of:0000ffffffff0008",
+ "port": 1
+ },
+ "labels": [
+ "unknown",
+ "A6:96:E5:03:52:5F"
+ ],
+ "metaUi": {
+ "Xx": 520,
+ "Xy": 250
+ },
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/simple/scenario.json b/framework/src/onos/web/gui/src/test/_karma/ev/simple/scenario.json
new file mode 100644
index 00000000..38daa5c7
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/simple/scenario.json
@@ -0,0 +1,30 @@
+{
+ "comments": [
+ "Add two devices and one link (auto), and two hosts.",
+ "Then update the two hosts (with IP address labels)."
+ ],
+ "title": "Simple Startup Scenario",
+ "params": {
+ "lastAuto": 0
+ },
+ "description": [
+ "Simple sequence of events...",
+ "",
+ "1. add instance A",
+ "2. add instance B",
+ "3. add device [8] (offline)",
+ "4. add device [3] (offline)",
+ "5. update device [8] (online, label3 change)",
+ "6. update device [3] (online, label3 change)",
+ "7. add link [3] --> [8]",
+ "8. add host (to [3])",
+ "9. add host (to [8])",
+ "10. update host[3] (IP now 10.0.0.13)",
+ "11. update host[8] (IP now 10.0.0.17)",
+ "12. update link (increase width, update props)",
+ "13. update link (reduce width, update props)",
+ "14. remove link",
+ "15. remove host (10.0.0.17)",
+ "16. remove device [3]"
+ ]
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_10_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_10_onos.json
new file mode 100644
index 00000000..e07a3c71
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_10_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffffff04",
+ "type": "roadm",
+ "online": true,
+ "labels": [
+ "",
+ "opt-4",
+ "0000ffffffffff04"
+ ],
+ "metaUi": {
+ "x": 322,
+ "y": 138
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_11_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_11_onos.json
new file mode 100644
index 00000000..71efaf39
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_11_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff000A",
+ "type": "switch",
+ "online": true,
+ "labels": [
+ "",
+ "sw-A",
+ "0000ffffffff000A"
+ ],
+ "metaUi": {
+ "x": 832,
+ "y": 223
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_12_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_12_onos.json
new file mode 100644
index 00000000..7d9fe610
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_12_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0001",
+ "type": "switch",
+ "online": true,
+ "labels": [
+ "",
+ "sw-1",
+ "0000ffffffff0001"
+ ],
+ "metaUi": {
+ "x": 167,
+ "y": 403
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_13_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_13_onos.json
new file mode 100644
index 00000000..12937b42
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_13_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffffff01",
+ "type": "roadm",
+ "online": true,
+ "labels": [
+ "",
+ "opt-1",
+ "0000ffffffffff01"
+ ],
+ "metaUi": {
+ "x": 227,
+ "y": 460
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_14_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_14_onos.json
new file mode 100644
index 00000000..c4f9790c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_14_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0004",
+ "type": "switch",
+ "online": true,
+ "labels": [
+ "",
+ "sw-4",
+ "0000ffffffff0004"
+ ],
+ "metaUi": {
+ "x": 317,
+ "y": 73
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_15_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_15_onos.json
new file mode 100644
index 00000000..6a51e771
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_15_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffffff0A",
+ "type": "roadm",
+ "online": true,
+ "labels": [
+ "",
+ "opt-A",
+ "0000ffffffffff0A"
+ ],
+ "metaUi": {
+ "x": 840,
+ "y": 290
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_16_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_16_onos.json
new file mode 100644
index 00000000..ba243ba5
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_16_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffffff09",
+ "type": "roadm",
+ "online": true,
+ "labels": [
+ "",
+ "opt-9",
+ "0000ffffffffff09"
+ ],
+ "metaUi": {
+ "x": 1010,
+ "y": 229
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_17_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_17_onos.json
new file mode 100644
index 00000000..1a7e24bc
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_17_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffffff02/20-of:0000ffffffffff05/10",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 4,
+ "src": "of:0000ffffffffff02",
+ "srcPort": "20",
+ "dst": "of:0000ffffffffff05",
+ "dstPort": "10",
+ "props" : {
+ "BW": "80 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_18_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_18_onos.json
new file mode 100644
index 00000000..5f9f7d7c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_18_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff000A/2-of:0000ffffffffff0A/1",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffff000A",
+ "srcPort": "2",
+ "dst": "of:0000ffffffffff0A",
+ "dstPort": "1",
+ "props" : {
+ "BW": "100 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_19_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_19_onos.json
new file mode 100644
index 00000000..5c928ee1
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_19_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffffff03/10-of:0000ffffffffff02/10",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffffff03",
+ "srcPort": "10",
+ "dst": "of:0000ffffffffff02",
+ "dstPort": "10",
+ "props" : {
+ "BW": "70 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_1_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_1_onos.json
new file mode 100644
index 00000000..bd07ae66
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_1_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffffff08",
+ "type": "roadm",
+ "online": true,
+ "labels": [
+ "",
+ "opt-B",
+ "0000ffffffffff08"
+ ],
+ "metaUi": {
+ "x": 539,
+ "y": 186
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_20_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_20_onos.json
new file mode 100644
index 00000000..44705d57
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_20_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffffff07/21-of:0000ffffffffff05/20",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffffff07",
+ "srcPort": "21",
+ "dst": "of:0000ffffffffff05",
+ "dstPort": "20",
+ "props" : {
+ "BW": "70 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_21_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_21_onos.json
new file mode 100644
index 00000000..0fa67d21
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_21_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0001/2-of:0000ffffffffff01/1",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0001",
+ "srcPort": "2",
+ "dst": "of:0000ffffffffff01",
+ "dstPort": "1",
+ "props" : {
+ "BW": "70 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_22_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_22_onos.json
new file mode 100644
index 00000000..0edde2a5
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_22_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffffff09/20-of:0000ffffffffff0A/20",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffffff09",
+ "srcPort": "20",
+ "dst": "of:0000ffffffffff0A",
+ "dstPort": "20",
+ "props" : {
+ "BW": "70 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_23_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_23_onos.json
new file mode 100644
index 00000000..5443b417
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_23_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffffff07/30-of:0000ffffffffff08/20",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 4,
+ "src": "of:0000ffffffffff07",
+ "srcPort": "30",
+ "dst": "of:0000ffffffffff08",
+ "dstPort": "20",
+ "props" : {
+ "BW": "70 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_24_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_24_onos.json
new file mode 100644
index 00000000..5e7bb99b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_24_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffffff02/10-of:0000ffffffffff01/10",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffffff02",
+ "srcPort": "10",
+ "dst": "of:0000ffffffffff01",
+ "dstPort": "10",
+ "props" : {
+ "BW": "70 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_25_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_25_onos.json
new file mode 100644
index 00000000..1d0e9762
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_25_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffffff04/27-of:0000ffffffffff08/10",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffffff04",
+ "srcPort": "27",
+ "dst": "of:0000ffffffffff08",
+ "dstPort": "10",
+ "props" : {
+ "BW": "30 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_26_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_26_onos.json
new file mode 100644
index 00000000..9f2cd7b2
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_26_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0003/2-of:0000ffffffffff03/1",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0003",
+ "srcPort": "2",
+ "dst": "of:0000ffffffffff03",
+ "dstPort": "1",
+ "props" : {
+ "BW": "70 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_27_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_27_onos.json
new file mode 100644
index 00000000..23ccc226
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_27_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffffff09/1-of:0000ffffffff0009/2",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffffff09",
+ "srcPort": "1",
+ "dst": "of:0000ffffffff0009",
+ "dstPort": "2",
+ "props" : {
+ "BW": "70 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_28_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_28_onos.json
new file mode 100644
index 00000000..84be94f5
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_28_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffffff03/30-of:0000ffffffffff04/10",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffffff03",
+ "srcPort": "30",
+ "dst": "of:0000ffffffffff04",
+ "dstPort": "10",
+ "props" : {
+ "BW": "70 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_29_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_29_onos.json
new file mode 100644
index 00000000..be5c6963
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_29_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffffff07/20-of:0000ffffffffff09/10",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffffff07",
+ "srcPort": "20",
+ "dst": "of:0000ffffffffff09",
+ "dstPort": "10",
+ "props" : {
+ "BW": "70 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_2_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_2_onos.json
new file mode 100644
index 00000000..b00c6890
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_2_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffffff03",
+ "type": "roadm",
+ "online": true,
+ "labels": [
+ "",
+ "opt-3",
+ "0000ffffffffff03"
+ ],
+ "metaUi": {
+ "x": 95,
+ "y": 225
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_30_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_30_onos.json
new file mode 100644
index 00000000..283d300d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_30_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffffff0A/10-of:0000ffffffffff08/30",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 4,
+ "src": "of:0000ffffffffff0A",
+ "srcPort": "10",
+ "dst": "of:0000ffffffffff08",
+ "dstPort": "30",
+ "props" : {
+ "BW": "70 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_31_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_31_onos.json
new file mode 100644
index 00000000..965f76b1
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_31_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0004/2-of:0000ffffffffff04/1",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0004",
+ "srcPort": "2",
+ "dst": "of:0000ffffffffff04",
+ "dstPort": "1",
+ "props" : {
+ "BW": "70 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_32_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_32_onos.json
new file mode 100644
index 00000000..3d90bfab
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_32_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffffff07/1-of:0000ffffffff0007/2",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffffff07",
+ "srcPort": "1",
+ "dst": "of:0000ffffffff0007",
+ "dstPort": "2",
+ "props" : {
+ "BW": "70 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_33_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_33_onos.json
new file mode 100644
index 00000000..7b17ddaa
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_33_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "updateDevice",
+ "payload": {
+ "id": "of:0000ffffffffff06",
+ "type": "roadm",
+ "online": true,
+ "labels": [
+ "",
+ "opt-6",
+ "0000ffffffffff06"
+ ],
+ "metaUi": {
+ "x": 336,
+ "y": 254
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_34_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_34_onos.json
new file mode 100644
index 00000000..a75a345c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_34_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffffff06/20-of:0000ffffffffff05/30",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 4,
+ "src": "of:0000ffffffffff06",
+ "srcPort": "20",
+ "dst": "of:0000ffffffffff05",
+ "dstPort": "30",
+ "props" : {
+ "BW": "70 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_35_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_35_onos.json
new file mode 100644
index 00000000..055a80d7
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_35_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffffff03/20-of:0000ffffffffff06/10",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffffff03",
+ "srcPort": "20",
+ "dst": "of:0000ffffffffff06",
+ "dstPort": "10",
+ "props" : {
+ "BW": "70 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_36_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_36_onos.json
new file mode 100644
index 00000000..addcc6dc
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_36_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffffff06/30-of:0000ffffffffff08/10",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 4,
+ "src": "of:0000ffffffffff06",
+ "srcPort": "30",
+ "dst": "of:0000ffffffffff08",
+ "dstPort": "10",
+ "props" : {
+ "BW": "70 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_37_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_37_onos.json
new file mode 100644
index 00000000..42adbf93
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_37_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "updateDevice",
+ "payload": {
+ "id": "of:0000ffffffffff08",
+ "type": "roadm",
+ "online": false,
+ "labels": [
+ "",
+ "opt-8",
+ "0000ffffffffff08"
+ ],
+ "metaUi": {
+ "x": 539,
+ "y": 186
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_38_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_38_onos.json
new file mode 100644
index 00000000..5479f6e0
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_38_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "removeLink",
+ "payload": {
+ "id": "of:0000ffffffffff07/30-of:0000ffffffffff08/20",
+ "type": "optical",
+ "online": false,
+ "linkWidth": 4,
+ "src": "of:0000ffffffffff07",
+ "srcPort": "30",
+ "dst": "of:0000ffffffffff08",
+ "dstPort": "20",
+ "props" : {
+ "BW": "70 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_39_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_39_onos.json
new file mode 100644
index 00000000..13c2cf22
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_39_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "removeLink",
+ "payload": {
+ "id": "of:0000ffffffffff04/27-of:0000ffffffffff08/10",
+ "type": "optical",
+ "online": false,
+ "linkWidth": 2,
+ "src": "of:0000ffffffffff04",
+ "srcPort": "27",
+ "dst": "of:0000ffffffffff08",
+ "dstPort": "10",
+ "props" : {
+ "BW": "30 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_3_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_3_onos.json
new file mode 100644
index 00000000..eb1da818
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_3_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0007",
+ "type": "switch",
+ "online": true,
+ "labels": [
+ "",
+ "sw-7",
+ "0000ffffffff0007"
+ ],
+ "metaUi": {
+ "x": 890,
+ "y": 375
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_40_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_40_onos.json
new file mode 100644
index 00000000..7a9c1e1e
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_40_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "removeLink",
+ "payload": {
+ "id": "of:0000ffffffffff0A/10-of:0000ffffffffff08/30",
+ "type": "optical",
+ "online": false,
+ "linkWidth": 4,
+ "src": "of:0000ffffffffff0A",
+ "srcPort": "10",
+ "dst": "of:0000ffffffffff08",
+ "dstPort": "30",
+ "props" : {
+ "BW": "70 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_41_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_41_onos.json
new file mode 100644
index 00000000..fb2fa458
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_41_onos.json
@@ -0,0 +1,16 @@
+{
+ "event": "removeLink",
+ "payload": {
+ "id": "of:0000ffffffffff06/30-of:0000ffffffffff08/10",
+ "type": "optical",
+ "online": false,
+ "linkWidth": 4,
+ "src": "of:0000ffffffffff06",
+ "srcPort": "30",
+ "dst": "of:0000ffffffffff08",
+ "dstPort": "10",
+ "props" : {
+ "BW": "70 G"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_4_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_4_onos.json
new file mode 100644
index 00000000..495d69b1
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_4_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0009",
+ "type": "switch",
+ "online": true,
+ "labels": [
+ "",
+ "sw-9",
+ "0000ffffffff0009"
+ ],
+ "metaUi": {
+ "x": 1004,
+ "y": 163
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_5_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_5_onos.json
new file mode 100644
index 00000000..0fe43412
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_5_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffffff02",
+ "type": "roadm",
+ "online": true,
+ "labels": [
+ "",
+ "opt-2",
+ "0000ffffffffff02"
+ ],
+ "metaUi": {
+ "x": 211,
+ "y": 307
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_6_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_6_onos.json
new file mode 100644
index 00000000..7557c026
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_6_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0003",
+ "type": "switch",
+ "online": true,
+ "labels": [
+ "",
+ "sw-3",
+ "0000ffffffff0003"
+ ],
+ "metaUi": {
+ "x": 114,
+ "y": 158
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_7_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_7_onos.json
new file mode 100644
index 00000000..ed90ac3a
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_7_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffffff07",
+ "type": "roadm",
+ "online": true,
+ "labels": [
+ "",
+ "opt-7",
+ "0000ffffffffff07"
+ ],
+ "metaUi": {
+ "x": 925,
+ "y": 446
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_8_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_8_onos.json
new file mode 100644
index 00000000..f9f429bc
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_8_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffffff06",
+ "type": "roadm",
+ "online": false,
+ "labels": [
+ "",
+ "opt-6",
+ "0000ffffffffff06"
+ ],
+ "metaUi": {
+ "x": 336,
+ "y": 254
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_9_onos.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_9_onos.json
new file mode 100644
index 00000000..72d8feda
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/ev_9_onos.json
@@ -0,0 +1,17 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffffff05",
+ "type": "roadm",
+ "online": true,
+ "labels": [
+ "",
+ "opt-5",
+ "0000ffffffffff05"
+ ],
+ "metaUi": {
+ "x": 539,
+ "y": 524
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/startup/scenario.json b/framework/src/onos/web/gui/src/test/_karma/ev/startup/scenario.json
new file mode 100644
index 00000000..0fe1dd31
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/startup/scenario.json
@@ -0,0 +1,19 @@
+{
+ "comments": [
+ "This scenario steps through adding devices and links.",
+ "(Typical 'start-ip' of the view.)"
+ ],
+ "title": "Startup Scenario",
+ "params": {
+ "lastAuto": 32
+ },
+ "description": [
+ "Loads 16 devices (10 optical, 6 packet)",
+ " and their associated links.",
+ "",
+ "Press '=' to load initial events.",
+ "Press '-' to fire further events...",
+ " * 4 events - device online, add 3 links",
+ " * 5 events - device offline, remove 4 links"
+ ]
+} \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_10_addLink_s8-r8.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_10_addLink_s8-r8.json
new file mode 100644
index 00000000..190ce4ec
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_10_addLink_s8-r8.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0008/5-of:0000ffffffffff08/11",
+ "type": "indirect",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0008",
+ "srcPort": "5",
+ "dst": "of:0000ffffffffff08",
+ "dstPort": "11",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_11_addLink_s3-r3.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_11_addLink_s3-r3.json
new file mode 100644
index 00000000..34e074ab
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_11_addLink_s3-r3.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0003/6-of:0000ffffffffff03/8",
+ "type": "indirect",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0003",
+ "srcPort": "6",
+ "dst": "of:0000ffffffffff03",
+ "dstPort": "8",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_12_addLink_r8-r3.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_12_addLink_r8-r3.json
new file mode 100644
index 00000000..8d97902e
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_12_addLink_r8-r3.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffffff08/13-of:0000ffffffffff03/17",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffffff08",
+ "srcPort": "13",
+ "dst": "of:0000ffffffffff03",
+ "dstPort": "17",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_13_addHost_h3.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_13_addHost_h3.json
new file mode 100644
index 00000000..a5ee5c98
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_13_addHost_h3.json
@@ -0,0 +1,17 @@
+{
+ "event": "addHost",
+ "payload": {
+ "id": "0E:2A:69:30:13:86/-1",
+ "ingress": "0E:2A:69:30:13:86/-1/0-of:0000ffffffff0003/101",
+ "egress": "of:0000ffffffff0003/101-0E:2A:69:30:13:86/-1/0",
+ "cp": {
+ "device": "of:0000ffffffff0003",
+ "port": 101
+ },
+ "labels": [
+ "1.2.3.4",
+ "0E:2A:69:30:13:86"
+ ],
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_14_addHost_h7.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_14_addHost_h7.json
new file mode 100644
index 00000000..262b8f21
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_14_addHost_h7.json
@@ -0,0 +1,17 @@
+{
+ "event": "addHost",
+ "payload": {
+ "id": "0E:2A:69:30:13:88/-1",
+ "ingress": "0E:2A:69:30:13:88/-1/0-of:0000ffffffff0007/102",
+ "egress": "of:0000ffffffff0007/102-0E:2A:69:30:13:86/-1/0",
+ "cp": {
+ "device": "of:0000ffffffff0007",
+ "port": 102
+ },
+ "labels": [
+ "4.5.7.6",
+ "0E:2A:69:30:13:88"
+ ],
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_15_addHost_h8.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_15_addHost_h8.json
new file mode 100644
index 00000000..65cd825a
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_15_addHost_h8.json
@@ -0,0 +1,17 @@
+{
+ "event": "addHost",
+ "payload": {
+ "id": "0E:2A:69:30:13:aa/-1",
+ "ingress": "0E:2A:69:30:13:aa/-1/0-of:0000ffffffff0008/103",
+ "egress": "of:0000ffffffff0008/103-0E:2A:69:30:13:aa/-1/0",
+ "cp": {
+ "device": "of:0000ffffffff0008",
+ "port": 103
+ },
+ "labels": [
+ "12.13.14.15",
+ "0E:2A:69:30:13:aa"
+ ],
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_16_addDevice_r4.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_16_addDevice_r4.json
new file mode 100644
index 00000000..fc354f09
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_16_addDevice_r4.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffffff04",
+ "type": "roadm",
+ "online": true,
+ "master": "myInstB",
+ "labels": [
+ "",
+ "opt-4",
+ "0000ffffffffff04"
+ ],
+ "metaUi": {
+ "x": 1100,
+ "y": 600
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_17_addLink_r8-r4.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_17_addLink_r8-r4.json
new file mode 100644
index 00000000..d32efef5
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_17_addLink_r8-r4.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffffff08/99-of:0000ffffffffff04/65535",
+ "type": "optical",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffffff08",
+ "srcPort": "99",
+ "dst": "of:0000ffffffffff04",
+ "dstPort": "65535",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_18_showTraffic_primary.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_18_showTraffic_primary.json
new file mode 100644
index 00000000..7eafcf10
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_18_showTraffic_primary.json
@@ -0,0 +1,34 @@
+{
+ "event": "showTraffic",
+ "sid": 1,
+ "payload": {
+ "paths": [
+ {
+ "class": "primary animated",
+ "links": [
+ "0E:2A:69:30:13:86/-1/0-of:0000ffffffff0003/101",
+ "0E:2A:69:30:13:aa/-1/0-of:0000ffffffff0008/103",
+ "of:0000ffffffff0003/6-of:0000ffffffffff03/8",
+ "of:0000ffffffff0008/5-of:0000ffffffffff08/11"
+ ],
+ "labels": [
+ "20 bytes",
+ "20 bytes",
+ "24 bytes",
+ "some bits"
+ ]
+ },
+ {
+ "class": "primary optical animated",
+ "links": [
+ "of:0000ffffffffff08/13-of:0000ffffffffff03/17",
+ "of:0000ffffffffff08/99-of:0000ffffffffff04/65535"
+ ],
+ "labels": [
+ "foo bars",
+ "boo fars"
+ ]
+ }
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_19_showTraffic_secondary.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_19_showTraffic_secondary.json
new file mode 100644
index 00000000..1f60c72a
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_19_showTraffic_secondary.json
@@ -0,0 +1,34 @@
+{
+ "event": "showTraffic",
+ "sid": 1,
+ "payload": {
+ "paths": [
+ {
+ "class": "secondary animated",
+ "links": [
+ "0E:2A:69:30:13:86/-1/0-of:0000ffffffff0003/101",
+ "0E:2A:69:30:13:aa/-1/0-of:0000ffffffff0008/103",
+ "of:0000ffffffff0003/6-of:0000ffffffffff03/8",
+ "of:0000ffffffff0008/5-of:0000ffffffffff08/11"
+ ],
+ "labels": [
+ "35 bytes",
+ "35 bytes",
+ "24 bytes",
+ "some bits"
+ ]
+ },
+ {
+ "class": "secondary optical animated",
+ "links": [
+ "of:0000ffffffffff08/13-of:0000ffffffffff03/17",
+ "of:0000ffffffffff08/99-of:0000ffffffffff04/65535"
+ ],
+ "labels": [
+ "foo bars",
+ "bar foos"
+ ]
+ }
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_1_addInstance.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_1_addInstance.json
new file mode 100644
index 00000000..c2eda412
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_1_addInstance.json
@@ -0,0 +1,14 @@
+{
+ "event": "addInstance",
+ "payload": {
+ "id": "myInstA",
+ "ip": "192.168.56.101",
+ "online": true,
+ "uiAttached": true,
+ "switches": 4,
+ "labels": [
+ "myInstA",
+ "192.168.56.101"
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_20_showTraffic_allMix.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_20_showTraffic_allMix.json
new file mode 100644
index 00000000..0526274c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_20_showTraffic_allMix.json
@@ -0,0 +1,39 @@
+{
+ "event": "showTraffic",
+ "sid": 1,
+ "payload": {
+ "paths": [
+ {
+ "class": "primary animated",
+ "links": [
+ "of:0000ffffffff0008/21-of:0000ffffffff0003/1"
+ ],
+ "labels": ["primary"]
+ },
+ {
+ "class": "secondary animated",
+ "links": [
+ "of:0000ffffffff0003/9-of:0000ffffffff0007/2",
+ "of:0000ffffffff0008/4-of:0000ffffffff0007/3",
+ "of:0000ffffffff0003/6-of:0000ffffffffff03/8",
+ "of:0000ffffffff0008/5-of:0000ffffffffff08/11"
+ ],
+ "labels": ["secondary", "secondo", "deux", "zwei"]
+ },
+ {
+ "class": "secondary optical animated",
+ "links": [
+ "of:0000ffffffffff08/99-of:0000ffffffffff04/65535"
+ ],
+ "labels": ["secondary optical"]
+ },
+ {
+ "class": "primary optical animated",
+ "links": [
+ "of:0000ffffffffff08/13-of:0000ffffffffff03/17"
+ ],
+ "labels": ["primary optical"]
+ }
+ ]
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_21_showTraffic_none.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_21_showTraffic_none.json
new file mode 100644
index 00000000..5f8aae0c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_21_showTraffic_none.json
@@ -0,0 +1,7 @@
+{
+ "event": "showTraffic",
+ "sid": 1,
+ "payload": {
+ "paths": []
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_22_updateDevice_s7offline.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_22_updateDevice_s7offline.json
new file mode 100644
index 00000000..2f9d567c
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_22_updateDevice_s7offline.json
@@ -0,0 +1,17 @@
+{
+ "event": "updateDevice",
+ "payload": {
+ "id": "of:0000ffffffff0007",
+ "type": "switch",
+ "online": false,
+ "labels": [
+ "",
+ "sw-7",
+ "0000ffffffff0007"
+ ],
+ "metaUi": {
+ "x": 530,
+ "y": 330
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_23_updateDevice_s7online.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_23_updateDevice_s7online.json
new file mode 100644
index 00000000..a409b614
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_23_updateDevice_s7online.json
@@ -0,0 +1,17 @@
+{
+ "event": "updateDevice",
+ "payload": {
+ "id": "of:0000ffffffff0007",
+ "type": "switch",
+ "online": true,
+ "labels": [
+ "",
+ "sw-7",
+ "0000ffffffff0007"
+ ],
+ "metaUi": {
+ "x": 530,
+ "y": 330
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_24_removeDevice_s8.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_24_removeDevice_s8.json
new file mode 100644
index 00000000..0478da1d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_24_removeDevice_s8.json
@@ -0,0 +1,17 @@
+{
+ "event": "removeDevice",
+ "payload": {
+ "id": "of:0000ffffffff0008",
+ "type": "switch",
+ "online": false,
+ "labels": [
+ "",
+ "sw-8",
+ "0000ffffffff0008"
+ ],
+ "metaUi": {
+ "x": 734,
+ "y": 477
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_25_addDevice_s8.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_25_addDevice_s8.json
new file mode 100644
index 00000000..16f530fa
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_25_addDevice_s8.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0008",
+ "type": "switch",
+ "online": true,
+ "master": "myInstA",
+ "labels": [
+ "",
+ "sw-8",
+ "0000ffffffff0008"
+ ],
+ "metaUi": {
+ "x": 734,
+ "y": 477
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_26_removeHost_h7.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_26_removeHost_h7.json
new file mode 100644
index 00000000..69fc2bcb
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_26_removeHost_h7.json
@@ -0,0 +1,17 @@
+{
+ "event": "removeHost",
+ "payload": {
+ "id": "0E:2A:69:30:13:88/-1",
+ "ingress": "0E:2A:69:30:13:88/-1/0-of:0000ffffffff0007/101",
+ "egress": "of:0000ffffffff0007/101-0E:2A:69:30:13:86/-1/0",
+ "cp": {
+ "device": "of:0000ffffffff0007",
+ "port": 101
+ },
+ "labels": [
+ "4.5.7.6",
+ "0E:2A:69:30:13:88"
+ ],
+ "props": {}
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_2_addDevice_s8.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_2_addDevice_s8.json
new file mode 100644
index 00000000..16f530fa
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_2_addDevice_s8.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0008",
+ "type": "switch",
+ "online": true,
+ "master": "myInstA",
+ "labels": [
+ "",
+ "sw-8",
+ "0000ffffffff0008"
+ ],
+ "metaUi": {
+ "x": 734,
+ "y": 477
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_3_addDevice_s3.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_3_addDevice_s3.json
new file mode 100644
index 00000000..60f687e3
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_3_addDevice_s3.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0003",
+ "type": "switch",
+ "online": true,
+ "master": "myInstA",
+ "labels": [
+ "",
+ "sw-3",
+ "0000ffffffff0003"
+ ],
+ "metaUi": {
+ "x": 282,
+ "y": 503
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_4_addDevice_s7.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_4_addDevice_s7.json
new file mode 100644
index 00000000..e4681187
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_4_addDevice_s7.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffff0007",
+ "type": "switch",
+ "online": true,
+ "master": "myInstA",
+ "labels": [
+ "",
+ "sw-7",
+ "0000ffffffff0007"
+ ],
+ "metaUi": {
+ "x": 530,
+ "y": 330
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_5_addDevice_r8.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_5_addDevice_r8.json
new file mode 100644
index 00000000..6fa87b19
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_5_addDevice_r8.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffffff08",
+ "type": "roadm",
+ "online": true,
+ "master": "myInstA",
+ "labels": [
+ "",
+ "opt-8",
+ "0000ffffffffff08"
+ ],
+ "metaUi": {
+ "x": 734,
+ "y": 577
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_6_addDevice_r3.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_6_addDevice_r3.json
new file mode 100644
index 00000000..ed1b1cbf
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_6_addDevice_r3.json
@@ -0,0 +1,18 @@
+{
+ "event": "addDevice",
+ "payload": {
+ "id": "of:0000ffffffffff03",
+ "type": "roadm",
+ "online": true,
+ "master": "myInstA",
+ "labels": [
+ "",
+ "opt-3",
+ "0000ffffffffff03"
+ ],
+ "metaUi": {
+ "x": 282,
+ "y": 603
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_7_addLink_s3-s7.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_7_addLink_s3-s7.json
new file mode 100644
index 00000000..00583d4d
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_7_addLink_s3-s7.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0003/9-of:0000ffffffff0007/2",
+ "type": "direct",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0003",
+ "srcPort": "9",
+ "dst": "of:0000ffffffff0007",
+ "dstPort": "2",
+ "props" : {
+ "BW": "120 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_8_addLink_s8-s3.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_8_addLink_s8-s3.json
new file mode 100644
index 00000000..84531de8
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_8_addLink_s8-s3.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0008/21-of:0000ffffffff0003/1",
+ "type": "direct",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0008",
+ "srcPort": "21",
+ "dst": "of:0000ffffffff0003",
+ "dstPort": "1",
+ "props" : {
+ "BW": "70 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_9_addLink_s8-s7.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_9_addLink_s8-s7.json
new file mode 100644
index 00000000..a432a521
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/ev_9_addLink_s8-s7.json
@@ -0,0 +1,16 @@
+{
+ "event": "addLink",
+ "payload": {
+ "id": "of:0000ffffffff0008/4-of:0000ffffffff0007/3",
+ "type": "direct",
+ "online": true,
+ "linkWidth": 2,
+ "src": "of:0000ffffffff0008",
+ "srcPort": "4",
+ "dst": "of:0000ffffffff0007",
+ "dstPort": "3",
+ "props" : {
+ "BW": "90 Gb"
+ }
+ }
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/ev/traffic/scenario.json b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/scenario.json
new file mode 100644
index 00000000..57c03733
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/ev/traffic/scenario.json
@@ -0,0 +1,12 @@
+{
+ "comments": [
+ "Stepping through showTraffic"
+ ],
+ "title": "Show Traffic Scenario",
+ "params": {
+ "lastAuto": 15
+ },
+ "description": [
+ "Primary, secondary and animated link visualizations."
+ ]
+}
diff --git a/framework/src/onos/web/gui/src/test/_karma/mockserver.js b/framework/src/onos/web/gui/src/test/_karma/mockserver.js
new file mode 100644
index 00000000..23b468b0
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/_karma/mockserver.js
@@ -0,0 +1,361 @@
+#!/usr/bin/env node
+
+// === Mock Web Socket Server - for testing the topology view
+
+var fs = require('fs'),
+ readline = require('readline'),
+ http = require('http'),
+ WebSocketServer = require('websocket').server,
+ port = 8123,
+ scenarioRoot = 'ev/',
+ verbose = false, // show received messages from client
+ extraVerbose = false; // show ALL received messages from client
+
+var lastcmd, // last command executed
+ lastargs, // arguments to last command
+ connection, // ws connection
+ origin, // origin of connection
+ scid, // scenario ID
+ scdata, // scenario data
+ scdone, // shows when scenario is over
+ eventsById, // map of event file names
+ maxEvno, // highest loaded event number
+ autoLast, // last event number for auto-advance
+ evno, // next event number
+ evdata; // event data
+
+
+process.argv.forEach(function (val) {
+ switch (val) {
+ case '-v': verbose = true; break;
+ case '-v!': extraVerbose = true; break;
+ }
+});
+
+var scFiles = fs.readdirSync(scenarioRoot);
+console.log();
+console.log('Mock Server v1.0');
+if (verbose || extraVerbose) {
+ console.log('Verbose=' + verbose, 'ExtraVerbose=' + extraVerbose);
+}
+console.log('================');
+listScenarios();
+
+var rl = readline.createInterface(process.stdin, process.stdout);
+rl.setPrompt('ws> ');
+
+
+var server = http.createServer(function(request, response) {
+ console.log((new Date()) + ' Received request for ' + request.url);
+ response.writeHead(404);
+ response.end();
+});
+
+server.listen(port, function() {
+ console.log((new Date()) + ' Server is listening on port ' + port);
+});
+
+server.on('listening', function () {
+ console.log('OK, server is running');
+ console.log('(? for help)');
+});
+
+var wsServer = new WebSocketServer({
+ httpServer: server,
+ // You should not use autoAcceptConnections for production
+ // applications, as it defeats all standard cross-origin protection
+ // facilities built into the protocol and the browser. You should
+ // *always* verify the connection's origin and decide whether or not
+ // to accept it.
+ autoAcceptConnections: false
+});
+
+function originIsAllowed(origin) {
+ // put logic here to detect whether the specified origin is allowed.
+ return true;
+}
+
+// displays the message if our arguments say we should
+function displayMsg(msg) {
+ var ev = JSON.parse(msg);
+ switch (ev.event) {
+ case 'topoHeartbeat': return extraVerbose;
+ default: return true;
+ }
+}
+
+wsServer.on('request', function(request) {
+ console.log(); // newline after prompt
+ console.log("Origin: ", request.origin);
+
+ if (!originIsAllowed(request.origin)) {
+ // Make sure we only accept requests from an allowed origin
+ request.reject();
+ console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.');
+ return;
+ }
+
+ origin = request.origin;
+ connection = request.accept(null, origin);
+
+
+ console.log((new Date()) + ' Connection accepted.');
+ rl.prompt();
+
+ connection.on('message', function(message) {
+ if (verbose || extraVerbose) {
+ if (message.type === 'utf8') {
+ if (displayMsg(message.utf8Data)) {
+ console.log(); // newline after prompt
+ console.log('Received Message: ' + message.utf8Data);
+ }
+ //connection.sendUTF(message.utf8Data);
+ rl.prompt();
+ }
+ else if (message.type === 'binary') {
+ console.log('Received Binary Message of ' + message.binaryData.length + ' bytes');
+ //connection.sendBytes(message.binaryData);
+ }
+ }
+ });
+ connection.on('close', function(reasonCode, description) {
+ console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.');
+ connection = null;
+ origin = null;
+ });
+});
+
+
+setTimeout(doCli, 10); // allow async processes to write to stdout first
+
+function doCli() {
+ rl.prompt();
+ rl.on('line', function (line) {
+ var words = line.trim().split(' '),
+ cmd = words.shift(),
+ str = words.join(' ');
+
+ if (!cmd) {
+ // repeat last command
+ cmd = lastcmd;
+ str = lastargs;
+ }
+
+ switch(cmd) {
+ case 'l': listScenarios(); break;
+ case 'c': connStatus(); break;
+ case 'm': customMessage(str); break;
+ case 's': setScenario(str); break;
+ case 'a': autoAdvance(); break;
+ case 'n': nextEvent(); break;
+ case 'r': restartScenario(); break;
+ case 'q': quit(); break;
+ case '?': showHelp(); break;
+ default: console.log('Say what?! (? for help)'); break;
+ }
+ lastcmd = cmd;
+ lastargs = str;
+ rl.prompt();
+
+ }).on('close', function () {
+ quit();
+ });
+}
+
+var helptext = '\n' +
+ 'l - list scenarios\n' +
+ 'c - show connection status\n' +
+ 'm {text} - send custom message to client\n' +
+ 's {id} - load scenario {id}\n' +
+ 's - show scenario status\n' +
+ 'a - auto-send events\n' +
+ 'n - send next event\n' +
+ 'r - restart the scenario\n' +
+ 'q - exit the server\n' +
+ '? - display this help text\n';
+
+function showHelp() {
+ console.log(helptext);
+}
+
+function listScenarios() {
+ console.log('Scenarios ...');
+ console.log(scFiles.join(', '));
+ console.log();
+}
+
+function connStatus() {
+ if (connection) {
+ console.log('Connection from ' + origin + ' established.');
+ } else {
+ console.log('No connection.');
+ }
+}
+
+function quit() {
+ console.log('Quitting...');
+ process.exit(0);
+}
+
+function customMessage(m) {
+ if (connection) {
+ console.log('Sending message: ' + m);
+ connection.sendUTF(m);
+ } else {
+ console.warn('No current connection.');
+ }
+}
+
+function showScenarioStatus() {
+ var msg;
+ if (!scid) {
+ console.log('No scenario loaded.');
+ } else {
+ msg = 'Scenario: "' + scid + '", ' +
+ (scdone ? 'DONE' : 'next event: ' + evno);
+ console.log(msg);
+ }
+}
+
+function scenarioPath(evno) {
+ var file = evno ? ('/' + eventsById[evno].fname) : '/scenario.json';
+ return scenarioRoot + scid + file;
+}
+
+
+function initScenario(verb) {
+ console.log(); // get past prompt
+ console.log(verb + ' scenario "' + scid + '"');
+ console.log(scdata.title);
+ scdata.description.forEach(function (d) {
+ console.log(' ' + d);
+ });
+ autoLast = (scdata.params && scdata.params.lastAuto) || 0;
+ if (autoLast) {
+ console.log('[auto-advance: ' + autoLast + ']');
+ }
+ evno = 1;
+ scdone = false;
+ readEventFilenames();
+}
+
+function readEventFilenames() {
+ var files = fs.readdirSync(scenarioRoot + scid),
+ eventCount = 0,
+ match, id, tag;
+
+ maxEvno = 0;
+
+ eventsById = {};
+ files.forEach(function (f) {
+ match = /^ev_(\d+)_(.*)\.json$/.exec(f);
+ if (match) {
+ eventCount++;
+ id = match[1];
+ tag = match[2];
+ eventsById[id] = {
+ fname: f,
+ num: id,
+ tag: tag
+ };
+ if (Number(id) > Number(maxEvno)) {
+ maxEvno = id;
+ }
+ }
+
+ });
+ console.log('[' + eventCount + ' events loaded, (max=' + maxEvno + ')]');
+}
+
+function setScenario(id) {
+ if (!id) {
+ return showScenarioStatus();
+ }
+
+ evdata = null;
+ scid = id;
+ fs.readFile(scenarioPath(), 'utf8', function (err, data) {
+ if (err) {
+ console.warn('No scenario named "' + id + '"', err);
+ scid = null;
+ } else {
+ scdata = JSON.parse(data);
+ initScenario('Loading');
+ }
+ rl.prompt();
+ });
+}
+
+function restartScenario() {
+ if (!scid) {
+ console.log('No scenario loaded.');
+ } else {
+ initScenario('Restarting');
+ }
+ rl.prompt();
+}
+
+function eventAvailable() {
+ if (!scid) {
+ console.log('No scenario loaded.');
+ rl.prompt();
+ return false;
+ }
+
+ if (!connection) {
+ console.log('No current connection.');
+ rl.prompt();
+ return false;
+ }
+
+ if (Number(evno) > Number(maxEvno)) {
+ scdone = true;
+ console.log('Scenario DONE.');
+ return false;
+ }
+ return true;
+}
+
+function autoAdvance() {
+ if (evno > autoLast) {
+ console.log('[auto done]');
+ return;
+ }
+
+ // need to recurse with a callback, since each event send relies
+ // on an async load of event data...
+ function callback() {
+ if (eventAvailable() && evno <= autoLast) {
+ _nextEvent(callback);
+ }
+ }
+
+ callback();
+}
+
+function nextEvent() {
+ if (eventAvailable()) {
+ _nextEvent();
+ }
+}
+
+function _nextEvent(callback) {
+ var path = scenarioPath(evno);
+
+ fs.readFile(path, 'utf8', function (err, data) {
+ if (err) {
+ console.error('Oops error: ' + err);
+ } else {
+ evdata = JSON.parse(data);
+ console.log(); // get past prompt
+ console.log('Sending event #' + evno + ' [' + evdata.event +
+ '] from ' + eventsById[evno].fname);
+ connection.sendUTF(data);
+ evno++;
+ if (callback) {
+ callback();
+ }
+ }
+ rl.prompt();
+ });
+}
diff --git a/framework/src/onos/web/gui/src/test/java/org/onosproject/ui/impl/README.txt b/framework/src/onos/web/gui/src/test/java/org/onosproject/ui/impl/README.txt
new file mode 100644
index 00000000..0d5844db
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/java/org/onosproject/ui/impl/README.txt
@@ -0,0 +1 @@
+# Need to write unit tests for the GUI server-side code!
diff --git a/framework/src/onos/web/gui/src/test/webapp/_sdh/ng-examples/js/ch03-controllerSpec.js b/framework/src/onos/web/gui/src/test/webapp/_sdh/ng-examples/js/ch03-controllerSpec.js
new file mode 100644
index 00000000..b2d4947b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/webapp/_sdh/ng-examples/js/ch03-controllerSpec.js
@@ -0,0 +1,35 @@
+// Jasmine unit tests for ch03-controller.js
+
+describe('Controller: ListCtrl', function () {
+ // instantiate a new version of my module before each test
+ beforeEach(module('notesApp'));
+
+ var ctrl;
+
+ // before each unit test, instantiate a new instance of the controller
+ beforeEach(inject(function ($controller) {
+ ctrl = $controller('ListCtrl');
+ }));
+
+ it('should have items available on load', function () {
+ expect(ctrl.items).toEqual([
+ {id: 1, label: 'First', done: true},
+ {id: 2, label: 'Second', done: false}
+ ]);
+ });
+
+ it('should have highlight items based on state', function () {
+ var item = {id: 1, label: 'First', done: true};
+
+ var actualClass = ctrl.getDoneClass(item);
+ expect(actualClass.finished).toBeTruthy();
+ expect(actualClass.unfinished).toBeFalsy();
+
+ item.done = false;
+
+ actualClass = ctrl.getDoneClass(item);
+ expect(actualClass.finished).toBeFalsy();
+ expect(actualClass.unfinished).toBeTruthy();
+ });
+
+}); \ No newline at end of file
diff --git a/framework/src/onos/web/gui/src/test/webapp/_sdh/ng-examples/js/ch09-01-time-agoSpec.js b/framework/src/onos/web/gui/src/test/webapp/_sdh/ng-examples/js/ch09-01-time-agoSpec.js
new file mode 100644
index 00000000..a518ae2b
--- /dev/null
+++ b/framework/src/onos/web/gui/src/test/webapp/_sdh/ng-examples/js/ch09-01-time-agoSpec.js
@@ -0,0 +1,40 @@
+// ch09-01-time-agoSpec.js
+
+describe('timeAgo Filter', function () {
+ beforeEach(module('filterApp'));
+
+ var filter;
+ beforeEach(inject(function (timeAgoFilter) {
+ filter = timeAgoFilter;
+ }));
+
+ it('should respond based on timestamp', function() {
+ // The presence of new Date().getTime() makes it slightly
+ // hard to unit test deterministically.
+ // Ideally, we would inject a dateProvider into the timeAgo
+ // filter, but we are trying to keep it simple for now.
+ // So, we assume that our tests are fast enough to execute
+ // in mere milliseconds.
+
+ var t = new Date().getTime();
+ t -= 10000;
+ expect(filter(t)).toEqual('seconds ago');
+ expect(filter(t, true)).toEqual('minutes ago');
+
+ var fmin = t - 1000 * 60;
+ expect(filter(fmin)).toEqual('minutes ago');
+ expect(filter(fmin, true)).toEqual('minutes ago');
+
+ var fhour = t - 1000 * 60 * 68;
+ expect(filter(fhour)).toEqual('hours ago');
+ expect(filter(fhour, true)).toEqual('hours ago');
+
+ var fday = t - 1000 * 60 * 60 * 26;
+ expect(filter(fday)).toEqual('days ago');
+ expect(filter(fday, true)).toEqual('days ago');
+
+ var fmon = t - 1000 * 60 * 60 * 24 * 34;
+ expect(filter(fmon)).toEqual('months ago');
+ expect(filter(fmon, true)).toEqual('months ago');
+ });
+});